]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/ModelDependenciesBean.java
Merge "Support dependency embedding in generic model export/import"
[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.LinkedList;
4 import java.util.Map;
5 import java.util.Set;
6
7 import org.simantics.databoard.Bindings;
8 import org.simantics.databoard.adapter.AdaptException;
9 import org.simantics.databoard.binding.Binding;
10 import org.simantics.databoard.binding.mutable.Variant;
11 import org.simantics.db.ReadGraph;
12 import org.simantics.db.Resource;
13 import org.simantics.db.common.request.ObjectsWithType;
14 import org.simantics.db.exception.DatabaseException;
15 import org.simantics.db.layer0.adapter.CopyHandler;
16 import org.simantics.db.layer0.migration.MigrationState;
17 import org.simantics.db.layer0.migration.MigrationStateKeys;
18 import org.simantics.db.layer0.util.SimanticsClipboard.Representation;
19 import org.simantics.graph.representation.TransferableGraph1;
20 import org.simantics.layer0.Layer0;
21
22 public class ModelDependenciesBean {
23
24         public static final String EXTENSION_KEY = ModelDependenciesBean.class.getSimpleName();
25
26         public static final Binding BINDING = Bindings.getBindingUnchecked(ModelDependenciesBean.class);
27
28         public ModelDependency[] dependencies;
29
30         public ModelDependenciesBean() {
31                 dependencies = new ModelDependency[0];
32         }
33
34         public ModelDependenciesBean(ModelDependency[] dependencies) {
35                 this.dependencies = dependencies;
36         }
37
38         private static void collectDependencies(ReadGraph graph, Resource resource, LinkedList<ModelDependency> modelDependencies) throws DatabaseException {
39
40                 Layer0 L0 = Layer0.getInstance(graph);
41                 libs: for(Resource library : graph.syncRequest(new ObjectsWithType(resource, L0.IsLinkedTo, L0.SharedOntology))) {
42                         String uri = graph.getPossibleURI(library);
43                         if(uri == null) continue;
44                         for(ModelDependency dep : modelDependencies)
45                                 if(dep.uri.equals(uri)) continue libs;
46                         CopyHandler ch = graph.adapt(library, CopyHandler.class);
47                         SimanticsClipboardImpl clipboard = new SimanticsClipboardImpl();
48                         ch.copyToClipboard(graph, clipboard);
49                         for (Set<Representation> object : clipboard.getContents()) {
50                                 TransferableGraph1 tg = ClipboardUtils.accept(graph, object, SimanticsKeys.KEY_TRANSFERABLE_GRAPH);
51                                 if(tg != null) {
52                                         modelDependencies.addFirst(new ModelDependency(uri, tg));
53                                 }
54                         }
55                         collectDependencies(graph, library, modelDependencies);
56                 }
57
58         }
59
60         public static ModelDependenciesBean create(ReadGraph graph, Resource resource) throws DatabaseException {
61
62                 LinkedList<ModelDependency> dependencies = new LinkedList<>();
63                 collectDependencies(graph, resource, dependencies);
64                 return new ModelDependenciesBean(dependencies.toArray(new ModelDependency[dependencies.size()]));
65
66         }
67
68         public static ModelDependenciesBean fromMigrationState(MigrationState state) throws DatabaseException {
69                 Map<String,Variant> extensions = state.getProperty(MigrationStateKeys.TG_EXTENSIONS);
70                 final Variant variant = extensions.get(ModelDependenciesBean.EXTENSION_KEY);
71                 if (variant != null) {
72                         try {
73                                 return (ModelDependenciesBean) variant.getValue(ModelDependenciesBean.BINDING);
74                         } catch (AdaptException e) {
75                                 e.printStackTrace();
76                         }
77                 }
78                 return null;
79         }       
80         
81 }