]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/GraphAccessorUtils.java
Sync git svn branch with SVN repository r33158.
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / util / GraphAccessorUtils.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.db.layer0.util;\r
13 \r
14 import java.util.Collection;\r
15 \r
16 import org.simantics.databoard.Accessors;\r
17 import org.simantics.databoard.accessor.Accessor;\r
18 import org.simantics.databoard.accessor.error.AccessorConstructionException;\r
19 import org.simantics.databoard.accessor.error.AccessorException;\r
20 import org.simantics.databoard.accessor.event.Event;\r
21 import org.simantics.databoard.accessor.interestset.InterestSet;\r
22 import org.simantics.databoard.binding.Binding;\r
23 import org.simantics.db.ReadGraph;\r
24 import org.simantics.db.RequestProcessor;\r
25 import org.simantics.db.Resource;\r
26 import org.simantics.db.WriteGraph;\r
27 import org.simantics.db.common.request.WriteRequest;\r
28 import org.simantics.db.exception.DatabaseException;\r
29 import org.simantics.db.procedure.Listener;\r
30 import org.simantics.db.request.Read;\r
31 \r
32 public class GraphAccessorUtils {\r
33 \r
34         static private class ValueReadRequest implements Read<Object> {\r
35                 Resource resource;\r
36                 Binding binding;\r
37                 \r
38                 public ValueReadRequest(Resource resource, Binding binding) {\r
39                         this.resource = resource;\r
40                         this.binding = binding;\r
41                 }\r
42 \r
43                 @Override\r
44                 public Object perform(ReadGraph graph) throws DatabaseException {\r
45                         return graph.getValue(resource, binding);\r
46                 }\r
47         }\r
48         \r
49 \r
50         static private class ValueReadRequest2 implements Read<Object> {\r
51                 Resource resource;\r
52                 Resource relation;\r
53                 Object defaultValue;\r
54                 Binding binding;\r
55                 \r
56                 public ValueReadRequest2(Resource resource, Resource relation, Object defaultValue, Binding binding) {\r
57                         this.resource = resource;\r
58                         this.relation = relation;\r
59                         this.defaultValue = defaultValue;\r
60                         this.binding = binding;\r
61                 }\r
62 \r
63                 @Override\r
64                 public Object perform(ReadGraph graph) throws DatabaseException {\r
65                         Object value = graph.getPossibleRelatedValue(resource, relation, binding);\r
66                         if(value != null)\r
67                                 return value;\r
68                         else\r
69                                 return defaultValue;\r
70                 }\r
71         }\r
72                 \r
73         static private class ValueReadListener implements Listener<Object> {\r
74 \r
75                 Binding binding;\r
76                 Accessor accessor;              \r
77                 \r
78                 public ValueReadListener(Binding binding) {\r
79                         this.binding = binding;\r
80                 }\r
81 \r
82                 @Override\r
83                 public void exception(Throwable t) {\r
84                 }\r
85 \r
86                 @Override\r
87                 public void execute(Object result) {\r
88                         if(accessor == null)\r
89                                 try {\r
90                                         accessor = Accessors.getAccessor(binding, result);                                      \r
91                                 } catch (AccessorConstructionException e) {\r
92                                         e.printStackTrace();\r
93                                 }\r
94                         else\r
95                                 try {\r
96                                         if(!binding.equals(accessor.getValue(binding), result))\r
97                                                 accessor.setValue(binding, result);\r
98                                 } catch (AccessorException e) {\r
99                                         e.printStackTrace();\r
100                                 }                       \r
101                 }\r
102 \r
103                 @Override\r
104                 public boolean isDisposed() {\r
105                         // TODO Auto-generated method stub\r
106                         return false;\r
107                 }\r
108                 \r
109         }\r
110         \r
111         static private class AccessorListener implements Accessor.Listener {\r
112 \r
113                 Accessor accessor;\r
114                 RequestProcessor rp;\r
115                 Resource resource;\r
116                 Binding binding;\r
117                 \r
118                 public AccessorListener(Accessor accessor, RequestProcessor rp,\r
119                                 Resource resource, Binding binding) {\r
120                         this.accessor = accessor;\r
121                         this.rp = rp;\r
122                         this.resource = resource;\r
123                         this.binding = binding;\r
124                 }\r
125 \r
126                 @Override\r
127                 public void onEvents(Collection<Event> event) {\r
128                         rp.asyncRequest(new WriteRequest() {                            \r
129                                 @Override\r
130                                 public void perform(WriteGraph graph) throws DatabaseException {\r
131                                         try {\r
132                                                 Object a = accessor.getValue(binding);\r
133                                                 Object b = graph.getValue(resource, binding);\r
134                                                 if(!binding.equals(a, b))\r
135                                                         graph.claimValue(resource, a, binding);\r
136                                         } catch (AccessorException e) {\r
137                                                 throw new DatabaseException(e);\r
138                                         }\r
139                                 }\r
140                         });\r
141                 }\r
142                 \r
143         }\r
144         \r
145         static private class AccessorListener2 implements Accessor.Listener {\r
146 \r
147                 Accessor accessor;\r
148                 RequestProcessor rp;\r
149                 Resource resource;\r
150                 Resource relation;\r
151                 Binding binding;\r
152                 \r
153                 public AccessorListener2(Accessor accessor, RequestProcessor rp,\r
154                                 Resource resource, Resource relation, Binding binding) {\r
155                         this.accessor = accessor;\r
156                         this.rp = rp;\r
157                         this.resource = resource;\r
158                         this.relation = relation;\r
159                         this.binding = binding;\r
160                 }\r
161 \r
162                 @Override\r
163                 public void onEvents(Collection<Event> event) {\r
164                         rp.asyncRequest(new WriteRequest() {                            \r
165                                 @Override\r
166                                 public void perform(WriteGraph graph) throws DatabaseException {\r
167                                         try {\r
168                                                 Object a = accessor.getValue(binding);\r
169                                                 \r
170                                                 Resource valueResource = graph.getPossibleObject(resource, relation);\r
171                                                 if(valueResource == null) {\r
172                                                         valueResource = graph.newResource(); \r
173                                                         graph.claim(resource, relation, valueResource);\r
174                                                         graph.claimValue(valueResource, a, binding);\r
175                                                 }\r
176                                                 else {\r
177                                                         Object b = graph.getValue(valueResource, binding);\r
178                                                         if(!binding.equals(a, b))\r
179                                                                 graph.claimLiteral(resource, relation, a, binding);\r
180                                                 }\r
181                                         } catch (AccessorException e) {\r
182                                                 throw new DatabaseException(e);\r
183                                         }\r
184                                 }\r
185                         });\r
186                 }\r
187                 \r
188         }\r
189         \r
190         public static Accessor create(RequestProcessor rp, Resource resource, Binding binding) throws DatabaseException {\r
191                 ValueReadRequest request = new ValueReadRequest(resource, binding);\r
192                 ValueReadListener listener = new ValueReadListener(binding);\r
193                 rp.syncRequest(request, listener);\r
194                 try {\r
195                         listener.accessor.addListener(\r
196                                 new AccessorListener(listener.accessor, rp, resource, binding), \r
197                                 InterestSet.newInterestSet(listener.accessor.type(), true, false, true),\r
198                                 null, null);\r
199                 } catch (AccessorException e) {\r
200                         e.printStackTrace();\r
201                 }\r
202                 return listener.accessor;               \r
203         }\r
204         \r
205         public static Accessor create(RequestProcessor rp, Resource resource, Resource relation, Object defaultValue, Binding binding) throws DatabaseException {\r
206                 ValueReadRequest2 request = new ValueReadRequest2(resource, relation, defaultValue, binding);\r
207                 ValueReadListener listener = new ValueReadListener(binding);\r
208                 rp.syncRequest(request, listener);\r
209                 try {\r
210                         listener.accessor.addListener(\r
211                                 new AccessorListener2(listener.accessor, rp, resource, relation, binding), \r
212                                 InterestSet.newInterestSet(listener.accessor.type(), true, false, true),\r
213                                 null, null);\r
214                 } catch (AccessorException e) {\r
215                         e.printStackTrace();\r
216                 }\r
217                 return listener.accessor;               \r
218         }\r
219         \r
220 }\r