001    package org.nlp2rdf.ontology;
002    
003    import com.hp.hpl.jena.ontology.OntModel;
004    import com.hp.hpl.jena.ontology.OntModelSpec;
005    import com.hp.hpl.jena.ontology.impl.OntModelImpl;
006    import com.hp.hpl.jena.rdf.model.Model;
007    import com.hp.hpl.jena.rdf.model.ModelFactory;
008    import org.slf4j.Logger;
009    import org.slf4j.LoggerFactory;
010    
011    import java.io.IOException;
012    import java.io.InputStream;
013    import java.net.MalformedURLException;
014    import java.net.URL;
015    import java.util.HashSet;
016    import java.util.Set;
017    
018    /**
019     * @author Sebastian Hellmann - http://bis.informatik.uni-leipzig.de/SebastianHellmann
020     *         Created: 29.06.11
021     *         <p/>
022     *         //TODO there is some domain specific replacements  in this class
023     *         private String toClasspath(String ontologyUrl) throws MalformedURLException{
024     *         ontologyUrl = ontologyUrl.replace("http://nlp2rdf.lod2.eu/schema/sso/", "http://nlp2rdf.lod2.eu/schema/sso/sso.owl");
025     *         ontologyUrl = ontologyUrl.replace("http://nlp2rdf.lod2.eu/schema/string/", "http://nlp2rdf.lod2.eu/schema/string/string.owl");
026     */
027    public class ClasspathLoader implements OntologyLoader {
028        private static Logger log = LoggerFactory.getLogger(ClasspathLoader.class);
029    
030        public static void main(String[] args) throws Exception {
031            String test = "http://nlp2rdf.lod2.eu/schema/sso/";
032            System.out.println(new ClasspathLoader().loadOntology(test));
033        }
034    
035        public class CC extends OntModelImpl {
036            public CC(OntModelSpec spec, Model model) {
037                super(spec, model);
038            }
039        }
040    
041        @Override
042        public OntModel loadOntology(String ontologyUri) {
043            return loadOntology(ontologyUri, OntModelSpec.OWL_DL_MEM);
044        }
045    
046        @Override
047        public OntModel loadOntology(String ontologyUri, OntModelSpec spec) {
048            OntModel model = ModelFactory.createOntologyModel(spec);
049            model.getDocumentManager().setProcessImports(false);
050            try {
051                InputStream is = this.getClass().getClassLoader().getResourceAsStream(toClasspath(ontologyUri));
052                model.read(is, "");
053                log.info("ontology " + ontologyUri + " was loaded from classpath. ");
054            } catch (MalformedURLException e) {
055                log.error("" + ontologyUri, e);
056            } catch (IOException e) {
057                log.warn("ontology was not in classpath, loading from url" + ontologyUri, e);
058                log.error("exit for development");
059                System.exit(0);
060                model.read(ontologyUri);
061            }
062            return model;
063        }
064    
065    
066        @Override
067        public void loadImports(OntModel model) {
068            loadImports(model, new HashSet<String>());
069        }
070    
071    
072        private void loadImports(OntModel m, Set<String> loaded) {
073            for (String one : m.listImportedOntologyURIs()) {
074                log.debug("adding one more: " + one);
075                if (loaded.add(one) == false) {
076                    log.debug("skipping " + one + " (already loaded)");
077                    continue;
078                }
079                OntModel sm = loadOntology(one);
080                loadImports(sm);
081                m.addSubModel(sm);
082            }
083        }
084    
085    
086        public String toClasspath(String ontologyUrl) throws MalformedURLException {
087    
088            ontologyUrl = ontologyUrl.replace("http://nlp2rdf.lod2.eu/schema/sso/", "http://nlp2rdf.lod2.eu/schema/sso/sso.owl");
089            ontologyUrl = ontologyUrl.replace("http://nlp2rdf.lod2.eu/schema/string/", "http://nlp2rdf.lod2.eu/schema/string/string.owl");
090    
091            StringBuilder sb = new StringBuilder();
092    
093            URL u = new URL(ontologyUrl);
094    
095            //reverse host
096            String host = u.getHost();
097            for (String s : host.split("\\.")) {
098                sb.insert(0, s + "/");
099            }
100    
101            //sb.insert(0, "classpath:");
102    
103            //get path
104            sb.append(u.getPath());
105    
106            return sb.toString().replace("//", "/");
107    
108        }
109    
110    }