]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelDependenciesBean.java
Collect model dependencies in reversed topological order
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / ModelDependenciesBean.java
1 package org.simantics.db.layer0.util;
2
3 import java.util.Collections;
4 import java.util.HashSet;
5 import java.util.LinkedList;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Set;
9
10 import org.simantics.databoard.Bindings;
11 import org.simantics.databoard.adapter.AdaptException;
12 import org.simantics.databoard.binding.Binding;
13 import org.simantics.databoard.binding.mutable.Variant;
14 import org.simantics.db.ReadGraph;
15 import org.simantics.db.Resource;
16 import org.simantics.db.common.request.ObjectsWithType;
17 import org.simantics.db.exception.DatabaseException;
18 import org.simantics.db.layer0.adapter.CopyHandler;
19 import org.simantics.db.layer0.migration.MigrationState;
20 import org.simantics.db.layer0.migration.MigrationStateKeys;
21 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;
22 import org.simantics.graph.representation.TransferableGraph1;
23 import org.simantics.layer0.Layer0;
24
25 public class ModelDependenciesBean {
26
27         public static final String EXTENSION_KEY = ModelDependenciesBean.class.getSimpleName();
28
29         public static final Binding BINDING = Bindings.getBindingUnchecked(ModelDependenciesBean.class);
30
31         public ModelDependency[] dependencies;
32
33         public ModelDependenciesBean() {
34                 dependencies = new ModelDependency[0];
35         }
36
37         public ModelDependenciesBean(ModelDependency[] dependencies) {
38                 this.dependencies = dependencies;
39         }
40
41         /*
42          * Returns the linked shared ontologies in topological order. 
43          */
44         public static List<Resource> collectDependencies(ReadGraph graph, Resource resource) throws DatabaseException {
45                 LinkedList<Resource> order = new LinkedList<>();
46                 collectDependencies(graph, resource, order, new HashSet<>());
47                 return order;
48         }
49         
50         private static void collectDependencies(ReadGraph graph, Resource resource, LinkedList<Resource> order, Set<Resource> visited) throws DatabaseException {
51                 Layer0 L0 = Layer0.getInstance(graph);
52                 for(Resource library : graph.syncRequest(new ObjectsWithType(resource, L0.IsLinkedTo, L0.SharedOntology))) {
53                         if (order.contains(library)) continue;
54                         if (visited.contains(library)) throw new DatabaseException("Cyclic dependency detected.");
55                         visited.add(library);
56                         collectDependencies(graph, library, order, visited);
57                         order.addFirst(library);
58                 }
59         }
60         
61         private static List<ModelDependency> collectModelDependencies(ReadGraph graph, Resource resource) throws DatabaseException {
62                 List<Resource> order = collectDependencies(graph, resource);
63                 Collections.reverse(order);
64
65                 List<ModelDependency> modelDependencies = new LinkedList<>();
66
67                 for (Resource library : order) {
68                         String uri = graph.getPossibleURI(library);
69                         if(uri == null) continue;
70                         CopyHandler ch = graph.adapt(library, CopyHandler.class);
71                         SimanticsClipboardImpl clipboard = new SimanticsClipboardImpl();
72                         ch.copyToClipboard(graph, clipboard);
73                         for (Set<Representation> object : clipboard.getContents()) {
74                                 TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);
75                                 if(tg != null) {
76                                         modelDependencies.add(new ModelDependency(uri, tg));
77                                 }
78                         }
79                 }
80                 return modelDependencies;
81
82         }
83
84         public static ModelDependenciesBean create(ReadGraph graph, Resource resource) throws DatabaseException {
85
86                 List<ModelDependency> dependencies = collectModelDependencies(graph, resource);
87                 return new ModelDependenciesBean(dependencies.toArray(new ModelDependency[dependencies.size()]));
88
89         }
90
91         public static ModelDependenciesBean fromMigrationState(MigrationState state) throws DatabaseException {
92                 Map<String,Variant> extensions = state.getProperty(MigrationStateKeys.TG_EXTENSIONS);
93                 final Variant variant = extensions.get(ModelDependenciesBean.EXTENSION_KEY);
94                 if (variant != null) {
95                         try {
96                                 return (ModelDependenciesBean) variant.getValue(ModelDependenciesBean.BINDING);
97                         } catch (AdaptException e) {
98                                 e.printStackTrace();
99                         }
100                 }
101                 return null;
102         }       
103         
104 }