diff --git a/src/main/java/org/gcube/informationsystem/discovery/knowledge/Knowledge.java b/src/main/java/org/gcube/informationsystem/discovery/knowledge/Knowledge.java new file mode 100644 index 0000000..473f7aa --- /dev/null +++ b/src/main/java/org/gcube/informationsystem/discovery/knowledge/Knowledge.java @@ -0,0 +1,73 @@ +package org.gcube.informationsystem.discovery.knowledge; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.ServiceLoader; + +import org.gcube.informationsystem.discovery.RegistrationProvider; + +/** + * @author Luca Frosini (ISTI - CNR) + */ +public class Knowledge { + + private static Knowledge instance; + + public static Knowledge getInstance() throws Exception { + return getInstance(false); + } + + public static Knowledge getInstance(boolean forceRediscover) throws Exception { + if(forceRediscover) { + instance = null; + } + + if(instance == null) { + instance = new Knowledge(); + instance.discover(); + } + return instance; + } + + protected ModelKnowledge allKnowledge; + protected Map modelKnowledges; + + private Knowledge() { + } + + public ModelKnowledge getAllKnowledge() { + return allKnowledge; + } + + public ModelKnowledge getModelKnowledges(RegistrationProvider rp) { + return modelKnowledges.get(rp.getModelName()); + } + + public ModelKnowledge getModelKnowledges(String modelName) { + return modelKnowledges.get(modelName); + } + + public void discover() throws Exception { + + allKnowledge = new ModelKnowledge(); + modelKnowledges = new LinkedHashMap<>(); + + ServiceLoader registrationProviders = ServiceLoader + .load(RegistrationProvider.class); + + for(RegistrationProvider rp : registrationProviders) { + ModelKnowledge modelKnowledge = new ModelKnowledge(); + modelKnowledges.put(rp.getModelName(), modelKnowledge); + modelKnowledge.addRegistrationProvider(rp); + modelKnowledge.createKnowledge(); + + allKnowledge.addRegistrationProvider(rp); + } + + allKnowledge.createKnowledge(); + + } + + + +} diff --git a/src/main/java/org/gcube/informationsystem/serialization/ElementMapper.java b/src/main/java/org/gcube/informationsystem/serialization/ElementMapper.java index 2c34612..af67a5d 100644 --- a/src/main/java/org/gcube/informationsystem/serialization/ElementMapper.java +++ b/src/main/java/org/gcube/informationsystem/serialization/ElementMapper.java @@ -12,7 +12,6 @@ import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.ServiceLoader; import java.util.Set; import org.gcube.com.fasterxml.jackson.core.JsonGenerationException; @@ -31,8 +30,7 @@ import org.gcube.com.fasterxml.jackson.databind.node.TextNode; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.Element; import org.gcube.informationsystem.discovery.Discovery; -import org.gcube.informationsystem.discovery.RegistrationProvider; -import org.gcube.informationsystem.discovery.knowledge.ModelKnowledge; +import org.gcube.informationsystem.discovery.knowledge.Knowledge; import org.gcube.informationsystem.types.TypeMapper; import org.gcube.informationsystem.types.reference.Type; import org.slf4j.Logger; @@ -50,20 +48,6 @@ public abstract class ElementMapper { protected static final Map> knownTypes; - private static ModelKnowledge modelKnowledge; - - public static ModelKnowledge getGlobalModelKnowledgeInstance() { - if(modelKnowledge==null) { - modelKnowledge = new ModelKnowledge(); - ServiceLoader registrationProviders = ServiceLoader - .load(RegistrationProvider.class); - for(RegistrationProvider rp : registrationProviders) { - modelKnowledge.addRegistrationProvider(rp); - } - } - return modelKnowledge; - } - /** * @return the ObjectMapper */ @@ -123,7 +107,7 @@ public abstract class ElementMapper { } try { - ElementMapper.getGlobalModelKnowledgeInstance().createKnowledge(); + Knowledge.getInstance(); }catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/test/java/org/gcube/informationsystem/discovery/DiscoveryTest.java b/src/test/java/org/gcube/informationsystem/discovery/DiscoveryTest.java index 0113fb0..2dbc402 100644 --- a/src/test/java/org/gcube/informationsystem/discovery/DiscoveryTest.java +++ b/src/test/java/org/gcube/informationsystem/discovery/DiscoveryTest.java @@ -4,8 +4,8 @@ import java.util.Map; import org.gcube.informationsystem.base.reference.AccessType; import org.gcube.informationsystem.base.reference.Element; +import org.gcube.informationsystem.discovery.knowledge.Knowledge; import org.gcube.informationsystem.discovery.knowledge.ModelKnowledge; -import org.gcube.informationsystem.serialization.ElementMapper; import org.gcube.informationsystem.tree.Tree; import org.gcube.informationsystem.types.TypeMapper; import org.gcube.informationsystem.types.reference.Type; @@ -26,8 +26,7 @@ public class DiscoveryTest { @Test public void testDiscovery() throws Exception { - ModelKnowledge modelKnowledge = ElementMapper.getGlobalModelKnowledgeInstance(); - modelKnowledge.createKnowledge(); + ModelKnowledge modelKnowledge = Knowledge.getInstance().getAllKnowledge(); AccessType[] accessTypes = AccessType.getModelTypes(); for(AccessType accessType : accessTypes) {