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

88 lines
2.8 KiB
Java

package org.gcube.informationsystem.discovery.knowledge;
import java.util.HashMap;
import java.util.HashSet;
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.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;
/**
* @author Luca Frosini (ISTI - CNR)
*/
public class ModelKnowledge {
public static ModelKnowledge getInstance() {
return new ModelKnowledge();
}
protected Map<AccessType, Tree<Class<Element>>> trees;
protected Map<AccessType, Tree<Type>> typeTrees;
protected Map<AccessType, Discovery<? extends Element>> discoveries;
protected ModelKnowledge() {
this.trees = new HashMap<>();
this.typeTrees = new HashMap<>();
this.discoveries = new HashMap<>();
}
public void createKnowledge() throws Exception {
AccessType[] modelTypes = AccessType.getModelTypes();
Set<Package> allPackages = new HashSet<>();
ServiceLoader<? extends RegistrationProvider> registrationProviders = ServiceLoader
.load(RegistrationProvider.class);
for(RegistrationProvider rp : registrationProviders) {
allPackages.addAll(rp.getPackagesToRegister());
}
ClassInformation classInformation = new ClassInformation();
TypeInformation typeInformation = new TypeInformation();
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);
Type type = TypeMapper.createTypeDefinition(clz);
Tree<Type> typeTree = new Tree<>(type, typeInformation);
typeTrees.put(accessType, typeTree);
AddTypeToTreeAction attta = new AddTypeToTreeAction(typeTree);
Discovery<? extends Element> discovery = new Discovery<>(clz);
discoveries.put(accessType, discovery);
discovery.addPackages(allPackages);
discovery.addDiscoveredElementActions(new ElementMappingAction());
discovery.addDiscoveredElementActions(aetta);
discovery.addDiscoveredElementActions(attta);
discovery.discover();
}
}
public Tree<Class<Element>> getClassesTree(AccessType accessType) {
return trees.get(accessType);
}
public Tree<Type> getTypesTree(AccessType accessType) {
return typeTrees.get(accessType);
}
}