--- /dev/null
+package org.simantics.db.layer0.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.Collections;\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.db.ReadGraph;\r
+import org.simantics.db.RequestProcessor;\r
+import org.simantics.db.Resource;\r
+import org.simantics.db.Statement;\r
+import org.simantics.db.common.NamedResource;\r
+import org.simantics.db.common.request.UniqueRead;\r
+import org.simantics.db.exception.DatabaseException;\r
+import org.simantics.db.layer0.adapter.SubgraphExtent.ExtentStatus;\r
+import org.simantics.db.layer0.util.DomainProcessor3.ExclusionDecision;\r
+import org.simantics.scl.runtime.function.Function1;\r
+\r
+public class TransferableGraphConfiguration2 {\r
+ \r
+ public static class RootSpec {\r
+ public final Resource resource;\r
+ public final String name;\r
+ public final boolean internal;\r
+\r
+ public RootSpec(Resource resource, String name, boolean internal) {\r
+ if (resource == null)\r
+ throw new NullPointerException("null resource");\r
+ if (name == null)\r
+ throw new NullPointerException("null name");\r
+ this.resource = resource;\r
+ this.name = name;\r
+ this.internal = internal;\r
+ }\r
+\r
+ @Override\r
+ public String toString() {\r
+ return "RootSpec[" + name + ", " + resource + ", " + internal + "]"; \r
+ }\r
+\r
+ @Override\r
+ public int hashCode() {\r
+ final int prime = 31;\r
+ int result = 1;\r
+ result = prime * result + (internal ? 1231 : 1237);\r
+ result = prime * result + resource.hashCode();\r
+ result = prime * result + name.hashCode();\r
+ return result;\r
+ }\r
+\r
+ @Override\r
+ public boolean equals(Object obj) {\r
+ if (this == obj)\r
+ return true;\r
+ if (obj == null)\r
+ return false;\r
+ if (getClass() != obj.getClass())\r
+ return false;\r
+ RootSpec other = (RootSpec) obj;\r
+ return internal == other.internal && resource.equals(other.resource) && name.equals(other.name);\r
+ }\r
+ }\r
+ \r
+ final public TreeMap<String, Variant> baseExtensions = new TreeMap<String,Variant>();\r
+ final public Resource indexRoot;\r
+ final public Collection<RootSpec> roots;\r
+ final public Map<Resource, ExtentStatus> preStatus;\r
+ final public boolean ignoreVirtualResources;\r
+ final public boolean validate;\r
+ \r
+ /**\r
+ * <code>true</code> to export values, <code>false</code> to skip the actual\r
+ * values and only write the resource id.\r
+ */\r
+ public boolean values = true;\r
+\r
+ public Collection<TGValueModifier> valueModifiers;\r
+ public Function1<Statement,ExclusionDecision> exclusionFunction;\r
+\r
+ public TransferableGraphConfiguration2(Resource indexRoot, Collection<RootSpec> roots, Map<Resource, ExtentStatus> preStatus, boolean ignoreVirtualResources, boolean validate) {\r
+ this.indexRoot = indexRoot;\r
+ this.roots = roots;\r
+ this.preStatus = preStatus;\r
+ this.ignoreVirtualResources = ignoreVirtualResources;\r
+ this.validate = validate;\r
+ this.valueModifiers = null;\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(Resource indexRoot, Collection<RootSpec> roots, Map<Resource, ExtentStatus> preStatus, boolean ignoreVirtualResources) {\r
+ this(indexRoot, roots, preStatus, ignoreVirtualResources, true);\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(Resource indexRoot, Collection<RootSpec> roots, Map<Resource, ExtentStatus> preStatus) {\r
+ this(indexRoot, roots, preStatus, true);\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(TransferableGraphConfiguration2 conf) throws DatabaseException {\r
+ this(conf.indexRoot, conf.roots, conf.preStatus, conf.ignoreVirtualResources, conf.validate);\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(ReadGraph graph, Resource model, boolean ignoreVirtualResources, boolean validate) throws DatabaseException {\r
+ this(new TGConfigurer(graph, ignoreVirtualResources, validate).roots2(Collections.singletonList(model)).create());\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(ReadGraph graph, Collection<Resource> roots, boolean ignoreVirtualResources, boolean validate) throws DatabaseException {\r
+ this(new TGConfigurer(graph, ignoreVirtualResources, validate).roots2(roots).create());\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(ReadGraph graph, Resource model, boolean ignoreVirtualResources) throws DatabaseException {\r
+ this(graph, model, ignoreVirtualResources, true);\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(ReadGraph graph, Resource model) throws DatabaseException {\r
+ this(graph, model, true);\r
+ }\r
+ \r
+ public TransferableGraphConfiguration2(ReadGraph graph, Collection<RootSpec> roots, Collection<Resource> resourceRoots, Collection<Resource> exclusions) throws DatabaseException {\r
+ this(new TGConfigurer(graph, true).roots(roots).roots2(resourceRoots).exclusions(exclusions).create());\r
+ }\r
+\r
+ public TransferableGraphConfiguration2(ReadGraph graph, Collection<RootSpec> roots, Collection<Resource> resourceRoots, Collection<Resource> exclusions, boolean ignoreVirtualResource, boolean validate) throws DatabaseException {\r
+ this(new TGConfigurer(graph, ignoreVirtualResource, validate).roots(roots).roots2(resourceRoots).exclusions(exclusions).create());\r
+ }\r
+\r
+ public static TransferableGraphConfiguration2 createWithNames(RequestProcessor processor, final Collection<NamedResource> roots, final Collection<Resource> exclusions, final boolean ignoreVirtualResource, final boolean validate) throws DatabaseException {\r
+ return processor.sync(new UniqueRead<TransferableGraphConfiguration2>() {\r
+\r
+ @Override\r
+ public TransferableGraphConfiguration2 perform(ReadGraph graph) throws DatabaseException {\r
+ return new TransferableGraphConfiguration2(graph, translate(roots), Collections.<Resource>emptyList(), exclusions, ignoreVirtualResource, validate);\r
+ }\r
+ \r
+ });\r
+ }\r
+\r
+ public static TransferableGraphConfiguration2 createWithNames2(RequestProcessor processor, final Collection<RootSpec> roots, final Collection<Resource> exclusions, final boolean ignoreVirtualResource, final boolean validate) throws DatabaseException {\r
+ return processor.sync(new UniqueRead<TransferableGraphConfiguration2>() {\r
+\r
+ @Override\r
+ public TransferableGraphConfiguration2 perform(ReadGraph graph) throws DatabaseException {\r
+ return new TransferableGraphConfiguration2(graph, roots, Collections.<Resource>emptyList(), exclusions, ignoreVirtualResource, validate);\r
+ }\r
+ \r
+ });\r
+ }\r
+\r
+ public static TransferableGraphConfiguration2 createWithNames(RequestProcessor processor, final Collection<NamedResource> roots, final Collection<Resource> exclusions) throws DatabaseException {\r
+ return createWithNames(processor, roots, exclusions, true, true);\r
+ }\r
+\r
+ public static TransferableGraphConfiguration2 createWithResources(RequestProcessor processor, final Collection<Resource> roots, final Collection<Resource> exclusions) throws DatabaseException {\r
+ return processor.sync(new UniqueRead<TransferableGraphConfiguration2>() {\r
+\r
+ @Override\r
+ public TransferableGraphConfiguration2 perform(ReadGraph graph) throws DatabaseException {\r
+ return new TransferableGraphConfiguration2(graph, Collections.<RootSpec>emptyList(), roots, exclusions);\r
+ }\r
+ \r
+ });\r
+ }\r
+\r
+ public static TransferableGraphConfiguration2 createForModel(RequestProcessor processor, final Resource model) throws DatabaseException {\r
+ return createWithResources(processor, Collections.singletonList(model), Collections.<Resource>emptyList());\r
+ }\r
+\r
+ private static Collection<RootSpec> translate(Collection<NamedResource> roots) {\r
+ ArrayList<RootSpec> result = new ArrayList<RootSpec>();\r
+ for(NamedResource nr : roots) result.add(new RootSpec(nr.getResource(), nr.getName(), true));\r
+ return result;\r
+ }\r
+ \r
+}\r