From b05f0c51f357f7be11fb94c4a7d0a971da7aa0f4 Mon Sep 17 00:00:00 2001 From: "luca.frosini" Date: Fri, 27 Oct 2023 14:50:16 +0200 Subject: [PATCH] Improved knowledge and tree solution --- .../knowledge/ModelKnowledgeValidator.java | 2 +- .../model/knowledge/ModelKnowledge.java | 12 ++- .../gcube/informationsystem/tree/Tree.java | 85 ++++++++++++++----- .../types/knowledge/TypeInformation.java | 6 +- .../types/knowledge/ModelKnowledgeTest.java | 4 +- 5 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledgeValidator.java b/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledgeValidator.java index 08374fb..7fc56df 100644 --- a/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledgeValidator.java +++ b/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledgeValidator.java @@ -64,7 +64,7 @@ public class ModelKnowledgeValidator implements DiscoveredElementAction } String typeName = TypeMapper.getType(e); - if(node.getTree().getRoot().getNodeElement() == e) { + if(node.getTree().getRootNode().getNodeElement() == e) { logger.info("{}- Type {} is the root type", stringBuffer.toString(), typeName); return; } diff --git a/src/main/java/org/gcube/informationsystem/model/knowledge/ModelKnowledge.java b/src/main/java/org/gcube/informationsystem/model/knowledge/ModelKnowledge.java index e701923..1a3b4d2 100644 --- a/src/main/java/org/gcube/informationsystem/model/knowledge/ModelKnowledge.java +++ b/src/main/java/org/gcube/informationsystem/model/knowledge/ModelKnowledge.java @@ -57,9 +57,13 @@ public class ModelKnowledge> { AccessType[] modelTypes = AccessType.getModelTypes(); for(AccessType accessType : modelTypes) { - T t = typeInformation.getRoot(accessType); - Tree tree = new Tree<>(t, typeInformation); + /* + * T t = typeInformation.getRoot(accessType); + * Tree tree = new Tree<>(t, typeInformation); + */ + + Tree tree = new Tree<>(typeInformation); trees.put(accessType, tree); if(accessType == AccessType.PROPERTY) { @@ -140,6 +144,10 @@ public class ModelKnowledge> { } } + if(types.size()==toRetry.size()) { + throw new RuntimeException("Unable to find parent for " + toRetry.toString()); + } + if(toRetry.size()>0) { addAllType(toRetry); } diff --git a/src/main/java/org/gcube/informationsystem/tree/Tree.java b/src/main/java/org/gcube/informationsystem/tree/Tree.java index 941a964..8704bbc 100644 --- a/src/main/java/org/gcube/informationsystem/tree/Tree.java +++ b/src/main/java/org/gcube/informationsystem/tree/Tree.java @@ -11,18 +11,53 @@ public class Tree { private boolean allowMultipleInheritance; - private Node root; + private Node rootNode; private NodeInformation ni; private Map> locate; - public Tree(T t, NodeInformation ni) { + public Tree() { this.allowMultipleInheritance = true; - this.ni = ni; this.locate = new HashMap<>(); - this.root = new Node<>(t); - this.root.setTree(this); - String identifier = ni.getIdentifier(t); - this.locate.put(identifier, root); + } + + public Tree(NodeInformation ni) { + this(); + setNodeInformation(ni); + } + + public Tree(T root, NodeInformation ni) { + this(ni); + setRoot(root); + } + + /** + * Set the NodeInformation if and only if it was not previously set. + * Otherwise this function has no effect. + * @param ni the NodeInformation to set + */ + public void setNodeInformation(NodeInformation ni) { + if(this.ni==null) { + this.ni = ni; + } + } + + /** + * Set the root if and only if it was not previously set. + * Otherwise this function has no effect. + * This function raises a RuntimeException is the + * NodeInformation was not previously set. + * @param root the root to set + */ + public void setRoot(T root) throws RuntimeException { + if(this.ni==null) { + throw new RuntimeException("You must set the NodeInformation instance first"); + } + if(this.rootNode==null) { + this.rootNode = new Node<>(root); + this.rootNode.setTree(this); + String identifier = ni.getIdentifier(root); + this.locate.put(identifier, rootNode); + } } public void setAllowMultipleInheritance(boolean allowMultipleInheritance) { @@ -43,17 +78,25 @@ public class Tree { Node node = new Node<>(t); node.setTree(this); - Set parentIdentifiers = ni.getParentIdentifiers(root.getNodeElement(), t); - for(String parentIdentifier : parentIdentifiers) { - Node parentNode = locate.get(parentIdentifier); - if(parentNode==null) { - throw new RuntimeException("I can find parent for " + identifier + ". Missing parent is " + parentIdentifier); + Set parentIdentifiers = ni.getParentIdentifiers(rootNode!= null ? rootNode.getNodeElement() : null, t); + if(parentIdentifiers==null || parentIdentifiers.size()==0) { + if(this.rootNode==null) { + this.rootNode = node; + }else { + throw new RuntimeException("A Tree cannot have two root. " + t.toString() + " has not parent."); } - - parentNode.addChild(node); - - if(!allowMultipleInheritance) { - break; + } else { + for(String parentIdentifier : parentIdentifiers) { + Node parentNode = locate.get(parentIdentifier); + if(parentNode==null) { + throw new RuntimeException("I can find parent for " + identifier + ". Missing parent is " + parentIdentifier); + } + + parentNode.addChild(node); + + if(!allowMultipleInheritance) { + break; + } } } @@ -62,16 +105,16 @@ public class Tree { return node; } - public Node getRoot() { - return root; + public Node getRootNode() { + return rootNode; } @Override public String toString() { - return root.toString(); + return rootNode.toString(); } public void elaborate(NodeElaborator nodeElaborator) throws Exception { - root.elaborate(nodeElaborator); + rootNode.elaborate(nodeElaborator); } } \ No newline at end of file diff --git a/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java b/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java index e698d80..9d73658 100644 --- a/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java +++ b/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java @@ -19,10 +19,12 @@ public class TypeInformation implements org.gcube.informationsystem.model.knowle @Override public Set getParentIdentifiers(Type root, Type type) { - if(type.getName().compareTo(root.getName())==0) { + if(root!=null && type.getName().compareTo(root.getName())==0) { + return new LinkedHashSet<>(); + } + if(root==null && AccessType.getAccessType(type.getName())!=null) { return new LinkedHashSet<>(); } - return type.getExtendedTypes(); } diff --git a/src/test/java/org/gcube/informationsystem/types/knowledge/ModelKnowledgeTest.java b/src/test/java/org/gcube/informationsystem/types/knowledge/ModelKnowledgeTest.java index 1bfee01..d1db28f 100644 --- a/src/test/java/org/gcube/informationsystem/types/knowledge/ModelKnowledgeTest.java +++ b/src/test/java/org/gcube/informationsystem/types/knowledge/ModelKnowledgeTest.java @@ -12,7 +12,6 @@ import java.util.Map.Entry; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.model.knowledge.ModelKnowledge; import org.gcube.informationsystem.model.knowledge.UsageKnowledge; -import org.gcube.informationsystem.queries.templates.QueryTemplateTest; import org.gcube.informationsystem.tree.Node; import org.gcube.informationsystem.tree.NodeElaborator; import org.gcube.informationsystem.tree.Tree; @@ -32,7 +31,7 @@ public class ModelKnowledgeTest{ private static final Logger logger = LoggerFactory.getLogger(ModelKnowledgeTest.class); protected File getTypesDirectory() throws Exception { - URL logbackFileURL = QueryTemplateTest.class.getClassLoader().getResource("logback-test.xml"); + URL logbackFileURL = ModelKnowledgeTest.class.getClassLoader().getResource("logback-test.xml"); File logbackFile = new File(logbackFileURL.toURI()); File resourcesDirectory = logbackFile.getParentFile(); return new File(resourcesDirectory, "types"); @@ -55,6 +54,7 @@ public class ModelKnowledgeTest{ String json = readFile(file); List types = TypeMapper.deserializeTypeDefinitions(json); modelKnowledge.addAllType(types); + logger.trace("-------------------------------------------------------"); } for(AccessType modelType : modelTypes) {