001    package nl.tudelft.tbm.eeni.owl2java;
002    
003    import com.hp.hpl.jena.ontology.OntDocumentManager;
004    import com.hp.hpl.jena.ontology.OntModel;
005    import com.hp.hpl.jena.ontology.OntModelSpec;
006    import com.hp.hpl.jena.rdf.model.ModelFactory;
007    import nl.tudelft.tbm.eeni.owl2java.generator.JavaWriter;
008    import nl.tudelft.tbm.eeni.owl2java.generator.ModelPreparation;
009    import nl.tudelft.tbm.eeni.owl2java.generator.OwlReader;
010    import nl.tudelft.tbm.eeni.owl2java.model.jmodel.JModel;
011    import org.apache.commons.logging.Log;
012    import org.apache.commons.logging.LogFactory;
013    
014    import java.util.*;
015    
016    
017    public class JenaGenerator {
018    
019        @SuppressWarnings("unused")
020        private static Log log = LogFactory.getLog(JenaGenerator.class);
021    
022        // config options
023        private String vocabularyName = "Vocabulary";
024        private String factoryName = "Factory";
025        private String testClassName = "Test";
026    
027        private boolean createTestClass = true;
028    
029        String toolsPackage = "tools";
030    
031        Date startAll;
032    
033        Date startJModedlCreation;
034    
035        Date startPreparation;
036    
037        Date startToDisk;
038    
039        Date stopAll;
040    
041        OntModel model;
042    
043        private Map<String, String> mappings = new HashMap<String, String>();
044    
045        JModel jmodel;
046    
047        protected boolean reasignDomainlessProperties = true;
048    
049        protected boolean enableCodeFormatting = true;
050    
051        protected Properties codeFormatterOptions = null;
052    
053        public void generate(String uri, String altLocation, String baseDir, String basePackage) {
054            startAll = new Date();
055    
056            OntModel owlModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
057            OntDocumentManager owlDocMgr = owlModel.getDocumentManager();
058            owlDocMgr.setProcessImports(true);
059            owlDocMgr.addAltEntry(uri, altLocation);
060            addMappings(owlDocMgr, uri);
061            owlModel.read(uri);
062    
063            generate(owlModel, baseDir, basePackage);
064        }
065    
066        public void generate(String uri, String baseDir, String basePackage) {
067            startAll = new Date();
068    
069            OntModel owlModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
070            OntDocumentManager owlDocMgr = owlModel.getDocumentManager();
071            owlDocMgr.setProcessImports(true);
072            addMappings(owlDocMgr, uri);
073            owlModel.read(uri);
074    
075            generate(owlModel, baseDir, basePackage);
076        }
077    
078        public void generate(OntModel model, String baseDir, String basePackage) {
079            // Note: model needs to be OWL_DL_MEM !!!
080            this.model = model;
081    
082            startJModedlCreation = new Date();
083            if (startAll == null) {
084                startAll = startJModedlCreation;
085            }
086            // read the model
087            OwlReader mReader = new OwlReader();
088            mReader.setBasePackage(basePackage);
089            mReader.addForbiddenPrefix(toolsPackage);
090            this.jmodel = mReader.generateJModel(model);
091    
092            // prepare the model
093            startPreparation = new Date();
094            ModelPreparation mPrep = new ModelPreparation();
095            mPrep.setReasignDomainlessProperties(reasignDomainlessProperties);
096            this.jmodel = mPrep.prepareModel(jmodel);
097    
098            // write the model
099            startToDisk = new Date();
100            JavaWriter mWriter = new JavaWriter();
101            mWriter.setVocabularyName(vocabularyName);
102            mWriter.setToolsPackage(toolsPackage);
103            mWriter.setFactoryName(factoryName);
104            mWriter.setCreateTestClass(createTestClass);
105            mWriter.setTestClassName(testClassName);
106            mWriter.setEnableCodeFormatting(enableCodeFormatting);
107            mWriter.setCodeFormatterOptions(codeFormatterOptions);
108            mWriter.generate(this.jmodel, baseDir, basePackage);
109    
110            stopAll = new Date();
111        }
112    
113        public void setVocabularyName(String vocabularyName) {
114            this.vocabularyName = vocabularyName;
115        }
116    
117    
118        public void setFactoryName(String factoryName) {
119            this.factoryName = factoryName;
120        }
121    
122        public void setCreateTestClass(boolean createTestClass) {
123            this.createTestClass = createTestClass;
124        }
125    
126        public void setTestcaseName(String testcaseName) {
127            this.testClassName = testcaseName;
128        }
129    
130        public boolean addMappings(String uri, String altLocation) {
131            if (uri == null || altLocation == null) {
132                return false;
133            }
134            if (mappings == null) {
135                mappings = new HashMap<String, String>();
136            }
137            if (mappings.containsKey(uri)) {
138                return false;
139            }
140            mappings.put(uri, altLocation);
141            return true;
142        }
143    
144        protected void addMappings(OntDocumentManager owlDocMgr, String top_uri) {
145            if (mappings != null && !mappings.isEmpty()) {
146                int lastSlash = top_uri == null ? 0 : top_uri.lastIndexOf('/');
147                String baseuri = lastSlash >= 0 ? top_uri.substring(0, lastSlash) : top_uri;
148                for (int i = 0; i < mappings.size(); i++) {
149                    Iterator<String> itr = mappings.keySet().iterator();
150                    while (itr.hasNext()) {
151                        String uri = itr.next();
152                        String altloc = baseuri + "/" + mappings.get(uri);
153                        owlDocMgr.addAltEntry(uri, altloc);
154                        System.out.println("uri=" + uri + "; altloc=" + altloc);
155                    }
156                }
157            }
158        }
159    
160        public String getStatistics() {
161            String str = new String();
162            if (this.jmodel != null)
163                str += jmodel.getStatistics() + "\n";
164            str += "Total Time: " + (stopAll.getTime() - startAll.getTime()) + " ms\n";
165            str += "Reading the Owl Model: " + (startJModedlCreation.getTime() - startAll.getTime()) + " ms\n";
166            str += "Creating the JModel: " + (startPreparation.getTime() - startJModedlCreation.getTime()) + " ms\n";
167            str += "Preparing the JModel: " + (startToDisk.getTime() - startPreparation.getTime()) + " ms\n";
168            str += "Writting the classes: " + (stopAll.getTime() - startToDisk.getTime()) + " ms\n";
169    
170            return str;
171        }
172    
173        public String getJModelReport() {
174            if (this.jmodel != null)
175                return jmodel.getJModelReport();
176            return new String();
177        }
178    
179        public OntModel getOntModel() {
180            return model;
181        }
182    
183        public JModel getJModel() {
184            return jmodel;
185        }
186    
187        public void setToolsPackage(String toolsPackage) {
188            this.toolsPackage = toolsPackage;
189        }
190    
191        public void setReasignDomainlessProperties(boolean reasignDomainlessProperties) {
192            this.reasignDomainlessProperties = reasignDomainlessProperties;
193        }
194    
195        public void setEnableCodeFormating(boolean enableCodeFormatting) {
196            this.enableCodeFormatting = enableCodeFormatting;
197        }
198    
199        public void setCodeFormatterOptions(Properties codeFormatterOptions) {
200            this.codeFormatterOptions = codeFormatterOptions;
201        }
202    
203    }