X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Futil%2FGraphAccessorUtils.java;fp=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Futil%2FGraphAccessorUtils.java;h=54cedf088edbfdf0c963ad27c73aaaa5f345c5b3;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/GraphAccessorUtils.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/GraphAccessorUtils.java new file mode 100644 index 000000000..54cedf088 --- /dev/null +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/util/GraphAccessorUtils.java @@ -0,0 +1,220 @@ +/******************************************************************************* + * 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 { + 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 { + 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 { + + 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) { + 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) { + 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; + } + +}