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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.db.layer0.util;
\r
14 import java.util.Collection;
\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
32 public class GraphAccessorUtils {
\r
34 static private class ValueReadRequest implements Read<Object> {
\r
38 public ValueReadRequest(Resource resource, Binding binding) {
\r
39 this.resource = resource;
\r
40 this.binding = binding;
\r
44 public Object perform(ReadGraph graph) throws DatabaseException {
\r
45 return graph.getValue(resource, binding);
\r
50 static private class ValueReadRequest2 implements Read<Object> {
\r
53 Object defaultValue;
\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
64 public Object perform(ReadGraph graph) throws DatabaseException {
\r
65 Object value = graph.getPossibleRelatedValue(resource, relation, binding);
\r
69 return defaultValue;
\r
73 static private class ValueReadListener implements Listener<Object> {
\r
78 public ValueReadListener(Binding binding) {
\r
79 this.binding = binding;
\r
83 public void exception(Throwable t) {
\r
87 public void execute(Object result) {
\r
88 if(accessor == null)
\r
90 accessor = Accessors.getAccessor(binding, result);
\r
91 } catch (AccessorConstructionException e) {
\r
92 e.printStackTrace();
\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
104 public boolean isDisposed() {
\r
105 // TODO Auto-generated method stub
\r
111 static private class AccessorListener implements Accessor.Listener {
\r
114 RequestProcessor rp;
\r
118 public AccessorListener(Accessor accessor, RequestProcessor rp,
\r
119 Resource resource, Binding binding) {
\r
120 this.accessor = accessor;
\r
122 this.resource = resource;
\r
123 this.binding = binding;
\r
127 public void onEvents(Collection<Event> event) {
\r
128 rp.asyncRequest(new WriteRequest() {
\r
130 public void perform(WriteGraph graph) throws DatabaseException {
\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
145 static private class AccessorListener2 implements Accessor.Listener {
\r
148 RequestProcessor rp;
\r
153 public AccessorListener2(Accessor accessor, RequestProcessor rp,
\r
154 Resource resource, Resource relation, Binding binding) {
\r
155 this.accessor = accessor;
\r
157 this.resource = resource;
\r
158 this.relation = relation;
\r
159 this.binding = binding;
\r
163 public void onEvents(Collection<Event> event) {
\r
164 rp.asyncRequest(new WriteRequest() {
\r
166 public void perform(WriteGraph graph) throws DatabaseException {
\r
168 Object a = accessor.getValue(binding);
\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
177 Object b = graph.getValue(valueResource, binding);
\r
178 if(!binding.equals(a, b))
\r
179 graph.claimLiteral(resource, relation, a, binding);
\r
181 } catch (AccessorException e) {
\r
182 throw new DatabaseException(e);
\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
195 listener.accessor.addListener(
\r
196 new AccessorListener(listener.accessor, rp, resource, binding),
\r
197 InterestSet.newInterestSet(listener.accessor.type(), true, false, true),
\r
199 } catch (AccessorException e) {
\r
200 e.printStackTrace();
\r
202 return listener.accessor;
\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
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
214 } catch (AccessorException e) {
\r
215 e.printStackTrace();
\r
217 return listener.accessor;
\r