-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.db.layer0.util;\r
-\r
-import java.util.Collection;\r
-\r
-import org.simantics.databoard.Accessors;\r
-import org.simantics.databoard.accessor.Accessor;\r
-import org.simantics.databoard.accessor.error.AccessorConstructionException;\r
-import org.simantics.databoard.accessor.error.AccessorException;\r
-import org.simantics.databoard.accessor.event.Event;\r
-import org.simantics.databoard.accessor.interestset.InterestSet;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.RequestProcessor;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.WriteGraph;\r
-import org.simantics.db.common.request.WriteRequest;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.procedure.Listener;\r
-import org.simantics.db.request.Read;\r
-\r
-public class GraphAccessorUtils {\r
-\r
- static private class ValueReadRequest implements Read<Object> {\r
- Resource resource;\r
- Binding binding;\r
- \r
- public ValueReadRequest(Resource resource, Binding binding) {\r
- this.resource = resource;\r
- this.binding = binding;\r
- }\r
-\r
- @Override\r
- public Object perform(ReadGraph graph) throws DatabaseException {\r
- return graph.getValue(resource, binding);\r
- }\r
- }\r
- \r
-\r
- static private class ValueReadRequest2 implements Read<Object> {\r
- Resource resource;\r
- Resource relation;\r
- Object defaultValue;\r
- Binding binding;\r
- \r
- public ValueReadRequest2(Resource resource, Resource relation, Object defaultValue, Binding binding) {\r
- this.resource = resource;\r
- this.relation = relation;\r
- this.defaultValue = defaultValue;\r
- this.binding = binding;\r
- }\r
-\r
- @Override\r
- public Object perform(ReadGraph graph) throws DatabaseException {\r
- Object value = graph.getPossibleRelatedValue(resource, relation, binding);\r
- if(value != null)\r
- return value;\r
- else\r
- return defaultValue;\r
- }\r
- }\r
- \r
- static private class ValueReadListener implements Listener<Object> {\r
-\r
- Binding binding;\r
- Accessor accessor; \r
- \r
- public ValueReadListener(Binding binding) {\r
- this.binding = binding;\r
- }\r
-\r
- @Override\r
- public void exception(Throwable t) {\r
- }\r
-\r
- @Override\r
- public void execute(Object result) {\r
- if(accessor == null)\r
- try {\r
- accessor = Accessors.getAccessor(binding, result); \r
- } catch (AccessorConstructionException e) {\r
- e.printStackTrace();\r
- }\r
- else\r
- try {\r
- if(!binding.equals(accessor.getValue(binding), result))\r
- accessor.setValue(binding, result);\r
- } catch (AccessorException e) {\r
- e.printStackTrace();\r
- } \r
- }\r
-\r
- @Override\r
- public boolean isDisposed() {\r
- // TODO Auto-generated method stub\r
- return false;\r
- }\r
- \r
- }\r
- \r
- static private class AccessorListener implements Accessor.Listener {\r
-\r
- Accessor accessor;\r
- RequestProcessor rp;\r
- Resource resource;\r
- Binding binding;\r
- \r
- public AccessorListener(Accessor accessor, RequestProcessor rp,\r
- Resource resource, Binding binding) {\r
- this.accessor = accessor;\r
- this.rp = rp;\r
- this.resource = resource;\r
- this.binding = binding;\r
- }\r
-\r
- @Override\r
- public void onEvents(Collection<Event> event) {\r
- rp.asyncRequest(new WriteRequest() { \r
- @Override\r
- public void perform(WriteGraph graph) throws DatabaseException {\r
- try {\r
- Object a = accessor.getValue(binding);\r
- Object b = graph.getValue(resource, binding);\r
- if(!binding.equals(a, b))\r
- graph.claimValue(resource, a, binding);\r
- } catch (AccessorException e) {\r
- throw new DatabaseException(e);\r
- }\r
- }\r
- });\r
- }\r
- \r
- }\r
- \r
- static private class AccessorListener2 implements Accessor.Listener {\r
-\r
- Accessor accessor;\r
- RequestProcessor rp;\r
- Resource resource;\r
- Resource relation;\r
- Binding binding;\r
- \r
- public AccessorListener2(Accessor accessor, RequestProcessor rp,\r
- Resource resource, Resource relation, Binding binding) {\r
- this.accessor = accessor;\r
- this.rp = rp;\r
- this.resource = resource;\r
- this.relation = relation;\r
- this.binding = binding;\r
- }\r
-\r
- @Override\r
- public void onEvents(Collection<Event> event) {\r
- rp.asyncRequest(new WriteRequest() { \r
- @Override\r
- public void perform(WriteGraph graph) throws DatabaseException {\r
- try {\r
- Object a = accessor.getValue(binding);\r
- \r
- Resource valueResource = graph.getPossibleObject(resource, relation);\r
- if(valueResource == null) {\r
- valueResource = graph.newResource(); \r
- graph.claim(resource, relation, valueResource);\r
- graph.claimValue(valueResource, a, binding);\r
- }\r
- else {\r
- Object b = graph.getValue(valueResource, binding);\r
- if(!binding.equals(a, b))\r
- graph.claimLiteral(resource, relation, a, binding);\r
- }\r
- } catch (AccessorException e) {\r
- throw new DatabaseException(e);\r
- }\r
- }\r
- });\r
- }\r
- \r
- }\r
- \r
- public static Accessor create(RequestProcessor rp, Resource resource, Binding binding) throws DatabaseException {\r
- ValueReadRequest request = new ValueReadRequest(resource, binding);\r
- ValueReadListener listener = new ValueReadListener(binding);\r
- rp.syncRequest(request, listener);\r
- try {\r
- listener.accessor.addListener(\r
- new AccessorListener(listener.accessor, rp, resource, binding), \r
- InterestSet.newInterestSet(listener.accessor.type(), true, false, true),\r
- null, null);\r
- } catch (AccessorException e) {\r
- e.printStackTrace();\r
- }\r
- return listener.accessor; \r
- }\r
- \r
- public static Accessor create(RequestProcessor rp, Resource resource, Resource relation, Object defaultValue, Binding binding) throws DatabaseException {\r
- ValueReadRequest2 request = new ValueReadRequest2(resource, relation, defaultValue, binding);\r
- ValueReadListener listener = new ValueReadListener(binding);\r
- rp.syncRequest(request, listener);\r
- try {\r
- listener.accessor.addListener(\r
- new AccessorListener2(listener.accessor, rp, resource, relation, binding), \r
- InterestSet.newInterestSet(listener.accessor.type(), true, false, true),\r
- null, null);\r
- } catch (AccessorException e) {\r
- e.printStackTrace();\r
- }\r
- return listener.accessor; \r
- }\r
- \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.db.layer0.util;
+
+import java.util.Collection;
+
+import org.simantics.databoard.Accessors;
+import org.simantics.databoard.accessor.Accessor;
+import org.simantics.databoard.accessor.error.AccessorConstructionException;
+import org.simantics.databoard.accessor.error.AccessorException;
+import org.simantics.databoard.accessor.event.Event;
+import org.simantics.databoard.accessor.interestset.InterestSet;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.RequestProcessor;
+import org.simantics.db.Resource;
+import org.simantics.db.WriteGraph;
+import org.simantics.db.common.request.WriteRequest;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.procedure.Listener;
+import org.simantics.db.request.Read;
+
+public class GraphAccessorUtils {
+
+ static private class ValueReadRequest implements Read<Object> {
+ Resource resource;
+ Binding binding;
+
+ public ValueReadRequest(Resource resource, Binding binding) {
+ this.resource = resource;
+ this.binding = binding;
+ }
+
+ @Override
+ public Object perform(ReadGraph graph) throws DatabaseException {
+ return graph.getValue(resource, binding);
+ }
+ }
+
+
+ static private class ValueReadRequest2 implements Read<Object> {
+ Resource resource;
+ Resource relation;
+ Object defaultValue;
+ Binding binding;
+
+ public ValueReadRequest2(Resource resource, Resource relation, Object defaultValue, Binding binding) {
+ this.resource = resource;
+ this.relation = relation;
+ this.defaultValue = defaultValue;
+ this.binding = binding;
+ }
+
+ @Override
+ public Object perform(ReadGraph graph) throws DatabaseException {
+ Object value = graph.getPossibleRelatedValue(resource, relation, binding);
+ if(value != null)
+ return value;
+ else
+ return defaultValue;
+ }
+ }
+
+ static private class ValueReadListener implements Listener<Object> {
+
+ Binding binding;
+ Accessor accessor;
+
+ public ValueReadListener(Binding binding) {
+ this.binding = binding;
+ }
+
+ @Override
+ public void exception(Throwable t) {
+ }
+
+ @Override
+ public void execute(Object result) {
+ if(accessor == null)
+ try {
+ accessor = Accessors.getAccessor(binding, result);
+ } catch (AccessorConstructionException e) {
+ e.printStackTrace();
+ }
+ else
+ try {
+ if(!binding.equals(accessor.getValue(binding), result))
+ accessor.setValue(binding, result);
+ } catch (AccessorException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public boolean isDisposed() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ }
+
+ static private class AccessorListener implements Accessor.Listener {
+
+ Accessor accessor;
+ RequestProcessor rp;
+ Resource resource;
+ Binding binding;
+
+ public AccessorListener(Accessor accessor, RequestProcessor rp,
+ Resource resource, Binding binding) {
+ this.accessor = accessor;
+ this.rp = rp;
+ this.resource = resource;
+ this.binding = binding;
+ }
+
+ @Override
+ public void onEvents(Collection<Event> event) {
+ rp.asyncRequest(new WriteRequest() {
+ @Override
+ public void perform(WriteGraph graph) throws DatabaseException {
+ try {
+ Object a = accessor.getValue(binding);
+ Object b = graph.getValue(resource, binding);
+ if(!binding.equals(a, b))
+ graph.claimValue(resource, a, binding);
+ } catch (AccessorException e) {
+ throw new DatabaseException(e);
+ }
+ }
+ });
+ }
+
+ }
+
+ static private class AccessorListener2 implements Accessor.Listener {
+
+ Accessor accessor;
+ RequestProcessor rp;
+ Resource resource;
+ Resource relation;
+ Binding binding;
+
+ public AccessorListener2(Accessor accessor, RequestProcessor rp,
+ Resource resource, Resource relation, Binding binding) {
+ this.accessor = accessor;
+ this.rp = rp;
+ this.resource = resource;
+ this.relation = relation;
+ this.binding = binding;
+ }
+
+ @Override
+ public void onEvents(Collection<Event> event) {
+ rp.asyncRequest(new WriteRequest() {
+ @Override
+ public void perform(WriteGraph graph) throws DatabaseException {
+ try {
+ Object a = accessor.getValue(binding);
+
+ Resource valueResource = graph.getPossibleObject(resource, relation);
+ if(valueResource == null) {
+ valueResource = graph.newResource();
+ graph.claim(resource, relation, valueResource);
+ graph.claimValue(valueResource, a, binding);
+ }
+ else {
+ Object b = graph.getValue(valueResource, binding);
+ if(!binding.equals(a, b))
+ graph.claimLiteral(resource, relation, a, binding);
+ }
+ } catch (AccessorException e) {
+ throw new DatabaseException(e);
+ }
+ }
+ });
+ }
+
+ }
+
+ public static Accessor create(RequestProcessor rp, Resource resource, Binding binding) throws DatabaseException {
+ ValueReadRequest request = new ValueReadRequest(resource, binding);
+ ValueReadListener listener = new ValueReadListener(binding);
+ rp.syncRequest(request, listener);
+ try {
+ listener.accessor.addListener(
+ new AccessorListener(listener.accessor, rp, resource, binding),
+ InterestSet.newInterestSet(listener.accessor.type(), true, false, true),
+ null, null);
+ } catch (AccessorException e) {
+ e.printStackTrace();
+ }
+ return listener.accessor;
+ }
+
+ public static Accessor create(RequestProcessor rp, Resource resource, Resource relation, Object defaultValue, Binding binding) throws DatabaseException {
+ ValueReadRequest2 request = new ValueReadRequest2(resource, relation, defaultValue, binding);
+ ValueReadListener listener = new ValueReadListener(binding);
+ rp.syncRequest(request, listener);
+ try {
+ listener.accessor.addListener(
+ new AccessorListener2(listener.accessor, rp, resource, relation, binding),
+ InterestSet.newInterestSet(listener.accessor.type(), true, false, true),
+ null, null);
+ } catch (AccessorException e) {
+ e.printStackTrace();
+ }
+ return listener.accessor;
+ }
+
+}