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    }