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

110 lines
3.1 KiB
Java
Raw Normal View History

2023-10-26 17:22:53 +02:00
package org.gcube.informationsystem.discovery.model.knowledge;
2023-02-06 14:15:01 +01:00
2023-02-07 15:15:22 +01:00
import java.util.Collection;
2023-02-06 16:35:30 +01:00
import java.util.HashMap;
2023-02-06 17:04:25 +01:00
import java.util.HashSet;
2023-02-06 14:15:01 +01:00
import java.util.Map;
2023-02-06 16:35:30 +01:00
import java.util.Set;
2023-02-06 14:15:01 +01:00
import org.gcube.informationsystem.base.reference.AccessType;
import org.gcube.informationsystem.base.reference.Element;
2023-02-06 16:35:30 +01:00
import org.gcube.informationsystem.discovery.Discovery;
import org.gcube.informationsystem.serialization.ElementMappingAction;
2023-02-06 14:15:01 +01:00
import org.gcube.informationsystem.tree.Tree;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2023-02-06 14:15:01 +01:00
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class ModelKnowledge {
2023-02-06 17:43:51 +01:00
private static final Logger logger = LoggerFactory.getLogger(ModelKnowledge.class);
2023-02-07 15:15:22 +01:00
protected boolean created;
2023-02-10 12:12:24 +01:00
protected Map<AccessType, UsageKnowledge> usageKnowledges;
2023-02-06 14:15:01 +01:00
protected Map<AccessType, Tree<Class<Element>>> trees;
2023-02-10 12:12:24 +01:00
protected Map<AccessType, Discovery<Element>> discoveries;
protected Set<Package> packages;
2023-02-06 16:35:30 +01:00
2023-02-07 15:15:22 +01:00
public ModelKnowledge() {
2023-02-10 12:12:24 +01:00
this.packages = new HashSet<>();
reset();
2023-02-08 16:58:12 +01:00
}
private void reset() {
this.created = false;
2023-02-10 12:12:24 +01:00
this.usageKnowledges = new HashMap<>();
2023-02-08 16:58:12 +01:00
this.trees = new HashMap<>();
this.discoveries = new HashMap<>();
}
2023-02-07 15:15:22 +01:00
public UsageKnowledge getUsageKnowledge(AccessType accessType) {
if(!created) {
throw new RuntimeException("You must invoke createKnowledge() first");
}
return usageKnowledges.get(accessType);
2023-02-06 16:35:30 +01:00
}
2023-02-06 14:15:01 +01:00
public synchronized void createKnowledge(boolean force) throws Exception {
if(force) {
logger.info("Going to force Knowledge recreation");
2023-02-08 16:58:12 +01:00
reset();
}
createKnowledge();
}
2023-02-10 12:12:24 +01:00
public void addPackages(Collection<Package> packages) {
this.packages.addAll(packages);
}
public synchronized void createKnowledge() throws Exception {
if(created) {
logger.trace("Knowledge has been already created.");
return;
}
2023-02-06 16:35:30 +01:00
2023-02-07 15:15:22 +01:00
AccessType[] modelTypes = AccessType.getModelTypes();
2023-02-06 17:43:51 +01:00
ClassInformation classInformation = new ClassInformation();
2023-02-06 16:35:30 +01:00
for(AccessType accessType : modelTypes) {
2023-02-06 18:03:47 +01:00
Class<Element> clz = accessType.getTypeClass();
2023-02-06 17:43:51 +01:00
Tree<Class<Element>> tree = new Tree<>(clz, classInformation);
2023-02-06 16:35:30 +01:00
trees.put(accessType, tree);
AddElementToTreeAction aetta = new AddElementToTreeAction(tree);
2023-02-07 15:15:22 +01:00
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);
}
2023-02-06 16:35:30 +01:00
2023-02-10 12:12:24 +01:00
Discovery<Element> discovery = new Discovery<>(clz);
2023-02-06 16:35:30 +01:00
discoveries.put(accessType, discovery);
2023-02-10 12:12:24 +01:00
discovery.addPackages(packages);
2023-02-06 16:35:30 +01:00
discovery.addDiscoveredElementActions(new ElementMappingAction());
discovery.addDiscoveredElementActions(aetta);
2023-02-08 16:58:12 +01:00
discovery.discover();
2023-02-06 16:35:30 +01:00
}
this.created = true;
2023-02-06 16:35:30 +01:00
}
2023-02-06 14:15:01 +01:00
public synchronized Tree<Class<Element>> getClassesTree(AccessType accessType) {
2023-02-06 17:04:25 +01:00
return trees.get(accessType);
2023-02-06 16:35:30 +01:00
}
2023-02-06 18:03:47 +01:00
2023-02-10 12:12:24 +01:00
public synchronized Discovery<Element> getDiscovery(AccessType accessType) {
return discoveries.get(accessType);
}
2023-02-06 14:15:01 +01:00
}