diff --git a/src/fr/inrialpes/exmo/align/gen/ClassHierarchy.java b/src/fr/inrialpes/exmo/align/gen/ClassHierarchy.java index 73553016d277e81d1ef3e8bbca8ef28ea515bc6b..bc99d2de43352b7a09790894b3e6ba4429c2745e 100644 --- a/src/fr/inrialpes/exmo/align/gen/ClassHierarchy.java +++ b/src/fr/inrialpes/exmo/align/gen/ClassHierarchy.java @@ -23,6 +23,7 @@ Iterates through all the classes in the hierarchy and builds the class hierarchy */ + package fr.inrialpes.exmo.align.gen; //Jena @@ -44,7 +45,7 @@ public class ClassHierarchy { public ClassHierarchy() {} //return the root of the hierarchy - public URITree getRootClassHierarchy () { + public URITree getRootClassHierarchy () { return this.root; } @@ -53,7 +54,7 @@ public class ClassHierarchy { this.maxDepth = this.root.getMaxDepth(); return this.maxDepth; } - + //print class hierarchy public void printClassHierarchy() { System.out.println( "[--------------------]" ); @@ -65,12 +66,13 @@ public class ClassHierarchy { public void addClass (String childURI, String parentURI) { URITree node = null; - node = this.root.searchURITree( this.root, parentURI ); //the node from the hierarchy with the identifier parentURI - node.addChildToNode( node, childURI ); //we add the new childURI to the hierarchy + //node = this.root.searchURITree( this.root, parentURI ); //the node from the hierarchy with the identifier parentURI + this.getRootClassHierarchy().add(this.root, parentURI, childURI); //we add the new childURI to the hierarchy + //node._addChildToNode(this.root, parentURI, childURI); } //updates the class hierarchy - public void updateClassHierarchy (Properties params) { + public void updateClassHierarchy (Properties params) { this.root.renameTree(this.root, params); } @@ -82,7 +84,7 @@ public class ClassHierarchy { classes.add( model.getOntClass( nodes.get(i).getURI() ) ); //builds the list of classes return classes; } - + //get the nodes from a specific level public List<URITree> getNodesFromLevel (int level) { return this.getRootClassHierarchy().getNodesFromLevel(this.root, level); @@ -98,7 +100,7 @@ public class ClassHierarchy { public OntClass removeClass ( OntModel model, OntClass cls ) { URITree node = this.root.searchURITree( this.root, cls.getURI() ); //search for the class URI in the class hierarchy URITree parentNode = null; - + int depth = node.getDepth(); //get the depth of the node parentNode = node.getParent(); //get the parent of the node for ( URITree child : node.getChildrenList() ) { //change the parent of the subclasses of the node @@ -123,23 +125,25 @@ public class ClassHierarchy { int index = rdm.nextInt( childrenNodes.size() ); //get a random number between 0 and the number_of_classes_from_that_level return model.getOntClass( childrenNodes.get(index).getURI() ); //returns the class from the position that we have selected -> the random number } - + //modifies the class hierarchy after we have flattened it public boolean flattenClassHierarchy ( OntModel model, int level, ArrayList<OntClass> childClasses, ArrayList<OntClass> parentClasses, ArrayList<OntClass> superLevelClasses) { List<URITree> childrenNodes = getNodesFromLevel( level ); + URITree parentNode = null; URITree superNode = null; boolean active = true; for ( URITree childNode : childrenNodes ) { //for each child class parentNode = childNode.getParent(); //get the parent node + superNode = parentNode.getParent(); //get the parents of the parent node - + childClasses.add( model.getOntClass( childNode.getURI() ) ); //build the list of children classes parentClasses.add( model.getOntClass( parentNode.getURI() ) ); //build the list of parent classes - + if ( !superNode.getURI().equals( "Thing" ) ) { //if the parent of the child class is not owl:Thing (1st level class) superLevelClasses.add( model.getOntClass( superNode.getURI() ) );//build the list of the parents of the parent classes active = true; //set the flag -> we don't have a 1st level class @@ -148,7 +152,7 @@ public class ClassHierarchy { active = false; //set the flag -> we have a 1st level class } } - + flattenHierarchy( childrenNodes ); //modify the links among the nodes from the class hierarchy this.getRootClassHierarchy().changeDepth ( this.getRootClassHierarchy(), level );//change the depth return active; @@ -163,7 +167,7 @@ public class ClassHierarchy { childNode.setParent( parentNode.getParent() ); //change the parent of my superclass to the [parent of the "parent node"] childNode.setDepth( parentNode.getDepth() ); //change it's depth - + parentNode.getChildrenList().remove( childNode ); //remove it from the children list of parentNode parentNode.getParent().getChildrenList().add( childNode ); //add it to the children list of superClass } @@ -177,10 +181,11 @@ public class ClassHierarchy { //get the list of root classes List<OntClass> ontologyClasses = model.listClasses().toList(); - List<OntClass> rootClasses = model.listClasses().toList(); + List<OntClass> rootClasses = new ArrayList<OntClass>();// = model.listClasses().toList(); for ( OntClass cls : ontologyClasses ) { - if ( cls.isHierarchyRoot() ) + if ( cls.isHierarchyRoot() ) { rootClasses.add( cls ); + } } for ( OntClass rootClass : rootClasses ) { @@ -221,16 +226,21 @@ public class ClassHierarchy { int found = 0; OntClass aux = null; uri = c.getURI(); - - for ( Iterator it = c.listSuperClasses(); it.hasNext(); ) { //search to see if the class has a superclass which is not anonymous + + for ( Iterator it = c.listSuperClasses( ); it.hasNext(); ) { //search to see if the class has a superclass which is not anonymous aux = (OntClass)it.next(); if ( !aux.isAnon() ) { //is not an anonymous class found = 1; //got the parent parentURI = aux.getURI(); - this.root.add(this.root, uri, parentURI); + + //it the superclass is .../#Thing + if ( parentURI.contains( "Thing" ) ) + this.getRootClassHierarchy().add(this.root, uri, "Thing"); + else + this.root.add(this.root, uri, parentURI); } } - + if ( found == 0 ) //has no parent until now this.getRootClassHierarchy().add(this.root, uri, "Thing"); } @@ -264,13 +274,15 @@ public class ClassHierarchy { m_anonIDs.put( anon.getId(), anonID ); } } - + // Generate the indentation protected void indent( int depth ) { for (int i = 0; i < depth; i++) { System.out.print( " " ); } } - + } + +