1 package org.simantics.db.layer0.variable;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
5 import java.util.HashMap;
\r
6 import java.util.List;
\r
7 import java.util.Map;
\r
9 import org.simantics.db.ReadGraph;
\r
10 import org.simantics.db.Resource;
\r
11 import org.simantics.db.common.procedure.single.SingleSetSyncListener;
\r
12 import org.simantics.db.common.request.ParametrizedPrimitiveRead;
\r
13 import org.simantics.db.common.request.ResourceRead;
\r
14 import org.simantics.db.exception.DatabaseException;
\r
15 import org.simantics.db.layer0.request.VariableFactoryRequest;
\r
16 import org.simantics.db.procedure.Listener;
\r
17 import org.simantics.db.service.QueryControl;
\r
18 import org.simantics.operation.Layer0X;
\r
20 public class ExtendedGraphChildVariable extends StandardGraphChildVariable {
\r
22 private Map<String, Variable> extension;
\r
23 private List<Listener<Map<String, Variable>>> listeners = new ArrayList<Listener<Map<String, Variable>>>();
\r
25 public ExtendedGraphChildVariable(Variable parent, Resource resource) throws DatabaseException {
\r
26 super(parent, null, resource);
\r
29 Map<String, Variable> getExtension(ReadGraph graph) throws DatabaseException {
\r
31 if(extension == null) {
\r
33 extension = new HashMap<String, Variable>();
\r
35 QueryControl qc = graph.getService(QueryControl.class);
\r
37 qc.getIndependentGraph(graph).syncRequest(new ResourceRead<Collection<VariableFactory>>(resource) {
\r
40 public Collection<VariableFactory> perform(ReadGraph graph) throws DatabaseException {
\r
41 Layer0X L0X = Layer0X.getInstance(graph);
\r
42 ArrayList<VariableFactory> result = new ArrayList<VariableFactory>();
\r
43 for(Resource r : graph.getObjects(resource, L0X.HasChildVariables)) {
\r
44 VariableFactory factory = graph.adapt(r, VariableFactory.class);
\r
45 assert(factory != null);
\r
46 result.add(factory);
\r
51 }, new SingleSetSyncListener<VariableFactory>() {
\r
54 public void add(ReadGraph graph, final VariableFactory factory) throws DatabaseException {
\r
56 graph.syncRequest(new VariableFactoryRequest(ExtendedGraphChildVariable.this, factory), new SingleSetSyncListener<Variable>() {
\r
59 public void add(ReadGraph graph, final Variable child) throws DatabaseException {
\r
60 String name = child.getPropertyValue(graph, Variables.NAME);
\r
61 extension.put(name, child);
\r
65 public void remove(ReadGraph graph, Variable child) throws DatabaseException {
\r
66 String name = child.getPropertyValue(graph, Variables.NAME);
\r
67 Variable exist = extension.get(name);
\r
68 if(exist == child) extension.remove(name);
\r
71 public void finished(ReadGraph graph) throws DatabaseException {
\r
72 Map<String, Variable> clone = getClone();
\r
73 for(Listener<Map<String, Variable>> listener : listeners) listener.execute(clone);
\r
77 public boolean isDisposed() {
\r
86 public boolean isDisposed() {
\r
94 return graph.syncRequest(new ParametrizedPrimitiveRead<Variable, Map<String, Variable>>(this) {
\r
97 public void register(ReadGraph graph, Listener<Map<String, Variable>> procedure) {
\r
99 listeners.add(procedure);
\r
100 procedure.execute(getClone());
\r
108 private Map<String, Variable> getClone() {
\r
109 Map<String, Variable> clone = new HashMap<String, Variable>();
\r
110 clone.putAll(extension);
\r
114 public Variable getPossibleSpecialChild(ReadGraph graph, String name) throws DatabaseException {
\r
115 return getExtension(graph).get(name);
\r
118 public void collectSpecialChildren(ReadGraph graph, Collection<Variable> children) throws DatabaseException {
\r
119 children.addAll(getExtension(graph).values());
\r