diff --git a/pom.xml b/pom.xml index 92c8ab5..61d67fb 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,12 @@ owlapi-distribution 5.1.14 + + + org.json + json + 20201115 + com.googlecode.json-simple diff --git a/src/main/java/widoco/ClassTreeParser.java b/src/main/java/widoco/ClassTreeParser.java new file mode 100644 index 0000000..ed667b4 --- /dev/null +++ b/src/main/java/widoco/ClassTreeParser.java @@ -0,0 +1,279 @@ +package widoco; + +import java.util.Iterator; +import java.util.Set; +import java.util.TreeSet; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.semanticweb.owlapi.model.AxiomType; +import org.semanticweb.owlapi.model.OWLAnnotationProperty; +import org.semanticweb.owlapi.model.OWLClass; +import org.semanticweb.owlapi.model.OWLDataProperty; +import org.semanticweb.owlapi.model.OWLNamedIndividual; +import org.semanticweb.owlapi.model.OWLObjectProperty; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLSubAnnotationPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubClassOfAxiom; +import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubPropertyAxiom; + +public class ClassTreeParser { + + static JSONObject getClassHierarchyTree( final OWLOntology model) { + Set seenResources=new TreeSet(); + Set workedResources=new TreeSet(); + JSONObject result=new JSONObject(); + result.put("classes",new JSONArray()); + result.put("objprop",new JSONArray()); + result.put("dataprop",new JSONArray()); + result.put("annoprop",new JSONArray()); + result.put("individuals",new JSONArray()); + System.out.println("SeenResources: "+seenResources); + System.out.println("WorkedResources: "+workedResources); + Iterator sciter = model.axioms(AxiomType.SUBCLASS_OF).iterator(); + System.out.println("Hasnext? "+sciter.hasNext()); + while (sciter.hasNext()) + { + OWLSubClassOfAxiom subClasse=sciter.next(); + if (subClasse.getSuperClass() instanceof OWLClass + && subClasse.getSubClass() instanceof OWLClass) + { + System.out.println(subClasse.getSuperClass().toString()+" - "+subClasse.getSubClass().toString()); + if(!seenResources.contains(subClasse.getSubClass().toString()) || (seenResources.contains(subClasse.getSubClass().toString()) && !workedResources.contains(subClasse.getSubClass().toString())) ){ + seenResources.add(subClasse.getSuperClass().toString()); + seenResources.add(subClasse.getSubClass().toString()); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",subClasse.getSubClass().toString().replace("<", "").replace(">", "")); + treeelem.put("parent",subClasse.getSuperClass().toString().replace("<", "").replace(">", "")); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/Classes.gif"); + if(subClasse.getSubClass().toString().contains("#")) { + treeelem.put("text",subClasse.getSubClass().toString().substring(subClasse.getSubClass().toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",subClasse.getSubClass().toString().substring(subClasse.getSubClass().toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("classes").put(treeelem); + workedResources.add(subClasse.getSubClass().toString()); + } + } + } + System.out.println("SeenResources: "+seenResources); + System.out.println("WorkedResources: "+workedResources); + for(String res:seenResources) { + if(!workedResources.contains(res)) { + System.out.println("Missing Class: "+res); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",res.replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/Classes.gif"); + if(res.toString().contains("#")) { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("classes").put(treeelem); + } + } + Iterator classpropiter = model.classesInSignature().iterator(); + System.out.println("Hasnext? "+sciter.hasNext()); + while (classpropiter.hasNext()) { + OWLClass c=classpropiter.next(); + if(!seenResources.contains(c.toString())) { + JSONObject treeelem=new JSONObject(); + treeelem.put("id",c.toString().replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/Classes.gif"); + if(c.toString().contains("#")) { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("dataprop").put(treeelem); + } + } + //System.out.println(result.getJSONArray("classes").toString(2)); + seenResources.clear(); + workedResources.clear(); + for (OWLClass c : model.getClassesInSignature()) { + for (OWLNamedIndividual i :c.getIndividualsInSignature()) { + JSONObject treeelem=new JSONObject(); + treeelem.put("id",i.toString().replace("<", "").replace(">", "")); + treeelem.put("parent",c.toString().replace("<", "").replace(">", "")); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLIndividual.gif"); + if(i.toString().contains("#")) { + treeelem.put("text",i.toString().substring(i.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",i.toString().substring(i.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("individuals").put(treeelem); + } + } + Iterator sciter2 = model.axioms(AxiomType.SUB_OBJECT_PROPERTY).iterator(); + System.out.println("Hasnext? "+sciter.hasNext()); + while (sciter2.hasNext()) + { + OWLSubObjectPropertyOfAxiom subClasse = sciter2.next(); + if(!seenResources.contains(subClasse.getSuperProperty().toString()) || (seenResources.contains(subClasse.getSubProperty().toString()) && !workedResources.contains(subClasse.getSubProperty().toString()))){ + seenResources.add(subClasse.getSuperProperty().toString()); + seenResources.add(subClasse.getSubProperty().toString()); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",subClasse.getSubProperty().toString().replace("<", "").replace(">", "")); + treeelem.put("parent",subClasse.getSuperProperty().toString().replace("<", "").replace(">", "")); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLObjectProperty.gif"); + if(subClasse.getSubProperty().toString().contains("#")) { + treeelem.put("text",subClasse.getSubProperty().toString().substring(subClasse.getSubProperty().toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",subClasse.getSubProperty().toString().substring(subClasse.getSubProperty().toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("objprop").put(treeelem); + workedResources.add(subClasse.getSubProperty().toString()); + } + } + System.out.println(seenResources); + System.out.println(workedResources); + for(String res:seenResources) { + if(!workedResources.contains(res)) { + System.out.println("Missing ObjProp: "+res); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",res.replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLObjectProperty.gif"); + if(res.toString().contains("#")) { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("objprop").put(treeelem); + } + } + Iterator objpropiter = model.objectPropertiesInSignature().iterator(); + System.out.println("Hasnext? "+sciter.hasNext()); + while (objpropiter.hasNext()) { + OWLObjectProperty c=objpropiter.next(); + if(!seenResources.contains(c.toString())) { + JSONObject treeelem=new JSONObject(); + treeelem.put("id",c.toString().replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLObjectProperty.gif"); + if(c.toString().contains("#")) { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("objprop").put(treeelem); + } + } + seenResources.clear(); + workedResources.clear(); + for (final OWLSubPropertyAxiom subClasse : model.getAxioms(AxiomType.SUB_DATA_PROPERTY)) + { + if(!seenResources.contains(subClasse.getSuperProperty().toString()) || (seenResources.contains(subClasse.getSubProperty().toString()) && !workedResources.contains(subClasse.getSubProperty().toString()))){ + seenResources.add(subClasse.getSuperProperty().toString()); + seenResources.add(subClasse.getSubProperty().toString()); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",subClasse.getSubProperty().toString().replace("<", "").replace(">", "")); + treeelem.put("parent",subClasse.getSuperProperty().toString().replace("<", "").replace(">", "")); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLDatatypeProperty.gif"); + if(subClasse.getSubProperty().toString().contains("#")) { + treeelem.put("text",subClasse.getSubProperty().toString().substring(subClasse.getSubProperty().toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",subClasse.getSubProperty().toString().substring(subClasse.getSubProperty().toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("dataprop").put(treeelem); + workedResources.add(subClasse.getSubProperty().toString()); + } + } + System.out.println("SeenResources: "+seenResources); + System.out.println("WorkedResources: "+workedResources); + for(String res:seenResources) { + if(!workedResources.contains(res)) { + System.out.println("Missing Dataprop: "+res); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",res.replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLDatatypeProperty.gif"); + if(res.toString().contains("#")) { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("dataprop").put(treeelem); + } + } + Iterator datapropiter = model.dataPropertiesInSignature().iterator(); + System.out.println("Hasnext? "+sciter.hasNext()); + while (datapropiter.hasNext()) { + OWLDataProperty c=datapropiter.next(); + if(!seenResources.contains(c.toString())) { + JSONObject treeelem=new JSONObject(); + treeelem.put("id",c.toString().replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/OWLDatatypeProperty.gif"); + if(c.toString().contains("#")) { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("dataprop").put(treeelem); + } + } + seenResources.clear(); + workedResources.clear(); + for (final OWLSubAnnotationPropertyOfAxiom subClasse : model.getAxioms(AxiomType.SUB_ANNOTATION_PROPERTY_OF)) + { + if(!seenResources.contains(subClasse.getSuperProperty().toString()) || (seenResources.contains(subClasse.getSubProperty().toString()) && !workedResources.contains(subClasse.getSubProperty().toString()))){ + seenResources.add(subClasse.getSuperProperty().toString()); + seenResources.add(subClasse.getSubProperty().toString()); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",subClasse.getSubProperty().toString().replace("<", "").replace(">", "")); + treeelem.put("parent",subClasse.getSuperProperty().toString().replace("<", "").replace(">", "")); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/Annotation.gif"); + if(subClasse.getSubProperty().toString().contains("#")) { + treeelem.put("text",subClasse.getSubProperty().toString().substring(subClasse.getSubProperty().toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",subClasse.getSubProperty().toString().substring(subClasse.getSubProperty().toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("annoprop").put(treeelem); + workedResources.add(subClasse.getSubProperty().toString()); + } + } + System.out.println("SeenResources: "+seenResources); + System.out.println("WorkedResources: "+workedResources); + for(String res:seenResources) { + if(!workedResources.contains(res)) { + System.out.println("Missing Annoprop: "+res); + JSONObject treeelem=new JSONObject(); + treeelem.put("id",res.replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/Annotation.gif"); + if(res.toString().contains("#")) { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",res.toString().substring(res.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("annoprop").put(treeelem); + } + } + Iterator annopropiter = model.annotationPropertiesInSignature().iterator(); + System.out.println("Hasnext? "+sciter.hasNext()); + while (annopropiter.hasNext()) { + OWLAnnotationProperty c=annopropiter.next(); + if(!seenResources.contains(c.toString())) { + JSONObject treeelem=new JSONObject(); + treeelem.put("id",c.toString().replace("<", "").replace(">", "")); + treeelem.put("parent","#"); + treeelem.put("icon","https://raw.githubusercontent.com/protegeproject/protege/master/protege-editor-owl/src/main/resources/Annotation.gif"); + if(c.toString().contains("#")) { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('#')+1).replace("<", "").replace(">", "")); + }else { + treeelem.put("text",c.toString().substring(c.toString().lastIndexOf('/')+1).replace("<", "").replace(">", "")); + } + result.getJSONArray("annoprop").put(treeelem); + } + } + seenResources.clear(); + workedResources.clear(); + return result; + } + +} diff --git a/src/main/java/widoco/Constants.java b/src/main/java/widoco/Constants.java index 0427fa2..9fdbcff 100644 --- a/src/main/java/widoco/Constants.java +++ b/src/main/java/widoco/Constants.java @@ -612,7 +612,7 @@ public static String getIndexDocument(String resourcesFolderName, Configuration // JSON-LD snippet document += getJSONLDSnippet(c); - document += " \n" + " \n" + " \n" + "