OWL2Parser.java revision 4ffc423a7df8af7e7d7e563a15471da4505ddeb5
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignaziopackage de.unibremen.informatik;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.BufferedReader;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.BufferedWriter;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.File;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.FileReader;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.FileWriter;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.IOException;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.OutputStreamWriter;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.Writer;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.net.URI;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.net.URLConnection;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.util.ArrayList;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.util.HashSet;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.util.Set;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
d25c69509848853b0b15b93e3cc180cab81047acChristian Maederimport org.coode.owlapi.owlxml.renderer.OWLXMLRenderer;
d25c69509848853b0b15b93e3cc180cab81047acChristian Maederimport org.coode.owlapi.rdf.rdfxml.RDFXMLRenderer;
2578a6d217296401d347302c9104fee179bd0470Francisc Nicolae Bungiuimport org.semanticweb.owlapi.apibinding.OWLManager;
d25c69509848853b0b15b93e3cc180cab81047acChristian Maederimport org.semanticweb.owlapi.io.OWLRendererException;
6f52b2f195d946649597c21e5888c70ccfeeb81eChristian Maederimport org.semanticweb.owlapi.io.StreamDocumentSource;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.model.IRI;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.model.MissingImportEvent;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.model.MissingImportHandlingStrategy;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.model.MissingImportListener;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.model.OWLOntology;
43f8464f7a29c9609509b9c58925f0432263803dSimon Ulbrichtimport org.semanticweb.owlapi.model.OWLOntologyLoaderConfiguration;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.model.OWLOntologyManager;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport org.semanticweb.owlapi.util.OWLOntologyMerger;
2578a6d217296401d347302c9104fee179bd0470Francisc Nicolae Bungiu
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport uk.ac.manchester.cs.owl.owlapi.OWLOntologyIRIMapperImpl;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport uk.ac.manchester.cs.owl.owlapi.mansyntaxrenderer.ManchesterOWLSyntaxRenderer;
2578a6d217296401d347302c9104fee179bd0470Francisc Nicolae Bungiu
2578a6d217296401d347302c9104fee179bd0470Francisc Nicolae Bungiupublic class OWL2Parser {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio private static enum OPTION {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio OWL_XML, MANCHESTER, RDF_XML, OBO, TURTLE
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist private static Boolean quick = false;
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder private static Boolean cyclic = false;
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist protected static final Set<IRI> missingImports = new HashSet<IRI>();
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder private static Set<OWLOntology> ontologies;
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder private static final Set<OWLOntology> exported = new HashSet<OWLOntology>();
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben private static OWLOntologyManager manager = setupManagerWithMissingImportListener();
43f8464f7a29c9609509b9c58925f0432263803dSimon Ulbricht private static OWLOntologyIRIMapperImpl mapper = new OWLOntologyIRIMapperImpl();
b1854c6c6cbc17bd15e317b7b787b29b0b788e8cnotanartist private static URI uri = null;
ae0124755bed317b3e11afe1c6275fdb488807acnotanartist
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder public static void main(String[] args) {
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder // A simple example of how to load and save an ontology
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder try {
ae0124755bed317b3e11afe1c6275fdb488807acnotanartist OWLOutputHandler out = new OWLOutputHandler();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio parseArgs(args, out);
a933696a057bd1ad025d2d8e6b7079cc8e979d6eChristian Maeder URLConnection con = uri.toURL().openConnection();
ebe1b5c42cea5468e66f088648362125cb3c2818Christian Maeder con.addRequestProperty("Accept", "text/plain");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio StreamDocumentSource sds = new StreamDocumentSource(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio con.getInputStream(), IRI.create(uri));
6f52b2f195d946649597c21e5888c70ccfeeb81eChristian Maeder OWLOntologyLoaderConfiguration config = new OWLOntologyLoaderConfiguration();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio config = config
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio .setMissingImportHandlingStrategy(MissingImportHandlingStrategy.SILENT);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio OWLOntology ontology = manager.loadOntologyFromOntologyDocument(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio sds, config);
c1cca90cf3d763a48705ddaeeffb3c2d82e9e37eSimon Ulbricht if (!missingImports.isEmpty()) {
c1cca90cf3d763a48705ddaeeffb3c2d82e9e37eSimon Ulbricht IRI ontohub = IRI.create("https://ontohub.org/external/");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio for (IRI mi : missingImports) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio mapper.addMapping(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio mi,
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio ontohub.resolve(mi.toURI().getHost()
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + mi.toURI().getPath()));
c1cca90cf3d763a48705ddaeeffb3c2d82e9e37eSimon Ulbricht }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio // reset the manager. clear out imports to avoid duplicates
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben manager = setupManagerWithMissingImportListener();
c1cca90cf3d763a48705ddaeeffb3c2d82e9e37eSimon Ulbricht manager.addIRIMapper(mapper);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist // collect missing imports again to report them in output file.
c1cca90cf3d763a48705ddaeeffb3c2d82e9e37eSimon Ulbricht missingImports.clear();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio ontology = manager
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio .loadOntologyFromOntologyDocument(sds, config);
43f8464f7a29c9609509b9c58925f0432263803dSimon Ulbricht }
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder ontologies = getImports(ontology, new HashSet<OWLOntology>());
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist out._open();
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder if (cyclic) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio String str = ontology.getOntologyID().getOntologyIRI()
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio .toString();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio String merged_name = str + ".merged.owl"; // we must make a new
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio // name!
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder // System.out.println("NAME: " + merged_name + "\n");
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder IRI mergedOntologyIRI = IRI.create(merged_name);
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder // System.out.println("MERGED_IRI " + mergedOntologyIRI + "\n");
91e24fc45834b35f2a3830d72565640251149bf3Christian Maeder OWLOntology merged;
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist // Axioms can be excluded when 'quick' Option selected
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (quick) {
91e24fc45834b35f2a3830d72565640251149bf3Christian Maeder merged = manager.createOntology(mergedOntologyIRI);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else {
91e24fc45834b35f2a3830d72565640251149bf3Christian Maeder OWLOntologyMerger merger = new OWLOntologyMerger(manager);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio merged = merger.createMergedOntology(manager,
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio mergedOntologyIRI);
91e24fc45834b35f2a3830d72565640251149bf3Christian Maeder }
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist out.renderUsingOption(merged);
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder } else {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder ontologies.add(ontology);
b1854c6c6cbc17bd15e317b7b787b29b0b788e8cnotanartist exportImports(out);
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist out._close();
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder } catch (Exception ex) {
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder System.err.println("OWL parse error: " + ex.getMessage());
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder ex.printStackTrace();
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder
ae0124755bed317b3e11afe1c6275fdb488807acnotanartist // print usage information screen
ae0124755bed317b3e11afe1c6275fdb488807acnotanartist private static void showHelpScreen() {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio System.out.println("Usage: processor [<options..>] <URI>\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + "_>_options_<______________\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " | -o <tp> <fn> ..write output to file\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " - - - tp <- type [: owl xml omn rdf obo dol ttl]\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " - - - fn <- filename\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " | -o-sys <tp> ..write output to system.out\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " - - - - - tp <- type\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " | -qk ..internal(!) sets 'quick' option\n"
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + " | -h ..this helptext");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist // parse arguments according to option set
b1854c6c6cbc17bd15e317b7b787b29b0b788e8cnotanartist // fails for unknown or incomplete arguments, or when IRI is not set
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio private static void parseArgs(String[] args, OWLOutputHandler out)
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throws Exception {
ae0124755bed317b3e11afe1c6275fdb488807acnotanartist String inp = "", msg = "OWL2Parser.parseArgs: ";
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (args.length == 0) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(msg + "no arguments provided");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist for (int i = 0; i < args.length; i++) {
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist String arg = args[i].toLowerCase();
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist if (arg.startsWith("-")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (arg.equals("-o")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (!(i < args.length - 2)) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio msg
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + "insufficient arguments (-o [format] [filename])");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio out.add(parseOption(args[++i].toLowerCase(), msg),
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio args[++i]);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else if (arg.equals("-o-sys")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (!(i < args.length - 1)) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(msg
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio + "insufficient arguments (-o-sys [format])");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio out.add(parseOption(args[++i].toLowerCase(), msg));
25f163f5755534f518718981c8b160fdf5097773notanartist } else if (arg.equals("-qk") || arg.equals("-q")) {
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist quick = true;
25f163f5755534f518718981c8b160fdf5097773notanartist } else if (arg.equals("-h") || arg.equals("--help")) {
25f163f5755534f518718981c8b160fdf5097773notanartist showHelpScreen();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(msg + "unknown command <" + arg + ">");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist } else {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (!inp.equals("")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(msg + "ambigious IRI");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
b1854c6c6cbc17bd15e317b7b787b29b0b788e8cnotanartist inp = args[i]; // read again to undo earlier 'toLowerCase'
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (arg.startsWith("http:") || arg.startsWith("https:")) {
b1854c6c6cbc17bd15e317b7b787b29b0b788e8cnotanartist uri = new URI(inp);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio uri = new File(inp).toURI();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (inp.equals("")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(msg + "IRI not set");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben }
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio private static OPTION parseOption(String opt, String err) throws Exception {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (opt.equals("xml") || opt.equals("owl")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio return OPTION.OWL_XML;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else if (opt.equals("omn")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio return OPTION.MANCHESTER;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else if (opt.equals("rdf")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio return OPTION.RDF_XML;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else if (opt.equals("obo")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio return OPTION.OBO;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else if (opt.equals("ttl")) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio return OPTION.TURTLE;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio throw new Exception(err + "unrecognized owl-format: " + opt);
c7d44bc923b7eb1a01abd095cd004030fee589eanotanartist }
ae0124755bed317b3e11afe1c6275fdb488807acnotanartist
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio private static OWLOntologyManager setupManagerWithMissingImportListener() {
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben OWLOntologyManager mgr = OWLManager.createOWLOntologyManager();
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben mgr.addMissingImportListener(new HasMissingImports());
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben return mgr;
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben }
2e08f62eab7a9bd9becf08ce32871a39306e4798Szaben
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder private static class HasMissingImports implements MissingImportListener {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder @Override
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder public void importMissing(MissingImportEvent event) {
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder missingImports.add(event.getImportedOntologyURI());
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder }
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder }
7ca6e1b0867fc982f00128017f530b433ea8a37fChristian Maeder
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio private static Set<OWLOntology> getImports(OWLOntology ontology,
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio Set<OWLOntology> stop) {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder Set<OWLOntology> s = new HashSet<OWLOntology>();
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder Set<OWLOntology> next = new HashSet<OWLOntology>(stop);
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder next.add(ontology);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio for (OWLOntology imported : ontology.getDirectImports()) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (cyclic || next.contains(imported)) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio cyclic = true;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio } else if (!s.contains(imported)) {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder Set<OWLOntology> i = getImports(imported, next);
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder s.add(imported);
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder s.addAll(i);
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder return s;
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio private static void exportImports(OWLOutputHandler out) throws IOException {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder Boolean changed;
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder do {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder changed = false;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio for (OWLOntology onto : ontologies) {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder if (exported.containsAll(onto.getDirectImports())) {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder if (!exported.contains(onto)) {
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder changed = exported.add(onto);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist out.renderUsingOption(onto);
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4efb09a1f46a0b322633b729c9a9fd50bf270125Christian Maeder } while (changed);
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio // output handler allows and handles a list of output-requests
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio protected static class OWLOutputHandler {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio static ArrayList<OWLOntologyWriter> writer = new ArrayList<OWLOntologyWriter>();
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void add(OPTION op) throws Exception {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio writer.add(new OWLOntologyWriter(op));
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void add(OPTION op, String filename) throws Exception {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio writer.add(new OWLOntologyWriter(filename, op));
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void _open() throws IOException {
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist for (OWLOntologyWriter out : writer) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio out._open();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void _close() throws IOException {
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist for (OWLOntologyWriter out : writer) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio out._close();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist // function need to be called once to render and close every output
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void renderUsingOption(OWLOntology onto) throws IOException {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist for (OWLOntologyWriter out : writer) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio out.renderUsingOption(onto);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist // custem OntolgyWriter bundles a BufferedWriter with an OWL output format
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist protected static class OWLOntologyWriter extends BufferedWriter {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist protected static OPTION option;
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio OWLOntologyWriter(String fn, OPTION op) throws Exception {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio super(new FileWriter(fn));
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio option = op;
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio OWLOntologyWriter(OPTION op) throws Exception {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio super(new OutputStreamWriter(System.out));
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist option = op;
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void writeMissingImports() throws IOException {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist for (IRI mi : missingImports) {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist write("<Missing>" + mi + "</Missing>\n");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void _open() throws IOException {
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist if (option == OPTION.OWL_XML) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio write("<Ontologies>\n");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void _close() throws IOException {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio if (option == OPTION.OWL_XML) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio writeMissingImports();
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist write("\n</Ontologies>\n");
ea200f8484810ec6d7436f8c1b8286e7e61f4551notanartist }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio _close(this);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void _close(Writer pointer) throws IOException {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist pointer.flush();
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist pointer.close();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void renderUsingOption(OWLOntology onto) throws IOException {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio switch (option) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio case OWL_XML:
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist renderAsXml(onto);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist break;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio case MANCHESTER:
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio renderAsOmn(onto);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio break;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio case RDF_XML:
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio renderAsRdf(onto);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio break;
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist // TODO: the below still need implementation!
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio case OBO:
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio renderAsXml(onto);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio break;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio case TURTLE:
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio renderAsXml(onto);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio break;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void renderAsOmn(OWLOntology onto) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio try {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist ManchesterOWLSyntaxRenderer omnrend = new ManchesterOWLSyntaxRenderer();
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist omnrend.render(onto, this);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist } catch (OWLRendererException ex) {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist System.err.println("Error by ManchesterParser!");
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist ex.printStackTrace();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void renderAsXml(OWLOntology onto) {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist try {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist OWLXMLRenderer xmlren = new OWLXMLRenderer();
c21fdc9d17fd00d8433cfc75895dc081bfa7a586notanartist File tempFile = File.createTempFile("owlTemp_1", ".xml");
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist FileWriter buf = new FileWriter(tempFile);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist if (quick) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio onto.getOWLOntologyManager().removeAxioms(onto,
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio onto.getAxioms());
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist }
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist xmlren.render(onto, buf);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio _close(buf);
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio BufferedReader rBuf = new BufferedReader(new FileReader(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio tempFile));
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio rBuf.readLine(); // ignore the first line containing <?xml
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio // version="1.0"?>
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio while (rBuf.ready()) {
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio append(rBuf.readLine()).append("\n");
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist rBuf.close();
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist tempFile.deleteOnExit();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio append("<Loaded name=\"").append(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio manager.getOntologyDocumentIRI(onto));
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio append("\" ontiri=\"").append(
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio onto.getOntologyID().getOntologyIRI());
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist append("\"/>\n");
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist } catch (Exception ex) {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist System.err.println("Error by XMLParser!");
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist ex.printStackTrace();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio void renderAsRdf(OWLOntology onto) {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist try {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist RDFXMLRenderer rdfrend = new RDFXMLRenderer(onto, this);
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist rdfrend.render();
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist } catch (IOException ex) {
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist System.err.println("Error by RDFParser!");
b1d1bda618f7b145c28645f39b0ca651b8001ebanotanartist ex.printStackTrace();
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazio }
d25c69509848853b0b15b93e3cc180cab81047acChristian Maeder }
2578a6d217296401d347302c9104fee179bd0470Francisc Nicolae Bungiu}