package converter;
import converter.utils.StringPair;
import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.model.*;
import risks.BusinessProcess;
import risks.Risk;
import uk.ac.manchester.cs.owl.owlapi.OWLDataPropertyImpl;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
/**
* Created by miguel on 02-05-2014.
*/
public class OwlManager {
private OWLOntology mainOntology;
private OWLOntologyManager manager;
private OWLDataFactory df;
public OwlManager(String ontologyPath) {
OWLManager managerManager = new OWLManager();
manager = managerManager.buildOWLOntologyManager();
df = manager.getOWLDataFactory();
try {
mainOntology = manager.loadOntologyFromOntologyDocument(Main.fileHandler(ontologyPath));
} catch (OWLOntologyCreationException e) {
e.printStackTrace();
}
}
public OWLOntology getMainOntology() {
return mainOntology;
}
public HashMap<String, String> getBusinessActivities() {
return getElementsFromClass("BusinessActivity");
}
public HashMap<String, String> getBusinessProcesses() {
return getElementsFromClass("BusinessProcess");
}
public HashMap<String, String> getJunctions() {
return getElementsFromClass("Junction");
}
public HashMap<String, String> getAndJunctions() {
return getElementsFromClass("AndJunction");
}
public HashMap<String, String> getRisks() {
return getElementsFromClass("Risk");
}
public HashMap<String, String> getElementsFromClass(String className) {
HashMap<String, String> individuals = new HashMap<String, String>();
for (OWLEntity claz : mainOntology.getClassesInSignature()) {
if (claz.isOWLClass() && getIndividualNameFromURI(claz.getIRI().toString()).equals(className)) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(mainOntology)) {
Object[] anot = ind.asOWLNamedIndividual().getAnnotations(mainOntology).toArray();
if (anot != null && anot.length > 0 && ((OWLAnnotation) anot[0]).getValue() != null && ((OWLAnnotation) anot[0]).getValue().toString() != "")
individuals.put(getIndividualNameFromURI(ind.toString()), getNameFromLabel(((OWLAnnotation) anot[0]).getValue().toString()));
else
individuals.put(getIndividualNameFromURI(ind.toString()), getIndividualNameFromURI(ind.toString()));
}
break;
}
}
return individuals;
}
public String getDataPropertyFromIndividual(String id, String property) {
return getDataPropertyFromIndividual(id, "http://timbus.teco.edu/ontologies/DSOs/risk.owl", property);
}
public String getDataPropertyFromIndividual(String id, String prefix, String property) {
for (OWLEntity claz : mainOntology.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(mainOntology)) {
String cutIndividual = getIndividualNameFromURI(ind.toString());
if (cutIndividual.equals(id)) {
OWLDataProperty prop = df.getOWLDataProperty(IRI.create(prefix + "#", property));
Set<OWLLiteral> props = ind.asOWLNamedIndividual().getDataPropertyValues(prop, mainOntology);
ArrayList<OWLLiteral> propss = new ArrayList<OWLLiteral>(props);
if (props.size() != 0)
return propss.get(0).getLiteral();
else
return null;
}
}
}
}
for (OWLOntology ont : mainOntology.getImports())
for (OWLEntity claz : ont.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(ont)) {
if (getIndividualNameFromURI(ind.toString()).equals(id)) {
OWLDataProperty prop = df.getOWLDataProperty(IRI.create(prefix + "#", property));
Set<OWLLiteral> props = ind.asOWLNamedIndividual().getDataPropertyValues(prop, ont);
ArrayList<OWLLiteral> propss = new ArrayList<OWLLiteral>(props);
if (props.size() != 0)
return propss.get(0).getLiteral();
else
return null;
}
}
}
}
return null;
}
public ArrayList<OWLIndividual> getMultipleObjectPropertyFromIndividual(String id, String prefix, String property) {
ArrayList<OWLIndividual> listt = new ArrayList<OWLIndividual>();
for (OWLEntity claz : mainOntology.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(mainOntology)) {
String cutIndividual = getIndividualNameFromURI(ind.toString());
if (cutIndividual.equals(id)) {
OWLObjectProperty prop = df.getOWLObjectProperty(IRI.create(prefix + "#", property));
Set<OWLIndividual> props = ind.asOWLNamedIndividual().getObjectPropertyValues(prop, mainOntology);
listt.addAll(props);
}
}
}
}
for (OWLOntology ont : mainOntology.getImports())
for (OWLEntity claz : ont.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(ont)) {
String cutIndividual = getIndividualNameFromURI(ind.toString());
if (cutIndividual.equals(id)) {
OWLObjectProperty prop = df.getOWLObjectProperty(IRI.create(prefix + "#", property));
Set<OWLIndividual> props = ind.asOWLNamedIndividual().getObjectPropertyValues(prop, ont);
listt.addAll(props);
}
}
}
}
return listt;
}
public ArrayList<String> getMultipleObjectPropertyFromIndividualAsStrings(String id, String prefix, String property) {
ArrayList<OWLIndividual> list = getMultipleObjectPropertyFromIndividual(id, prefix, property);
ArrayList<String> stringList = new ArrayList<String>();
if (list != null)
for (OWLIndividual ind : list)
stringList.add(getIndividualNameFromURI(ind.toString()));
return stringList;
}
public String getObjectPropertyFromIndividual(String id, String prefix, String property) {
ArrayList<String> list = getMultipleObjectPropertyFromIndividualAsStrings(id, prefix, property);
if (list.size() != 0)
return list.get(0);
else
return null;
}
public ArrayList<String> getElementWithNumberOfOutFlows(int number, boolean greaterThan) {
if (number == 0)
throw new IllegalArgumentException("Zero is not a valid number. Required: number>=1");
ArrayList<StringPair> flows = getFlows();
ArrayList<String> list = new ArrayList<String>();
for (StringPair s : flows) {
int i = 0;
for (StringPair ss : flows) {
if (ss.getFirst().equals(s.getFirst()))
i++;
}
if (i == number || (greaterThan && i > number))
list.add(s.getFirst());
}
HashSet<String> hs = new HashSet<String>();
hs.addAll(list);
list.clear();
list.addAll(hs);
return list;
}
public ArrayList<String> getElementWithNumberOfInFlows(int number, boolean greaterThan) {
ArrayList<String> list = new ArrayList<String>();
ArrayList<StringPair> flows = getFlows();
for (StringPair s : flows) {
int i = 0;
for (StringPair ss : flows) {
if (ss.getSecond().equals(s.getFirst()))
i++;
}
if (i == number || (greaterThan && i > number))
list.add(s.getFirst());
int j = 0;
for (StringPair ss : flows) {
if (ss.getSecond().equals(s.getSecond()))
j++;
}
if (j == number || (greaterThan && i > number))
list.add(s.getSecond());
}
HashSet<String> hs = new HashSet<String>();
hs.addAll(list);
list.clear();
list.addAll(hs);
return list;
}
public ArrayList<StringPair> getFlows() {
ArrayList<StringPair> flows = new ArrayList<StringPair>();
for (OWLEntity claz : mainOntology.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(mainOntology)) {
for (OWLObjectPropertyExpression ope : ind.getObjectPropertyValues(mainOntology).keySet()) {
if (getIndividualNameFromURI(ope.toString()).equals("flowTo") || getIndividualNameFromURI(ope.toString()).equals("triggers") || getIndividualNameFromURI(ope.toString()).equals("FlowTo")) {
for (OWLIndividual indd : ind.getObjectPropertyValues(mainOntology).get(ope))
flows.add(new StringPair(getIndividualNameFromURI(ind.toString()),
getIndividualNameFromURI(indd.toString())));
}
}
}
}
}
return flows;
}
public String getNameAnnotationFromId(String id) {
for (OWLEntity claz : mainOntology.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(mainOntology)) {
if (getIndividualNameFromURI(ind.toString()).equals(id)) {
OWLAnnotation anot = (OWLAnnotation) (ind.asOWLNamedIndividual().getAnnotations(mainOntology).toArray()[0]);
if (anot.getValue() != null && anot.getValue().toString() != "")
return getNameFromLabel(anot.getValue().toString());
}
}
}
}
for (OWLOntology ont : mainOntology.getImports())
for (OWLEntity claz : ont.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(ont)) {
if (getIndividualNameFromURI(ind.toString()).equals(id)) {
OWLAnnotation anot = (OWLAnnotation) (ind.asOWLNamedIndividual().getAnnotations(ont).toArray()[0]);
if (anot.getValue() != null && anot.getValue().toString() != "")
return getNameFromLabel(anot.getValue().toString());
}
}
}
}
return null;
}
private String getIndividualNameFromURI(String uri) {
String temp = uri.split("#")[1];
if (uri.endsWith(">"))
return temp.substring(0, temp.length() - 1);
else
return temp;
}
private String getNameFromLabel(String name) {
return name.substring(1).split("\"")[0];
}
public String getOntologyURI() {
// return manager.getOntologyDocumentIRI(mainOntology).toString();
return mainOntology.getOntologyID().getOntologyIRI().toString();
}
public String getIndividualURI(String id) {
for (OWLEntity claz : mainOntology.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(mainOntology)) {
if (getIndividualNameFromURI(ind.toString()).equals(id)) {
return ind.toStringID();
}
}
}
}
for (OWLOntology ont : mainOntology.getImports())
for (OWLEntity claz : ont.getClassesInSignature()) {
if (claz.isOWLClass()) {
for (OWLIndividual ind : claz.asOWLClass().getIndividuals(ont)) {
if (getIndividualNameFromURI(ind.toString()).equals(id)) {
return ind.toStringID();
}
}
}
}
return null;
}
public static void main(String[] args) throws OWLOntologyCreationException {
OwlManager owl = new OwlManager("/home/miguel/Documentos/opensourceprojects/context-model/converters/ierm-to-owl/outputTest.owl");
System.out.println(owl.getMultipleObjectPropertyFromIndividualAsStrings("_AOOx0OApEeOdPf2iYA7Sww", "http://timbus.teco.edu/public/ontologies/DSOs/risk.owl", "occurInResource"));
System.out.println(owl.getNameAnnotationFromId("_AOOx0OApEeOdPf2iYA7Sww"));
System.out.println(owl.getDataPropertyFromIndividual("_AOOx0OApEeOdPf2iYA7Sww", "http://timbus.teco.edu/ontologies/DSOs/risk.owl", "legalImpact"));
System.out.println(owl.getMultipleObjectPropertyFromIndividualAsStrings("_4e743d14a1864639bc1e02034190b0b8", "http://timbus.teco.edu/ontologies/DIO.owl", "uses"));
}
}