001 package nl.tudelft.tbm.eeni.owl2java.model.jmodel.utils;
002
003 import com.hp.hpl.jena.ontology.IntersectionClass;
004 import com.hp.hpl.jena.ontology.OntClass;
005 import com.hp.hpl.jena.ontology.OntProperty;
006 import com.hp.hpl.jena.ontology.UnionClass;
007 import com.hp.hpl.jena.rdf.model.Property;
008 import com.hp.hpl.jena.util.iterator.ExtendedIterator;
009 import nl.tudelft.tbm.eeni.owl2java.model.jmodel.JModel;
010 import nl.tudelft.tbm.eeni.owl2java.model.jmodel.JPackage;
011 import nl.tudelft.tbm.eeni.owl2java.model.ns.NamespaceUtils;
012 import nl.tudelft.tbm.eeni.owl2java.utils.JavaUtils;
013 import nl.tudelft.tbm.eeni.owl2java.utils.StringUtils;
014 import org.apache.commons.logging.Log;
015 import org.apache.commons.logging.LogFactory;
016
017 import java.util.*;
018
019
020 public class NamingUtils {
021
022 private static Log log = LogFactory.getLog(NamingUtils.class);
023
024 public static int anonCounter = 0;
025 public static String anonPrefix = "Anon";
026
027 public static String unionClassPrefix = "";
028 public static String unionClassGlue = "And";
029
030 public static String intersectionClassPrefix = "";
031 public static String intersectionClassGlue = "Or";
032
033 public static String classNameAddOn = "";
034 // %c = AddOn, %n = Name, %p = Prefix
035 public static String classNamingSchema = "%c%n";
036
037 public static String interfaceNameAddOn = "I";
038 // %i = AddOn, %n = Name, %p = Prefix
039 public static String interfaceNamingSchema = "%i%n";
040
041 // %n = Name, $p = Prefix
042 public static String propertyNamingSchema = "%n";
043 public static boolean propertyStripPrefix = true;
044
045 public static List<String> propertyIgnoredPrefixes;
046
047 static {
048 propertyIgnoredPrefixes = new ArrayList<String>();
049 propertyIgnoredPrefixes.add("has");
050 propertyIgnoredPrefixes.add("is");
051 }
052
053 public static String getJavaClassName(OntClass ontClass) {
054 String nsUri = ontClass.getNameSpace();
055 String prefix = ontClass.getModel().getNsURIPrefix(nsUri);
056
057 // ignore base prefixes and namespaces
058 if (NamespaceUtils.defaultNs2UriMapping.containsKey(nsUri))
059 prefix = JModel.BASEPREFIX;
060
061 String localName = ontClass.getLocalName();
062 if (prefix != null) {
063 prefix = StringUtils.toFirstUpperCase(prefix);
064 } else {
065 prefix = JModel.BASEPREFIX;
066 }
067
068 // to naming schema
069 String name = classNamingSchema;
070 name = name.replace("%n", localName);
071 name = name.replace("%p", prefix);
072 name = name.replace("%c", classNameAddOn);
073 return StringUtils.toFirstUpperCase(name);
074 }
075
076 public static String getJavaClassName(String localName, String prefix) {
077 String name = classNamingSchema;
078 name = name.replace("%n", localName);
079 name = name.replace("%p", prefix);
080 name = name.replace("%c", classNameAddOn);
081 return StringUtils.toFirstUpperCase(name);
082 }
083
084 public static String getJavaFullName(JPackage pkg, String className) {
085 String name = pkg.getJavaName() + "." + className;
086 return name;
087 }
088
089 public static String getJavaInterfaceName(OntClass ontClass) {
090 String nsUri = ontClass.getNameSpace();
091 String prefix = ontClass.getModel().getNsURIPrefix(nsUri);
092
093 // ignore base prefixes and namespaces
094 if (NamespaceUtils.defaultNs2UriMapping.containsKey(nsUri))
095 prefix = JModel.BASEPREFIX;
096
097 String localName = ontClass.getLocalName();
098 if (prefix != null) {
099 prefix = StringUtils.toFirstUpperCase(prefix);
100 } else {
101 prefix = JModel.BASEPREFIX;
102 }
103
104 // to naming schema
105 String name = interfaceNamingSchema;
106 name = name.replace("%n", localName);
107 name = name.replace("%p", prefix);
108 name = name.replace("%i", interfaceNameAddOn);
109 return StringUtils.toFirstUpperCase(name);
110 }
111
112 public static String getJavaInterfaceName(String localName, String prefix) {
113 String name = interfaceNamingSchema;
114 name = name.replace("%n", localName);
115 name = name.replace("%p", prefix);
116 name = name.replace("%i", interfaceNameAddOn);
117 return StringUtils.toFirstUpperCase(name);
118 }
119
120 public static String getJavaPackageName(String basePackage, String prefix) {
121 if (prefix != JModel.BASEPREFIX)
122 return basePackage + "." + prefix;
123 return basePackage;
124 }
125
126 public static String getPropertyName(OntProperty ontProperty) {
127 String nsUri = ontProperty.getNameSpace();
128 String prefix = ontProperty.getModel().getNsURIPrefix(nsUri);
129 String localName = ontProperty.getLocalName();
130 if (prefix != null) {
131 prefix = StringUtils.toFirstUpperCase(prefix);
132 } else {
133 prefix = JModel.BASEPREFIX;
134 }
135
136 if (propertyStripPrefix) {
137 // prefixes are only stripped if no other property with a
138 // name without the prefix exists
139 String newLocalName = stripPropertyPrefixes(localName);
140 // we have a different name
141 if (!newLocalName.equals(localName)) {
142 Property p1 = ontProperty.getOntModel().getOntProperty(nsUri + newLocalName);
143 Property p2 = ontProperty.getOntModel().getOntProperty(
144 nsUri + StringUtils.toFirstLowerCase(newLocalName));
145 // no other property of stripped name exists
146 if (p1 == null && p2 == null) {
147 localName = newLocalName;
148 } else {
149 log.warn(LogUtils.toLogName(ontProperty) + ": Can not strip property prefix "
150 + "as another property of such name exists");
151 }
152 }
153 }
154
155 // to naming schema
156 String name = propertyNamingSchema;
157 name = name.replace("%n", localName);
158 name = name.replace("%p", prefix);
159 return StringUtils.toFirstLowerCase(name);
160 }
161
162 public static String getValidJavaName(String aName) {
163 return JavaUtils.toValidJavaName(aName);
164 }
165
166 public static String stripPropertyPrefixes(String string) {
167 for (String prefix : propertyIgnoredPrefixes)
168 string = string.replace(prefix, JModel.BASEPREFIX);
169 return string;
170 }
171
172 @SuppressWarnings("unchecked")
173 public static String createUnionClassName(UnionClass cls) {
174 String name = unionClassPrefix;
175 Iterator operandIt = sortOperandClasses(cls.listOperands()).iterator();
176 while (operandIt.hasNext()) {
177 OntClass c = (OntClass) operandIt.next();
178 name += StringUtils.toFirstUpperCase(c.getLocalName());
179 if (operandIt.hasNext()) {
180 name += unionClassGlue;
181 }
182 }
183 name = NamingUtils.getValidJavaName(name);
184 return name;
185 }
186
187 @SuppressWarnings("unchecked")
188 public static String createIntersectionClassName(IntersectionClass cls) {
189 String name = intersectionClassPrefix;
190 Iterator operandIt = sortOperandClasses(cls.listOperands()).iterator();
191 while (operandIt.hasNext()) {
192 OntClass c = (OntClass) operandIt.next();
193 // avoid problems with anonymous classes in intersections
194 if (c.isAnon()) {
195 name += anonPrefix + anonCounter;
196 anonCounter++;
197 } else {
198 name += StringUtils.toFirstUpperCase(c.getLocalName());
199 }
200 if (operandIt.hasNext()) {
201 name += intersectionClassGlue;
202 }
203 }
204 return name;
205 }
206
207 /*
208 * Put operand classes (provided as an iterator) in alphabetical order
209 */
210 private static List<? extends OntClass> sortOperandClasses(ExtendedIterator<? extends OntClass> operands) {
211 // Copy the operand classes to a list
212 List<? extends OntClass> operandList = operands.toList();
213
214 // Sort the list
215 Collections.sort(operandList, new Comparator<OntClass>() {
216 @Override
217 public int compare(OntClass a, OntClass b) {
218 // Compare by local name first
219 int result = a.getLocalName().compareToIgnoreCase(b.getLocalName());
220
221 // If local names comparison has no result, compare URIs
222 if (result == 0) {
223 result = a.getURI().compareToIgnoreCase(b.getLocalName());
224 }
225
226 return result;
227 }
228 });
229
230 // Return the sorted operand classes as an ordered list
231 return operandList;
232 }
233
234 }