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