information-system-model/src/main/java/org/gcube/informationsystem/discovery/knowledge/ModelKnowledge.java

134 lines
3.9 KiB
Java

package org.gcube.informationsystem.discovery.knowledge;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
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.serialization.ElementMappingAction;
import org.gcube.informationsystem.tree.Tree;
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);
private static ModelKnowledge modelKnowledge;
public static ModelKnowledge getGlobalModelKnowledgeInstance() {
if(modelKnowledge==null) {
modelKnowledge = new ModelKnowledge();
ServiceLoader<? extends RegistrationProvider> registrationProviders = ServiceLoader
.load(RegistrationProvider.class);
for(RegistrationProvider rp : registrationProviders) {
modelKnowledge.addRegistrationProvider(rp);
}
}
return modelKnowledge;
}
protected boolean created;
protected Map<AccessType,UsageKnowledge> usageKnowledges;
protected Map<AccessType, Tree<Class<Element>>> trees;
protected Map<AccessType, Discovery<? extends Element>> discoveries;
protected List<RegistrationProvider> registrationProviders;
public ModelKnowledge() {
this.trees = new HashMap<>();
this.discoveries = new HashMap<>();
this.created = false;
this.usageKnowledges = new HashMap<>();
this.registrationProviders = new ArrayList<>();
}
public void addRegistrationProvider(RegistrationProvider rp) {
registrationProviders.add(rp);
}
public void addRegistrationProviders(Collection<RegistrationProvider> rps) {
registrationProviders.addAll(rps);
}
public UsageKnowledge getUsageKnowledge(AccessType accessType) {
if(!created) {
throw new RuntimeException("You must invoke createKnowledge() first");
}
return usageKnowledges.get(accessType);
}
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;
}
Set<Package> allPackages = new HashSet<>();
for(RegistrationProvider rp : registrationProviders) {
allPackages.addAll(rp.getPackagesToRegister());
}
AccessType[] modelTypes = AccessType.getModelTypes();
ClassInformation classInformation = new ClassInformation();
for(AccessType accessType : modelTypes) {
Class<Element> clz = accessType.getTypeClass();
Tree<Class<Element>> tree = new Tree<>(clz, classInformation);
trees.put(accessType, tree);
AddElementToTreeAction aetta = new AddElementToTreeAction(tree);
if(accessType == AccessType.RESOURCE) {
UsageKnowledge facetKnowledge = new UsageKnowledge();
this.usageKnowledges.put(AccessType.FACET, facetKnowledge);
aetta.setFacetKnowledge(facetKnowledge);
UsageKnowledge resourceKnowledge = new UsageKnowledge();
this.usageKnowledges.put(AccessType.RESOURCE, resourceKnowledge);
aetta.setResourceKnowledge(resourceKnowledge);
}
Discovery<? extends Element> discovery = new Discovery<>(clz);
discoveries.put(accessType, discovery);
discovery.addPackages(allPackages);
discovery.addDiscoveredElementActions(new ElementMappingAction());
discovery.addDiscoveredElementActions(aetta);
discovery.discover();
}
this.created = true;
}
public synchronized Tree<Class<Element>> getClassesTree(AccessType accessType) {
return trees.get(accessType);
}
}