/*
* This code was adapted by Daniel Garijo from the LODE framework by
* Silvio Peroni.
* https://github.com/essepuntato/LODE
* Copyright (c) 2010-2013, Silvio Peroni <essepuntato@gmail.com>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
* Copyright 2012-2013 Ontology Engineering Group, Universidad Polit�cnica de Madrid, Spain
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package lode;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.HashSet;
import java.util.Set;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.semanticweb.owlapi.formats.OWLXMLDocumentFormat;
import org.semanticweb.owlapi.formats.RDFXMLDocumentFormat;
import org.semanticweb.owlapi.io.OWLOntologyDocumentTarget;
import org.semanticweb.owlapi.io.RDFXMLOntologyFormat;
import org.semanticweb.owlapi.io.StringDocumentTarget;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import widoco.Configuration;
/**
*
* @author Silvio Peroni, adpated to Widoco (and modified) by Daniel Garijo
*/
public class LODEGeneration {
public static String getLODEhtml(Configuration c, File lodeResources) throws Exception {
try {
String content = "";
String lang = c.getCurrentLanguage();
if (lang == null || "".equals(lang)) {
lang = "en";
}
//we have stored the ontology locally
content = parseImports(c.isUseImported(), c.getMainOntology().getOWLAPIOntologyManager(), c.getMainOntology().getOWLAPIModel());
content = applyXSLTTransformation(content, c.getOntologyURI(), lang, lodeResources);
return(content);
}
catch (OWLOntologyCreationException e) {
System.err.println("Error while applying LODE. Error while applying the XLS file: "+e.getMessage());
throw e;
} catch (OWLOntologyStorageException e) {
System.err.println("Error while applying LODE. Error while applying the XLS file: "+e.getMessage());
throw e;
} catch (URISyntaxException e) {
System.err.println("Error while applying LODE. Error while applying the XLS file: "+e.getMessage());
throw e;
} catch (TransformerException e) {
System.err.println("Error while applying LODE. Error while applying the XLS file: "+e.getMessage());
throw e;
} catch (UnsupportedEncodingException e) {
System.err.println("Error while applying LODE. Error while applying the XLS file: "+e.getMessage());
throw e;
}
}
/**
* Method that uses the loaded ontology and parses it in case there are imports that have not been considered
* @param considerImportedOntologies
* @param manager
* @param ontology
* @return
* @throws OWLOntologyCreationException
* @throws OWLOntologyStorageException
* @throws URISyntaxException
*/
private static String parseImports(
boolean considerImportedOntologies,
OWLOntologyManager manager,
OWLOntology ontology)
throws OWLOntologyCreationException, OWLOntologyStorageException, URISyntaxException {
String result = "";
if (considerImportedOntologies) {
//considerImportedClosure || //<- removed for the moment
Set<OWLOntology> setOfImportedOntologies = new HashSet<OWLOntology>();
setOfImportedOntologies.addAll(ontology.getDirectImports());
// else {
// setOfImportedOntologies.addAll(ontology.getImportsClosure());
// }
for (OWLOntology importedOntology : setOfImportedOntologies) {
manager.addAxioms(ontology, importedOntology.getAxioms());
}
}
OWLOntologyDocumentTarget parsedOntology = new StringDocumentTarget();
manager.saveOntology(ontology,new RDFXMLDocumentFormat(), parsedOntology);//new RDFXMLOntologyFormat()
result = parsedOntology.toString();
// }
return result;
}
// private String addImportedAxioms(String result, List<String> removed) {
// DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// factory.setNamespaceAware(true);
// try {
// DocumentBuilder builder = factory.newDocumentBuilder();
// Document document = builder.parse(new ByteArrayInputStream(result.getBytes()));
//
// NodeList ontologies =
// document.getElementsByTagNameNS("http://www.w3.org/2002/07/owl#", "Ontology");
// if (ontologies.getLength() > 0) {
// Element ontology = (Element) ontologies.item(0);
//
// for (String toBeAdded : removed) {
// Element importElement =
// document.createElementNS("http://www.w3.org/2002/07/owl#","owl:imports");
// importElement.setAttributeNS(
// "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf:resource", toBeAdded);
// ontology.appendChild(importElement);
// }
// }
//
// Transformer transformer = TransformerFactory.newInstance().newTransformer();
// StreamResult output = new StreamResult(new StringWriter());
// DOMSource source = new DOMSource(document);
// transformer.transform(source, output);
//
// return output.getWriter().toString();
// } catch (ParserConfigurationException e) {
// return result;
// } catch (SAXException e) {
// return result;
// } catch (IOException e) {
// return result;
// } catch (TransformerConfigurationException e) {
// return result;
// } catch (TransformerFactoryConfigurationError e) {
// return result;
// } catch (TransformerException e) {
// return result;
// }
// }
/*
private String removeImportedAxioms(String result, List<String> removedImport) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(result.getBytes()));
NodeList ontologies =
document.getElementsByTagNameNS("http://www.w3.org/2002/07/owl#", "Ontology");
for (int i = 0; i < ontologies.getLength() ; i++) {
Element ontology = (Element) ontologies.item(i);
NodeList children = ontology.getChildNodes();
List<Element> removed = new ArrayList<Element>();
for (int j = 0; j < children.getLength(); j++) {
Node child = children.item(j);
if (
child.getNodeType() == Node.ELEMENT_NODE &&
child.getNamespaceURI().equals("http://www.w3.org/2002/07/owl#") &&
child.getLocalName().equals("imports")) {
removed.add((Element) child);
}
}
for (Element toBeRemoved : removed) {
removedImport.add(toBeRemoved.getAttributeNS(
"http://www.w3.org/1999/02/22-rdf-syntax-ns#", "resource"));
ontology.removeChild(toBeRemoved);
}
}
Transformer transformer = TransformerFactory.newInstance().newTransformer();
StreamResult output = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(document);
transformer.transform(source, output);
return output.getWriter().toString();
} catch (ParserConfigurationException e) {
return result;
} catch (SAXException e) {
return result;
} catch (IOException e) {
return result;
} catch (TransformerConfigurationException e) {
return result;
} catch (TransformerFactoryConfigurationError e) {
return result;
} catch (TransformerException e) {
return result;
}
}
*/
// private static OWLOntology parseWithReasoner(OWLOntologyManager manager, OWLOntology ontology) {
// try {
// //poner la url donde esta directamente. Coger como resource y cargar el path (facil)
//// PelletOptions.load(new URL("http://" + cssLocation + "pellet.properties"));
// //new URL("lode/resources/pellet.properties")
// PelletOptions.load(new URL(ClassLoader.getSystemResource("lode/pellet.properties").getPath()));
// PelletReasoner reasoner = PelletReasonerFactory.getInstance().createReasoner(ontology);
// reasoner.getKB().prepare();
// List<InferredAxiomGenerator<? extends OWLAxiom>> generators=
// new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
// generators.add(new InferredSubClassAxiomGenerator());
// generators.add(new InferredClassAssertionAxiomGenerator());
// generators.add(new InferredDisjointClassesAxiomGenerator());
// generators.add(new InferredEquivalentClassAxiomGenerator());
// generators.add(new InferredEquivalentDataPropertiesAxiomGenerator());
// generators.add(new InferredEquivalentObjectPropertyAxiomGenerator());
// generators.add(new InferredInverseObjectPropertiesAxiomGenerator());
// generators.add(new InferredPropertyAssertionGenerator());
// generators.add(new InferredSubDataPropertyAxiomGenerator());
// generators.add(new InferredSubObjectPropertyAxiomGenerator());
//
// InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner, generators);
//
// OWLOntologyID id = ontology.getOntologyID();
// Set<OWLImportsDeclaration> declarations = ontology.getImportsDeclarations();
// Set<OWLAnnotation> annotations = ontology.getAnnotations();
//
// Map<OWLEntity, Set<OWLAnnotationAssertionAxiom>> entityAnnotations = new HashMap<OWLEntity,Set<OWLAnnotationAssertionAxiom>>();
// for (OWLClass aEntity : ontology.getClassesInSignature()) {
// entityAnnotations.put(aEntity, aEntity.getAnnotationAssertionAxioms(ontology));
// }
// for (OWLObjectProperty aEntity : ontology.getObjectPropertiesInSignature()) {
// entityAnnotations.put(aEntity, aEntity.getAnnotationAssertionAxioms(ontology));
// }
// for (OWLDataProperty aEntity : ontology.getDataPropertiesInSignature()) {
// entityAnnotations.put(aEntity, aEntity.getAnnotationAssertionAxioms(ontology));
// }
// for (OWLNamedIndividual aEntity : ontology.getIndividualsInSignature()) {
// entityAnnotations.put(aEntity, aEntity.getAnnotationAssertionAxioms(ontology));
// }
// for (OWLAnnotationProperty aEntity : ontology.getAnnotationPropertiesInSignature()) {
// entityAnnotations.put(aEntity, aEntity.getAnnotationAssertionAxioms(ontology));
// }
// for (OWLDatatype aEntity : ontology.getDatatypesInSignature()) {
// entityAnnotations.put(aEntity, aEntity.getAnnotationAssertionAxioms(ontology));
// }
//
// manager.removeOntology(ontology);
// OWLOntology inferred = manager.createOntology(id);
// iog.fillOntology(manager, inferred);
//
// for (OWLImportsDeclaration decl : declarations) {
// manager.applyChange(new AddImport(inferred, decl));
// }
// for (OWLAnnotation ann : annotations) {
// manager.applyChange(new AddOntologyAnnotation(inferred, ann));
// }
// for (OWLClass aEntity : inferred.getClassesInSignature()) {
// applyAnnotations(aEntity, entityAnnotations, manager, inferred);
// }
// for (OWLObjectProperty aEntity : inferred.getObjectPropertiesInSignature()) {
// applyAnnotations(aEntity, entityAnnotations, manager, inferred);
// }
// for (OWLDataProperty aEntity : inferred.getDataPropertiesInSignature()) {
// applyAnnotations(aEntity, entityAnnotations, manager, inferred);
// }
// for (OWLNamedIndividual aEntity : inferred.getIndividualsInSignature()) {
// applyAnnotations(aEntity, entityAnnotations, manager, inferred);
// }
// for (OWLAnnotationProperty aEntity : inferred.getAnnotationPropertiesInSignature()) {
// applyAnnotations(aEntity, entityAnnotations, manager, inferred);
// }
// for (OWLDatatype aEntity : inferred.getDatatypesInSignature()) {
// applyAnnotations(aEntity, entityAnnotations, manager, inferred);
// }
// return inferred;
// } catch (IOException e) {
// return ontology;
// } catch (OWLOntologyChangeException e) {
// return ontology;
// } catch (OWLOntologyCreationException e) {
// return ontology;
// }
// }
// private static void applyAnnotations(
// OWLEntity aEntity, Map<OWLEntity, Set<OWLAnnotationAssertionAxiom>> entityAnnotations,
// OWLOntologyManager manager, OWLOntology ontology) {
// Set<OWLAnnotationAssertionAxiom> entitySet = entityAnnotations.get(aEntity);
// if (entitySet != null) {
// for (OWLAnnotationAssertionAxiom ann : entitySet) {
// manager.addAxiom(ontology, ann);
// }
// }
// }
private static String applyXSLTTransformation(String source, String ontologyUrl, String lang, File resourcesFile)
throws TransformerException, UnsupportedEncodingException {
TransformerFactory tfactory = new net.sf.saxon.TransformerFactoryImpl();
ByteArrayOutputStream output = new ByteArrayOutputStream();
Transformer transformer =
tfactory.newTransformer(
new StreamSource(resourcesFile.getPath()+File.separator+"extraction.xsl"));
// transformer.setParameter("css-location", "");
transformer.setParameter("lang", lang);
transformer.setParameter("ontology-url", ontologyUrl);
// transformer.setParameter("source", cssLocation + "source");
StreamSource inputSource = new StreamSource(new StringReader(source));
transformer.transform(
inputSource,
new StreamResult(output));
return output.toString("UTF-8");
}
}