1 package org.simantics.db.layer0.util;
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashSet;
6 import java.util.LinkedList;
11 import org.eclipse.core.runtime.NullProgressMonitor;
12 import org.simantics.databoard.Bindings;
13 import org.simantics.databoard.adapter.AdaptException;
14 import org.simantics.databoard.binding.Binding;
15 import org.simantics.databoard.binding.mutable.Variant;
16 import org.simantics.db.ReadGraph;
17 import org.simantics.db.Resource;
18 import org.simantics.db.common.request.ObjectsWithType;
19 import org.simantics.db.exception.DatabaseException;
20 import org.simantics.db.layer0.adapter.CopyHandler;
21 import org.simantics.db.layer0.migration.MigrationState;
22 import org.simantics.db.layer0.migration.MigrationStateKeys;
23 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;
24 import org.simantics.graph.representation.TransferableGraph1;
25 import org.simantics.layer0.Layer0;
27 public class ModelDependenciesBean {
29 public static final String EXTENSION_KEY = ModelDependenciesBean.class.getSimpleName();
31 public static final Binding BINDING = Bindings.getBindingUnchecked(ModelDependenciesBean.class);
33 public ModelDependency[] dependencies;
35 public ModelDependenciesBean() {
36 dependencies = new ModelDependency[0];
39 public ModelDependenciesBean(ModelDependency[] dependencies) {
40 this.dependencies = dependencies;
44 * Returns the linked shared ontologies in topological order.
46 public static List<Resource> collectDependencies(ReadGraph graph, Resource resource) throws DatabaseException {
47 LinkedList<Resource> order = new LinkedList<>();
48 collectDependencies(graph, resource, order, new HashSet<>());
52 private static void collectDependencies(ReadGraph graph, Resource resource, LinkedList<Resource> order, Set<Resource> visited) throws DatabaseException {
53 Layer0 L0 = Layer0.getInstance(graph);
54 for(Resource library : graph.syncRequest(new ObjectsWithType(resource, L0.IsLinkedTo, L0.SharedOntology))) {
55 if (order.contains(library)) continue;
56 if (visited.contains(library)) throw new DatabaseException("Cyclic dependency detected.");
58 collectDependencies(graph, library, order, visited);
59 order.addFirst(library);
63 private static List<ModelDependency> collectModelDependencies(ReadGraph graph, Resource resource) throws DatabaseException {
64 List<Resource> order = collectDependencies(graph, resource);
65 Collections.reverse(order);
67 List<ModelDependency> modelDependencies = new ArrayList<>(order.size());
69 for (Resource library : order) {
70 String uri = graph.getPossibleURI(library);
71 if(uri == null) continue;
72 CopyHandler ch = graph.adapt(library, CopyHandler.class);
73 SimanticsClipboardImpl clipboard = new SimanticsClipboardImpl();
74 ch.copyToClipboard(graph, clipboard, new NullProgressMonitor());
75 for (Set<Representation> object : clipboard.getContents()) {
76 TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);
78 modelDependencies.add(new ModelDependency(uri, tg));
82 return modelDependencies;
85 public static ModelDependenciesBean create(ReadGraph graph, Resource resource) throws DatabaseException {
86 List<ModelDependency> dependencies = collectModelDependencies(graph, resource);
87 return new ModelDependenciesBean(dependencies.toArray(new ModelDependency[dependencies.size()]));
90 public static ModelDependenciesBean fromMigrationState(MigrationState state) throws DatabaseException, AdaptException {
91 Map<String,Variant> extensions = state.getProperty(MigrationStateKeys.TG_EXTENSIONS);
92 final Variant variant = extensions.get(ModelDependenciesBean.EXTENSION_KEY);
93 return variant != null ? (ModelDependenciesBean) variant.getValue(ModelDependenciesBean.BINDING) : null;