]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/TransferableGraphConfiguration2.java
Sync git svn branch with SVN repository r33158.
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / TransferableGraphConfiguration2.java
1 package org.simantics.db.layer0.util;\r
2 \r
3 import java.util.ArrayList;\r
4 import java.util.Collection;\r
5 import java.util.Collections;\r
6 import java.util.Map;\r
7 import java.util.TreeMap;\r
8 \r
9 import org.simantics.databoard.binding.mutable.Variant;\r
10 import org.simantics.db.ReadGraph;\r
11 import org.simantics.db.RequestProcessor;\r
12 import org.simantics.db.Resource;\r
13 import org.simantics.db.Statement;\r
14 import org.simantics.db.common.NamedResource;\r
15 import org.simantics.db.common.request.UniqueRead;\r
16 import org.simantics.db.exception.DatabaseException;\r
17 import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;\r
18 import org.simantics.db.layer0.util.DomainProcessor3.ExclusionDecision;\r
19 import org.simantics.scl.runtime.function.Function1;\r
20 \r
21 public class TransferableGraphConfiguration2 {\r
22         \r
23         public static class RootSpec {\r
24                 public final Resource resource;\r
25                 public final String name;\r
26                 public final boolean internal;\r
27 \r
28                 public RootSpec(Resource resource, String name, boolean internal) {\r
29                         if (resource == null)\r
30                                 throw new NullPointerException("null resource");\r
31                         if (name == null)\r
32                                 throw new NullPointerException("null name");\r
33                         this.resource = resource;\r
34                         this.name = name;\r
35                         this.internal = internal;\r
36                 }\r
37 \r
38                 @Override\r
39                 public String toString() {\r
40                         return "RootSpec[" + name + ", " + resource + ", " + internal + "]"; \r
41                 }\r
42 \r
43                 @Override\r
44                 public int hashCode() {\r
45                         final int prime = 31;\r
46                         int result = 1;\r
47                         result = prime * result + (internal ? 1231 : 1237);\r
48                         result = prime * result + resource.hashCode();\r
49                         result = prime * result + name.hashCode();\r
50                         return result;\r
51                 }\r
52 \r
53                 @Override\r
54                 public boolean equals(Object obj) {\r
55                         if (this == obj)\r
56                                 return true;\r
57                         if (obj == null)\r
58                                 return false;\r
59                         if (getClass() != obj.getClass())\r
60                                 return false;\r
61                         RootSpec other = (RootSpec) obj;\r
62                         return internal == other.internal && resource.equals(other.resource) && name.equals(other.name);\r
63                 }\r
64         }\r
65         \r
66         final public TreeMap<String, Variant> baseExtensions = new TreeMap<String,Variant>();\r
67         final public Resource indexRoot;\r
68         final public Collection<RootSpec> roots;\r
69         final public Map<Resource, ExtentStatus> preStatus;\r
70         final public boolean ignoreVirtualResources;\r
71         final public boolean validate;\r
72         \r
73         /**\r
74          * <code>true</code> to export values, <code>false</code> to skip the actual\r
75          * values and only write the resource id.\r
76          */\r
77         public boolean values = true;\r
78 \r
79         public Collection<TGValueModifier> valueModifiers;\r
80         public Function1<Statement,ExclusionDecision> exclusionFunction;\r
81 \r
82         public TransferableGraphConfiguration2(Resource indexRoot, Collection<RootSpec> roots, Map<Resource, ExtentStatus> preStatus, boolean ignoreVirtualResources, boolean validate) {\r
83                 this.indexRoot = indexRoot;\r
84                 this.roots = roots;\r
85                 this.preStatus = preStatus;\r
86                 this.ignoreVirtualResources = ignoreVirtualResources;\r
87                 this.validate = validate;\r
88                 this.valueModifiers = null;\r
89         }\r
90 \r
91         public TransferableGraphConfiguration2(Resource indexRoot, Collection<RootSpec> roots, Map<Resource, ExtentStatus> preStatus, boolean ignoreVirtualResources) {\r
92                 this(indexRoot, roots, preStatus, ignoreVirtualResources, true);\r
93         }\r
94 \r
95         public TransferableGraphConfiguration2(Resource indexRoot, Collection<RootSpec> roots, Map<Resource, ExtentStatus> preStatus) {\r
96                 this(indexRoot, roots, preStatus, true);\r
97         }\r
98 \r
99         public TransferableGraphConfiguration2(TransferableGraphConfiguration2 conf) throws DatabaseException {\r
100                 this(conf.indexRoot, conf.roots, conf.preStatus, conf.ignoreVirtualResources, conf.validate);\r
101         }\r
102 \r
103         public TransferableGraphConfiguration2(ReadGraph graph, Resource model, boolean ignoreVirtualResources, boolean validate) throws DatabaseException {\r
104                 this(new TGConfigurer(graph, ignoreVirtualResources, validate).roots2(Collections.singletonList(model)).create());\r
105         }\r
106 \r
107         public TransferableGraphConfiguration2(ReadGraph graph, Collection<Resource> roots, boolean ignoreVirtualResources, boolean validate) throws DatabaseException {\r
108             this(new TGConfigurer(graph, ignoreVirtualResources, validate).roots2(roots).create());\r
109         }\r
110 \r
111         public TransferableGraphConfiguration2(ReadGraph graph, Resource model, boolean ignoreVirtualResources) throws DatabaseException {\r
112                 this(graph, model, ignoreVirtualResources, true);\r
113         }\r
114 \r
115         public TransferableGraphConfiguration2(ReadGraph graph, Resource model) throws DatabaseException {\r
116                 this(graph, model, true);\r
117         }\r
118         \r
119         public TransferableGraphConfiguration2(ReadGraph graph, Collection<RootSpec> roots, Collection<Resource> resourceRoots, Collection<Resource> exclusions) throws DatabaseException {\r
120                 this(new TGConfigurer(graph, true).roots(roots).roots2(resourceRoots).exclusions(exclusions).create());\r
121         }\r
122 \r
123         public TransferableGraphConfiguration2(ReadGraph graph, Collection<RootSpec> roots, Collection<Resource> resourceRoots, Collection<Resource> exclusions, boolean ignoreVirtualResource, boolean validate) throws DatabaseException {\r
124                 this(new TGConfigurer(graph, ignoreVirtualResource, validate).roots(roots).roots2(resourceRoots).exclusions(exclusions).create());\r
125         }\r
126 \r
127         public static TransferableGraphConfiguration2 createWithNames(RequestProcessor processor, final Collection<NamedResource> roots, final Collection<Resource> exclusions, final boolean ignoreVirtualResource, final boolean validate) throws DatabaseException {\r
128                 return processor.sync(new UniqueRead<TransferableGraphConfiguration2>() {\r
129 \r
130                         @Override\r
131                         public TransferableGraphConfiguration2 perform(ReadGraph graph) throws DatabaseException {\r
132                                 return new TransferableGraphConfiguration2(graph, translate(roots), Collections.<Resource>emptyList(), exclusions, ignoreVirtualResource, validate);\r
133                         }\r
134                         \r
135                 });\r
136         }\r
137 \r
138         public static TransferableGraphConfiguration2 createWithNames2(RequestProcessor processor, final Collection<RootSpec> roots, final Collection<Resource> exclusions, final boolean ignoreVirtualResource, final boolean validate) throws DatabaseException {\r
139                 return processor.sync(new UniqueRead<TransferableGraphConfiguration2>() {\r
140 \r
141                         @Override\r
142                         public TransferableGraphConfiguration2 perform(ReadGraph graph) throws DatabaseException {\r
143                                 return new TransferableGraphConfiguration2(graph, roots, Collections.<Resource>emptyList(), exclusions, ignoreVirtualResource, validate);\r
144                         }\r
145                         \r
146                 });\r
147         }\r
148 \r
149         public static TransferableGraphConfiguration2 createWithNames(RequestProcessor processor, final Collection<NamedResource> roots, final Collection<Resource> exclusions) throws DatabaseException {\r
150                 return createWithNames(processor, roots, exclusions, true, true);\r
151         }\r
152 \r
153         public static TransferableGraphConfiguration2 createWithResources(RequestProcessor processor, final Collection<Resource> roots, final Collection<Resource> exclusions) throws DatabaseException {\r
154                 return processor.sync(new UniqueRead<TransferableGraphConfiguration2>() {\r
155 \r
156                         @Override\r
157                         public TransferableGraphConfiguration2 perform(ReadGraph graph) throws DatabaseException {\r
158                                 return new TransferableGraphConfiguration2(graph, Collections.<RootSpec>emptyList(), roots, exclusions);\r
159                         }\r
160                         \r
161                 });\r
162         }\r
163 \r
164         public static TransferableGraphConfiguration2 createForModel(RequestProcessor processor, final Resource model) throws DatabaseException {\r
165                 return createWithResources(processor, Collections.singletonList(model), Collections.<Resource>emptyList());\r
166         }\r
167 \r
168         private static Collection<RootSpec> translate(Collection<NamedResource> roots) {\r
169                 ArrayList<RootSpec> result = new ArrayList<RootSpec>();\r
170                 for(NamedResource nr : roots) result.add(new RootSpec(nr.getResource(), nr.getName(), true));\r
171                 return result;\r
172         }\r
173         \r
174 }\r