diff --git a/src/main/java/org/gcube/informationsystem/discovery/RegistrationProvider.java b/src/main/java/org/gcube/informationsystem/discovery/RegistrationProvider.java index 41cb96d..c34c553 100644 --- a/src/main/java/org/gcube/informationsystem/discovery/RegistrationProvider.java +++ b/src/main/java/org/gcube/informationsystem/discovery/RegistrationProvider.java @@ -8,6 +8,8 @@ import java.util.Collection; * returning the list of packages containing the interfaces * representing the model. * + * Any registration provider MUST have a constructor with no arguments + * * @author Luca Frosini (ISTI - CNR) */ public interface RegistrationProvider { diff --git a/src/main/java/org/gcube/informationsystem/discovery/knowledge/AddElementToTreeAction.java b/src/main/java/org/gcube/informationsystem/discovery/knowledge/AddElementToTreeAction.java index 32b67b5..dee5550 100644 --- a/src/main/java/org/gcube/informationsystem/discovery/knowledge/AddElementToTreeAction.java +++ b/src/main/java/org/gcube/informationsystem/discovery/knowledge/AddElementToTreeAction.java @@ -3,9 +3,13 @@ */ package org.gcube.informationsystem.discovery.knowledge; +import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.Element; import org.gcube.informationsystem.discovery.DiscoveredElementAction; import org.gcube.informationsystem.tree.Tree; +import org.gcube.informationsystem.types.TypeMapper; +import org.gcube.informationsystem.types.reference.Type; +import org.gcube.informationsystem.types.reference.entities.ResourceType; /** * @author Luca Frosini (ISTI - CNR) @@ -21,6 +25,19 @@ public class AddElementToTreeAction implements DiscoveredElementAction @Override public void analizeElement(Class e) throws Exception { tree.addNode(e); + Type type = TypeMapper.createTypeDefinition(e); + createUsageKnowledge(type); + } + + protected void createUsageKnowledge(Type type) { + if (type.getAccessType() != AccessType.RESOURCE) { + return; + } + ResourceType rt = (ResourceType) type; + UsageKnowledge fk = UsageKnowledge.getFacetKnowledge(); + fk.addAll(rt.getFacets()); + UsageKnowledge rk = UsageKnowledge.getResourceKnowledge(); + rk.addAll(rt.getResources()); } } diff --git a/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledge.java b/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledge.java index 0423e01..8ca876c 100644 --- a/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledge.java +++ b/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledge.java @@ -12,31 +12,46 @@ import org.gcube.informationsystem.discovery.Discovery; import org.gcube.informationsystem.discovery.RegistrationProvider; import org.gcube.informationsystem.serialization.ElementMappingAction; import org.gcube.informationsystem.tree.Tree; -import org.gcube.informationsystem.types.TypeMapper; -import org.gcube.informationsystem.types.knowledge.AddTypeToTreeAction; -import org.gcube.informationsystem.types.knowledge.TypeInformation; -import org.gcube.informationsystem.types.reference.Type; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Luca Frosini (ISTI - CNR) */ public class ModelKnowledge { + private static final Logger logger = LoggerFactory.getLogger(ModelKnowledge.class); + + protected boolean created; + public static ModelKnowledge getInstance() { return new ModelKnowledge(); } protected Map>> trees; - protected Map> typeTrees; protected Map> discoveries; protected ModelKnowledge() { this.trees = new HashMap<>(); - this.typeTrees = new HashMap<>(); this.discoveries = new HashMap<>(); + this.created = false; } - public void createKnowledge() throws Exception { + public synchronized void createKnowledge(boolean force) throws Exception { + if(force) { + this.created = false; + logger.info("Going to force Knowledge recreation"); + } + + createKnowledge(); + } + + public synchronized void createKnowledge() throws Exception { + + if(created) { + logger.trace("Knowledge has been already created."); + return; + } AccessType[] modelTypes = AccessType.getModelTypes(); @@ -48,7 +63,6 @@ public class ModelKnowledge { } ClassInformation classInformation = new ClassInformation(); - TypeInformation typeInformation = new TypeInformation(); for(AccessType accessType : modelTypes) { @@ -57,31 +71,22 @@ public class ModelKnowledge { trees.put(accessType, tree); AddElementToTreeAction aetta = new AddElementToTreeAction(tree); - Type type = TypeMapper.createTypeDefinition(clz); - Tree typeTree = new Tree<>(type, typeInformation); - typeTrees.put(accessType, typeTree); - AddTypeToTreeAction attta = new AddTypeToTreeAction(typeTree); - - Discovery discovery = new Discovery<>(clz); discoveries.put(accessType, discovery); discovery.addPackages(allPackages); discovery.addDiscoveredElementActions(new ElementMappingAction()); discovery.addDiscoveredElementActions(aetta); - discovery.addDiscoveredElementActions(attta); discovery.discover(); } + this.created = true; + } - public Tree> getClassesTree(AccessType accessType) { + public synchronized Tree> getClassesTree(AccessType accessType) { return trees.get(accessType); } - - public Tree getTypesTree(AccessType accessType) { - return typeTrees.get(accessType); - } } diff --git a/src/main/java/org/gcube/informationsystem/types/knowledge/UsageKnowledge.java b/src/main/java/org/gcube/informationsystem/discovery/knowledge/UsageKnowledge.java similarity index 96% rename from src/main/java/org/gcube/informationsystem/types/knowledge/UsageKnowledge.java rename to src/main/java/org/gcube/informationsystem/discovery/knowledge/UsageKnowledge.java index 2e256a3..511c1d3 100644 --- a/src/main/java/org/gcube/informationsystem/types/knowledge/UsageKnowledge.java +++ b/src/main/java/org/gcube/informationsystem/discovery/knowledge/UsageKnowledge.java @@ -1,4 +1,4 @@ -package org.gcube.informationsystem.types.knowledge; +package org.gcube.informationsystem.discovery.knowledge; import java.util.Collection; import java.util.LinkedHashMap; diff --git a/src/main/java/org/gcube/informationsystem/types/knowledge/AddTypeToTreeAction.java b/src/main/java/org/gcube/informationsystem/types/knowledge/AddTypeToTreeAction.java deleted file mode 100644 index d27716b..0000000 --- a/src/main/java/org/gcube/informationsystem/types/knowledge/AddTypeToTreeAction.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * - */ -package org.gcube.informationsystem.types.knowledge; - -import org.gcube.informationsystem.base.reference.AccessType; -import org.gcube.informationsystem.base.reference.Element; -import org.gcube.informationsystem.discovery.DiscoveredElementAction; -import org.gcube.informationsystem.tree.Tree; -import org.gcube.informationsystem.types.TypeMapper; -import org.gcube.informationsystem.types.reference.Type; -import org.gcube.informationsystem.types.reference.entities.ResourceType; - -/** - * @author Luca Frosini (ISTI - CNR) - */ -public class AddTypeToTreeAction implements DiscoveredElementAction { - - protected Tree tree; - - public AddTypeToTreeAction(Tree tree) { - this.tree = tree; - } - - @Override - public void analizeElement(Class e) throws Exception { - Type type = TypeMapper.createTypeDefinition(e); - tree.addNode(type); - createUsageKnowledge(type); - } - - - protected void createUsageKnowledge(Type type) { - if (type.getAccessType() != AccessType.RESOURCE) { - return; - } - ResourceType rt = (ResourceType) type; - UsageKnowledge fk = UsageKnowledge.getFacetKnowledge(); - fk.addAll(rt.getFacets()); - UsageKnowledge rk = UsageKnowledge.getResourceKnowledge(); - rk.addAll(rt.getResources()); - } - -} diff --git a/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java b/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java deleted file mode 100644 index d6d96d5..0000000 --- a/src/main/java/org/gcube/informationsystem/types/knowledge/TypeInformation.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.gcube.informationsystem.types.knowledge; - -import java.util.HashSet; -import java.util.Set; - -import org.gcube.informationsystem.tree.NodeInformation; -import org.gcube.informationsystem.types.reference.Type; - -/** - * @author Luca Frosini (ISTI - CNR) - */ -public class TypeInformation implements NodeInformation { - - @Override - public String getIdentifier(Type type) { - return type.getName(); - } - - @Override - public Set getParentIdentifiers(Type root, Type type) { - if(getIdentifier(type).compareTo(getIdentifier(root))==0) { - return new HashSet<>(); - } - return type.getSuperClasses(); - } - -}