1 /*******************************************************************************
2 * Copyright (c) 2007, 2010 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.db.layer0.util;
14 import java.util.Collection;
16 import org.simantics.databoard.Accessors;
17 import org.simantics.databoard.accessor.Accessor;
18 import org.simantics.databoard.accessor.error.AccessorConstructionException;
19 import org.simantics.databoard.accessor.error.AccessorException;
20 import org.simantics.databoard.accessor.event.Event;
21 import org.simantics.databoard.accessor.interestset.InterestSet;
22 import org.simantics.databoard.binding.Binding;
23 import org.simantics.db.ReadGraph;
24 import org.simantics.db.RequestProcessor;
25 import org.simantics.db.Resource;
26 import org.simantics.db.WriteGraph;
27 import org.simantics.db.common.request.WriteRequest;
28 import org.simantics.db.exception.DatabaseException;
29 import org.simantics.db.procedure.Listener;
30 import org.simantics.db.request.Read;
32 public class GraphAccessorUtils {
34 static private class ValueReadRequest implements Read<Object> {
38 public ValueReadRequest(Resource resource, Binding binding) {
39 this.resource = resource;
40 this.binding = binding;
44 public Object perform(ReadGraph graph) throws DatabaseException {
45 return graph.getValue(resource, binding);
50 static private class ValueReadRequest2 implements Read<Object> {
56 public ValueReadRequest2(Resource resource, Resource relation, Object defaultValue, Binding binding) {
57 this.resource = resource;
58 this.relation = relation;
59 this.defaultValue = defaultValue;
60 this.binding = binding;
64 public Object perform(ReadGraph graph) throws DatabaseException {
65 Object value = graph.getPossibleRelatedValue(resource, relation, binding);
73 static private class ValueReadListener implements Listener<Object> {
78 public ValueReadListener(Binding binding) {
79 this.binding = binding;
83 public void exception(Throwable t) {
87 public void execute(Object result) {
90 accessor = Accessors.getAccessor(binding, result);
91 } catch (AccessorConstructionException e) {
96 if(!binding.equals(accessor.getValue(binding), result))
97 accessor.setValue(binding, result);
98 } catch (AccessorException e) {
104 public boolean isDisposed() {
105 // TODO Auto-generated method stub
111 static private class AccessorListener implements Accessor.Listener {
118 public AccessorListener(Accessor accessor, RequestProcessor rp,
119 Resource resource, Binding binding) {
120 this.accessor = accessor;
122 this.resource = resource;
123 this.binding = binding;
127 public void onEvents(Collection<Event> event) {
128 rp.asyncRequest(new WriteRequest() {
130 public void perform(WriteGraph graph) throws DatabaseException {
132 Object a = accessor.getValue(binding);
133 Object b = graph.getValue(resource, binding);
134 if(!binding.equals(a, b))
135 graph.claimValue(resource, a, binding);
136 } catch (AccessorException e) {
137 throw new DatabaseException(e);
145 static private class AccessorListener2 implements Accessor.Listener {
153 public AccessorListener2(Accessor accessor, RequestProcessor rp,
154 Resource resource, Resource relation, Binding binding) {
155 this.accessor = accessor;
157 this.resource = resource;
158 this.relation = relation;
159 this.binding = binding;
163 public void onEvents(Collection<Event> event) {
164 rp.asyncRequest(new WriteRequest() {
166 public void perform(WriteGraph graph) throws DatabaseException {
168 Object a = accessor.getValue(binding);
170 Resource valueResource = graph.getPossibleObject(resource, relation);
171 if(valueResource == null) {
172 valueResource = graph.newResource();
173 graph.claim(resource, relation, valueResource);
174 graph.claimValue(valueResource, a, binding);
177 Object b = graph.getValue(valueResource, binding);
178 if(!binding.equals(a, b))
179 graph.claimLiteral(resource, relation, a, binding);
181 } catch (AccessorException e) {
182 throw new DatabaseException(e);
190 public static Accessor create(RequestProcessor rp, Resource resource, Binding binding) throws DatabaseException {
191 ValueReadRequest request = new ValueReadRequest(resource, binding);
192 ValueReadListener listener = new ValueReadListener(binding);
193 rp.syncRequest(request, listener);
195 listener.accessor.addListener(
196 new AccessorListener(listener.accessor, rp, resource, binding),
197 InterestSet.newInterestSet(listener.accessor.type(), true, false, true),
199 } catch (AccessorException e) {
202 return listener.accessor;
205 public static Accessor create(RequestProcessor rp, Resource resource, Resource relation, Object defaultValue, Binding binding) throws DatabaseException {
206 ValueReadRequest2 request = new ValueReadRequest2(resource, relation, defaultValue, binding);
207 ValueReadListener listener = new ValueReadListener(binding);
208 rp.syncRequest(request, listener);
210 listener.accessor.addListener(
211 new AccessorListener2(listener.accessor, rp, resource, relation, binding),
212 InterestSet.newInterestSet(listener.accessor.type(), true, false, true),
214 } catch (AccessorException e) {
217 return listener.accessor;