]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/variable/ExtendedGraphChildVariable.java
Merge commit 'ad8333027322fda6b9a8a524c7a7e15a54c52f38'
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / variable / ExtendedGraphChildVariable.java
1 package org.simantics.db.layer0.variable;\r
2 \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
8 \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
19 \r
20 public class ExtendedGraphChildVariable extends StandardGraphChildVariable {\r
21 \r
22         private Map<String, Variable> extension;\r
23         private List<Listener<Map<String, Variable>>> listeners = new ArrayList<Listener<Map<String, Variable>>>();\r
24         \r
25         public ExtendedGraphChildVariable(Variable parent, Resource resource) throws DatabaseException {\r
26                 super(parent, null, resource);\r
27         }\r
28 \r
29         Map<String, Variable> getExtension(ReadGraph graph) throws DatabaseException {\r
30 \r
31                 if(extension == null) {\r
32 \r
33                         extension = new HashMap<String, Variable>();\r
34 \r
35                         QueryControl qc = graph.getService(QueryControl.class);\r
36                         \r
37                         qc.getIndependentGraph(graph).syncRequest(new ResourceRead<Collection<VariableFactory>>(resource) {\r
38 \r
39                                 @Override\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
47                                         }\r
48                                         return result;\r
49                                 }\r
50                         \r
51                     }, new SingleSetSyncListener<VariableFactory>() {\r
52 \r
53                     @Override\r
54                     public void add(ReadGraph graph, final VariableFactory factory) throws DatabaseException {\r
55                         \r
56                         graph.syncRequest(new VariableFactoryRequest(ExtendedGraphChildVariable.this, factory), new SingleSetSyncListener<Variable>() {\r
57 \r
58                             @Override\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
62                             }\r
63                             \r
64                             @Override\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
69                             }\r
70                             \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
74                             }\r
75 \r
76                             @Override\r
77                             public boolean isDisposed() {\r
78                                 return false;\r
79                             }\r
80 \r
81                         });\r
82                         \r
83                     }\r
84                     \r
85                     @Override\r
86                     public boolean isDisposed() {\r
87                         return false;\r
88                     }\r
89                     \r
90                     });\r
91                         \r
92                 }\r
93                 \r
94                 return graph.syncRequest(new ParametrizedPrimitiveRead<Variable, Map<String, Variable>>(this) {\r
95                         \r
96                         @Override\r
97                         public void register(ReadGraph graph, Listener<Map<String, Variable>> procedure) {\r
98 \r
99                                 listeners.add(procedure);\r
100                                 procedure.execute(getClone());\r
101                                 \r
102                         }\r
103                         \r
104                 });\r
105                 \r
106         }\r
107         \r
108         private Map<String, Variable> getClone() {\r
109                 Map<String, Variable> clone = new HashMap<String, Variable>();\r
110                 clone.putAll(extension);\r
111                 return clone;\r
112         }\r
113         \r
114         public Variable getPossibleSpecialChild(ReadGraph graph, String name) throws DatabaseException {\r
115                 return getExtension(graph).get(name);\r
116         }\r
117 \r
118         public void collectSpecialChildren(ReadGraph graph, Collection<Variable> children) throws DatabaseException {\r
119                 children.addAll(getExtension(graph).values());\r
120         }\r
121         \r
122 }\r