4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.BufferedWriter;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.File;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elknerimport java.io.FileInputStream;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elknerimport java.io.FileOutputStream;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.FileWriter;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.IOException;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elknerimport java.io.InputStreamReader;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.OutputStreamWriter;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.io.Writer;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elknerimport java.net.HttpURLConnection;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elknerimport java.net.MalformedURLException;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.net.URI;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elknerimport java.net.URL;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.net.URLConnection;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.util.ArrayList;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.util.HashSet;
4ffc423a7df8af7e7d7e563a15471da4505ddeb5ignazioimport java.util.Set;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elknerimport java.util.zip.GZIPInputStream;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elknerimport java.util.zip.GZIPOutputStream;
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
53680982da7898ae889870da416205a85f0bffadJens Elkner private static enum OPTION {
53680982da7898ae889870da416205a85f0bffadJens Elkner OWL_XML, MANCHESTER, RDF_XML, OBO, TURTLE
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner private static Boolean quick = false;
53680982da7898ae889870da416205a85f0bffadJens Elkner private static Boolean cyclic = false;
53680982da7898ae889870da416205a85f0bffadJens Elkner protected static final Set<IRI> missingImports = new HashSet<IRI>();
53680982da7898ae889870da416205a85f0bffadJens Elkner private static Set<OWLOntology> ontologies;
53680982da7898ae889870da416205a85f0bffadJens Elkner private static final Set<OWLOntology> exported = new HashSet<OWLOntology>();
53680982da7898ae889870da416205a85f0bffadJens Elkner private static OWLOntologyManager manager =
53680982da7898ae889870da416205a85f0bffadJens Elkner setupManagerWithMissingImportListener();
53680982da7898ae889870da416205a85f0bffadJens Elkner private static OWLOntologyIRIMapperImpl mapper =
53680982da7898ae889870da416205a85f0bffadJens Elkner new OWLOntologyIRIMapperImpl();
53680982da7898ae889870da416205a85f0bffadJens Elkner private static URI uri = null;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner private static int maxRedirects = 0;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner private static void checkMaxRedirects() {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner String t = System.getProperty("http.maxRedirects", null);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (t == null || t.isEmpty()) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner maxRedirects = 20;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner try {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner int n = Integer.parseInt(t, 10);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (n > 0) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner maxRedirects = n;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner } catch (NumberFormatException nfe) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.err.println("Ignoring invalid system property "
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner + "'http.maxRedirects' - invalid number '" + t + "'");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner private static URLConnection getConnection(URL url, int redirCount)
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner throws IOException
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner URLConnection c = url.openConnection();
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (!(c instanceof HttpURLConnection)) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return c;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner HttpURLConnection con = (HttpURLConnection) c;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner con.addRequestProperty("Accept", "text/plain");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner con.setConnectTimeout(300 * 1000); // 5 min timeout
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner int status = con.getResponseCode();
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (status == HttpURLConnection.HTTP_MOVED_TEMP
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner || status == HttpURLConnection.HTTP_MOVED_PERM
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner || status == HttpURLConnection.HTTP_SEE_OTHER)
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (redirCount > maxRedirects) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.err.println("Max. redirects (" + maxRedirects
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner + ") reached for " + url);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return null;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner String loc = null;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner try {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner loc = con.getHeaderField("Location");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (loc == null) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.err.println("Invalid redirect by '" + url
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner + "' (missing Location header).");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return null;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner url = new URL(loc);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner } catch (MalformedURLException mue) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.err.println("'" + url + "' redirects to an unsupported "
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner + "resource (" + loc + ")");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return null;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner con.disconnect();
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return getConnection(url, redirCount + 1);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner } else if (status != HttpURLConnection.HTTP_OK) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.err.println("URL '" + url + "' is not OK (status " + status
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner + ").");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return null;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner return con;
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner public static void main(String[] args) {
53680982da7898ae889870da416205a85f0bffadJens Elkner // A simple example of how to load and save an ontology
53680982da7898ae889870da416205a85f0bffadJens Elkner try {
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOutputHandler out = new OWLOutputHandler();
53680982da7898ae889870da416205a85f0bffadJens Elkner parseArgs(args, out);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner checkMaxRedirects();
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner URLConnection con = getConnection(uri.toURL(), 0);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner if (con == null) {
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.err.println("Nothing to parse - exiting.");
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner System.exit(1);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner StreamDocumentSource sds =
53680982da7898ae889870da416205a85f0bffadJens Elkner new StreamDocumentSource(con.getInputStream(), IRI.create(uri));
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntologyLoaderConfiguration config =
53680982da7898ae889870da416205a85f0bffadJens Elkner new OWLOntologyLoaderConfiguration();
53680982da7898ae889870da416205a85f0bffadJens Elkner config = config
53680982da7898ae889870da416205a85f0bffadJens Elkner .setMissingImportHandlingStrategy(MissingImportHandlingStrategy.SILENT);
47bb42d5a2ea6356bfa21924a004637803bb440fJens Elkner config = config.setFollowRedirects(true);
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntology ontology =
53680982da7898ae889870da416205a85f0bffadJens Elkner manager.loadOntologyFromOntologyDocument(sds, config);
53680982da7898ae889870da416205a85f0bffadJens Elkner if ( !missingImports.isEmpty()) {
53680982da7898ae889870da416205a85f0bffadJens Elkner IRI ontohub = IRI.create("https://ontohub.org/external/");
53680982da7898ae889870da416205a85f0bffadJens Elkner for (IRI mi : missingImports) {
53680982da7898ae889870da416205a85f0bffadJens Elkner mapper.addMapping(mi, ontohub.resolve(mi.toURI().getHost()
53680982da7898ae889870da416205a85f0bffadJens Elkner + mi.toURI().getPath()));
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner // reset the manager. clear out imports to avoid duplicates
53680982da7898ae889870da416205a85f0bffadJens Elkner manager = setupManagerWithMissingImportListener();
53680982da7898ae889870da416205a85f0bffadJens Elkner manager.addIRIMapper(mapper);
53680982da7898ae889870da416205a85f0bffadJens Elkner // collect missing imports again to report them in output file.
53680982da7898ae889870da416205a85f0bffadJens Elkner missingImports.clear();
53680982da7898ae889870da416205a85f0bffadJens Elkner ontology =
53680982da7898ae889870da416205a85f0bffadJens Elkner manager.loadOntologyFromOntologyDocument(sds, config);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner ontologies = getImports(ontology, new HashSet<OWLOntology>());
53680982da7898ae889870da416205a85f0bffadJens Elkner out._open();
53680982da7898ae889870da416205a85f0bffadJens Elkner if (cyclic) {
53680982da7898ae889870da416205a85f0bffadJens Elkner String str = ontology.getOntologyID().getOntologyIRI().toString();
53680982da7898ae889870da416205a85f0bffadJens Elkner // we must make a new name
53680982da7898ae889870da416205a85f0bffadJens Elkner String merged_name = str + ".merged.owl";
53680982da7898ae889870da416205a85f0bffadJens Elkner // System.out.println("NAME: " + merged_name + "\n");
53680982da7898ae889870da416205a85f0bffadJens Elkner IRI mergedOntologyIRI = IRI.create(merged_name);
53680982da7898ae889870da416205a85f0bffadJens Elkner // System.out.println("MERGED_IRI " + mergedOntologyIRI + "\n");
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntology merged;
53680982da7898ae889870da416205a85f0bffadJens Elkner // Axioms can be excluded when 'quick' Option selected
53680982da7898ae889870da416205a85f0bffadJens Elkner if (quick) {
53680982da7898ae889870da416205a85f0bffadJens Elkner merged = manager.createOntology(mergedOntologyIRI);
53680982da7898ae889870da416205a85f0bffadJens Elkner } else {
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntologyMerger merger = new OWLOntologyMerger(manager);
53680982da7898ae889870da416205a85f0bffadJens Elkner merged =
53680982da7898ae889870da416205a85f0bffadJens Elkner merger.createMergedOntology(manager, mergedOntologyIRI);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner out.renderUsingOption(merged);
53680982da7898ae889870da416205a85f0bffadJens Elkner } else {
53680982da7898ae889870da416205a85f0bffadJens Elkner ontologies.add(ontology);
53680982da7898ae889870da416205a85f0bffadJens Elkner exportImports(out);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner out._close();
53680982da7898ae889870da416205a85f0bffadJens Elkner } catch (Exception ex) {
53680982da7898ae889870da416205a85f0bffadJens Elkner System.err.println("OWL parse error: " + ex.getMessage());
53680982da7898ae889870da416205a85f0bffadJens Elkner ex.printStackTrace();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner // print usage information screen
53680982da7898ae889870da416205a85f0bffadJens Elkner private static void showHelpScreen() {
53680982da7898ae889870da416205a85f0bffadJens Elkner System.out.println("Usage: processor [<options..>] <URI>\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + "_>_options_<______________\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " | -o <tp> <fn> ..write output to file\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " - - - tp <- type [: owl xml omn rdf obo dol ttl]\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " - - - fn <- filename\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " | -o-sys <tp> ..write output to system.out\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " - - - - - tp <- type\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " | -qk ..internal(!) sets 'quick' option\n"
53680982da7898ae889870da416205a85f0bffadJens Elkner + " | -h ..this helptext");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner // parse arguments according to option set
53680982da7898ae889870da416205a85f0bffadJens Elkner // fails for unknown or incomplete arguments, or when IRI is not set
53680982da7898ae889870da416205a85f0bffadJens Elkner private static void parseArgs(String[] args, OWLOutputHandler out)
53680982da7898ae889870da416205a85f0bffadJens Elkner throws Exception
53680982da7898ae889870da416205a85f0bffadJens Elkner {
53680982da7898ae889870da416205a85f0bffadJens Elkner String inp = "", msg = "OWL2Parser.parseArgs: ";
53680982da7898ae889870da416205a85f0bffadJens Elkner if (args.length == 0) {
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(msg + "no arguments provided");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner for (int i = 0; i < args.length; i++ ) {
53680982da7898ae889870da416205a85f0bffadJens Elkner String arg = args[i].toLowerCase();
53680982da7898ae889870da416205a85f0bffadJens Elkner if (arg.startsWith("-")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (arg.equals("-o")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (!(i < args.length - 2)) {
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(msg
53680982da7898ae889870da416205a85f0bffadJens Elkner + "insufficient arguments (-o [format] [filename])");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner out.add(parseOption(args[++i].toLowerCase(), msg), args[++i]);
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (arg.equals("-o-sys")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (!(i < args.length - 1)) {
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(msg
53680982da7898ae889870da416205a85f0bffadJens Elkner + "insufficient arguments (-o-sys [format])");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner out.add(parseOption(args[ ++i].toLowerCase(), msg));
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (arg.equals("-qk") || arg.equals("-q")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner quick = true;
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (arg.equals("-h") || arg.equals("--help")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner showHelpScreen();
53680982da7898ae889870da416205a85f0bffadJens Elkner } else {
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(msg + "unknown command <" + arg + ">");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner } else {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (!inp.equals("")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(msg + "ambigious IRI");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner inp = args[i]; // read again to undo earlier 'toLowerCase'
53680982da7898ae889870da416205a85f0bffadJens Elkner if (arg.startsWith("http:") || arg.startsWith("https:")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner uri = new URI(inp);
53680982da7898ae889870da416205a85f0bffadJens Elkner } else {
53680982da7898ae889870da416205a85f0bffadJens Elkner uri = new File(inp).toURI();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner if (inp.equals("")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(msg + "IRI not set");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner private static OPTION parseOption(String opt, String err) throws Exception {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (opt.equals("xml") || opt.equals("owl")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner return OPTION.OWL_XML;
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (opt.equals("omn")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner return OPTION.MANCHESTER;
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (opt.equals("rdf")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner return OPTION.RDF_XML;
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (opt.equals("obo")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner return OPTION.OBO;
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (opt.equals("ttl")) {
53680982da7898ae889870da416205a85f0bffadJens Elkner return OPTION.TURTLE;
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner throw new Exception(err + "unrecognized owl-format: " + opt);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner private static OWLOntologyManager setupManagerWithMissingImportListener() {
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntologyManager mgr = OWLManager.createOWLOntologyManager();
53680982da7898ae889870da416205a85f0bffadJens Elkner mgr.addMissingImportListener(new HasMissingImports());
53680982da7898ae889870da416205a85f0bffadJens Elkner return mgr;
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner private static class HasMissingImports implements MissingImportListener {
53680982da7898ae889870da416205a85f0bffadJens Elkner @Override
53680982da7898ae889870da416205a85f0bffadJens Elkner public void importMissing(MissingImportEvent event) {
53680982da7898ae889870da416205a85f0bffadJens Elkner missingImports.add(event.getImportedOntologyURI());
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner private static Set<OWLOntology> getImports(OWLOntology ontology,
53680982da7898ae889870da416205a85f0bffadJens Elkner Set<OWLOntology> stop)
53680982da7898ae889870da416205a85f0bffadJens Elkner {
53680982da7898ae889870da416205a85f0bffadJens Elkner Set<OWLOntology> s = new HashSet<OWLOntology>();
53680982da7898ae889870da416205a85f0bffadJens Elkner Set<OWLOntology> next = new HashSet<OWLOntology>(stop);
53680982da7898ae889870da416205a85f0bffadJens Elkner next.add(ontology);
53680982da7898ae889870da416205a85f0bffadJens Elkner for (OWLOntology imported : ontology.getDirectImports()) {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (cyclic || next.contains(imported)) {
53680982da7898ae889870da416205a85f0bffadJens Elkner cyclic = true;
53680982da7898ae889870da416205a85f0bffadJens Elkner } else if (!s.contains(imported)) {
53680982da7898ae889870da416205a85f0bffadJens Elkner Set<OWLOntology> i = getImports(imported, next);
53680982da7898ae889870da416205a85f0bffadJens Elkner s.add(imported);
53680982da7898ae889870da416205a85f0bffadJens Elkner s.addAll(i);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner return s;
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner private static void exportImports(OWLOutputHandler out) throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner Boolean changed;
53680982da7898ae889870da416205a85f0bffadJens Elkner do {
53680982da7898ae889870da416205a85f0bffadJens Elkner changed = false;
53680982da7898ae889870da416205a85f0bffadJens Elkner for (OWLOntology onto : ontologies) {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (exported.containsAll(onto.getDirectImports())) {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (!exported.contains(onto)) {
53680982da7898ae889870da416205a85f0bffadJens Elkner changed = exported.add(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner out.renderUsingOption(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner } while (changed);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner // output handler allows and handles a list of output-requests
53680982da7898ae889870da416205a85f0bffadJens Elkner protected static class OWLOutputHandler {
53680982da7898ae889870da416205a85f0bffadJens Elkner static ArrayList<OWLOntologyWriter> writer =
53680982da7898ae889870da416205a85f0bffadJens Elkner new ArrayList<OWLOntologyWriter>();
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void add(OPTION op) throws Exception {
53680982da7898ae889870da416205a85f0bffadJens Elkner writer.add(new OWLOntologyWriter(op));
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void add(OPTION op, String filename) throws Exception {
53680982da7898ae889870da416205a85f0bffadJens Elkner writer.add(new OWLOntologyWriter(filename, op));
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void _open() throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner for (OWLOntologyWriter out : writer) {
53680982da7898ae889870da416205a85f0bffadJens Elkner out._open();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void _close() throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner for (OWLOntologyWriter out : writer) {
53680982da7898ae889870da416205a85f0bffadJens Elkner out._close();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner // function need to be called once to render and close every output
53680982da7898ae889870da416205a85f0bffadJens Elkner void renderUsingOption(OWLOntology onto) throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner for (OWLOntologyWriter out : writer) {
53680982da7898ae889870da416205a85f0bffadJens Elkner out.renderUsingOption(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner // custem OntolgyWriter bundles a BufferedWriter with an OWL output format
53680982da7898ae889870da416205a85f0bffadJens Elkner protected static class OWLOntologyWriter extends BufferedWriter {
53680982da7898ae889870da416205a85f0bffadJens Elkner protected static OPTION option;
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntologyWriter(String fn, OPTION op) throws Exception {
53680982da7898ae889870da416205a85f0bffadJens Elkner super(new FileWriter(fn));
53680982da7898ae889870da416205a85f0bffadJens Elkner option = op;
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLOntologyWriter(OPTION op) throws Exception {
53680982da7898ae889870da416205a85f0bffadJens Elkner super(new OutputStreamWriter(System.out));
53680982da7898ae889870da416205a85f0bffadJens Elkner option = op;
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void writeMissingImports() throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner for (IRI mi : missingImports) {
53680982da7898ae889870da416205a85f0bffadJens Elkner write("<Missing>" + mi + "</Missing>\n");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void _open() throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (option == OPTION.OWL_XML) {
53680982da7898ae889870da416205a85f0bffadJens Elkner write("<Ontologies>\n");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void _close() throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner if (option == OPTION.OWL_XML) {
53680982da7898ae889870da416205a85f0bffadJens Elkner writeMissingImports();
53680982da7898ae889870da416205a85f0bffadJens Elkner write("\n</Ontologies>\n");
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner _close(this);
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void _close(Writer pointer) throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner pointer.flush();
53680982da7898ae889870da416205a85f0bffadJens Elkner pointer.close();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void renderUsingOption(OWLOntology onto) throws IOException {
53680982da7898ae889870da416205a85f0bffadJens Elkner switch (option) {
53680982da7898ae889870da416205a85f0bffadJens Elkner case OWL_XML:
53680982da7898ae889870da416205a85f0bffadJens Elkner renderAsXml(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner break;
53680982da7898ae889870da416205a85f0bffadJens Elkner case MANCHESTER:
53680982da7898ae889870da416205a85f0bffadJens Elkner renderAsOmn(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner break;
53680982da7898ae889870da416205a85f0bffadJens Elkner case RDF_XML:
53680982da7898ae889870da416205a85f0bffadJens Elkner renderAsRdf(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner break;
53680982da7898ae889870da416205a85f0bffadJens Elkner // TODO: the below still need implementation!
53680982da7898ae889870da416205a85f0bffadJens Elkner case OBO:
53680982da7898ae889870da416205a85f0bffadJens Elkner renderAsXml(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner break;
53680982da7898ae889870da416205a85f0bffadJens Elkner case TURTLE:
53680982da7898ae889870da416205a85f0bffadJens Elkner renderAsXml(onto);
53680982da7898ae889870da416205a85f0bffadJens Elkner break;
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void renderAsOmn(OWLOntology onto) {
53680982da7898ae889870da416205a85f0bffadJens Elkner try {
53680982da7898ae889870da416205a85f0bffadJens Elkner ManchesterOWLSyntaxRenderer omnrend =
53680982da7898ae889870da416205a85f0bffadJens Elkner new ManchesterOWLSyntaxRenderer();
53680982da7898ae889870da416205a85f0bffadJens Elkner omnrend.render(onto, this);
53680982da7898ae889870da416205a85f0bffadJens Elkner } catch (OWLRendererException ex) {
53680982da7898ae889870da416205a85f0bffadJens Elkner System.err.println("Error by ManchesterParser!");
53680982da7898ae889870da416205a85f0bffadJens Elkner ex.printStackTrace();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void renderAsXml(OWLOntology onto) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner FileOutputStream fos = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner FileInputStream fis = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner OutputStreamWriter out = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner InputStreamReader in = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner char[] buf = new char[8192];
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner int c, n;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner int chomp = -1;
53680982da7898ae889870da416205a85f0bffadJens Elkner try {
53680982da7898ae889870da416205a85f0bffadJens Elkner OWLXMLRenderer xmlren = new OWLXMLRenderer();
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner String t = System.getenv("HETS_GZIP");
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner boolean gz = t == null || t.equalsIgnoreCase("on");
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner t = gz ? ".xml.gz" : ".xml";
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner String tmpDir = System.getenv("TMPDIR");
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner File tempFile = File.createTempFile("owlTemp_1", t,
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner tmpDir == null ? null : new File(tmpDir));
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner fos = new FileOutputStream(tempFile);
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner out = new OutputStreamWriter(gz
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner ? new GZIPOutputStream(fos, 4096)
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner : fos,
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner "UTF-8");
53680982da7898ae889870da416205a85f0bffadJens Elkner if (quick) {
53680982da7898ae889870da416205a85f0bffadJens Elkner onto.getOWLOntologyManager()
53680982da7898ae889870da416205a85f0bffadJens Elkner .removeAxioms(onto,onto.getAxioms());
53680982da7898ae889870da416205a85f0bffadJens Elkner }
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner xmlren.render(onto, out);
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner out.close();
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner out = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner fos = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner fis = new FileInputStream(tempFile);
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner in = new InputStreamReader(gz
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner ? new GZIPInputStream(fis, 4096)
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner : fis,
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner "UTF-8");
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner // ignore the first line containing <?xml version="1.0"?>
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner while ((chomp != -2) && (c = in.read(buf, 0, 8192)) != -1) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner if (chomp == -1) {
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner n = 0;
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner while (n < c && buf[n] != '\n' && buf[n] != '\r') {
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner n++;
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner }
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner if (n < c) {
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner chomp = n;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner if (chomp != -1) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner // chomp trailing LF and CR
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner n = chomp;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner chomp = 0;
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner while (n < c && (buf[n] == '\n' || buf[n] == '\r')) {
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner n++;
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner }
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner if (n < c) {
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner write(buf, n, c - n);
bd14718aef718051dedc7ba736edd36e15371895Jens Elkner chomp = -2;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner // copy the remaining stuff as is
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner while ((c = in.read(buf, 0, 8192)) != -1) {
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner write(buf, 0, c);
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner }
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner in.close();
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner in = null;
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner fis = null;
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner t = System.getenv("HETS_KEEPTMP");
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner if (t == null || ! t.equalsIgnoreCase("on")) {
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner tempFile.deleteOnExit();
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner }
a5c14fe216541674b474665ef6e049d65427f812Jens Elkner append("<Loaded name=\"")
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner .append(manager.getOntologyDocumentIRI(onto))
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner .append("\" ontiri=\"")
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner .append(onto.getOntologyID().getOntologyIRI())
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner .append("\"/>\n");
53680982da7898ae889870da416205a85f0bffadJens Elkner } catch (Exception ex) {
53680982da7898ae889870da416205a85f0bffadJens Elkner System.err.println("Error by XMLParser!");
53680982da7898ae889870da416205a85f0bffadJens Elkner ex.printStackTrace();
3b04038d32edab784cb55e2a4e824ce4cd0f63edJens Elkner } finally {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner if (out != null) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner try { out.close(); } catch (Exception e) { /* nwcd */ }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner } else if (fos != null) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner try { fos.close(); } catch (Exception e) { /* nwcd */ }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner if (in != null) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner try { in.close(); } catch (Exception e) { /* nwcd */ }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner } else if (fis != null) {
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner try { fis.close(); } catch (Exception e) { /* nwcd */ }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
be8a364e20bf080501e6b7b76664c33b649ffac7Jens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner
53680982da7898ae889870da416205a85f0bffadJens Elkner void renderAsRdf(OWLOntology onto) {
53680982da7898ae889870da416205a85f0bffadJens Elkner try {
53680982da7898ae889870da416205a85f0bffadJens Elkner RDFXMLRenderer rdfrend = new RDFXMLRenderer(onto, this);
53680982da7898ae889870da416205a85f0bffadJens Elkner rdfrend.render();
53680982da7898ae889870da416205a85f0bffadJens Elkner } catch (IOException ex) {
53680982da7898ae889870da416205a85f0bffadJens Elkner System.err.println("Error by RDFParser!");
53680982da7898ae889870da416205a85f0bffadJens Elkner ex.printStackTrace();
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
53680982da7898ae889870da416205a85f0bffadJens Elkner }
2578a6d217296401d347302c9104fee179bd0470Francisc Nicolae Bungiu}