]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.db.impl/src/org/simantics/db/impl/graph/ReadGraphImpl.java
Fix non-compiling ReadGraphImpl.hasStatement implementation
[simantics/platform.git] / bundles / org.simantics.db.impl / src / org / simantics / db / impl / graph / ReadGraphImpl.java
index 7aceda39fd3204d9d2d762334241a2a01d52fd72..2309af76440b10bc2a3e9d336cf2fc4bdfc14819 100644 (file)
-/*******************************************************************************\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.impl.graph;\r
-\r
-import gnu.trove.map.hash.TObjectIntHashMap;\r
-\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.io.PrintStream;\r
-import java.lang.reflect.Array;\r
-import java.lang.reflect.InvocationTargetException;\r
-import java.nio.BufferUnderflowException;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.IdentityHashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.ListIterator;\r
-import java.util.Set;\r
-\r
-import org.eclipse.core.runtime.Platform;\r
-import org.simantics.databoard.Accessors;\r
-import org.simantics.databoard.Bindings;\r
-import org.simantics.databoard.accessor.Accessor;\r
-import org.simantics.databoard.accessor.error.AccessorConstructionException;\r
-import org.simantics.databoard.adapter.AdaptException;\r
-import org.simantics.databoard.binding.Binding;\r
-import org.simantics.databoard.binding.error.RuntimeBindingConstructionException;\r
-import org.simantics.databoard.binding.impl.ObjectVariantBinding;\r
-import org.simantics.databoard.binding.mutable.Variant;\r
-import org.simantics.databoard.serialization.Serializer;\r
-import org.simantics.databoard.type.Datatype;\r
-import org.simantics.databoard.util.binary.BinaryFile;\r
-import org.simantics.databoard.util.binary.RandomAccessBinary;\r
-import org.simantics.db.AsyncReadGraph;\r
-import org.simantics.db.DevelopmentKeys;\r
-import org.simantics.db.ExternalValueSupport;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.RelationContext;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.Session;\r
-import org.simantics.db.Statement;\r
-import org.simantics.db.adaption.AdaptionService;\r
-import org.simantics.db.common.primitiverequest.Adapter;\r
-import org.simantics.db.common.primitiverequest.Builtin;\r
-import org.simantics.db.common.primitiverequest.DatatypeBinding;\r
-import org.simantics.db.common.primitiverequest.ForEachAssertedObject;\r
-import org.simantics.db.common.primitiverequest.ForEachAssertedStatement;\r
-import org.simantics.db.common.primitiverequest.HasStatement;\r
-import org.simantics.db.common.primitiverequest.HasStatementSubject;\r
-import org.simantics.db.common.primitiverequest.HasStatementSubjectObject;\r
-import org.simantics.db.common.primitiverequest.HasValue;\r
-import org.simantics.db.common.primitiverequest.Inverse;\r
-import org.simantics.db.common.primitiverequest.IsInheritedFrom;\r
-import org.simantics.db.common.primitiverequest.IsInstanceOf;\r
-import org.simantics.db.common.primitiverequest.IsSubrelationOf;\r
-import org.simantics.db.common.primitiverequest.OrderedSet;\r
-import org.simantics.db.common.primitiverequest.PossibleAdapter;\r
-import org.simantics.db.common.primitiverequest.PossibleInverse;\r
-import org.simantics.db.common.primitiverequest.PossibleObject;\r
-import org.simantics.db.common.primitiverequest.PossibleRelatedValue;\r
-import org.simantics.db.common.primitiverequest.PossibleRelatedValueImplied;\r
-import org.simantics.db.common.primitiverequest.PossibleStatement;\r
-import org.simantics.db.common.primitiverequest.PossibleType;\r
-import org.simantics.db.common.primitiverequest.PossibleUniqueAdapter;\r
-import org.simantics.db.common.primitiverequest.PossibleValue;\r
-import org.simantics.db.common.primitiverequest.PossibleValueImplied;\r
-import org.simantics.db.common.primitiverequest.RelatedValue;\r
-import org.simantics.db.common.primitiverequest.RelatedValueImplied;\r
-import org.simantics.db.common.primitiverequest.SingleObject;\r
-import org.simantics.db.common.primitiverequest.SingleStatement;\r
-import org.simantics.db.common.primitiverequest.SingleType;\r
-import org.simantics.db.common.primitiverequest.SingleTypeAny;\r
-import org.simantics.db.common.primitiverequest.Types;\r
-import org.simantics.db.common.primitiverequest.UniqueAdapter;\r
-import org.simantics.db.common.primitiverequest.Value;\r
-import org.simantics.db.common.primitiverequest.ValueImplied;\r
-import org.simantics.db.common.primitiverequest.VariantValueImplied;\r
-import org.simantics.db.common.procedure.adapter.AsyncMultiProcedureAdapter;\r
-import org.simantics.db.common.procedure.adapter.ProcedureAdapter;\r
-import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;\r
-import org.simantics.db.common.procedure.adapter.TransientCacheListener;\r
-import org.simantics.db.common.procedure.single.SyncReadProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.DeepSingleOrErrorProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.DeepSingleOrNullProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.ExceptionToNullProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.NullSingleOrNullProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.SingleFunctionalOrNullProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.SingleOrErrorProcedure;\r
-import org.simantics.db.common.procedure.single.wrapper.SingleOrNullProcedure;\r
-import org.simantics.db.common.procedure.wrapper.NoneToAsyncListener;\r
-import org.simantics.db.common.procedure.wrapper.NoneToAsyncMultiListener;\r
-import org.simantics.db.common.procedure.wrapper.NoneToAsyncMultiProcedure;\r
-import org.simantics.db.common.procedure.wrapper.NoneToAsyncProcedure;\r
-import org.simantics.db.common.procedure.wrapper.NoneToAsyncSetProcedure;\r
-import org.simantics.db.common.procedure.wrapper.SyncToAsyncListener;\r
-import org.simantics.db.common.procedure.wrapper.SyncToAsyncMultiListener;\r
-import org.simantics.db.common.procedure.wrapper.SyncToAsyncMultiProcedure;\r
-import org.simantics.db.common.procedure.wrapper.SyncToAsyncProcedure;\r
-import org.simantics.db.common.procedure.wrapper.SyncToAsyncSetProcedure;\r
-import org.simantics.db.common.request.AdaptValue;\r
-import org.simantics.db.common.request.ResourceRead;\r
-import org.simantics.db.common.utils.Logger;\r
-import org.simantics.db.common.utils.NameUtils;\r
-import org.simantics.db.common.validation.L0Validations;\r
-import org.simantics.db.exception.AdaptionException;\r
-import org.simantics.db.exception.ArgumentException;\r
-import org.simantics.db.exception.AssumptionException;\r
-import org.simantics.db.exception.BindingException;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.exception.DoesNotContainValueException;\r
-import org.simantics.db.exception.EmptyResourceException;\r
-import org.simantics.db.exception.InternalException;\r
-import org.simantics.db.exception.InvalidLiteralException;\r
-import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;\r
-import org.simantics.db.exception.NoInverseException;\r
-import org.simantics.db.exception.NoSingleResultException;\r
-import org.simantics.db.exception.ResourceNotFoundException;\r
-import org.simantics.db.exception.ServiceException;\r
-import org.simantics.db.exception.ValidationException;\r
-import org.simantics.db.impl.RelationContextImpl;\r
-import org.simantics.db.impl.ResourceImpl;\r
-import org.simantics.db.impl.internal.RandomAccessValueSupport;\r
-import org.simantics.db.impl.internal.ResourceData;\r
-import org.simantics.db.impl.procedure.CallWrappedSingleQueryProcedure4;\r
-import org.simantics.db.impl.procedure.ResultCallWrappedQueryProcedure4;\r
-import org.simantics.db.impl.procedure.ResultCallWrappedSingleQueryProcedure4;\r
-import org.simantics.db.impl.query.CacheEntry;\r
-import org.simantics.db.impl.query.QueryProcessor;\r
-import org.simantics.db.impl.query.QuerySupport;\r
-import org.simantics.db.impl.query.TripleIntProcedure;\r
-import org.simantics.db.impl.support.ResourceSupport;\r
-import org.simantics.db.procedure.AsyncListener;\r
-import org.simantics.db.procedure.AsyncMultiListener;\r
-import org.simantics.db.procedure.AsyncMultiProcedure;\r
-import org.simantics.db.procedure.AsyncProcedure;\r
-import org.simantics.db.procedure.AsyncSetListener;\r
-import org.simantics.db.procedure.Listener;\r
-import org.simantics.db.procedure.ListenerBase;\r
-import org.simantics.db.procedure.MultiListener;\r
-import org.simantics.db.procedure.MultiProcedure;\r
-import org.simantics.db.procedure.Procedure;\r
-import org.simantics.db.procedure.SetListener;\r
-import org.simantics.db.procedure.StatementProcedure;\r
-import org.simantics.db.procedure.SyncListener;\r
-import org.simantics.db.procedure.SyncMultiListener;\r
-import org.simantics.db.procedure.SyncMultiProcedure;\r
-import org.simantics.db.procedure.SyncProcedure;\r
-import org.simantics.db.procedure.SyncSetListener;\r
-import org.simantics.db.request.AsyncMultiRead;\r
-import org.simantics.db.request.AsyncRead;\r
-import org.simantics.db.request.DelayedWrite;\r
-import org.simantics.db.request.DelayedWriteResult;\r
-import org.simantics.db.request.ExternalRead;\r
-import org.simantics.db.request.MultiRead;\r
-import org.simantics.db.request.Read;\r
-import org.simantics.db.request.ReadInterface;\r
-import org.simantics.db.request.RequestFlags;\r
-import org.simantics.db.request.Write;\r
-import org.simantics.db.request.WriteInterface;\r
-import org.simantics.db.request.WriteOnly;\r
-import org.simantics.db.request.WriteOnlyResult;\r
-import org.simantics.db.request.WriteResult;\r
-import org.simantics.layer0.Layer0;\r
-import org.simantics.scl.compiler.types.Type;\r
-import org.simantics.scl.compiler.types.exceptions.SCLTypeParseException;\r
-import org.simantics.scl.reflection.ReflectionUtils;\r
-import org.simantics.scl.reflection.ValueNotFoundException;\r
-import org.simantics.scl.runtime.function.Function3;\r
-import org.simantics.utils.DataContainer;\r
-import org.simantics.utils.Development;\r
-import org.simantics.utils.datastructures.Callback;\r
-import org.simantics.utils.datastructures.Pair;\r
-import org.simantics.utils.datastructures.collections.CollectionUtils;\r
-\r
-public class ReadGraphImpl implements ReadGraph {\r
-\r
-    final static boolean EMPTY_RESOURCE_CHECK = false;\r
-    \r
-       final public CacheEntry parent;\r
-       final public QueryProcessor processor;\r
-       \r
-       final static Binding DATA_TYPE_BINDING_INTERNAL = Bindings.getBindingUnchecked(Datatype.class);\r
-       final static Serializer DATA_TYPE_SERIALIZER = Bindings.getSerializerUnchecked(DATA_TYPE_BINDING_INTERNAL);\r
-\r
-       final public static TObjectIntHashMap<String> counters = new TObjectIntHashMap<String>(); \r
-       \r
-       public static void resetCounters() {\r
-               counters.clear();\r
-       }\r
-       \r
-       public static String listCounters(File file) throws IOException {\r
-               \r
-               PrintStream b = new PrintStream(new BufferedOutputStream(new FileOutputStream(file)));\r
-\r
-               for(Pair<String,Integer> p : CollectionUtils.valueSortedEntries(counters)) {\r
-                       b.print(-p.second + " " + p.first + "\n");\r
-               }\r
-\r
-               b.close();\r
-\r
-               return "Dumped " + counters.size() + " queries.";\r
-               \r
-       }\r
-       \r
-       /*\r
-        * Implementation of the interface ReadGraph\r
-        */\r
-       final public String getURI(final Resource resource)     throws AssumptionException, ValidationException, ServiceException {\r
-               \r
-               assert (resource != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new org.simantics.db.common.uri.ResourceToURI(resource));\r
-\r
-               } catch (AssumptionException e) {\r
-\r
-                       throw new AssumptionException(e);\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-       \r
-       final public String getPossibleURI(final Resource resource)     throws ValidationException,     ServiceException {\r
-\r
-               assert (resource != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new org.simantics.db.common.uri.ResourceToPossibleURI(resource));\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       final public Resource getResource(final String id)\r
-                       throws ResourceNotFoundException, ValidationException,\r
-                       ServiceException {\r
-\r
-               assert (id != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new org.simantics.db.common.primitiverequest.Resource(\r
-                                       id));\r
-\r
-               } catch (ResourceNotFoundException e) {\r
-\r
-                       throw new ResourceNotFoundException(e);\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       final public Resource getPossibleResource(final String id)\r
-       throws ResourceNotFoundException, ValidationException,\r
-       ServiceException {\r
-\r
-               assert (id != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new org.simantics.db.common.primitiverequest.Resource(\r
-                                       id));\r
-\r
-               } catch (ResourceNotFoundException e) {\r
-                       \r
-                       return null;\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       final public Resource getRootLibrary() {\r
-               return processor.getRootLibraryResource();\r
-       }\r
-       \r
-       final public Resource getBuiltin(final String id)\r
-                       throws ResourceNotFoundException, ServiceException {\r
-\r
-               assert (id != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new Builtin(id));\r
-\r
-               } catch (ResourceNotFoundException e) {\r
-\r
-                       throw new ResourceNotFoundException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       static class StatementReadProcedure extends TIntArrayListInternal implements StatementProcedure {\r
-\r
-               private static Throwable DONE = new Throwable();\r
-               \r
-               Throwable exception = null;\r
-               \r
-               final ResourceSupport support;\r
-               \r
-               public StatementReadProcedure(ResourceSupport support) {\r
-                       this.support = support;\r
-               }\r
-               \r
-               @Override\r
-               public synchronized void execute(AsyncReadGraph graph, int s, int p, int o) {\r
-                       add(s);\r
-                       add(p);\r
-                       add(o);\r
-               }\r
-               \r
-               @Override\r
-               public void finished(AsyncReadGraph graph) {\r
-                       exception = DONE;\r
-               }\r
-\r
-               @Override\r
-               public void exception(AsyncReadGraph graph, Throwable t) {\r
-                       exception = t;\r
-               }\r
-               \r
-               public void checkAndThrow() throws DatabaseException {\r
-                       if(exception != DONE) {\r
-                               if (exception instanceof DatabaseException)\r
-                                       throw (DatabaseException) exception;\r
-                               else\r
-                                       throw new DatabaseException(\r
-                                                       "Unexpected exception in ReadGraph.syncRequest(AsyncMultiRead)",\r
-                                                       exception);\r
-                       }\r
-               }\r
-               \r
-               public boolean done() {\r
-                       return exception != null;\r
-               }\r
-\r
-               @Override\r
-               public boolean contains(Object obj) {\r
-                   if(!(obj instanceof InternalStatement))\r
-                       return false;\r
-                   InternalStatement statement = (InternalStatement)obj;\r
-                   int s = statement.s;\r
-                   int p = statement.p;\r
-                   int o = statement.o;\r
-                   for(int i=0;i<sizeInternal();i+=3)\r
-                if(s==getQuick(i) && p==getQuick(i+1) && o==getQuick(i+2))\r
-                    return true;\r
-                   return false;\r
-               }\r
-\r
-               @SuppressWarnings("unchecked")\r
-        @Override\r
-               public <T> T[] toArray(T[] a) {\r
-                   int length = sizeInternal() / 3;\r
-                   if(length > a.length) {\r
-                       Class<?> arrayType = a.getClass();\r
-                       a = (arrayType == Object[].class) \r
-                               ? (T[]) new Object[length]\r
-                               : (T[]) Array.newInstance(arrayType.getComponentType(), length);\r
-                   }\r
-                   else {\r
-                       for(int i=length;i<a.length;++i)\r
-                           a[i] = null;\r
-                   }\r
-            for(int i=0,j=0;i<sizeInternal();i+=3,++j)\r
-                a[j] = (T)new InternalStatement(support, getQuick(i), getQuick(i+1), getQuick(i+2));\r
-            return a;\r
-               }\r
-\r
-               @Override\r
-               public boolean add(Statement e) {\r
-                       throw new UnsupportedOperationException();\r
-               }\r
-\r
-               @Override\r
-               public boolean remove(Object o) {\r
-                       throw new UnsupportedOperationException();\r
-               }\r
-\r
-               @Override\r
-               public boolean addAll(Collection<? extends Statement> c) {\r
-                       throw new UnsupportedOperationException();\r
-               }\r
-\r
-               class IteratorImpl implements ListIterator<Statement> {\r
-            \r
-            int index;\r
-            \r
-            public IteratorImpl(int index) {\r
-                this.index = index;\r
-            }\r
-\r
-            @Override\r
-            public boolean hasNext() {\r
-                return index < sizeInternal(); \r
-            }\r
-\r
-            @Override\r
-            public Statement next() {\r
-                Statement result = new InternalStatement(support, getQuick(index), getQuick(index+1), getQuick(index+2)); \r
-                index += 3;\r
-                return result;\r
-            }\r
-\r
-            @Override\r
-            public void remove() {\r
-                throw new Error("Not supported");\r
-            }\r
-\r
-            @Override\r
-            public boolean hasPrevious() {\r
-                return index > 0;\r
-            }\r
-\r
-            @Override\r
-            public Statement previous() {\r
-                index -= 3;\r
-                Statement result = new InternalStatement(support, getQuick(index), getQuick(index+1), getQuick(index+2)); \r
-                return result;\r
-            }\r
-\r
-            @Override\r
-            public int nextIndex() {\r
-                return index/3;\r
-            }\r
-\r
-            @Override\r
-            public int previousIndex() {\r
-                return index/3-1;\r
-            }\r
-\r
-            @Override\r
-            public void set(Statement e) {\r
-                throw new UnsupportedOperationException();\r
-            }\r
-\r
-            @Override\r
-            public void add(Statement e) {\r
-                throw new UnsupportedOperationException();\r
-            }\r
-            \r
-        };\r
-        \r
-               @Override\r
-               public Iterator<Statement> iterator() {\r
-                       return new IteratorImpl(0);\r
-               }\r
-               \r
-               @Override\r
-               public int size() {\r
-                       return sizeInternal() / 3;\r
-               }\r
-\r
-               @Override\r
-               public Object[] toArray() {\r
-                   Object[] result = new Object[sizeInternal() / 3];\r
-                   for(int i=0,j=0;j<sizeInternal();i++,j+=3)\r
-                       result[i] = new InternalStatement(support, getQuick(j), getQuick(j+1), getQuick(j+2));\r
-                       return result;\r
-               }\r
-\r
-        @Override\r
-        public boolean addAll(int index, Collection<? extends Statement> c) {\r
-            throw new UnsupportedOperationException();\r
-        }\r
-\r
-        @Override\r
-        public Statement get(int index) {\r
-            index += 3;\r
-            if(index < 0 || index >= sizeInternal())\r
-                throw new IndexOutOfBoundsException();\r
-            return new InternalStatement(support, getQuick(index), getQuick(index+1), getQuick(index+2));\r
-        }\r
-\r
-        @Override\r
-        public Statement set(int index, Statement element) {\r
-            throw new UnsupportedOperationException();\r
-        }\r
-\r
-        @Override\r
-        public void add(int index, Statement element) {\r
-            throw new UnsupportedOperationException();\r
-        }\r
-\r
-        @Override\r
-        public Statement remove(int index) {\r
-            throw new UnsupportedOperationException();\r
-        }\r
-\r
-        @Override\r
-        public int indexOf(Object obj) {\r
-            if(!(obj instanceof InternalStatement))\r
-                return -1;\r
-            InternalStatement statement = (InternalStatement)obj;\r
-            int s = statement.s;\r
-            int p = statement.p;\r
-            int o = statement.o;\r
-            for(int i=0;i<sizeInternal();i+=3)\r
-                if(s==getQuick(i) && p==getQuick(i+1) && o==getQuick(i+2))\r
-                    return i/3;\r
-            return -1;\r
-        }\r
-\r
-        @Override\r
-        public int lastIndexOf(Object obj) {\r
-            if(!(obj instanceof InternalStatement))\r
-                return -1;\r
-            InternalStatement statement = (InternalStatement)obj;\r
-            int s = statement.s;\r
-            int p = statement.p;\r
-            int o = statement.o;\r
-            for(int i=sizeInternal()-3;i>=0;i-=3)\r
-                if(s==getQuick(i) && p==getQuick(i+1) && o==getQuick(i+2))\r
-                    return i/3;\r
-            return -1;\r
-        }\r
-\r
-        @Override\r
-        public ListIterator<Statement> listIterator() {\r
-            return new IteratorImpl(0);\r
-        }\r
-\r
-        @Override\r
-        public ListIterator<Statement> listIterator(int index) {\r
-            return new IteratorImpl(index*3);\r
-        }\r
-\r
-        @Override\r
-        public List<Statement> subList(int fromIndex, int toIndex) {\r
-            if(fromIndex < 0 || toIndex*3 >= sizeInternal() || fromIndex > toIndex)\r
-                throw new IndexOutOfBoundsException();\r
-            return new RandomAccessSubList<Statement>(this, fromIndex, toIndex-fromIndex);\r
-        }\r
-       }\r
-       \r
-       @Override\r
-       final public Collection<Statement> getStatements(final Resource subject,\r
-                       final Resource relation)\r
-                       throws ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       StatementReadProcedure procedure = new StatementReadProcedure(getResourceSupport());\r
-                       processor.forEachStatement(this, subject, relation, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure;\r
-                       \r
-               } catch (DatabaseException e) {\r
-\r
-                       System.err.println(INTERNAL_ERROR_STRING + " getStatements " + subject + " " + relation);\r
-\r
-                       StatementReadProcedure procedure = new StatementReadProcedure(getResourceSupport());\r
-                       processor.forEachStatement(this, subject, relation, procedure);\r
-                       \r
-                       return Collections.emptyList();\r
-               \r
-//                     throw new ServiceException(INTERNAL_ERROR_STRING + " getStatements " + subject + " " + relation, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Collection<Statement> getAssertedStatements(final Resource subject, final Resource relation)\r
-                       throws ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new ForEachAssertedStatement(subject, relation));\r
-\r
-               } catch (ManyObjectsForFunctionalRelationException e) {\r
-\r
-                       throw new ManyObjectsForFunctionalRelationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Collection<Resource> getPredicates(final Resource subject) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       return processor.getPredicates(this, subject);\r
-\r
-//                     AsyncMultiReadProcedure<Resource> procedure = new AsyncMultiReadProcedure<Resource>();\r
-//                     processor.forEachPredicate(this, subject, procedure);\r
-//                     procedure.checkAndThrow();\r
-//                     return procedure;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }  catch (Throwable e) {\r
-\r
-            throw new ServiceException(e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Collection<Resource> getPrincipalTypes(final Resource subject)\r
-                       throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       AsyncMultiReadProcedure<Resource> procedure = new AsyncMultiReadProcedure<Resource>();\r
-                       processor.forEachPrincipalType(this, subject, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure;\r
-                       \r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Set<Resource> getTypes(final Resource subject) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-                       \r
-                       return processor.getTypes(this, subject);\r
-                       \r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-                       \r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-        } catch (Throwable e) {\r
-\r
-            throw new ServiceException(e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Set<Resource> getSupertypes(final Resource subject)\r
-                       throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       SyncReadProcedure<Set<Resource>> procedure = new SyncReadProcedure<Set<Resource>>();\r
-                       processor.forSupertypes(this, subject, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure.result;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Set<Resource> getSuperrelations(final Resource subject)\r
-                       throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       SyncReadProcedure<Set<Resource>> procedure = new SyncReadProcedure<Set<Resource>>();\r
-                       processor.forSuperrelations(this, subject, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure.result;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-       \r
-       @Override\r
-       public Resource getPossibleSuperrelation(Resource subject) throws ServiceException {\r
-               \r
-               try {\r
-\r
-                       SyncReadProcedure<Resource> procedure = new SyncReadProcedure<Resource>();\r
-                       processor.forPossibleSuperrelation(this, subject, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure.result;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Collection<Resource> getObjects(final Resource subject, final Resource relation)\r
-                       throws ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               if(Development.DEVELOPMENT) {\r
-            if(Development.isTrue(DevelopmentKeys.READGRAPH_COUNT)) {\r
-               counters.adjustOrPutValue("objects $" + subject.getResourceId() + " $" + relation.getResourceId(), 1, 1);\r
-            }\r
-            //if(subject.getResourceId()==xx && relation.getResourceId()==xx) new Exception().printStackTrace();\r
-               }\r
-               \r
-               try {\r
-\r
-                       AsyncMultiReadProcedure<Resource> procedure = new AsyncMultiReadProcedure<Resource>();\r
-                       processor.forEachObject(this, subject, relation, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure;\r
-                       \r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Collection<Resource> getAssertedObjects(\r
-                       final Resource subject, final Resource relation)\r
-                       throws ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-        if (subject == null)\r
-            throw new ArgumentException("Subject must not be null.");\r
-        if (relation == null)\r
-            throw new ArgumentException("Relation must not be null. Subject=" + subject);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new ForEachAssertedObject(subject, relation));\r
-\r
-               } catch (ManyObjectsForFunctionalRelationException e) {\r
-\r
-                       throw new ManyObjectsForFunctionalRelationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Resource getInverse(final Resource relation) throws NoInverseException, ServiceException {\r
-\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       return getSingleObject(relation, processor.querySupport.getResource(processor.getInverseOf()));\r
-\r
-               } catch (NoSingleResultException e) {\r
-\r
-                       throw new NoInverseException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Resource getSingleObject(final Resource subject, final Resource relation) throws NoSingleResultException, ServiceException {\r
-\r
-               if( subject == null) throw new IllegalArgumentException("subject can not be null");\r
-               if( relation == null) throw new IllegalArgumentException("relation can not be null");\r
-\r
-               try {\r
-\r
-                       int single = processor.getSingleObject(this, subject, relation);\r
-                       if(single == 0) throw new NoSingleResultException("subject=" + subject + " relation="+relation);\r
-                       return processor.querySupport.getResource(single);\r
-\r
-               } catch (NoSingleResultException e) {\r
-                   \r
-                   if(EMPTY_RESOURCE_CHECK) {\r
-                       if(!hasStatement(subject)) throw new EmptyResourceException("Resource " + debugString(subject));\r
-                   }\r
-                   \r
-                       throw new NoSingleResultException("No single object for subject "\r
-                                       + debugString(subject) + " and relation "\r
-                                       + debugString(relation), e);\r
-            \r
-               } catch (DatabaseException e) {\r
-                   \r
-                       throw new ServiceException(e);\r
-                       \r
-               } \r
-               \r
-       }\r
-\r
-       @Override\r
-       final public Statement getSingleStatement(final Resource subject,\r
-                       final Resource relation) throws NoSingleResultException,\r
-                       ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       Collection<Statement> statements = getStatements(subject, relation);\r
-                       if(statements.size() == 1) return statements.iterator().next();\r
-                       else throw new NoSingleResultException("");\r
-\r
-        } catch (NoSingleResultException e) {\r
-            \r
-            if(EMPTY_RESOURCE_CHECK) {\r
-                if(!hasStatement(subject)) throw new EmptyResourceException("Resource " + debugString(subject));\r
-            }\r
-            \r
-            throw new NoSingleResultException("No single statement for subject "\r
-                    + debugString(subject) + " and relation "\r
-                    + debugString(relation), e);\r
-            \r
-        } catch (DatabaseException e) {\r
-            \r
-            throw new ServiceException(e);\r
-            \r
-        } \r
-\r
-       }\r
-\r
-       @Override\r
-       final public Resource getSingleType(final Resource subject) throws NoSingleResultException,\r
-                       ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       ArrayList<Resource> principalTypes = (ArrayList<Resource>)getPrincipalTypes(subject);\r
-                       if(principalTypes.size() == 1) return principalTypes.get(0);\r
-                       else throw new NoSingleResultException("");\r
-\r
-               } catch (NoSingleResultException e) {\r
-\r
-                       throw new NoSingleResultException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-\r
-       }\r
-\r
-       @Override\r
-       final public Resource getSingleType(final Resource subject,\r
-                       final Resource baseType) throws NoSingleResultException,\r
-                       ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (baseType != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new SingleType(subject, baseType));\r
-\r
-               } catch (NoSingleResultException e) {\r
-\r
-                       throw new NoSingleResultException(new NoSingleResultException("subject=" + subject + ", baseType=" + baseType, e));\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public <T> T getValue(final Resource subject) throws DoesNotContainValueException, ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       Layer0 L0 = processor.getL0(this);\r
-            int object = processor.getSingleObject(this, subject, L0.HasDataType);\r
-            if(object == 0) throw new DoesNotContainValueException("No data type for " + subject);\r
-            \r
-            if(processor.isImmutable(object)) {\r
-               Binding binding = syncRequest(new DatatypeBinding(processor.querySupport.getResource(object)), TransientCacheListener.<Binding>instance()); \r
-                       return getValue(subject, binding);\r
-            } else {\r
-                   byte[] dt = processor.getValue(this, object);\r
-                   if(dt == null) throw new ServiceException("No data type for " + subject);\r
-                   Datatype datatype = (Datatype)DATA_TYPE_SERIALIZER.deserialize(dt);\r
-                   Binding binding = Bindings.getBinding(datatype);\r
-                   return getValue(subject, binding);\r
-            }\r
-                       \r
-        } catch (IOException e) {\r
-\r
-            throw new ServiceException(e);\r
-\r
-               } catch (DoesNotContainValueException e) {\r
-\r
-                       throw new DoesNotContainValueException(e, subject);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-        }\r
-\r
-       }\r
-\r
-    @Override\r
-    final public Variant getVariantValue(final Resource subject) throws DoesNotContainValueException, ServiceException {\r
-\r
-        assert (subject != null);\r
-\r
-        try {\r
-\r
-            Layer0 L0 = processor.getL0(this);\r
-            int object = processor.getSingleObject(this, subject, L0.HasDataType);\r
-            if(object == 0) throw new DoesNotContainValueException("No data type for " + subject);\r
-            \r
-            if(processor.isImmutable(object)) {\r
-                Binding binding = syncRequest(new DatatypeBinding(processor.querySupport.getResource(object)), TransientCacheListener.<Binding>instance()); \r
-                return new Variant(binding, getValue(subject, binding));\r
-            } else {\r
-                byte[] dt = processor.getValue(this, object);\r
-                if(dt == null) throw new ServiceException("No data type for " + subject);\r
-                Datatype datatype = (Datatype)DATA_TYPE_SERIALIZER.deserialize(dt);\r
-                Binding binding = Bindings.getBinding(datatype);\r
-                return new Variant(binding, getValue(subject, binding));\r
-            }\r
-            \r
-        } catch (IOException e) {\r
-\r
-            throw new ServiceException(e);\r
-\r
-        } catch (DoesNotContainValueException e) {\r
-\r
-            throw new DoesNotContainValueException(e, subject);\r
-\r
-        } catch (ServiceException e) {\r
-\r
-            throw new ServiceException(e);\r
-\r
-        } catch (DatabaseException e) {\r
-\r
-            throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-        }              \r
-       }\r
-\r
-       static final IdentityHashMap<Binding,Serializer> serializers = new IdentityHashMap<Binding,Serializer>();\r
-       \r
-       static {\r
-               serializers.put(Bindings.STRING, Bindings.STRING.serializer());\r
-       }\r
-       \r
-       final protected Serializer getSerializer(Binding binding) {\r
-           return binding.serializer();\r
-       }\r
-       \r
-       @Override\r
-       final public <T> T getValue(final Resource subject, final Binding binding) throws DoesNotContainValueException, BindingException,\r
-                       ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-                       \r
-                       byte[] bytes = processor.getValue(this, subject);\r
-                       if (bytes == null) throw new DoesNotContainValueException("No value for resource " + subject);\r
-\r
-                       Serializer serializer = getSerializer(binding);\r
-                       return (T)serializer.deserialize(bytes);\r
-\r
-               } catch (DoesNotContainValueException e) {\r
-\r
-                       throw new DoesNotContainValueException(e);\r
-\r
-               } catch (IOException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-                   \r
-            throw new ServiceException(e);\r
-            \r
-        } catch (BufferUnderflowException e) {\r
-            // This is sometimes thrown when deserialize fails because wrong format.\r
-            // For callers of this method this is just an service exception.\r
-            throw new ServiceException(e);\r
-        }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public <T> T getRelatedValue(final Resource subject, final Resource relation) throws NoSingleResultException,\r
-                       DoesNotContainValueException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       Resource object = getSingleObject(subject, relation);\r
-                       return getValue(object);\r
-                       \r
-               } catch (NoSingleResultException e) {\r
-\r
-                       throw new NoSingleResultException(e);\r
-\r
-               } catch (DoesNotContainValueException e) {\r
-\r
-                       try {\r
-                               Layer0 L0 = processor.getL0(this);\r
-                               Resource object = getPossibleObject(subject, relation);\r
-                               if(isInstanceOf(object, L0.Value)) {\r
-                                       if(isInstanceOf(object, L0.Literal)) {\r
-                                               throw new DoesNotContainValueException(e);\r
-                                       } else {\r
-                                               throw new InvalidLiteralException("The object " + object + " is not an instance of L0.Literal (use getRelatedValue2 instead)");\r
-                                       }\r
-                               } else {\r
-                                       throw new DoesNotContainValueException("The object " + object + " is not an instance of L0.Value");\r
-                               }\r
-                       } catch (DoesNotContainValueException e2) {\r
-                               throw e2;\r
-                       } catch (DatabaseException e2) {\r
-                               throw new InternalException("The client failed to analyse the cause of the following exception", e);\r
-                       }\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-               \r
-       }\r
-\r
-    @Override\r
-    final public Variant getRelatedVariantValue(final Resource subject, final Resource relation) throws NoSingleResultException,\r
-            DoesNotContainValueException, ServiceException {\r
-\r
-        assert (subject != null);\r
-        assert (relation != null);\r
-\r
-        try {\r
-\r
-            Resource object = getSingleObject(subject, relation);\r
-            return getVariantValue(object);\r
-            \r
-        } catch (NoSingleResultException e) {\r
-\r
-            throw new NoSingleResultException(e);\r
-\r
-        } catch (DoesNotContainValueException e) {\r
-\r
-            try {\r
-                Layer0 L0 = processor.getL0(this);\r
-                Resource object = getPossibleObject(subject, relation);\r
-                if(isInstanceOf(object, L0.Value)) {\r
-                    if(isInstanceOf(object, L0.Literal)) {\r
-                        throw new DoesNotContainValueException(e);\r
-                    } else {\r
-                        throw new InvalidLiteralException("The object " + object + " is not an instance of L0.Literal (use getRelatedValue2 instead)");\r
-                    }\r
-                } else {\r
-                    throw new DoesNotContainValueException("The object " + object + " is not an instance of L0.Value");\r
-                }\r
-            } catch (DoesNotContainValueException e2) {\r
-                throw e2;\r
-            } catch (DatabaseException e2) {\r
-                throw new InternalException("The client failed to analyse the cause of the following exception", e);\r
-            }\r
-\r
-        } catch (ServiceException e) {\r
-\r
-            throw new ServiceException(e);\r
-\r
-        } \r
-        \r
-    }\r
-    \r
-       @Override\r
-       final public <T> T getRelatedValue(final Resource subject, final Resource relation, final Binding binding)\r
-                       throws NoSingleResultException, DoesNotContainValueException, BindingException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       Resource object = getSingleObject(subject, relation);\r
-                       return getValue(object, binding);\r
-\r
-               } catch (NoSingleResultException e) {\r
-\r
-                   String message = "";\r
-                   \r
-                   try {\r
-                   \r
-                   String subjectName = NameUtils.getSafeName(this, subject, true);\r
-                   String relationName = NameUtils.getSafeName(this, relation, true);\r
-                   message = "Subject: " + subjectName + ", Relation: " + relationName;\r
-\r
-                   } catch (DatabaseException e2) {\r
-                       \r
-                   }\r
-\r
-            throw new NoSingleResultException(message);\r
-                   \r
-               } catch (DoesNotContainValueException e) {\r
-\r
-                       throw new DoesNotContainValueException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public <T> T adapt(final Resource resource, final Class<T> clazz)\r
-                       throws AdaptionException, ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new Adapter<T>(resource, clazz));\r
-\r
-               } catch (AdaptionException e) {\r
-\r
-                       throw new AdaptionException(e);\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public <T,C> T adaptContextual(final Resource resource, final C context, final Class<C> contextClass, final Class<T> clazz)\r
-                       throws AdaptionException, ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (context != null);\r
-\r
-               class ContextualAdapter implements AsyncRead<T> {\r
-\r
-                       final private Resource resource;\r
-                       final private C context;\r
-                   final private Class<T> clazz;\r
-                   \r
-                   @Override\r
-                   public int hashCode() {\r
-                       return resource.hashCode() + 31 * (clazz.hashCode() + 41 * context.hashCode());\r
-                   }\r
-                   \r
-                   @Override\r
-                   final public int threadHash() {\r
-                       return resource.getThreadHash();\r
-                   }\r
-                   \r
-                   @Override\r
-                   public boolean equals(Object object) {\r
-                       if (this == object)\r
-                           return true;\r
-                       else if (object == null)\r
-                           return false;\r
-                       else if (getClass() != object.getClass())\r
-                           return false;\r
-                       ContextualAdapter r = (ContextualAdapter)object;\r
-                       return resource.equals(r.resource) && context.equals(r.context) && clazz.equals(r.clazz);\r
-                   }\r
-\r
-                   @Override\r
-                   public int getFlags() {\r
-                       return 0;\r
-                   }\r
-                   \r
-                   public ContextualAdapter(Resource resource, C context, Class<T> clazz) {\r
-                       this.resource = resource;\r
-                       this.context = context;\r
-                       this.clazz = clazz;\r
-                   }\r
-\r
-                   @Override\r
-                   public void perform(AsyncReadGraph graph, AsyncProcedure<T> procedure) {\r
-                       \r
-                               final AdaptionService service = getSession().peekService(AdaptionService.class);\r
-                               if (service == null)\r
-                                       procedure.exception(graph, new ServiceException("No AdaptionService available")); \r
-                               else\r
-                                       service.adapt(graph, resource, context, contextClass, clazz, false, procedure); \r
-                       \r
-                   }\r
-\r
-                   @Override\r
-                   public String toString() {\r
-                       return "Adapter for (" + resource + "," + context + ") as " + clazz.getName();\r
-                   }\r
-                   \r
-               }\r
-               \r
-               try {\r
-\r
-                       return syncRequest(new ContextualAdapter(resource, context, clazz));\r
-\r
-               } catch (AdaptionException e) {\r
-\r
-                       throw new AdaptionException(e);\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-       \r
-       @Override\r
-       final public <T> T adaptRelated(final Resource resource, final Resource relation, final Class<T> clazz)\r
-                       throws AdaptionException, NoSingleResultException, ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-\r
-               Statement stm = getSingleStatement(resource, relation);\r
-               \r
-               return adaptContextual(stm.getObject(), new RelationContextImpl(resource, stm), RelationContext.class, clazz);\r
-               \r
-       }\r
-\r
-       @Override\r
-       final public <T> T getPossibleRelatedAdapter(final Resource resource, final Resource relation, final Class<T> clazz)\r
-                       throws ValidationException, ServiceException {\r
-\r
-               try {\r
-                       return adaptRelated(resource, relation, clazz);\r
-               } catch (DatabaseException e) {\r
-                       return null;\r
-               }\r
-               \r
-       }\r
-\r
-       @Override\r
-       final public <T,C> T getPossibleContextualAdapter(final Resource resource, final C context, final Class<C> contextClass, final Class<T> clazz)\r
-                       throws ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (context != null);\r
-\r
-               class PossibleContextualAdapter implements AsyncRead<T> {\r
-\r
-                       final private Resource resource;\r
-                       final private C context;\r
-                   final private Class<T> clazz;\r
-                   \r
-                   @Override\r
-                   public int hashCode() {\r
-                       return resource.hashCode() + 31 * (clazz.hashCode() + 41 * context.hashCode());\r
-                   }\r
-                   \r
-                   @Override\r
-                   final public int threadHash() {\r
-                       return resource.getThreadHash();\r
-                   }\r
-                   \r
-                   @Override\r
-                   public boolean equals(Object object) {\r
-                       if (this == object)\r
-                           return true;\r
-                       else if (object == null)\r
-                           return false;\r
-                       else if (getClass() != object.getClass())\r
-                           return false;\r
-                       PossibleContextualAdapter r = (PossibleContextualAdapter)object;\r
-                       return resource.equals(r.resource) && context.equals(r.context) && clazz.equals(r.clazz);\r
-                   }\r
-\r
-                   @Override\r
-                   public int getFlags() {\r
-                       return 0;\r
-                   }\r
-                   \r
-                   public PossibleContextualAdapter(Resource resource, C context, Class<T> clazz) {\r
-                       this.resource = resource;\r
-                       this.context = context;\r
-                       this.clazz = clazz;\r
-                   }\r
-\r
-                   @Override\r
-                   public void perform(AsyncReadGraph graph, AsyncProcedure<T> procedure) {\r
-                       \r
-                               final AdaptionService service = getSession().peekService(AdaptionService.class);\r
-                               if (service == null)\r
-                                       procedure.exception(graph, new ServiceException("No AdaptionService available")); \r
-                               else\r
-                                       service.adapt(graph, resource, context, contextClass, clazz, true, procedure); \r
-                       \r
-                   }\r
-\r
-                   @Override\r
-                   public String toString() {\r
-                       return "Possible adapter for (" + resource + "," + context + ") as " + clazz.getName();\r
-                   }\r
-                   \r
-               }\r
-               \r
-               try {\r
-\r
-                       return syncRequest(new PossibleContextualAdapter(resource, context, clazz));\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-               \r
-       }\r
-\r
-       @Override\r
-       final public <T> T adaptUnique(final Resource resource, final Class<T> clazz)\r
-                       throws AdaptionException, ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new UniqueAdapter<T>(resource, clazz));\r
-\r
-               } catch (AdaptionException e) {\r
-\r
-                       throw new AdaptionException(e);\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public Resource getPossibleInverse(final Resource relation)\r
-                       throws ServiceException {\r
-\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       return getPossibleObject(relation, processor.querySupport.getResource(processor.getInverseOf()));\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public Resource getPossibleObject(final Resource subject, final Resource relation)\r
-                       throws ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                   int result = processor.getSingleObject(this, subject, relation);\r
-                   if(result == 0) return null;\r
-                   \r
-                   return processor.querySupport.getResource(result);\r
-\r
-            } catch (ManyObjectsForFunctionalRelationException e) {\r
-\r
-                throw new ManyObjectsForFunctionalRelationException("subject=" + subject + ", relation=" + relation, e);\r
-                \r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               }\r
-               \r
-       }\r
-\r
-       @Override\r
-       final public Statement getPossibleStatement(final Resource subject, final Resource relation)\r
-                       throws ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       Collection<Statement> statements = getStatements(subject, relation);\r
-                       if(statements.size() == 1) return statements.iterator().next();\r
-                       else return null;\r
-\r
-               } catch (ManyObjectsForFunctionalRelationException e) {\r
-\r
-                       throw new ManyObjectsForFunctionalRelationException("Many objects in " + subject + " for functional relation " + relation);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-\r
-       }\r
-\r
-       @Override\r
-       final public Resource getPossibleType(final Resource subject, final Resource baseType) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (baseType != null);\r
-\r
-               try {\r
-\r
-                       AsyncReadProcedure<Resource> procedure = new AsyncReadProcedure<Resource>();\r
-                       forPossibleType(subject, baseType, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure.result;                        \r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public <T> T getPossibleValue(final Resource subject) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-                   \r
-                   int object = processor.getSingleObject(this, subject, processor.getL0(this).HasDataType);\r
-                   if(object == 0) return null;\r
-                   \r
-            if(processor.isImmutable(object)) {\r
-               Binding binding = syncRequest(new DatatypeBinding(processor.querySupport.getResource(object)), TransientCacheListener.<Binding>instance()); \r
-                       return getPossibleValue(subject, binding);\r
-            } else {\r
-                   byte[] dt = processor.getValue(this, object);\r
-                   if(dt == null) return null;\r
-                   Datatype datatype = (Datatype)DATA_TYPE_SERIALIZER.deserialize(dt);\r
-                   Binding binding = Bindings.getBinding(datatype);\r
-                   return getPossibleValue(subject, binding);\r
-            }\r
-                   \r
-        } catch (IOException e) {\r
-            \r
-            throw new ServiceException(e);\r
-            \r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-        }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public <T> T getPossibleValue(final Resource subject, final Binding binding) throws BindingException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (binding != null);\r
-\r
-               try {\r
-\r
-            byte[] dt = processor.getValue(this, subject);\r
-            if(dt == null) return null;\r
-                       Serializer serializer = getSerializer(binding);\r
-            return (T)serializer.deserialize(dt);\r
-\r
-        } catch (IOException e) {\r
-\r
-            throw new ServiceException(e);\r
-            \r
-               } catch (BindingException e) {\r
-\r
-                       throw new BindingException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-                       e.printStackTrace();\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-        }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T getPossibleRelatedValue(final Resource subject, final Resource relation)\r
-                       throws ManyObjectsForFunctionalRelationException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       Resource object = getPossibleObject(subject, relation);\r
-                       if(object == null) return null;\r
-                       else return getPossibleValue(object);\r
-\r
-               } catch (ManyObjectsForFunctionalRelationException e) {\r
-\r
-                       throw new ManyObjectsForFunctionalRelationException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T getPossibleRelatedValue(final Resource subject, final Resource relation, final Binding binding)\r
-                       throws ManyObjectsForFunctionalRelationException, BindingException, ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (binding != null);\r
-\r
-               try {\r
-\r
-                       Resource object = getPossibleObject(subject, relation);\r
-                       if(object == null) return null;\r
-                       else return getPossibleValue(object, binding);\r
-\r
-               } catch (ManyObjectsForFunctionalRelationException e) {\r
-\r
-                       throw new ManyObjectsForFunctionalRelationException(e);\r
-\r
-               } catch (BindingException e) {\r
-\r
-                       throw new BindingException(e);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T getPossibleAdapter(Resource resource, Class<T> clazz) throws ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new PossibleAdapter<T>(resource, clazz));\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (AdaptionException e) {\r
-\r
-                       return null;\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public <T> T getPossibleUniqueAdapter(Resource resource, Class<T> clazz) throws ValidationException, ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-\r
-               try {\r
-\r
-                       return syncRequest(new PossibleUniqueAdapter<T>(resource, clazz));\r
-\r
-               } catch (AdaptionException e) {\r
-\r
-                       return null;\r
-\r
-               } catch (ValidationException e) {\r
-\r
-                       throw new ValidationException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-    @Override\r
-    final public boolean isInstanceOf(final Resource resource, final Resource type) throws ServiceException {\r
-\r
-        assert (resource != null);\r
-        assert (type != null);\r
-\r
-        Set<Resource> resources = getTypes(resource);\r
-        // This check was necessary because some of the callers of this method got stuck when the NPE was thrown from here.\r
-        if (null == resources)\r
-            return false;\r
-        \r
-        if(EMPTY_RESOURCE_CHECK) {\r
-            if (resources.isEmpty()) {\r
-                if(!hasStatement(resource)) throw new EmptyResourceException("Resource " + debugString(resource));\r
-            }\r
-        }\r
-        \r
-        return resources.contains(type);\r
-\r
-    }\r
-\r
-       @Override\r
-       final public boolean isInheritedFrom(final Resource resource, final Resource type) throws ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (type != null);\r
-\r
-               try {\r
-\r
-                       if(resource.equals(type)) return true;\r
-                       \r
-                       return getSupertypes(resource).contains(type);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-               \r
-       }\r
-\r
-       @Override\r
-       final public boolean isSubrelationOf(final Resource resource, final Resource type) throws ServiceException {\r
-\r
-               assert (resource != null);\r
-               assert (type != null);\r
-\r
-               try {\r
-\r
-                       if(resource.equals(type)) return true;\r
-                       \r
-                       return getSuperrelations(resource).contains(type);\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-\r
-       }\r
-\r
-       @Override\r
-       final public boolean hasStatement(final Resource subject) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       SyncReadProcedure<Boolean> procedure = new SyncReadProcedure<Boolean>();\r
-                       processor.forHasStatement(this, subject, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure.result;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public boolean hasStatement(final Resource subject, final Resource relation) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-\r
-               try {\r
-\r
-                       Collection<Resource> objects = getObjects(subject, relation);\r
-                       return !objects.isEmpty();\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } \r
-               \r
-       }\r
-\r
-       @Override\r
-       final public boolean hasStatement(final Resource subject, final Resource relation, final Resource object) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (object != null);\r
-\r
-               try {\r
-\r
-                       for(Resource o : getObjects(subject, relation)) {\r
-                               if(object.equals(o)) return true;\r
-                       }\r
-                       \r
-                       return false;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       final public boolean hasValue(final Resource subject) throws ServiceException {\r
-\r
-               assert (subject != null);\r
-\r
-               try {\r
-\r
-                       SyncReadProcedure<Boolean> procedure = new SyncReadProcedure<Boolean>();\r
-                       processor.forHasValue(this, subject, procedure);\r
-                       procedure.checkAndThrow();\r
-                       return procedure.result;\r
-\r
-               } catch (ServiceException e) {\r
-\r
-                       throw new ServiceException(e);\r
-\r
-               } catch (DatabaseException e) {\r
-\r
-                       throw new ServiceException(INTERNAL_ERROR_STRING, e);\r
-\r
-               }\r
-\r
-       }\r
-\r
-       final AsyncProcedure NONE = new AsyncProcedure() {\r
-\r
-               @Override\r
-               public void execute(AsyncReadGraph graph, Object result) {\r
-               }\r
-\r
-               @Override\r
-               public void exception(AsyncReadGraph graph, Throwable throwable) {\r
-               }\r
-               \r
-       };\r
-       \r
-       /*\r
-        * Implementation of the interface RequestProcessor\r
-        */\r
-\r
-       @Override\r
-       public <T> T syncRequest(final Read<T> request) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               if (parent != null) {\r
-\r
-                       try {\r
-                               return processor.queryRead(this, request, parent, null, null);\r
-                       } catch (Throwable e) {\r
-                               if(e instanceof DatabaseException) throw (DatabaseException)e;\r
-                               else throw new DatabaseException(e);\r
-                       }\r
-\r
-               } else {\r
-\r
-                       try {\r
-\r
-                               return processor.tryQuery(this, request);\r
-\r
-                       } catch (Throwable throwable) {\r
-\r
-                               //Logger.defaultLogError("Internal read request failure", throwable);\r
-\r
-                               if (throwable instanceof DatabaseException)\r
-                                       throw (DatabaseException) throwable;\r
-                               else\r
-                                       throw new DatabaseException(\r
-                                                       "Unexpected exception in ReadGraph.syncRequest(Read,Procedure)",\r
-                                                       throwable);\r
-\r
-                       }\r
-\r
-               }\r
-               \r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(Read<T> request, SyncListener<T> procedure)\r
-                       throws DatabaseException {\r
-               return syncRequest(request, new SyncToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(Read<T> request, final Listener<T> procedure)\r
-                       throws DatabaseException {\r
-               return syncRequest(request, new NoneToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(final Read<T> request, final AsyncProcedure<T> procedure) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               ListenerBase listener = procedure != null ? getListenerBase(procedure) : null;\r
-\r
-               if (parent != null || listener != null) {\r
-                       \r
-                       try {\r
-                return processor.queryRead(this, request, parent, procedure, listener);\r
-            } catch (Throwable e) {\r
-                if(e instanceof DatabaseException) throw (DatabaseException)e;\r
-                else throw new DatabaseException(e);\r
-            }\r
-\r
-               } else {\r
-\r
-                       try {\r
-\r
-                               T t = processor.tryQuery(this, request);\r
-                               if(procedure != null)\r
-                                       procedure.execute(this, t);\r
-\r
-                               return t;\r
-\r
-                       } catch (Throwable throwable) {\r
-\r
-                               Logger.defaultLogError("Internal read request failure", throwable);\r
-\r
-                               if(procedure != null)\r
-                                       procedure.exception(this, throwable);\r
-                               \r
-                               if (throwable instanceof DatabaseException)\r
-                                       throw (DatabaseException) throwable;\r
-                               else\r
-                                       throw new DatabaseException(\r
-                                                       "Unexpected exception in ReadGraph.syncRequest(Read,Procedure)",\r
-                                                       throwable);\r
-\r
-                       }\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(final Read<T> request,\r
-                       final SyncProcedure<T> procedure) throws DatabaseException {\r
-               return syncRequest(request, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(Read<T> request, Procedure<T> procedure)\r
-                       throws DatabaseException {\r
-               return syncRequest(request, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       static class AsyncReadProcedure<T> implements AsyncProcedure<T> {\r
-\r
-               private static Throwable DONE = new Throwable();\r
-               \r
-               T result = null;\r
-               Throwable exception = null;\r
-               \r
-               @Override\r
-               public void execute(AsyncReadGraph graph, T t) {\r
-                       result = t;\r
-                       exception = DONE;\r
-               }\r
-\r
-               @Override\r
-               public void exception(AsyncReadGraph graph, Throwable t) {\r
-                       exception = t;\r
-               }\r
-               \r
-               public void checkAndThrow() throws DatabaseException {\r
-                       if(exception != DONE) {\r
-                               if (exception instanceof DatabaseException)\r
-                                       throw (DatabaseException) exception;\r
-                               else\r
-                                       throw new DatabaseException(\r
-                                                       "Unexpected exception in ReadGraph.syncRequest(AsyncMultiRead)",\r
-                                                       exception);\r
-                       }\r
-               }\r
-               \r
-               public boolean done() {\r
-                       return exception != null;\r
-               }\r
-               \r
-       }\r
-       \r
-       @Override\r
-       public <T> T syncRequest(final AsyncRead<T> request)\r
-                       throws DatabaseException {\r
-\r
-               assert (request != null);\r
-               AsyncReadProcedure<T> procedure = new AsyncReadProcedure<T>();\r
-               syncRequest(request, procedure);\r
-               procedure.checkAndThrow();\r
-               return procedure.result;\r
-               \r
-//             return syncRequest(request, new AsyncProcedureAdapter<T>());\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(AsyncRead<T> request, AsyncListener<T> procedure)\r
-                       throws DatabaseException {\r
-               return syncRequest(request, (AsyncProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(AsyncRead<T> request, SyncListener<T> procedure)\r
-                       throws DatabaseException {\r
-               return syncRequest(request, new SyncToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(AsyncRead<T> request, Listener<T> procedure)\r
-                       throws DatabaseException {\r
-               return syncRequest(request, new NoneToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> T syncRequest(final AsyncRead<T> request,\r
-                       final AsyncProcedure<T> procedure) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               // System.out.println("syncRequest " + request + " syncParent=" +\r
-               // syncParent);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null || ((request.getFlags() & RequestFlags.SCHEDULE) > 0)) {\r
-\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       final ResultCallWrappedSingleQueryProcedure4<T> wrapper = new ResultCallWrappedSingleQueryProcedure4<T>(\r
-                                       procedure, request);\r
-                       \r
-                       processor.query(this, request, parent, wrapper, listener);\r
-\r
-//                     newGraph.waitAsync(syncParent);\r
-                       \r
-                       Throwable e = wrapper.getException();\r
-                       if (e != null) {\r
-                               // The request was async - produce meaningful stack trace by\r
-                               // wrapping\r
-                               if (e instanceof DatabaseException)\r
-                                       throw (DatabaseException) e;\r
-                               else\r
-                                       throw new DatabaseException(e);\r
-                       }\r
-                       \r
-                       return wrapper.getResult();\r
-\r
-               } else {\r
-\r
-                       // System.out.println("direct call " + request );\r
-\r
-                       // Do not set the sync state.parent for external threads\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       final ResultCallWrappedSingleQueryProcedure4<T> wrapper = new ResultCallWrappedSingleQueryProcedure4<T>(\r
-                                       procedure, request);\r
-\r
-                       try {\r
-\r
-                               processor.tryQuery(this, request, wrapper);\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               wrapper.exception(this, t);\r
-\r
-                       }\r
-\r
-                       Throwable e = wrapper.getException();\r
-                       if (e != null) {\r
-                               // The request was async - produce meaningful stack trace by\r
-                               // wrapping\r
-                               if (e instanceof DatabaseException)\r
-                                       throw (DatabaseException) e;\r
-                               else\r
-                                       throw new DatabaseException(e);\r
-                       }\r
-                       \r
-                       return wrapper.getResult();\r
-\r
-               }\r
-\r
-       }\r
-\r
-       final private <T> void syncRequest(final AsyncRead<T> request, final AsyncReadProcedure<T> procedure) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               // System.out.println("syncRequest " + request + " syncParent=" +\r
-               // syncParent);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null || ((request.getFlags() & RequestFlags.SCHEDULE) > 0)) {\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       final ResultCallWrappedSingleQueryProcedure4<T> wrapper = new ResultCallWrappedSingleQueryProcedure4<T>(\r
-                                       procedure, request);\r
-\r
-                       processor.query(this, request, parent, wrapper, listener);\r
-\r
-               } else {\r
-\r
-                       try {\r
-\r
-//                             final ReadGraphImpl newGraph = newSync();\r
-                               processor.tryQuery(this, request, procedure);\r
-//                             newGraph.waitAsync(null);\r
-                               waitAsyncProcedure(procedure);\r
-\r
-                       } catch (Throwable t) {\r
-                               if(Development.DEVELOPMENT) {\r
-                                       if(Development.<Boolean>getProperty(DevelopmentKeys.WRITEGRAPH_EXCEPTION_STACKTRACES, Bindings.BOOLEAN)) {\r
-                                       t.printStackTrace();\r
-                                       }\r
-                               }\r
-                               procedure.exception(this, t);\r
-                               waitAsyncProcedure(procedure);\r
-                       }\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(AsyncRead<T> request,\r
-                       final SyncProcedure<T> procedure) throws DatabaseException {\r
-               return syncRequest(request, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> T syncRequest(final AsyncRead<T> request,\r
-                       final Procedure<T> procedure) throws DatabaseException {\r
-               return syncRequest(request, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(final MultiRead<T> request)\r
-                       throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               final ArrayList<T> result = new ArrayList<T>();\r
-               final DataContainer<Throwable> exception = new DataContainer<Throwable>();\r
-\r
-               syncRequest(request, new AsyncMultiProcedure<T>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, T t) {\r
-                               synchronized (result) {\r
-                                       result.add(t);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void finished(AsyncReadGraph graph) {\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               exception.set(t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "syncRequest(MultiRead) -> " + request;\r
-                       }\r
-\r
-               });\r
-\r
-               Throwable t = exception.get();\r
-               if (t != null) {\r
-                       if (t instanceof DatabaseException)\r
-                               throw (DatabaseException) t;\r
-                       else\r
-                               throw new DatabaseException(\r
-                                               "Unexpected exception in ReadGraph.syncRequest(Read)",\r
-                                               t);\r
-               }\r
-\r
-               return result;\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(MultiRead<T> request,\r
-                       AsyncMultiListener<T> procedure) {\r
-               return syncRequest(request, (AsyncMultiProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(MultiRead<T> request,\r
-                       SyncMultiListener<T> procedure) {\r
-               return syncRequest(request, new SyncToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(MultiRead<T> request,\r
-                       MultiListener<T> procedure) {\r
-               return syncRequest(request, new NoneToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(MultiRead<T> request,\r
-                       AsyncMultiProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       processor.query(this, request, parent, procedure, listener);\r
-\r
-//                     newGraph.waitAsync(syncParent);\r
-\r
-               } else {\r
-\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       final ResultCallWrappedQueryProcedure4<T> wrapper = new ResultCallWrappedQueryProcedure4<T>(procedure);\r
-\r
-                       try {\r
-\r
-                               request.perform(this, wrapper);\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               wrapper.exception(this, t);\r
-//                             newGraph.waitAsync(syncParent);\r
-\r
-                       }\r
-\r
-               }\r
-\r
-               // TODO\r
-               return null;\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(MultiRead<T> request,\r
-                       SyncMultiProcedure<T> procedure) {\r
-               return syncRequest(request, new SyncToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(MultiRead<T> request,\r
-                       MultiProcedure<T> procedure) {\r
-               return syncRequest(request, new NoneToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       static class AsyncMultiReadProcedure<T> extends ArrayList<T> implements AsyncMultiProcedure<T> {\r
-\r
-               private static Throwable DONE = new Throwable();\r
-               \r
-               private static final long serialVersionUID = -6494230465108115812L;\r
-               \r
-               Throwable exception = null;\r
-               \r
-               @Override\r
-               public synchronized void execute(AsyncReadGraph graph, T t) {\r
-                       add(t);\r
-               }\r
-\r
-               @Override\r
-               public void finished(AsyncReadGraph graph) {\r
-                       exception = DONE;\r
-               }\r
-\r
-               @Override\r
-               public void exception(AsyncReadGraph graph, Throwable t) {\r
-                       exception = t;\r
-               }\r
-               \r
-               public void checkAndThrow() throws DatabaseException {\r
-                       if(exception != DONE) {\r
-                               if (exception instanceof DatabaseException)\r
-                                       throw (DatabaseException) exception;\r
-                               else\r
-                                       throw new DatabaseException(\r
-                                                       "Unexpected exception in ReadGraph.syncRequest(AsyncMultiRead)",\r
-                                                       exception);\r
-                       }\r
-               }\r
-               \r
-               public boolean done() {\r
-                       return exception != null;\r
-               }\r
-               \r
-       }\r
-\r
-       @Override\r
-       final public <T> Collection<T> syncRequest(AsyncMultiRead<T> request)\r
-                       throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               final AsyncMultiReadProcedure<T> procedure = new AsyncMultiReadProcedure<T>();\r
-               \r
-               syncRequest(request, procedure);\r
-               \r
-               procedure.checkAndThrow();\r
-               return procedure;\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,\r
-                       AsyncMultiListener<T> procedure) {\r
-               return syncRequest(request, (AsyncMultiProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,\r
-                       SyncMultiListener<T> procedure) {\r
-               return syncRequest(request, new SyncToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,\r
-                       MultiListener<T> procedure) {\r
-               return syncRequest(request, new NoneToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       final private <T> void syncRequest(final AsyncMultiRead<T> request,\r
-                       final AsyncMultiReadProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       processor.query(this, request, parent, procedure, listener);\r
-\r
-//                     newGraph.waitAsync(syncParent);\r
-                       waitAsyncProcedure(procedure);\r
-\r
-               } else {\r
-\r
-//                     Object syncParent = callerThread == Integer.MIN_VALUE ? null\r
-//                                     : request;\r
-//\r
-//                     final ReadGraphImpl newGraph = newSyncAsync(syncParent);\r
-\r
-                       try {\r
-\r
-//                             inc();\r
-//                             ReadGraphImpl sync = newSync();\r
-                               request.perform(this, procedure);\r
-//                             sync.waitAsync(null);\r
-                               waitAsyncProcedure(procedure);\r
-//                             dec();\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               waitAsyncProcedure(procedure);\r
-//                             dec();\r
-\r
-                       }\r
-\r
-               }\r
-\r
-       }\r
-       \r
-       \r
-       @Override\r
-       final public <T> Collection<T> syncRequest(final AsyncMultiRead<T> request,\r
-                       final AsyncMultiProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       processor.query(this, request, parent, procedure, listener);\r
-\r
-//                     newGraph.waitAsync(syncParent);\r
-\r
-               } else {\r
-\r
-                       Object syncParent = request;\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       try {\r
-\r
-                               request.perform(this, new AsyncMultiProcedure<T>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph, T result) {\r
-                                               procedure.execute(graph, result);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               procedure.finished(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               procedure.exception(graph, t);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public String toString() {\r
-                                               return "syncRequest(AsyncMultiRead) -> " + procedure;\r
-                                       }\r
-\r
-                               });\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                       }\r
-\r
-               }\r
-\r
-               // TODO!!\r
-               return null;\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,\r
-                       final SyncMultiProcedure<T> procedure) {\r
-               return syncRequest(request, new SyncToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> Collection<T> syncRequest(final AsyncMultiRead<T> request,\r
-                       final MultiProcedure<T> procedure) {\r
-               return syncRequest(request, new NoneToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(final ExternalRead<T> request)\r
-                       throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               return syncRequest(request, new Procedure<T>() {\r
-\r
-                       @Override\r
-                       public void execute(T t) {\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(Throwable t) {\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "syncRequest(AsyncRead) -> " + request;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(ExternalRead<T> request, Listener<T> procedure) throws DatabaseException {\r
-               return syncRequest(request, (Procedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       final public <T> T syncRequest(final ExternalRead<T> request,\r
-                       final Procedure<T> procedure) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               final DataContainer<Throwable> exception = new DataContainer<Throwable>();\r
-               final DataContainer<T> result = new DataContainer<T>();\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-                       \r
-                       processor.query(this, request, parent, new Procedure<T>() {\r
-\r
-                               @Override\r
-                               public void exception(Throwable throwable) {\r
-                                       exception.set(throwable);\r
-                                       procedure.exception(throwable);\r
-                               }\r
-\r
-                               @Override\r
-                               public void execute(T t) {\r
-                                       result.set(t);\r
-                                       procedure.execute(t);\r
-                               }\r
-\r
-                       }, listener);\r
-\r
-//                     newGraph.waitAsync(request);\r
-\r
-               } else {\r
-\r
-                       try {\r
-\r
-                               T t = processor.tryQuery(this, request);\r
-                               result.set(t);\r
-                               procedure.execute(t);\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                           if (t instanceof DatabaseException) {\r
-                               exception.set((DatabaseException)t);\r
-                               procedure.exception(exception.get());\r
-                           } else {\r
-                               exception.set(new DatabaseException(\r
-                                       "Unexpected exception in ReadGraph.syncRequest(Read)",\r
-                                       t));\r
-                               procedure.exception(exception.get());\r
-                           }\r
-\r
-                       }\r
-\r
-               }\r
-\r
-               Throwable t = exception.get();\r
-               if (t != null) {\r
-                       if (t instanceof DatabaseException)\r
-                               throw (DatabaseException) t;\r
-                       else\r
-                               throw new DatabaseException(\r
-                                               "Unexpected exception in ReadGraph.syncRequest(Read)",\r
-                                               t);\r
-               }\r
-\r
-               return result.get();            \r
-\r
-       }\r
-\r
-       @Override\r
-       public void syncRequest(final Write request) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               throw new DatabaseException(\r
-                               "Write operations are not supported during read transactions!");\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(final WriteResult<T> request) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               throw new DatabaseException(\r
-                               "Write operations are not supported during read transactions!");\r
-\r
-       }\r
-\r
-       @Override\r
-       public void syncRequest(final DelayedWrite request)\r
-                       throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               throw new DatabaseException(\r
-                               "Write operations are not supported during read transactions!");\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(final DelayedWriteResult<T> request) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               throw new DatabaseException(\r
-                               "Write operations are not supported during read transactions!");\r
-\r
-       }\r
-       \r
-       @Override\r
-       public void syncRequest(final WriteOnly request) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               throw new DatabaseException(\r
-                               "Write operations are not supported during read transactions!");\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> T syncRequest(final WriteOnlyResult<T> request) throws DatabaseException {\r
-\r
-               assert (request != null);\r
-\r
-               throw new DatabaseException(\r
-                               "Write operations are not supported during read transactions!");\r
-\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(ReadInterface<T> r, AsyncProcedure<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(ReadInterface<T> r, Procedure<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(ReadInterface<T> r, SyncProcedure<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(ReadInterface<T> r, AsyncListener<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(ReadInterface<T> r, Listener<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(ReadInterface<T> r, SyncListener<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> T sync(ReadInterface<T> r) throws DatabaseException {\r
-               return r.request(this);\r
-       }\r
-       \r
-       @Override\r
-       public <T> T sync(WriteInterface<T> r) throws DatabaseException {\r
-               return r.request(this);\r
-       }\r
-       \r
-       @Override\r
-       public <T> void async(WriteInterface<T> r, Procedure<T> procedure) {\r
-               r.request(this, procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> void async(WriteInterface<T> r) {\r
-               r.request(this, new ProcedureAdapter<T>());\r
-       }\r
-\r
-       /*\r
-        * Implementation of the interface AsyncReadGraph\r
-        */\r
-\r
-       @Override\r
-       public void forURI(Resource resource, AsyncListener<String> listener) {\r
-               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public void forURI(Resource resource, SyncListener<String> listener) {\r
-               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public void forURI(Resource resource, Listener<String> listener) {\r
-               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forURI(final Resource resource,\r
-                       final AsyncProcedure<String> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (procedure != null);\r
-\r
-               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),\r
-                               procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forURI(Resource resource, SyncProcedure<String> procedure) {\r
-               forURI(resource, new SyncToAsyncProcedure<String>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forURI(Resource resource, Procedure<String> procedure) {\r
-               forURI(resource, new NoneToAsyncProcedure<String>(procedure));\r
-       }\r
-       \r
-       @Override\r
-       public void forResource(String id, AsyncListener<Resource> listener) {\r
-               asyncRequest(new org.simantics.db.common.primitiverequest.Resource(id),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public void forResource(String id, SyncListener<Resource> listener) {\r
-               asyncRequest(new org.simantics.db.common.primitiverequest.Resource(id),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public void forResource(String id, Listener<Resource> listener) {\r
-               asyncRequest(new org.simantics.db.common.primitiverequest.Resource(id),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forResource(final String id,\r
-                       final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (id != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forResource(this, id, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forResource(String id, SyncProcedure<Resource> procedure) {\r
-               forResource(id, new SyncToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forResource(String id, Procedure<Resource> procedure) {\r
-               forResource(id, new NoneToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forBuiltin(String id, AsyncListener<Resource> listener) {\r
-               asyncRequest(new Builtin(id), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forBuiltin(String id, SyncListener<Resource> listener) {\r
-               asyncRequest(new Builtin(id), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forBuiltin(String id, Listener<Resource> listener) {\r
-               asyncRequest(new Builtin(id), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forBuiltin(final String id,\r
-                       final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (id != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forBuiltin(this, id, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forBuiltin(String id, SyncProcedure<Resource> procedure) {\r
-               forBuiltin(id, new SyncToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forBuiltin(String id, Procedure<Resource> procedure) {\r
-               forBuiltin(id, new NoneToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public void forEachStatement(Resource subject, Resource relation,\r
-                       AsyncMultiProcedure<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachStatement(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forEachStatement(Resource subject, Resource relation,\r
-                       SyncMultiProcedure<Statement> procedure) {\r
-               forEachStatement(subject, relation,\r
-                               new SyncToAsyncMultiProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public void forEachStatement(Resource subject, Resource relation,\r
-                       MultiProcedure<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachStatement(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forStatementSet(Resource subject, Resource relation,\r
-                       AsyncSetListener<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forStatementSet(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forStatementSet(Resource subject, Resource relation,\r
-                       SyncSetListener<Statement> procedure) {\r
-               forStatementSet(subject, relation,\r
-                               new SyncToAsyncSetProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forStatementSet(Resource subject, Resource relation,\r
-                       SetListener<Statement> listener) {\r
-               forStatementSet(subject, relation,\r
-                               new NoneToAsyncSetProcedure<Statement>(listener));\r
-       }\r
-\r
-       @Override\r
-       final public void forEachAssertedStatement(final Resource subject,\r
-                       final Resource relation,\r
-                       final AsyncMultiProcedure<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachAssertedStatement(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forEachAssertedStatement(Resource subject, Resource relation,\r
-                       SyncMultiProcedure<Statement> procedure) {\r
-               forEachAssertedStatement(subject, relation,\r
-                               new SyncToAsyncMultiProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forEachAssertedStatement(Resource subject, Resource relation,\r
-                       MultiProcedure<Statement> procedure) {\r
-               forEachAssertedStatement(subject, relation,\r
-                               new NoneToAsyncMultiProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forAssertedStatementSet(Resource subject, Resource relation,\r
-                       AsyncSetListener<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forAssertedStatementSet(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forAssertedStatementSet(Resource subject, Resource relation,\r
-                       SyncSetListener<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forAssertedStatementSet(subject, relation,\r
-                               new SyncToAsyncSetProcedure<Statement>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forAssertedStatementSet(Resource subject, Resource relation,\r
-                       SetListener<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forAssertedStatementSet(subject, relation,\r
-                               new NoneToAsyncSetProcedure<Statement>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forEachPredicate(final Resource subject,\r
-                       final AsyncMultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachPredicate(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forEachPredicate(Resource subject,\r
-                       SyncMultiProcedure<Resource> procedure) {\r
-               forEachPredicate(subject, new SyncToAsyncMultiProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       final public void forEachPredicate(final Resource subject,\r
-                       final MultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachPredicate(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forPredicateSet(final Resource subject,\r
-                       final AsyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forPredicateSet(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forPredicateSet(final Resource subject,\r
-                       final SyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               forPredicateSet(subject, new SyncToAsyncSetProcedure<Resource>(\r
-                               procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forPredicateSet(final Resource subject,\r
-                       final SetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               forPredicateSet(subject, new NoneToAsyncSetProcedure<Resource>(\r
-                               procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forEachPrincipalType(final Resource subject,\r
-                       final AsyncMultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachPrincipalType(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forEachPrincipalType(Resource subject,\r
-                       SyncMultiProcedure<Resource> procedure) {\r
-               forEachPrincipalType(subject, new SyncToAsyncMultiProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       final public void forEachPrincipalType(final Resource subject,\r
-                       final MultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachPrincipalType(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forPrincipalTypeSet(final Resource subject,\r
-                       final AsyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forPrincipalTypeSet(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forPrincipalTypeSet(final Resource subject,\r
-                       final SyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               forPrincipalTypeSet(subject, new SyncToAsyncSetProcedure<Resource>(\r
-                               procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forPrincipalTypeSet(final Resource subject,\r
-                       final SetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               forPrincipalTypeSet(subject, new NoneToAsyncSetProcedure<Resource>(\r
-                               procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forTypes(Resource subject, AsyncListener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forTypes(Resource subject, SyncListener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forTypes(Resource subject, Listener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forTypes(final Resource subject,\r
-                       final AsyncProcedure<Set<Resource>> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forTypes(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forTypes(Resource subject,\r
-                       SyncProcedure<Set<Resource>> procedure) {\r
-               forTypes(subject, new SyncToAsyncProcedure<Set<Resource>>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forTypes(Resource subject, Procedure<Set<Resource>> procedure) {\r
-               forTypes(subject, new NoneToAsyncProcedure<Set<Resource>>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSupertypes(Resource subject,\r
-                       AsyncListener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSupertypes(Resource subject,\r
-                       SyncListener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSupertypes(Resource subject, Listener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forSupertypes(final Resource subject,\r
-                       final AsyncProcedure<Set<Resource>> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forSupertypes(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forSupertypes(Resource subject,\r
-                       SyncProcedure<Set<Resource>> procedure) {\r
-               forSupertypes(subject, new SyncToAsyncProcedure<Set<Resource>>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSupertypes(Resource subject,\r
-                       Procedure<Set<Resource>> procedure) {\r
-               forSupertypes(subject, new NoneToAsyncProcedure<Set<Resource>>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forDirectSuperrelations(Resource subject,\r
-                       AsyncMultiProcedure<Resource> procedure) {\r
-               \r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forDirectSuperrelations(this, subject, procedure);\r
-               \r
-       }\r
-\r
-       @Override\r
-       public void forPossibleSuperrelation(Resource subject, AsyncProcedure<Resource> procedure) {\r
-               \r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forPossibleSuperrelation(this, subject, procedure);\r
-               \r
-       }\r
-\r
-       @Override\r
-       public void forSuperrelations(Resource subject,\r
-                       AsyncListener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSuperrelations(Resource subject,\r
-                       SyncListener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSuperrelations(Resource subject,\r
-                       Listener<Set<Resource>> listener) {\r
-               asyncRequest(new Types(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forSuperrelations(final Resource subject,\r
-                       final AsyncProcedure<Set<Resource>> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forSuperrelations(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forSuperrelations(Resource subject,\r
-                       SyncProcedure<Set<Resource>> procedure) {\r
-               forSuperrelations(subject, new SyncToAsyncProcedure<Set<Resource>>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSuperrelations(Resource subject,\r
-                       Procedure<Set<Resource>> procedure) {\r
-               forSuperrelations(subject, new NoneToAsyncProcedure<Set<Resource>>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       final public void forEachObject(final Resource subject, final Resource relation, final AsyncMultiProcedure<Resource> procedure) {\r
-               processor.forEachObject(this, subject, relation, procedure);\r
-       }\r
-\r
-       @Override\r
-       public void forEachObject(Resource subject, Resource relation,\r
-                       SyncMultiProcedure<Resource> procedure) {\r
-               forEachObject(subject, relation,\r
-                               new SyncToAsyncMultiProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forEachObject(Resource subject, Resource relation,\r
-                       MultiProcedure<Resource> procedure) {\r
-\r
-               processor.forEachObject(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-//     @Override\r
-//     final public void forEachDirectObject(final Resource subject,\r
-//                     final Resource relation,\r
-//                     final AsyncMultiProcedure<Resource> procedure) {\r
-//\r
-//             processor.forEachDirectObject(this, subject, relation, procedure);\r
-//\r
-//     }\r
-//\r
-//     @Override\r
-//     public void forEachDirectObject(Resource subject, Resource relation,\r
-//                     SyncMultiProcedure<Resource> procedure) {\r
-//             forEachDirectObject(subject, relation,\r
-//                             new SyncToAsyncMultiProcedure<Resource>(procedure));\r
-//     }\r
-//\r
-//     @Override\r
-//     public void forEachDirectObject(Resource subject, Resource relation,\r
-//                     MultiProcedure<Resource> procedure) {\r
-//             forEachDirectObject(subject, relation,\r
-//                             new NoneToAsyncMultiProcedure<Resource>(procedure));\r
-//     }\r
-       \r
-       @Override\r
-       final public void forEachDirectPredicate(final Resource subject, final AsyncMultiProcedure<Resource> procedure) {\r
-               processor.forEachDirectPredicate(this, subject, procedure);\r
-       }\r
-\r
-       @Override\r
-       public void forEachDirectPredicate(Resource subject, SyncMultiProcedure<Resource> procedure) {\r
-               forEachDirectPredicate(subject, new SyncToAsyncMultiProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forEachDirectPredicate(Resource subject, MultiProcedure<Resource> procedure) {\r
-               forEachDirectPredicate(subject, new NoneToAsyncMultiProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public void forObjectSet(final Resource subject,\r
-                       final Resource relation, final AsyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forObjectSet(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forObjectSet(final Resource subject,\r
-                       final Resource relation, final SyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forObjectSet(subject, relation, new SyncToAsyncSetProcedure<Resource>(\r
-                               procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forObjectSet(final Resource subject,\r
-                       final Resource relation, final SetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forObjectSet(subject, relation, new NoneToAsyncSetProcedure<Resource>(\r
-                               procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       final public void forEachAssertedObject(final Resource subject,\r
-                       final Resource relation,\r
-                       final AsyncMultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachAssertedObject(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forEachAssertedObject(Resource subject, Resource relation,\r
-                       SyncMultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forEachAssertedObject(subject, relation,\r
-                               new SyncToAsyncMultiProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forEachAssertedObject(Resource subject, Resource relation,\r
-                       MultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forEachAssertedObject(subject, relation,\r
-                               new NoneToAsyncMultiProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forAssertedObjectSet(Resource subject, Resource relation,\r
-                       AsyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forAssertedObjectSet(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forAssertedObjectSet(Resource subject, Resource relation,\r
-                       SyncSetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forAssertedObjectSet(subject, relation,\r
-                               new SyncToAsyncSetProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forAssertedObjectSet(Resource subject, Resource relation,\r
-                       SetListener<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               forAssertedObjectSet(subject, relation,\r
-                               new NoneToAsyncSetProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forInverse(Resource relation, AsyncListener<Resource> listener) {\r
-               asyncRequest(new Inverse(relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forInverse(Resource relation, SyncListener<Resource> listener) {\r
-               asyncRequest(new Inverse(relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forInverse(Resource relation, Listener<Resource> listener) {\r
-               asyncRequest(new Inverse(relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forInverse(final Resource relation,\r
-                       final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forInverse(this, relation, new AsyncProcedure<Resource>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, Resource result) {\r
-                               if (result != null)\r
-                                       procedure.execute(graph, result);\r
-                               else {\r
-                                       procedure.exception(graph, new NoInverseException(relation\r
-                                                       .toString()));\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable throwable) {\r
-                               procedure.exception(graph, throwable);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forInverse -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forInverse(Resource relation, SyncProcedure<Resource> procedure) {\r
-               forInverse(relation, new SyncToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forInverse(Resource relation, Procedure<Resource> procedure) {\r
-               forInverse(relation, new NoneToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleObject(Resource subject, Resource relation,\r
-                       AsyncListener<Resource> listener) {\r
-               asyncRequest(new SingleObject(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleObject(Resource subject, Resource relation,\r
-                       SyncListener<Resource> listener) {\r
-               asyncRequest(new SingleObject(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleObject(Resource subject, Resource relation,\r
-                       Listener<Resource> listener) {\r
-               asyncRequest(new SingleObject(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forSingleObject(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachObject(this, subject, relation,\r
-                               new SingleOrErrorProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forSingleObject(Resource subject, Resource relation,\r
-                       SyncProcedure<Resource> procedure) {\r
-               forSingleObject(subject, relation, new SyncToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleObject(Resource subject, Resource relation,\r
-                       Procedure<Resource> procedure) {\r
-               forSingleObject(subject, relation, new NoneToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleStatement(Resource subject, Resource relation,\r
-                       AsyncListener<Statement> listener) {\r
-               asyncRequest(new SingleStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleStatement(Resource subject, Resource relation,\r
-                       SyncListener<Statement> listener) {\r
-               asyncRequest(new SingleStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleStatement(Resource subject, Resource relation,\r
-                       Listener<Statement> listener) {\r
-               asyncRequest(new SingleStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forSingleStatement(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachStatement(this, subject, relation,\r
-                               new SingleOrErrorProcedure<Statement>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forSingleStatement(Resource subject, Resource relation,\r
-                       SyncProcedure<Statement> procedure) {\r
-               forSingleStatement(subject, relation,\r
-                               new SyncToAsyncProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleStatement(Resource subject, Resource relation,\r
-                       Procedure<Statement> procedure) {\r
-               forSingleStatement(subject, relation,\r
-                               new NoneToAsyncProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject,\r
-                       AsyncListener<Resource> listener) {\r
-               asyncRequest(new SingleTypeAny(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject,\r
-                       SyncListener<Resource> listener) {\r
-               asyncRequest(new SingleTypeAny(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject,\r
-                       Listener<Resource> listener) {\r
-               asyncRequest(new SingleTypeAny(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forSingleType(final Resource subject, final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               final DeepSingleOrErrorProcedure<Resource> checkedProcedure = new DeepSingleOrErrorProcedure<Resource>(procedure);\r
-\r
-               processor.forEachPrincipalType(this, subject, new AsyncMultiProcedureAdapter<Resource>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, final Resource principalType) {\r
-                               checkedProcedure.offer(graph, principalType);\r
-                       }\r
-\r
-                       @Override\r
-                       public void finished(AsyncReadGraph graph) {\r
-                               checkedProcedure.dec(graph);\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               checkedProcedure.exception(graph, t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forSingleType -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, SyncProcedure<Resource> procedure) {\r
-               forSingleType(subject, new SyncToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, Procedure<Resource> procedure) {\r
-               forSingleType(subject, new NoneToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, Resource relation,\r
-                       AsyncListener<Resource> listener) {\r
-               asyncRequest(new SingleType(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, Resource relation,\r
-                       SyncListener<Resource> listener) {\r
-               asyncRequest(new SingleType(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, Resource relation,\r
-                       Listener<Resource> listener) {\r
-               asyncRequest(new SingleType(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forSingleType(final Resource subject,\r
-                       final Resource baseType, final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               final DeepSingleOrErrorProcedure<Resource> checkedProcedure = new DeepSingleOrErrorProcedure<Resource>(procedure);\r
-\r
-               processor.forEachPrincipalType(this, subject,\r
-                               new AsyncMultiProcedureAdapter<Resource>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph,\r
-                                                       final Resource principalType) {\r
-\r
-                                               checkedProcedure.inc();\r
-\r
-                                               if(baseType == null) {\r
-\r
-                                                       checkedProcedure.offer(graph, principalType);\r
-                                                       checkedProcedure.dec(graph);\r
-\r
-                                               } else if(principalType.equals(baseType)) {\r
-\r
-                                                       checkedProcedure.offer(graph, principalType);\r
-                                                       checkedProcedure.dec(graph);\r
-\r
-                                               } else {\r
-\r
-                                                       processor.forSupertypes((ReadGraphImpl)graph, principalType,\r
-                                                                       new AsyncProcedure<Set<Resource>>() {\r
-\r
-                                                                               @Override\r
-                                                                               public void execute(\r
-                                                                                               AsyncReadGraph graph,\r
-                                                                                               Set<Resource> result) {\r
-\r
-                                                                                       if (result.contains(baseType))\r
-                                                                                               checkedProcedure.offer(graph,\r
-                                                                                                               principalType);\r
-                                                                                       checkedProcedure.dec(graph);\r
-\r
-                                                                               }\r
-\r
-                                                                               @Override\r
-                                                                               public void exception(\r
-                                                                                               AsyncReadGraph graph,\r
-                                                                                               Throwable t) {\r
-                                                                                       checkedProcedure\r
-                                                                                                       .exception(graph, t);\r
-                                                                               }\r
-\r
-                                                                       });\r
-\r
-                                               }\r
-\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               checkedProcedure.exception(graph, t);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public String toString() {\r
-                                               return "forSingleType -> " + procedure;\r
-                                       }\r
-\r
-                               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, Resource relation,\r
-                       SyncProcedure<Resource> procedure) {\r
-               forSingleType(subject, relation, new SyncToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forSingleType(Resource subject, Resource relation,\r
-                       Procedure<Resource> procedure) {\r
-               forSingleType(subject, relation, new NoneToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Binding binding,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new Value<T>(subject, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Binding binding,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new Value<T>(subject, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Binding binding,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new Value<T>(subject, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(final Resource resource, final Binding binding,\r
-                       final AsyncProcedure<T> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (binding != null);\r
-               assert (procedure != null);\r
-               \r
-               processor.forValue(this, resource, new AsyncProcedure<byte[]>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, byte[] result) {\r
-                               \r
-                               try {\r
-\r
-                                       if (result == null) {\r
-                                               procedure.exception(graph,\r
-                                                               new DoesNotContainValueException(\r
-                                                                               "No value for resource " + resource));\r
-                                               return;\r
-                                       }\r
-\r
-                                       Serializer serializer = binding.serializer();\r
-//                                     Serializer serializer = Bindings.getSerializer( binding );\r
-                                       Object obj = serializer.deserialize(result);\r
-//                                     if (!binding.isInstance(obj))\r
-//                                             procedure.exception(graph, new ClassCastException(\r
-//                                                             "Cannot get value " + obj + " with binding "\r
-//                                                                             + binding));\r
-//                                     else\r
-                                               procedure.execute(graph, (T) obj);\r
-\r
-                               } catch (IOException e) {\r
-                                       procedure.exception(graph, e);\r
-                               } catch (BufferUnderflowException e) {\r
-                                       procedure.exception(graph, e);\r
-                               } catch (Throwable t) {\r
-                                       procedure.exception(graph, t);\r
-                               }\r
-\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               try {\r
-                                       procedure.exception(graph, t);\r
-                               } catch (Throwable t2) {\r
-                               Logger.defaultLogError(t2);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forValue -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Binding binding,\r
-                       SyncProcedure<T> procedure) {\r
-               forValue(subject, binding, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Binding binding,\r
-                       Procedure<T> procedure) {\r
-               forValue(subject, binding, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, AsyncListener<T> listener) {\r
-               asyncRequest(new ValueImplied<T>(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, SyncListener<T> listener) {\r
-               asyncRequest(new ValueImplied<T>(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Listener<T> listener) {\r
-               asyncRequest(new ValueImplied<T>(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forValue(final Resource subject, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-               \r
-               forRelatedValue(subject, processor.getL0(this).HasDataType, DATA_TYPE_BINDING_INTERNAL, new AsyncProcedure<Datatype>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, Datatype type) {\r
-                               // TODO: consider trying Bindings.getBeanBinding(type);\r
-                               Binding binding = Bindings.getBinding(type);\r
-                               graph.forValue(subject, binding, procedure);\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable throwable) {\r
-                               procedure.exception(graph, new DoesNotContainValueException("Invalid data type", throwable));\r
-                       }\r
-                       \r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, SyncProcedure<T> procedure) {\r
-               forValue(subject, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forValue(Resource subject, Procedure<T> procedure) {\r
-               forValue(subject, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new RelatedValueImplied<T>(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new RelatedValueImplied<T>(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new RelatedValueImplied<T>(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forRelatedValue(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               final DeepSingleOrErrorProcedure<T> checkedProcedure = new DeepSingleOrErrorProcedure<T>(procedure);\r
-\r
-               processor.forEachObject(this, subject, relation,\r
-                               new AsyncMultiProcedureAdapter<Resource>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph,\r
-                                                       final Resource object) {\r
-\r
-                                               checkedProcedure.inc();\r
-\r
-                                               graph.forValue(object, new AsyncProcedure<Object>() {\r
-\r
-                                                       @Override\r
-                                                       public void execute(AsyncReadGraph graph,\r
-                                                                       Object result) {\r
-                                                               checkedProcedure.offer(graph, (T) result);\r
-                                                               checkedProcedure.dec(graph);\r
-                                                       }\r
-\r
-                                                       @Override\r
-                                                       public void exception(AsyncReadGraph graph,\r
-                                                                       Throwable t) {\r
-                                                               checkedProcedure.exception(graph, t);\r
-                                                       }\r
-\r
-                                                       @Override\r
-                                                       public String toString() {\r
-                                                               return "forRelatedValue -> " + procedure;\r
-                                                       }\r
-\r
-                                               });\r
-\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               checkedProcedure.exception(graph, t);\r
-                                       }\r
-\r
-                               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       SyncProcedure<T> procedure) {\r
-               forRelatedValue(subject, relation, new SyncToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Procedure<T> procedure) {\r
-               forRelatedValue(subject, relation, new NoneToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Binding binding, AsyncListener<T> listener) {\r
-               asyncRequest(new RelatedValue<T>(subject, relation, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Binding binding, SyncListener<T> listener) {\r
-               asyncRequest(new RelatedValue<T>(subject, relation, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Binding binding, Listener<T> listener) {\r
-               asyncRequest(new RelatedValue<T>(subject, relation, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forRelatedValue(final Resource subject,\r
-                       final Resource relation, final Binding binding,\r
-                       final AsyncProcedure<T> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (binding != null);\r
-               assert (procedure != null);\r
-\r
-               final DeepSingleOrErrorProcedure<T> checkedProcedure = new DeepSingleOrErrorProcedure<T>(procedure);\r
-               \r
-               processor.forEachObject(this, subject, relation,\r
-                               new AsyncMultiProcedureAdapter<Resource>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph,\r
-                                                       final Resource object) {\r
-\r
-                                               checkedProcedure.inc();\r
-\r
-                                               graph.forValue(object, binding, new AsyncProcedure<Object>() {\r
-\r
-                                                                       @Override\r
-                                                                       public void execute(AsyncReadGraph graph,\r
-                                                                                       Object result) {\r
-                                                                               \r
-                                                                               checkedProcedure.offer(graph,\r
-                                                                                               (T) result);\r
-                                                                               checkedProcedure.dec(graph);\r
-                                                                       }\r
-\r
-                                                                       @Override\r
-                                                                       public void exception(AsyncReadGraph graph,\r
-                                                                                       Throwable t) {\r
-                                                                               checkedProcedure.exception(graph, t);\r
-                                                                       }\r
-\r
-                                                                       @Override\r
-                                                                       public String toString() {\r
-                                                                               return "forRelatedValue -> "\r
-                                                                                               + procedure;\r
-                                                                       }\r
-\r
-                                                               });\r
-\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               checkedProcedure.exception(graph, t);\r
-                                       }\r
-\r
-                               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Binding binding, SyncProcedure<T> procedure) {\r
-               forRelatedValue(subject, relation, binding,\r
-                               new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forRelatedValue(Resource subject, Resource relation,\r
-                       Binding binding, Procedure<T> procedure) {\r
-               forRelatedValue(subject, relation, binding,\r
-                               new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forAdapted(Resource resource, Class<T> clazz,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new Adapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forAdapted(Resource resource, Class<T> clazz,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new Adapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forAdapted(Resource resource, Class<T> clazz,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new Adapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forAdapted(final Resource resource,\r
-                       final Class<T> clazz, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-               assert (procedure != null);\r
-\r
-               final AdaptionService service = getSession().peekService(AdaptionService.class);\r
-               if (service == null)\r
-                       procedure.exception(this, new ServiceException("No AdaptionService available")); \r
-               else\r
-                       service.adapt(this, resource, resource, Resource.class, clazz, false, procedure); \r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forAdapted(Resource resource, Class<T> clazz,\r
-                       SyncProcedure<T> procedure) {\r
-               forAdapted(resource, clazz, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forAdapted(Resource resource, Class<T> clazz,\r
-                       Procedure<T> procedure) {\r
-               forAdapted(resource, clazz, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new UniqueAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new UniqueAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new UniqueAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forUniqueAdapted(final Resource resource,\r
-                       final Class<T> clazz, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-               assert (procedure != null);\r
-\r
-               final AdaptionService service = getSession().peekService(AdaptionService.class);\r
-               if (service == null)\r
-                       procedure.exception(this, new ServiceException("No AdaptionService available")); \r
-               else\r
-                       service.adaptNew(this, resource, clazz, false, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       SyncProcedure<T> procedure) {\r
-               forUniqueAdapted(resource, clazz,\r
-                               new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       Procedure<T> procedure) {\r
-               forUniqueAdapted(resource, clazz,\r
-                               new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleInverse(Resource subject,\r
-                       AsyncListener<Resource> listener) {\r
-               asyncRequest(new PossibleInverse(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleInverse(Resource subject,\r
-                       SyncListener<Resource> listener) {\r
-               asyncRequest(new PossibleInverse(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleInverse(Resource subject, Listener<Resource> listener) {\r
-               asyncRequest(new PossibleInverse(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forPossibleInverse(final Resource relation,\r
-                       final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forInverse(this, relation, new ExceptionToNullProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleInverse(Resource subject,\r
-                       SyncProcedure<Resource> procedure) {\r
-               forPossibleInverse(subject, new SyncToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleInverse(Resource subject,\r
-                       Procedure<Resource> procedure) {\r
-               forPossibleInverse(subject, new NoneToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleObject(Resource subject, Resource relation,\r
-                       AsyncListener<Resource> listener) {\r
-               asyncRequest(new PossibleObject(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleObject(Resource subject, Resource relation,\r
-                       SyncListener<Resource> listener) {\r
-               asyncRequest(new PossibleObject(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleObject(Resource subject, Resource relation,\r
-                       Listener<Resource> listener) {\r
-               asyncRequest(new PossibleObject(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forPossibleObject(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachObject(this, subject, relation,\r
-                               new SingleOrNullProcedure<Resource>(procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleObject(Resource subject, Resource relation,\r
-                       SyncProcedure<Resource> procedure) {\r
-               forPossibleObject(subject, relation,\r
-                               new SyncToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleObject(Resource subject, Resource relation,\r
-                       Procedure<Resource> procedure) {\r
-               forPossibleObject(subject, relation,\r
-                               new NoneToAsyncProcedure<Resource>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleStatement(Resource subject, Resource relation,\r
-                       AsyncListener<Statement> listener) {\r
-               asyncRequest(new PossibleStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleStatement(Resource subject, Resource relation,\r
-                       SyncListener<Statement> listener) {\r
-               asyncRequest(new PossibleStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleStatement(Resource subject, Resource relation,\r
-                       Listener<Statement> listener) {\r
-               asyncRequest(new PossibleStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forPossibleStatement(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<Statement> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forEachStatement(this, subject, relation,\r
-                               new SingleFunctionalOrNullProcedure<Statement>(\r
-                                               "forPossibleStatement", procedure));\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleStatement(Resource subject, Resource relation,\r
-                       SyncProcedure<Statement> procedure) {\r
-               forPossibleStatement(subject, relation,\r
-                               new SyncToAsyncProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleStatement(Resource subject, Resource relation,\r
-                       Procedure<Statement> procedure) {\r
-               forPossibleStatement(subject, relation,\r
-                               new NoneToAsyncProcedure<Statement>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleType(Resource subject, Resource relation,\r
-                       AsyncListener<Resource> listener) {\r
-               asyncRequest(new PossibleType(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleType(Resource subject, Resource relation,\r
-                       SyncListener<Resource> listener) {\r
-               asyncRequest(new PossibleType(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleType(Resource subject, Resource relation,\r
-                       Listener<Resource> listener) {\r
-               asyncRequest(new PossibleType(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forPossibleType(final Resource subject,\r
-                       final Resource baseType, final AsyncProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               final NullSingleOrNullProcedure<Resource> checkedProcedure = new NullSingleOrNullProcedure<Resource>(procedure);\r
-\r
-               processor.forEachPrincipalType(this, subject, new AsyncMultiProcedureAdapter<Resource>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph,\r
-                                                       final Resource principalType) {\r
-\r
-                                               if (baseType == null) {\r
-\r
-                                                       checkedProcedure.offer(graph, principalType);\r
-\r
-                                               } else if (principalType.equals(baseType)) {\r
-\r
-                                                       checkedProcedure.offer(graph, principalType);\r
-\r
-                                               } else {\r
-\r
-                                                       checkedProcedure.inc();\r
-\r
-                                                       processor.forSupertypes((ReadGraphImpl)graph, principalType,\r
-                                                                       new AsyncProcedure<Set<Resource>>() {\r
-\r
-                                                                               @Override\r
-                                                                               public void execute(\r
-                                                                                               AsyncReadGraph graph,\r
-                                                                                               Set<Resource> result) {\r
-\r
-                                                                                       if (result.contains(baseType)) {\r
-                                                                                               checkedProcedure.offer(graph,\r
-                                                                                                               principalType);\r
-                                                                                       }\r
-\r
-                                                                                       checkedProcedure.dec(graph);\r
-\r
-                                                                               }\r
-\r
-                                                                               @Override\r
-                                                                               public void exception(\r
-                                                                                               AsyncReadGraph graph,\r
-                                                                                               Throwable t) {\r
-                                                                                       checkedProcedure.exception(graph, t);\r
-                                                                                       checkedProcedure.dec(graph);\r
-                                                                               }\r
-\r
-                                                                               @Override\r
-                                                                               public String toString() {\r
-                                                                                       return "forPossibleType -> "\r
-                                                                                                       + procedure;\r
-                                                                               }\r
-\r
-                                                                       });\r
-\r
-                                               }\r
-\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               checkedProcedure.exception(graph, t);\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleType(Resource subject, Resource relation,\r
-                       SyncProcedure<Resource> procedure) {\r
-               forPossibleType(subject, relation, new SyncToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forPossibleType(Resource subject, Resource relation,\r
-                       Procedure<Resource> procedure) {\r
-               forPossibleType(subject, relation, new NoneToAsyncProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, AsyncListener<T> listener) {\r
-               asyncRequest(new PossibleValueImplied<T>(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, SyncListener<T> listener) {\r
-               asyncRequest(new PossibleValueImplied<T>(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Listener<T> listener) {\r
-               asyncRequest(new PossibleValueImplied<T>(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forPossibleValue(final Resource subject,\r
-                       final AsyncProcedure<T> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-               \r
-               forPossibleRelatedValue(subject, processor.getL0(this).HasDataType, DATA_TYPE_BINDING_INTERNAL, new AsyncProcedure<Datatype>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, final Datatype type) {\r
-                               if (type == null) {\r
-                                       procedure.execute(graph, null);\r
-                               } else {\r
-                                       try {\r
-                                               // TODO: consider trying Bindings.getBeanBinding(type);\r
-                                               Binding binding = Bindings.getBinding(type);\r
-                                               graph.forPossibleValue(subject, binding, procedure);\r
-                                       } catch (RuntimeBindingConstructionException e) {\r
-                                               procedure.exception(graph, e);\r
-                                       }\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               procedure.exception(graph, t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forPossibleValue -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject,\r
-                       SyncProcedure<T> procedure) {\r
-               forPossibleValue(subject, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Procedure<T> procedure) {\r
-               forPossibleValue(subject, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Binding binding,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new PossibleValue<T>(subject, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Binding binding,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new PossibleValue<T>(subject, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Binding binding,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new PossibleValue<T>(subject, binding), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forPossibleValue(final Resource resource,\r
-                       final Binding binding, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (binding != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forValue(this, resource, new AsyncProcedure<byte[]>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, byte[] result) {\r
-\r
-                               try {\r
-\r
-                                       if (result == null) {\r
-                                               procedure.execute(graph, null);\r
-                                               return;\r
-                                       }\r
-\r
-                                       Serializer serializer = Bindings.getSerializer( binding );\r
-                                       Object obj = serializer.deserialize(result);\r
-                                       if (!binding.isInstance(obj))\r
-                                               procedure.exception(graph, new ClassCastException(\r
-                                                               "Cannot get value " + obj + " with binding "\r
-                                                                               + binding));\r
-                                       else\r
-                                               procedure.execute(graph, (T) obj);\r
-\r
-                               } catch (IOException e) {\r
-                                       procedure.exception(graph, e);\r
-                               } catch (BufferUnderflowException e) {\r
-                                       procedure.exception(graph, e);\r
-                               } catch (Throwable t) {\r
-                                       procedure.exception(graph, t);\r
-                               }\r
-\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               try {\r
-                                       procedure.exception(graph, t);\r
-                               } catch (Throwable t2) {\r
-                               Logger.defaultLogError(t2);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forPossibleValue -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Binding binding,\r
-                       SyncProcedure<T> procedure) {\r
-               forPossibleValue(subject, binding, new SyncToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleValue(Resource subject, Binding binding,\r
-                       Procedure<T> procedure) {\r
-               forPossibleValue(subject, binding, new NoneToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, AsyncListener<T> listener) {\r
-               asyncRequest(new PossibleRelatedValueImplied<T>(subject, relation),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, SyncListener<T> listener) {\r
-               asyncRequest(new PossibleRelatedValueImplied<T>(subject, relation),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Listener<T> listener) {\r
-               asyncRequest(new PossibleRelatedValueImplied<T>(subject, relation),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forPossibleRelatedValue(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               final DeepSingleOrNullProcedure<T> checkedProcedure = new DeepSingleOrNullProcedure<T>(procedure);\r
-               \r
-               processor.forEachObject(this, subject, relation,\r
-                               new AsyncMultiProcedureAdapter<Resource>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph,\r
-                                                       final Resource object) {\r
-\r
-                                               checkedProcedure.inc();\r
-\r
-                                               graph.forValue(object, new AsyncProcedure<Object>() {\r
-\r
-                                                       @Override\r
-                                                       public void execute(AsyncReadGraph graph,\r
-                                                                       Object result) {\r
-                                                               checkedProcedure.offer(graph, (T) result);\r
-                                                               checkedProcedure.dec(graph);\r
-                                                       }\r
-\r
-                                                       @Override\r
-                                                       public void exception(AsyncReadGraph graph,\r
-                                                                       Throwable t) {\r
-                                                               checkedProcedure.exception(graph, t);\r
-                                                               checkedProcedure.dec(graph);\r
-                                                       }\r
-\r
-                                               });\r
-\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               checkedProcedure.exception(graph, t);\r
-                                               checkedProcedure.dec(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public String toString() {\r
-                                               return "forPossibleRelatedValue -> " + procedure;\r
-                                       }\r
-                               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, SyncProcedure<T> procedure) {\r
-               forPossibleRelatedValue(subject, relation, new SyncToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Procedure<T> procedure) {\r
-               forPossibleRelatedValue(subject, relation, new NoneToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Binding binding, AsyncListener<T> listener) {\r
-               asyncRequest(new PossibleRelatedValue<T>(subject, relation, binding),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Binding binding, SyncListener<T> listener) {\r
-               asyncRequest(new PossibleRelatedValue<T>(subject, relation, binding),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Binding binding, Listener<T> listener) {\r
-               asyncRequest(new PossibleRelatedValue<T>(subject, relation, binding),\r
-                               listener);\r
-       }\r
-\r
-//     @Override\r
-//     final public <T> void forPossibleRelatedValue(final Resource subject, final Resource relation, final Binding binding,\r
-//                     final AsyncProcedure<T> procedure) {\r
-//             \r
-//             forPossibleRelatedValue(subject, relation, binding, procedure, false);\r
-//             \r
-//     }\r
-\r
-       final public <T> void forPossibleRelatedValue(final Resource subject, final Resource relation, final Binding binding,\r
-                       final AsyncProcedure<T> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forPossibleObject(this, subject, relation, new AsyncProcedure<Resource>() {\r
-                       \r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, Resource object) {\r
-                               \r
-                               if(object == null) {\r
-                                       procedure.execute(graph, null);\r
-                                       return;\r
-                               }\r
-\r
-                               processor.forPossibleValue((ReadGraphImpl)graph, object, new AsyncProcedure<byte[]>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph, byte[] bytes) {\r
-\r
-                                               if(bytes != null) {\r
-\r
-                                                       try {\r
-                                                       \r
-                                                               Serializer serializer = binding.serializer();\r
-                                                               Object obj = serializer.deserialize(bytes);\r
-                                                               if (!binding.isInstance(obj)) {\r
-                                                                       procedure.exception(graph, new ClassCastException("Cannot get value " + obj + " with binding " + binding));\r
-                                                               } else {\r
-                                                                       procedure.execute(graph, (T) obj);\r
-                                                               }\r
-\r
-                                                       } catch (Throwable t) {\r
-                                                               \r
-                                                               procedure.exception(graph, t);\r
-                                                               \r
-                                                       }\r
-                                                       \r
-                                               } else {\r
-                                                       \r
-                                                       procedure.execute(graph, null);\r
-                                                       \r
-                                               }\r
-                                               \r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               procedure.exception(graph, t);\r
-                                       }\r
-\r
-                               });\r
-                               \r
-                       }\r
-                       \r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable throwable) {\r
-                               throwable.printStackTrace();\r
-                               procedure.exception(graph, throwable);\r
-                       }\r
-                       \r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Binding binding, SyncProcedure<T> procedure) {\r
-               forPossibleRelatedValue(subject, relation, binding,\r
-                               new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleRelatedValue(Resource subject,\r
-                       Resource relation, Binding binding, Procedure<T> procedure) {\r
-               forPossibleRelatedValue(subject, relation, binding,\r
-                               new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forIsInstanceOf(Resource subject, Resource relation,\r
-                       AsyncListener<Boolean> listener) {\r
-               asyncRequest(new IsInstanceOf(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forIsInstanceOf(Resource subject, Resource relation,\r
-                       SyncListener<Boolean> listener) {\r
-               asyncRequest(new IsInstanceOf(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forIsInstanceOf(Resource subject, Resource relation,\r
-                       Listener<Boolean> listener) {\r
-               asyncRequest(new IsInstanceOf(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forIsInstanceOf(final Resource resource,\r
-                       final Resource type, final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (type != null);\r
-               assert (procedure != null);\r
-\r
-               forTypes(resource, new AsyncProcedure<Set<Resource>>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, Set<Resource> result) {\r
-                               \r
-                               try {\r
-                                       if (result.contains(type))\r
-                                               procedure.execute(graph, true);\r
-                                       else\r
-                                               procedure.execute(graph, false);\r
-                               } catch (Throwable t) {\r
-                               Logger.defaultLogError(t);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               try {\r
-                                       procedure.exception(graph, t);\r
-                               } catch (Throwable t2) {\r
-                               Logger.defaultLogError(t2);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forIsInstanceOf -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forIsInstanceOf(Resource subject, Resource relation,\r
-                       SyncProcedure<Boolean> procedure) {\r
-               forIsInstanceOf(subject, relation, new SyncToAsyncProcedure<Boolean>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forIsInstanceOf(Resource subject, Resource relation,\r
-                       Procedure<Boolean> procedure) {\r
-               forIsInstanceOf(subject, relation, new NoneToAsyncProcedure<Boolean>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forIsInheritedFrom(Resource subject, Resource relation,\r
-                       AsyncListener<Boolean> listener) {\r
-               asyncRequest(new IsInheritedFrom(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forIsInheritedFrom(Resource subject, Resource relation,\r
-                       SyncListener<Boolean> listener) {\r
-               asyncRequest(new IsInheritedFrom(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forIsInheritedFrom(Resource subject, Resource relation,\r
-                       Listener<Boolean> listener) {\r
-               asyncRequest(new IsInheritedFrom(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forIsInheritedFrom(final Resource resource,\r
-                       final Resource type, final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (type != null);\r
-               assert (procedure != null);\r
-\r
-               if (resource.equals(type)) {\r
-                       try {\r
-                               procedure.execute(this, true);\r
-                       } catch (Throwable t) {\r
-                       Logger.defaultLogError(t);\r
-                       }\r
-                       return;\r
-               }\r
-\r
-               forSupertypes(resource, new AsyncProcedure<Set<Resource>>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, Set<Resource> result) {\r
-                               try {\r
-                                       if (result.contains(type))\r
-                                               procedure.execute(graph, true);\r
-                                       else\r
-                                               procedure.execute(graph, false);\r
-                               } catch (Throwable t) {\r
-                               Logger.defaultLogError(t);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               try {\r
-                                       procedure.exception(graph, t);\r
-                               } catch (Throwable t2) {\r
-                               Logger.defaultLogError(t2);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forIsInheritedFrom -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forIsInheritedFrom(Resource subject, Resource relation,\r
-                       SyncProcedure<Boolean> procedure) {\r
-               forIsInheritedFrom(subject, relation,\r
-                               new SyncToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forIsInheritedFrom(Resource subject, Resource relation,\r
-                       Procedure<Boolean> procedure) {\r
-               forIsInheritedFrom(subject, relation,\r
-                               new NoneToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forIsSubrelationOf(Resource subject, Resource relation,\r
-                       AsyncListener<Boolean> listener) {\r
-               asyncRequest(new IsSubrelationOf(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forIsSubrelationOf(Resource subject, Resource relation,\r
-                       SyncListener<Boolean> listener) {\r
-               asyncRequest(new IsSubrelationOf(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forIsSubrelationOf(Resource subject, Resource relation,\r
-                       Listener<Boolean> listener) {\r
-               asyncRequest(new IsSubrelationOf(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forIsSubrelationOf(final Resource resource,\r
-                       final Resource relation, final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               if (resource.equals(relation)) {\r
-                       procedure.execute(this, true);\r
-                       return;\r
-               }\r
-\r
-               forSuperrelations(resource, new AsyncProcedure<Set<Resource>>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, Set<Resource> result) {\r
-                               try {\r
-                                       if (result.contains(relation))\r
-                                               procedure.execute(graph, true);\r
-                                       else\r
-                                               procedure.execute(graph, false);\r
-                               } catch (Throwable t) {\r
-                               Logger.defaultLogError(t);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               try {\r
-                                       procedure.exception(graph, t);\r
-                               } catch (Throwable t2) {\r
-                               Logger.defaultLogError(t2);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forIsSubrelationOf -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forIsSubrelationOf(Resource subject, Resource relation,\r
-                       SyncProcedure<Boolean> procedure) {\r
-               forIsSubrelationOf(subject, relation,\r
-                               new SyncToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forIsSubrelationOf(Resource subject, Resource relation,\r
-                       Procedure<Boolean> procedure) {\r
-               forIsSubrelationOf(subject, relation,\r
-                               new NoneToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject,\r
-                       AsyncListener<Boolean> listener) {\r
-               asyncRequest(new HasStatementSubject(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, SyncListener<Boolean> listener) {\r
-               asyncRequest(new HasStatementSubject(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Listener<Boolean> listener) {\r
-               asyncRequest(new HasStatementSubject(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forHasStatement(final Resource subject,\r
-                       final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forHasStatement(this, subject, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject,\r
-                       SyncProcedure<Boolean> procedure) {\r
-               forHasStatement(subject, new SyncToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Procedure<Boolean> procedure) {\r
-               forHasStatement(subject, new NoneToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       AsyncListener<Boolean> listener) {\r
-               asyncRequest(new HasStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       SyncListener<Boolean> listener) {\r
-               asyncRequest(new HasStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Listener<Boolean> listener) {\r
-               asyncRequest(new HasStatement(subject, relation), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forHasStatement(final Resource subject,\r
-                       final Resource relation, final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forHasStatement(this, subject, relation, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       SyncProcedure<Boolean> procedure) {\r
-               forHasStatement(subject, relation, new SyncToAsyncProcedure<Boolean>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Procedure<Boolean> procedure) {\r
-               forHasStatement(subject, relation, new NoneToAsyncProcedure<Boolean>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Resource object, AsyncListener<Boolean> listener) {\r
-               asyncRequest(new HasStatementSubjectObject(subject, relation, object),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Resource object, SyncListener<Boolean> listener) {\r
-               asyncRequest(new HasStatementSubjectObject(subject, relation, object),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Resource object, Listener<Boolean> listener) {\r
-               asyncRequest(new HasStatementSubjectObject(subject, relation, object),\r
-                               listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forHasStatement(final Resource subject,\r
-                       final Resource relation, final Resource object,\r
-                       final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (relation != null);\r
-               assert (object != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forHasStatement(this, subject, relation, object, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Resource object, SyncProcedure<Boolean> procedure) {\r
-               forHasStatement(subject, relation, object,\r
-                               new SyncToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasStatement(Resource subject, Resource relation,\r
-                       Resource object, Procedure<Boolean> procedure) {\r
-               forHasStatement(subject, relation, object,\r
-                               new NoneToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasValue(Resource subject, AsyncListener<Boolean> listener) {\r
-               asyncRequest(new HasValue(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasValue(Resource subject, SyncListener<Boolean> listener) {\r
-               asyncRequest(new HasValue(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forHasValue(Resource subject, Listener<Boolean> listener) {\r
-               asyncRequest(new HasValue(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forHasValue(final Resource subject,\r
-                       final AsyncProcedure<Boolean> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forValue(this, subject, new AsyncProcedure<byte[]>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, byte[] result) {\r
-                               try {\r
-                                       if (result == null)\r
-                                               procedure.execute(graph, false);\r
-                                       else\r
-                                               procedure.execute(graph, true);\r
-                               } catch (Throwable t) {\r
-                               Logger.defaultLogError(t);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               try {\r
-                                       procedure.exception(graph, t);\r
-                               } catch (Throwable t2) {\r
-                               Logger.defaultLogError(t2);\r
-                               }\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "forHasValue -> " + procedure;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forHasValue(Resource subject, SyncProcedure<Boolean> procedure) {\r
-               forHasValue(subject, new SyncToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forHasValue(Resource subject, Procedure<Boolean> procedure) {\r
-               forHasValue(subject, new NoneToAsyncProcedure<Boolean>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forOrderedSet(Resource subject,\r
-                       AsyncMultiListener<Resource> listener) {\r
-               asyncRequest(new OrderedSet(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forOrderedSet(Resource subject,\r
-                       SyncMultiListener<Resource> listener) {\r
-               asyncRequest(new OrderedSet(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       public void forOrderedSet(Resource subject, MultiListener<Resource> listener) {\r
-               asyncRequest(new OrderedSet(subject), listener);\r
-       }\r
-\r
-       @Override\r
-       final public void forOrderedSet(final Resource subject,\r
-                       final AsyncMultiProcedure<Resource> procedure) {\r
-\r
-               assert (subject != null);\r
-               assert (procedure != null);\r
-\r
-               processor.forOrderedSet(this, subject,\r
-                               new AsyncMultiProcedure<Resource>() {\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               try {\r
-                                                       procedure.finished(graph);\r
-                                               } catch (Throwable t) {\r
-                                               Logger.defaultLogError(t);\r
-                                               }\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph, Resource result) {\r
-                                               try {\r
-                                                       procedure.execute(graph, result);\r
-                                               } catch (Throwable t) {\r
-                                               Logger.defaultLogError(t);\r
-                                               }\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               try {\r
-                                                       procedure.exception(graph, t);\r
-                                               } catch (Throwable t2) {\r
-                                               Logger.defaultLogError(t2);\r
-                                               }\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public String toString() {\r
-                                               return "forOrderedSet -> " + procedure;\r
-                                       }\r
-\r
-                               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public void forOrderedSet(Resource subject,\r
-                       SyncMultiProcedure<Resource> procedure) {\r
-               forOrderedSet(subject, new SyncToAsyncMultiProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public void forOrderedSet(Resource subject,\r
-                       MultiProcedure<Resource> procedure) {\r
-               forOrderedSet(subject, new NoneToAsyncMultiProcedure<Resource>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new PossibleAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new PossibleAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new PossibleAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forPossibleAdapted(final Resource resource,\r
-                       final Class<T> clazz, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-               assert (procedure != null);\r
-\r
-               final AdaptionService service = getSession().peekService(AdaptionService.class);\r
-               if (service == null)\r
-                       procedure.exception(this, new ServiceException("No AdaptionService available")); \r
-               else\r
-                       service.adapt(this, resource, resource, Resource.class, clazz, true, procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,\r
-                       SyncProcedure<T> procedure) {\r
-               forPossibleAdapted(resource, clazz, new SyncToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,\r
-                       Procedure<T> procedure) {\r
-               forPossibleAdapted(resource, clazz, new NoneToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       AsyncListener<T> listener) {\r
-               asyncRequest(new PossibleUniqueAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       SyncListener<T> listener) {\r
-               asyncRequest(new PossibleUniqueAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       Listener<T> listener) {\r
-               asyncRequest(new PossibleUniqueAdapter<T>(resource, clazz), listener);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void forPossibleUniqueAdapted(final Resource resource,\r
-                       final Class<T> clazz, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (resource != null);\r
-               assert (clazz != null);\r
-               assert (procedure != null);\r
-\r
-               final AdaptionService service = getSession().peekService(AdaptionService.class);\r
-               if (service == null)\r
-                       procedure.exception(this, new ServiceException("No AdaptionService available")); \r
-               else\r
-                       service.adaptNew(this, resource, clazz, true, procedure);\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       SyncProcedure<T> procedure) {\r
-               forPossibleUniqueAdapted(resource, clazz, new SyncToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,\r
-                       Procedure<T> procedure) {\r
-               forPossibleUniqueAdapted(resource, clazz, new NoneToAsyncProcedure<T>(\r
-                               procedure));\r
-       }\r
-\r
-       /*\r
-        * Implementation of the interface AsyncRequestProcessor\r
-        */\r
-\r
-       @Override\r
-       final public Session getSession() {\r
-               return processor.getSession();\r
-       }\r
-\r
-//     @Override\r
-//     final public Builtins getBuiltins() {\r
-//             return processor.getSession().getBuiltins();\r
-//     }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final Read<T> request) {\r
-\r
-               asyncRequest(request, new AsyncProcedure<T>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, T result) {\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                               Logger.defaultLogError(t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "asyncRequest(Read) -> " + request;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(Read<T> request, AsyncListener<T> procedure) {\r
-               asyncRequest(request, (AsyncProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(Read<T> request,\r
-                       final SyncListener<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(Read<T> request, final Listener<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final Read<T> request, final AsyncProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               final ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       try {\r
-                               processor.queryRead(this, request, parent, procedure,\r
-                                               listener);\r
-                       } catch (Throwable e) {\r
-                               // This throwable has already been transferred to procedure at this point - do nothing about it\r
-                               //Logger.defaultLogError("Internal error ", e);\r
-                       }\r
-                       \r
-               } else {\r
-\r
-//                     final ReadGraphImpl newGraph = newSync();\r
-\r
-                       try {\r
-\r
-                               T result = request.perform(this);\r
-                               \r
-                               try {\r
-                                       procedure.execute(this, result);\r
-                               } catch (Throwable t) {\r
-                                       Logger.defaultLogError(t);\r
-                               }\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               try {\r
-                                       procedure.exception(this, t);\r
-                               } catch (Throwable t2) {\r
-                                       Logger.defaultLogError(t2);\r
-                               }\r
-\r
-                       } finally {\r
-\r
-                       }\r
-\r
-               }\r
-\r
-       }\r
-\r
-    public static ReadGraphImpl createAsync(QueryProcessor support) {\r
-        return new ReadGraphImpl(null, support);\r
-    }\r
-\r
-    public static ReadGraphImpl forRecompute(CacheEntry entry, QueryProcessor support) {\r
-        return new ReadGraphImpl(entry, support);       \r
-    }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(Read<T> request, SyncProcedure<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(Read<T> request, final Procedure<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(final AsyncRead<T> request) {\r
-\r
-               assert (request != null);\r
-\r
-               asyncRequest(request, new AsyncProcedure<T>() {\r
-\r
-                       @Override\r
-                       public void execute(AsyncReadGraph graph, T result) {\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                       Logger.defaultLogError(t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "asyncRequest(AsyncRead) -> " + request;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(AsyncRead<T> request,\r
-                       AsyncListener<T> procedure) {\r
-               asyncRequest(request, (AsyncProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(AsyncRead<T> request,\r
-                       final SyncListener<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(AsyncRead<T> request,\r
-                       final Listener<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(final AsyncRead<T> request,\r
-                       final AsyncProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               final ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       processor.query(this, request, parent, procedure, listener);\r
-\r
-               } else {\r
-\r
-                       try {\r
-                               \r
-                               request.perform(this, new CallWrappedSingleQueryProcedure4<T>(procedure, request));\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               if (t instanceof DatabaseException)\r
-                                       procedure.exception(this, t);\r
-                               else\r
-                                       procedure\r
-                                                       .exception(\r
-                                                                       this,\r
-                                                                       new DatabaseException(\r
-                                                                                       "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)",\r
-                                                                                       t));\r
-\r
-                       }\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(AsyncRead<T> request,\r
-                       SyncProcedure<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(final AsyncRead<T> request,\r
-                       final Procedure<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final MultiRead<T> request) {\r
-\r
-               assert (request != null);\r
-\r
-               asyncRequest(request, new AsyncMultiProcedureAdapter<T>() {\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                       Logger.defaultLogError(t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "asyncRequest(MultiRead) -> " + request;\r
-                       }\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(MultiRead<T> request,\r
-                       AsyncMultiListener<T> procedure) {\r
-               asyncRequest(request, (AsyncMultiProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(MultiRead<T> request,\r
-                       SyncMultiListener<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(MultiRead<T> request,\r
-                       MultiListener<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final MultiRead<T> request,\r
-                       final AsyncMultiProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               final ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-//                 final ReadGraphImpl newGraph = newSync();\r
-                   processor.query(this, request, parent, procedure,listener);\r
-\r
-               } else {\r
-\r
-//                 final ReadGraphImpl newGraph = newSync();\r
-\r
-                   try {\r
-\r
-                       request.perform(this, procedure);\r
-\r
-                   } catch (Throwable t) {\r
-\r
-                       procedure.exception(this, t);\r
-\r
-                   }                           \r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(MultiRead<T> request,\r
-                       SyncMultiProcedure<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(MultiRead<T> request,\r
-                       MultiProcedure<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(final AsyncMultiRead<T> request) {\r
-\r
-               assert (request != null);\r
-\r
-               asyncRequest(request, new AsyncMultiProcedureAdapter<T>() {\r
-                       @Override\r
-                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                       Logger.defaultLogError(t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "asyncRequest(AsyncMultiRead) -> " + request;\r
-                       }\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(AsyncMultiRead<T> request,\r
-                       AsyncMultiListener<T> procedure) {\r
-               asyncRequest(request, (AsyncMultiProcedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(AsyncMultiRead<T> request,\r
-                       SyncMultiListener<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(AsyncMultiRead<T> request,\r
-                       MultiListener<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncMultiListener<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(AsyncMultiRead<T> request,\r
-                       final AsyncMultiProcedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       processor.query(this, request, parent, procedure, listener);\r
-\r
-               } else {\r
-\r
-                       try {\r
-\r
-                               request.perform(this, new AsyncMultiProcedure<T>() {\r
-\r
-                                       @Override\r
-                                       public void execute(AsyncReadGraph graph, T result) {\r
-                                               procedure.execute(graph, result);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void finished(AsyncReadGraph graph) {\r
-                                               procedure.finished(graph);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(AsyncReadGraph graph, Throwable t) {\r
-                                               procedure.exception(graph, t);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public String toString() {\r
-                                               return "asyncRequest(AsyncMultiRead) -> " + procedure;\r
-                                       }\r
-\r
-                               });\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               procedure.exception(this, new DatabaseException(t));\r
-\r
-                       }\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(AsyncMultiRead<T> request,\r
-                       SyncMultiProcedure<T> procedure) {\r
-               asyncRequest(request, new SyncToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(AsyncMultiRead<T> request,\r
-                       final MultiProcedure<T> procedure) {\r
-               asyncRequest(request, new NoneToAsyncMultiProcedure<T>(procedure));\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(final ExternalRead<T> request) {\r
-\r
-               assert (request != null);\r
-\r
-               asyncRequest(request, new Procedure<T>() {\r
-\r
-                       @Override\r
-                       public void execute(T result) {\r
-                       }\r
-\r
-                       @Override\r
-                       public void exception(Throwable t) {\r
-                       Logger.defaultLogError(t);\r
-                       }\r
-\r
-                       @Override\r
-                       public String toString() {\r
-                               return "asyncRequest(PrimitiveRead) -> " + request;\r
-                       }\r
-\r
-               });\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(ExternalRead<T> request,\r
-                       final Listener<T> procedure) {\r
-               asyncRequest(request, (Procedure<T>) procedure);\r
-       }\r
-\r
-       @Override\r
-       final public <T> void asyncRequest(final ExternalRead<T> request,\r
-                       final Procedure<T> procedure) {\r
-\r
-               assert (request != null);\r
-               assert (procedure != null);\r
-\r
-               ListenerBase listener = getListenerBase(procedure);\r
-\r
-               if (parent != null || listener != null) {\r
-\r
-                       processor.query(this, request, parent, procedure, listener);\r
-\r
-               } else {\r
-\r
-                       try {\r
-\r
-                               request.register(this, new Listener<T>() {\r
-\r
-                                       @Override\r
-                                       public void execute(T result) {\r
-                                               procedure.execute(result);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public void exception(Throwable t) {\r
-                                               procedure.exception(t);\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public String toString() {\r
-                                               return "asyncRequest(PrimitiveRead) -> " + request;\r
-                                       }\r
-\r
-                                       @Override\r
-                                       public boolean isDisposed() {\r
-                                               return true;\r
-                                       }\r
-\r
-                               });\r
-\r
-                       } catch (Throwable t) {\r
-\r
-                               if (t instanceof DatabaseException)\r
-                                       procedure.exception(t);\r
-                               else\r
-                                       procedure\r
-                                                       .exception(new DatabaseException(\r
-                                                                       "Unexpected exception in ReadGraph.asyncRequest(SingleAsyncRead, SingleProcedure)",\r
-                                                                       t));\r
-\r
-                       }\r
-\r
-               }\r
-\r
-       }\r
-\r
-       @Override\r
-       public void asyncRequest(final Write request) {\r
-\r
-               assert (request != null);\r
-               \r
-               getSession().asyncRequest(request);\r
-\r
-//             processor.asyncWrite(request);\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final WriteResult<T> request, Procedure<T> procedure) {\r
-               throw new Error("Not implemented.");\r
-       }\r
-       \r
-       @Override\r
-       public void asyncRequest(Write request, Callback<DatabaseException> callback) {\r
-               \r
-               assert (request != null);\r
-               \r
-               getSession().asyncRequest(request, callback);\r
-               \r
-       }\r
-\r
-       @Override\r
-       public void asyncRequest(final DelayedWrite request) {\r
-\r
-               assert (request != null);\r
-\r
-               getSession().asyncRequest(request);\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final DelayedWriteResult<T> request, Procedure<T> procedure) {\r
-               throw new Error("Not implemented.");\r
-       }\r
-       \r
-       @Override\r
-       public void asyncRequest(DelayedWrite r,\r
-                       Callback<DatabaseException> callback) {\r
-               throw new Error("Not implemented.");\r
-       }\r
-\r
-       @Override\r
-       public void asyncRequest(final WriteOnly request) {\r
-\r
-               assert (request != null);\r
-\r
-               getSession().asyncRequest(request);\r
-\r
-       }\r
-\r
-       @Override\r
-       public <T> void asyncRequest(final WriteOnlyResult<T> request, Procedure<T> procedure) {\r
-               throw new Error("Not implemented.");\r
-       }\r
-       \r
-       @Override\r
-       public void asyncRequest(WriteOnly r, Callback<DatabaseException> callback) {\r
-               throw new Error("Not implemented.");\r
-       }\r
-\r
-       /*\r
-        * Implementation of the interface ServiceLocator\r
-        */\r
-\r
-       @Override\r
-       public <T> T getService(Class<T> api) {\r
-           if(WriteSupport.class == api) {\r
-               if(this instanceof WriteGraphImpl) {\r
-                   WriteGraphImpl impl = (WriteGraphImpl)this;\r
-                   return (T)impl.writeSupport;\r
-               }\r
-           }\r
-               return getSession().getService(api);\r
-       }\r
-\r
-       @Override\r
-       public <T> T peekService(Class<T> api) {\r
-               return getSession().peekService(api);\r
-       }\r
-\r
-       @Override\r
-       public boolean hasService(Class<?> api) {\r
-               return getSession().hasService(api);\r
-       }\r
-\r
-       @Override\r
-       public <T> void registerService(Class<T> api, T service) {\r
-               getSession().registerService(api, service);\r
-       }\r
-       \r
-       @Override\r
-       public boolean isImmutable(Resource resource) throws DatabaseException {\r
-               ResourceImpl impl = (ResourceImpl)resource;\r
-               return processor.isImmutable(impl.id);\r
-       }\r
-\r
-       /*\r
-        * Internal routines\r
-        */\r
-\r
-       protected static String INTERNAL_ERROR_STRING = "Transaction aborted due to internal client error. Contact application support.";\r
-\r
-       /*\r
-        * callerThread is the currently running thread state.syncThread is blocking for\r
-        * this execution state.syncParent is the blocking request\r
-        */\r
-\r
-       final private boolean isExternal(int thread) {\r
-               return thread == Integer.MIN_VALUE;\r
-       }\r
-\r
-//     final private boolean isSync(int thread) {\r
-//             return thread < -1 && thread > Integer.MIN_VALUE;\r
-//     }\r
-\r
-       ReadGraphImpl(ReadGraphImpl graph) {\r
-               this(graph.parent, graph.processor);\r
-       }\r
-\r
-       ReadGraphImpl(CacheEntry parent, QueryProcessor support) {\r
-//             this.state = new ReadGraphState(barrier, support);\r
-               this.parent = parent;\r
-               this.processor = support;\r
-       }\r
-       \r
-       ReadGraphImpl(final QueryProcessor support) {\r
-               \r
-//             this.state = state;\r
-               this.processor = support;\r
-               this.parent = null;\r
-               \r
-       }\r
-\r
-//     public static ReadGraphImpl createSync(int syncThread, Object syncParent,\r
-//                     ReadGraphSupportImpl support) {\r
-//             return new ReadGraphImpl(syncThread, syncThread, syncParent, null,\r
-//                             support, new AsyncBarrierImpl(null));\r
-//     }\r
-\r
-       public static ReadGraphImpl create(QueryProcessor support) {\r
-               return new ReadGraphImpl(support);\r
-       }\r
-\r
-//     public ReadGraphImpl newAsync() {\r
-//             return this;\r
-////           if(!state.synchronizedExecution) {\r
-////                   return this;\r
-////           } else {\r
-////                   return new ReadGraphImpl(false, parent, state.support, state.barrier);\r
-////           }\r
-//     }\r
-\r
-//     public ReadGraphImpl newSync() {\r
-//             return new ReadGraphImpl(parent, processor);\r
-//     }\r
-\r
-       public ReadGraphImpl newSync(CacheEntry parentEntry) {\r
-               return new ReadGraphImpl(parentEntry, processor);\r
-       }\r
-\r
-       public ReadGraphImpl newRestart(ReadGraphImpl impl) {\r
-\r
-               WriteGraphImpl write = processor.getSession().getService(\r
-                               WriteGraphImpl.class);\r
-\r
-//             if (write.callerThread != impl.callerThread)\r
-//                     return new WriteGraphImpl(impl.callerThread, parent, state.support, write.writeSupport, write.provider, write.state.barrier);\r
-               return write;\r
-\r
-       }\r
-\r
-//     public ReadGraphImpl newSync(Object parentRequest) {\r
-//             return new ReadGraphImpl(callerThread, state.parent, state.support, new AsyncBarrierImpl(state.barrier));\r
-//     }\r
-\r
-//     public ReadGraphImpl newSync(final int callerThread, Object parentRequest) {\r
-//             assert (state.syncThread == callerThread || (state.syncThread == Integer.MIN_VALUE && callerThread != Integer.MIN_VALUE));\r
-//             return new ReadGraphImpl(callerThread, callerThread, parentRequest,\r
-//                             state.parent, state.support, new AsyncBarrierImpl(state.barrier));\r
-//     }\r
-//\r
-//     public ReadGraphImpl newSyncAsync(Object parentRequest) {\r
-////           assert (callerThread < 0);\r
-//             return new ReadGraphImpl(callerThread, state.syncThread, parentRequest,\r
-//                             state.parent, state.support, new AsyncBarrierImpl(state.barrier));\r
-//     }\r
-//\r
-//     public ReadGraphImpl newSyncAsync(final int callerThread,\r
-//                     Object parentRequest) {\r
-////           assert (callerThread < 0);\r
-//             // assert(state.syncThread == callerThread || (state.syncThread == Integer.MIN_VALUE\r
-//             // && callerThread != Integer.MIN_VALUE) );\r
-//             return new ReadGraphImpl(callerThread, callerThread, parentRequest,\r
-//                             state.parent, state.support, new AsyncBarrierImpl(state.barrier));\r
-//     }\r
-\r
-       public ReadGraphImpl withAsyncParent(CacheEntry parent) {\r
-               return new ReadGraphImpl(parent, processor);\r
-       }\r
-\r
-       public ReadGraphImpl withParent(CacheEntry parent) {\r
-               if(parent == this.parent) return this;\r
-               else return new ReadGraphImpl(parent, processor);\r
-       }\r
-\r
-       final private ListenerBase getListenerBase(final Object procedure) {\r
-               if (procedure instanceof ListenerBase)\r
-                       return (ListenerBase) procedure;\r
-               else\r
-                       return null;\r
-       }\r
-\r
-       public <T> void waitAsyncProcedure(AsyncMultiReadProcedure<T> procedure) {\r
-               \r
-               assert(procedure.done());\r
-               \r
-//             while (!procedure.done()) {\r
-//\r
-//                     boolean executed = processor.resumeTasks(callerThread, null, null);\r
-//                     if (!executed) {\r
-//                             try {\r
-//                                     Thread.sleep(1);\r
-//                                     //                                                              sema.tryAcquire(1, TimeUnit.MILLISECONDS);\r
-//                             } catch (InterruptedException e) {\r
-//                                     e.printStackTrace();\r
-//                             }\r
-//                     }\r
-//\r
-//             }\r
-               \r
-       }\r
-\r
-       public <T> void waitAsyncProcedure(AsyncReadProcedure<T> procedure) {\r
-               \r
-               assert(procedure.done());\r
-               \r
-//             while (!procedure.done()) {\r
-//\r
-//                     boolean executed = processor.processor.resume(this);\r
-//                     if (!executed) {\r
-//                             try {\r
-//                                     Thread.sleep(1);\r
-//                                     //                                                              sema.tryAcquire(1, TimeUnit.MILLISECONDS);\r
-//                             } catch (InterruptedException e) {\r
-//                                     e.printStackTrace();\r
-//                             }\r
-//                     }\r
-//\r
-//             }\r
-               \r
-       }\r
-       \r
-//     public void waitAsync(Object request) {\r
-//             try {\r
-//                     state.barrier.waitBarrier(request, this);\r
-//             } catch (Throwable t) {\r
-//                     t.printStackTrace();\r
-//                     processor.scanPending();\r
-//                     processor.querySupport.checkTasks();\r
-//                     throw new RuntimeDatabaseException(t);\r
-//             }\r
-//     }\r
-\r
-//     public void restart() {\r
-//             state.barrier.restart();\r
-//     }\r
-\r
-       public boolean resumeTasks() {\r
-               return processor.resumeTasks(this);\r
-       }\r
-\r
-       Class<?> singleClass(Set<Resource> types) {\r
-               Class<?> result = null;\r
-               for (Resource type : types) {\r
-                       Class<?> clazz = processor.getBuiltinValue(type);\r
-                       if (clazz != null) {\r
-                               if (result != null)\r
-                                       return null;\r
-                               else\r
-                                       result = clazz;\r
-                       }\r
-               }\r
-               return result;\r
-       }\r
-\r
-       private String debugString(Resource r) {\r
-               String name = null;\r
-               try {\r
-                       name = getPossibleRelatedValue(r, processor.getL0(this).HasName);\r
-               } catch (ManyObjectsForFunctionalRelationException e) {\r
-               Logger.defaultLogError(e);\r
-               } catch (ServiceException e) {\r
-               Logger.defaultLogError(e);\r
-               }\r
-               return "[" + name + " - " + r + "]";\r
-       }\r
-\r
-       @Override\r
-       public String toString() {\r
-               return "ReadGraphImpl[thread=" + Thread.currentThread() + "]";\r
-       }\r
-\r
-       @Override\r
-       final public int thread() {\r
-               return 0;\r
-       }\r
-       \r
-    static class MultiTripleIntProcedure implements TripleIntProcedure {\r
-\r
-       final private AsyncMultiProcedure<Statement> procedure;\r
-       final private ReadGraphImpl impl;\r
-       final private QuerySupport support;\r
-       \r
-       public MultiTripleIntProcedure(AsyncMultiProcedure<Statement> procedure, ReadGraphImpl impl, QuerySupport support) {\r
-               this.procedure = procedure;\r
-               this.impl = impl;\r
-               this.support = support;\r
-       }\r
-       \r
-       @Override\r
-       public void execute(ReadGraphImpl graph, int s, int p, int o) {\r
-               try {\r
-                       procedure.execute(graph, support.getStatement(s, p, o));\r
-               } catch (Throwable t2) {\r
-                       Logger.defaultLogError(t2);\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public void finished(ReadGraphImpl graph) {\r
-               try {\r
-                       procedure.finished(graph);\r
-//                     impl.state.barrier.dec("ReadGraphSupportImpl.516");\r
-               } catch (Throwable t2) {\r
-                       Logger.defaultLogError(t2);\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public void exception(ReadGraphImpl graph, Throwable t) {\r
-               try {\r
-                       procedure.exception(graph, t);\r
-               } catch (Throwable t2) {\r
-                       Logger.defaultLogError(t2);\r
-               }\r
-//             impl.state.barrier.dec("ReadGraphSupportImpl.516");\r
-       }\r
-\r
-       @Override\r
-       public String toString() {\r
-               return "forEachObject with " + procedure;\r
-       }\r
-       \r
-    }\r
-\r
-//    private AsyncMultiProcedure<Resource> cacheKey = null;\r
-//    private MultiIntProcedure cacheResult = null;\r
-//    \r
-//    final IntProcedure forMultiProcedure(final AsyncMultiProcedure<Resource> procedure) {\r
-//     \r
-//     if(procedure == cacheKey) return cacheResult; \r
-//     \r
-//     cacheResult = new MultiIntProcedure(procedure, this, processor.support);\r
-//     cacheKey = procedure;\r
-//     \r
-//     return cacheResult;\r
-//     \r
-//    }\r
-//\r
-//    private AsyncMultiProcedure<Statement> cacheKey2 = null;\r
-//    private MultiTripleIntProcedure cacheResult2 = null;\r
-//\r
-//    final synchronized TripleIntProcedure forMultiProcedure(final AsyncMultiProcedure<Statement> procedure) {\r
-//     \r
-//     if(procedure == cacheKey2) return cacheResult2; \r
-//     \r
-//     cacheResult2 = new MultiTripleIntProcedure(procedure, this, processor.support);\r
-//     cacheKey2 = procedure;\r
-//     \r
-//     return cacheResult2;\r
-//     \r
-//    }\r
-    \r
-    @Override\r
-    public Datatype getDataType(Resource subject) throws DatabaseException {\r
-       for(Resource dataTypeResource : getObjects(subject, processor.getL0(this).HasDataType))\r
-               return getValue(dataTypeResource, Bindings.getBindingUnchecked(Datatype.class));\r
-       throw new DoesNotContainValueException("The literal has no data type.");\r
-    }\r
-    \r
-    protected <T extends Accessor> T getAccessor4File(Resource subject)\r
-    throws DatabaseException {\r
-        return null;\r
-        /*        \r
-        byte[]  bytes = processor.support.getValue(g, subject);\r
-        if (null == bytes)\r
-            return null;\r
-        try {\r
-            BinaryVariant va = (BinaryVariant) Accessors.getAccessor(bytes, Datatypes.VARIANT);\r
-            Accessor ca = va.getContentAccessor();\r
-            return (T)ca;\r
-        } catch (AccessorConstructionException e) {\r
-            throw new DatabaseException(e);\r
-        }\r
-        */\r
-        /*\r
-        if (null == bytes)\r
-            return null;\r
-        Binding datatype_binding = Bindings.getBindingUnchecked(DataType.class);\r
-        Serializer datatype_serializer = datatype_binding.serializer();\r
-        DataType datatype;\r
-        try {\r
-            BinaryMemory in = new BinaryMemory(ByteBuffer.wrap(bytes));\r
-            datatype = (DataType)datatype_serializer.deserialize(in);\r
-            Binding data_binding = Bindings.getBinding(datatype);\r
-            Serializer data_serializer = data_binding.serializer(BinarySerializationFormat.INSTANCE);\r
-            Object o = data_serializer.deserialize(in);\r
-            try {\r
-                return (T)Accessors.getAccessor(data_binding, o);\r
-            } catch(AccessorConstructionException e) {\r
-                return null;\r
-            }\r
-        } catch (Exception e) {\r
-            throw new DatabaseException(e);\r
-        }*/\r
-    }\r
-    @SuppressWarnings("unchecked")\r
-    @Override\r
-    public <T extends Accessor> T getAccessor(Resource subject) throws DatabaseException {\r
-        RandomAccessBinary rab = getRandomAccessBinary(subject);\r
-        try {\r
-            return (T)Accessors.getAccessor(rab, getDataType(subject));\r
-        } catch(AccessorConstructionException e) {\r
-            throw new DatabaseException(e);\r
-        }\r
-    }\r
-    @SuppressWarnings("unchecked")\r
-    protected <T extends Accessor> T createAccessor(Resource resource, Datatype datatype, Object intialValue)\r
-    throws DatabaseException {\r
-        RandomAccessBinary rab = createRandomAccessBinary(resource, datatype, intialValue);\r
-        try {\r
-            return (T)Accessors.getAccessor(rab, datatype);\r
-        } catch(AccessorConstructionException e) {\r
-            throw new DatabaseException(e);\r
-        }\r
-    }\r
-    @Override\r
-    public RandomAccessBinary getRandomAccessBinary(Resource subject) throws DatabaseException {\r
-        RandomAccessValueSupport ravs = getSession().getService(RandomAccessValueSupport.class);\r
-        ResourceData rd = ravs.get(subject);\r
-        if (null != rd)\r
-            return rd;\r
-        try {\r
-            ExternalValueSupport evs = getService(ExternalValueSupport.class);\r
-            long size = evs.getValueSize(this, subject); // Throws DatabaseException if no old external value.\r
-            try {\r
-                File platform = Platform.getLocation().toFile();\r
-                File tempFiles = new File(platform, "tempFiles");\r
-                File dbDir = new File(tempFiles, "db");\r
-                dbDir.mkdirs();\r
-                File file = new File(dbDir, "ResourceFile" + subject.getResourceId());\r
-                rd = new ResourceData(new BinaryFile(file), true); // Old external value.\r
-                final int N = 1<<20;\r
-                long left = size;\r
-                long offset = 0;\r
-                while (left > 0) {\r
-                    int length = N < left ? N : (int)left;\r
-                    byte[] bytes = evs.readValue(this, subject, offset, length);\r
-                    offset += bytes.length;\r
-                    left -= bytes.length;\r
-                    rd.binaryFile.write(bytes);\r
-                }\r
-                ravs.put(subject, rd);\r
-                return rd;\r
-            } catch (Exception e) {\r
-                throw new DatabaseException("Resource " + subject + " have value but there was problem with accessing value data.", e);\r
-            }\r
-        } catch (Exception e) {\r
-            if(Development.DEVELOPMENT) {\r
-                if(Development.<Boolean>getProperty(DevelopmentKeys.WRITEGRAPH_EXCEPTION_STACKTRACES, Bindings.BOOLEAN)) {\r
-                    e.printStackTrace();\r
-                }\r
-            }\r
-        }\r
-        Datatype datatype = getDataType(subject);\r
-        Object value = getPossibleValue(subject, Bindings.getBinding(datatype));\r
-        return createRandomAccessBinary(subject, datatype, value);\r
-    }\r
-    public RandomAccessBinary createRandomAccessBinary(Resource resource, Datatype datatype, Object initialValue)\r
-    throws DatabaseException {\r
-        RandomAccessValueSupport ravs = getSession().getService(RandomAccessValueSupport.class);\r
-        try {\r
-            File platform = Platform.getLocation().toFile();\r
-            File tempFiles = new File(platform, "tempFiles");\r
-            File dbDir = new File(tempFiles, "db");\r
-            dbDir.mkdirs();\r
-            File file = new File(dbDir, "ResourceFile" + resource.getResourceId());\r
-            ResourceData rd = new ResourceData(new BinaryFile(file), false);\r
-            Binding binding = Bindings.getBinding(datatype);\r
-            if (null == initialValue) {\r
-                initialValue = binding.createDefault();\r
-            }\r
-            Serializer serializer = binding.serializer();\r
-            byte[] bytes = serializer.serialize(initialValue);\r
-            rd.binaryFile.write(bytes);\r
-            ravs.put(resource, rd);\r
-            return rd;\r
-        } catch (Exception e) {\r
-            if (e instanceof DatabaseException)\r
-                throw (DatabaseException)e;\r
-            else\r
-                throw new DatabaseException(e);\r
-        }\r
-    }\r
-\r
-//    static class ExternalValueRequest<T> extends ResourceRead<T> {\r
-//\r
-//             public ExternalValueRequest(Resource resource) {\r
-//                     super(resource);\r
-//             }\r
-//\r
-//             @SuppressWarnings("unchecked")\r
-//             @Override\r
-//             public T perform(ReadGraph graph) throws DatabaseException {\r
-//             try {\r
-//                     \r
-//                     String uri = graph.getURI(resource);\r
-//                     if(Layer0.URIs.Functions_functionApplication.equals(uri)) return (T)functionApplication;\r
-//                     \r
-//                     return (T)ReflectionUtils.getValue(uri).getValue();\r
-//                     \r
-//             } catch(ValueNotFoundException e) {\r
-//                     throw new DatabaseException("Couldn't convert to external value (r=" + resource + ")", e);\r
-//             } catch(ClassCastException e) {\r
-//                     throw new DatabaseException("Couldn't convert to external value (r=" + resource + ")", e);\r
-//             }\r
-//             }\r
-//     \r
-//    }\r
-    \r
-    @SuppressWarnings("unchecked")\r
-    @Override\r
-    public <T> T getValue2(Resource r, Object context) throws DatabaseException {\r
-       Layer0 L0 = processor.getL0(this);\r
-       Set<Resource> types = getTypes(r);\r
-       \r
-       if(types.contains(L0.Literal)) {\r
-               if(isImmutable(r)) {\r
-                       return syncRequest(new ValueImplied<T>(r));\r
-               } else {\r
-                       return getValue(r);\r
-               }\r
-       }\r
-       else if(types.contains(L0.ExternalValue)) {\r
-               return (T)syncRequest(new AdaptValue(r), TransientCacheListener.<Object>instance());\r
-       }\r
-       else {\r
-\r
-           Function3<ReadGraph,Resource,Object,T> function = requestValueFunction(r);\r
-           if(function == null) throw new DoesNotContainValueException("Couldn't convert to a value function " + r);\r
-           try {\r
-               return function.apply(this, r, context);\r
-           } catch(RuntimeException e) {\r
-               DatabaseException dte = findPossibleRootException(e);\r
-               if(dte != null) throw dte;\r
-               else throw new DatabaseException(e);\r
-           }\r
-               \r
-       }\r
-    }\r
-\r
-    @SuppressWarnings("unchecked")\r
-    @Override\r
-    public Variant getVariantValue2(Resource r, Object context) throws DatabaseException {\r
-        Layer0 L0 = processor.getL0(this);\r
-        Set<Resource> types = getTypes(r);\r
-        \r
-        if(types.contains(L0.Literal)) {\r
-            if(isImmutable(r)) {\r
-                return syncRequest(new VariantValueImplied(r));\r
-            } else {\r
-                return getVariantValue(r);\r
-            }\r
-        }\r
-        else if(types.contains(L0.ExternalValue)) {\r
-            Object value = syncRequest(new AdaptValue(r), TransientCacheListener.<Object>instance());\r
-            try {\r
-                return new Variant(Bindings.OBJECT.getContentBinding(value), value);\r
-            } catch ( org.simantics.databoard.binding.error.BindingException e ) {\r
-                throw new BindingException( "No binding found for class " + value.getClass().getName(), e );\r
-            }\r
-        }\r
-        else {\r
-\r
-            Function3<ReadGraph,Resource,Object,Object> function = requestValueFunction(r);\r
-            if(function == null) throw new DoesNotContainValueException("Couldn't convert to a value function " + r);\r
-            try {\r
-                Object value = function.apply(this, r, context);\r
-                try {\r
-                    return new Variant(Bindings.OBJECT.getContentBinding(value), value);\r
-                } catch ( org.simantics.databoard.binding.error.BindingException e ) {\r
-                    throw new BindingException( "No binding found for class " + value.getClass().getName(), e );\r
-                }\r
-            } catch(RuntimeException e) {\r
-                DatabaseException dte = findPossibleRootException(e);\r
-                if(dte != null) throw dte;\r
-                else throw new DatabaseException(e);\r
-            }\r
-        }\r
-    }\r
-    \r
-    @Override\r
-    public <T> T getPossibleValue2(Resource subject, Object context) throws DatabaseException {\r
-       try {\r
-               return getValue2(subject, context);\r
-       } catch (DatabaseException e) {\r
-               return null;\r
-       }\r
-    }\r
-\r
-    static class PossibleConverterFunction<T> extends ResourceRead<Function3<ReadGraph,Resource,Object,T>> {\r
-       \r
-       public PossibleConverterFunction(Resource resource) {\r
-                       super(resource);\r
-               }\r
-\r
-        @Override\r
-        public Function3<ReadGraph,Resource,Object,T> perform(ReadGraph graph) throws DatabaseException {\r
-               return compute(graph, resource);\r
-        }\r
-        \r
-        @SuppressWarnings("unchecked")\r
-               public static <T> Function3<ReadGraph,Resource,Object,T> compute(ReadGraph graph, Resource resource) throws DatabaseException {\r
-            Layer0 L0 = Layer0.getInstance(graph);\r
-            for(Resource converter : graph.getObjects(resource, L0.ConvertsToValueWith)) {\r
-                try {\r
-                       if(L0.Functions_functionApplication.equals(converter)) {\r
-                               return (Function3<ReadGraph,Resource,Object,T>)graph.syncRequest(new AdaptValue(resource));\r
-                       } else {\r
-                               return graph.getValue2(converter, resource);\r
-                       }\r
-                } catch(RuntimeException e) {\r
-                    DatabaseException dte = findPossibleRootException(e);\r
-                    if(dte != null) throw dte;\r
-                    else throw new DatabaseException(e);\r
-                }\r
-            }\r
-            return null;\r
-        }\r
-        \r
-    }\r
-    \r
-    <T> Function3<ReadGraph,Resource,Object,T> requestValueFunction(Resource r) throws DatabaseException {\r
-       if(isImmutable(r))\r
-               return syncRequest(new PossibleConverterFunction<T>(r), TransientCacheAsyncListener.<Function3<ReadGraph,Resource,Object,T>>instance());\r
-       else\r
-               return syncRequest(new PossibleConverterFunction<T>(r));\r
-    }\r
-    \r
-    /**\r
-     * Get a value associated with a graph {@link Resource}, using a possible context object and\r
-     * a desired value binding. The following methods are tried in order to retreive the value:\r
-     * <ol>\r
-     *   <li>If the given resource is a {@code L0.Literal}, the value of the literal is returned, using the binding specified by {@code binding}.</li>\r
-     *   <li>If the resource is a {@code L0.ExternalValue}, the value is acquired using\r
-     *       {@link ReflectionUtils#getValue(String)}.</li>\r
-     *   <li>If the resource is associated with a suitable value converter with relation {@code L0.ConvertsToValueWith}\r
-     *       (see {@link #requestValueFunction(Resource)}), the value function is called with the graph, the resource\r
-     *       and the context object.</li>\r
-     * </ul>\r
-     * \r
-     * @param r  A graph resource with which the value is associated\r
-     * @param context  A context object that is used for acquiring the value (only applied in case 3)\r
-     * @param binding  A binding for the value type (only applied in case 1)\r
-     * @return  The value of the graph node.\r
-     * @throws DoesNotContainValueException  No value is associated with the graph node.\r
-     * @throws DatabaseException  Other errors, such as an error in casting the value to the return type or\r
-     *         a runtime error in the value function.\r
-     */\r
-    @SuppressWarnings("unchecked")\r
-       @Override\r
-    public <T> T getValue2(Resource r, Object context, Binding binding) throws DatabaseException {\r
-       if (binding instanceof ObjectVariantBinding)\r
-               return getValue2(r, context);\r
-       \r
-       Layer0 L0 = processor.getL0(this);\r
-       Set<Resource> types = getTypes(r);\r
-       if(types.contains(L0.Literal)) {\r
-               if(isImmutable(r)) {\r
-                       return syncRequest(new Value<T>(r, binding));\r
-               } else {\r
-                       return getValue(r, binding);\r
-               }\r
-       } else if(types.contains(L0.ExternalValue)) {\r
-               try {\r
-                       return (T)ReflectionUtils.getValue(getURI(r)).getValue();\r
-               } catch(ValueNotFoundException e) {\r
-                       throw new DatabaseException(e);\r
-               } catch(ClassCastException e) {\r
-                       throw new DatabaseException(e);\r
-               }\r
-       }\r
-       else {\r
-           Function3<ReadGraph,Resource,Object,T> function = requestValueFunction(r);\r
-           if(function == null) throw new DoesNotContainValueException("Couldn't convert to a value function.");\r
-           try {\r
-               Object value = function.apply(this, r, context);\r
-               if(binding.isInstance(value)) return (T)value;\r
-               Binding srcBinding = Bindings.OBJECT.getContentBinding(value);\r
-               return (T)Bindings.adapt(value, srcBinding, binding);\r
-           } catch(RuntimeException e) {\r
-               DatabaseException dte = findPossibleRootException(e);\r
-               if(dte != null) throw dte;\r
-               else throw new DatabaseException(e);\r
-           } catch (AdaptException e) {\r
-               throw new DatabaseException(e);\r
-                       } catch (org.simantics.databoard.binding.error.BindingException e) {\r
-               throw new DatabaseException(e);\r
-                       }\r
-       }\r
-    }\r
-    \r
-    @Override\r
-    public <T> T getPossibleValue2(Resource subject, Object context, Binding binding) throws DatabaseException {\r
-       try {\r
-               return getValue2(subject, context, binding);\r
-       } catch (DatabaseException e) {\r
-               return null;\r
-       }\r
-    }\r
-    \r
-       private static DatabaseException findPossibleRootException(Throwable t) {\r
-               if(t == null) return null;\r
-               if(t instanceof DatabaseException) return (DatabaseException)t;\r
-               if(t instanceof RuntimeException || t instanceof InvocationTargetException) {\r
-                       return findPossibleRootException(t.getCause());\r
-               }\r
-               return null;\r
-       }\r
-    \r
-    @Override\r
-    public <T> T getRelatedValue2(Resource subject, Resource relation) throws DatabaseException {\r
-       return getRelatedValue2(subject, relation, subject);\r
-    }\r
-    \r
-    @Override\r
-    public Variant getRelatedVariantValue2(Resource subject, Resource relation) throws DatabaseException {\r
-        return getRelatedVariantValue2(subject, relation, subject);\r
-    }\r
-    \r
-    @Override\r
-    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation) throws DatabaseException {\r
-       try {\r
-               Resource object = getPossibleObject(subject, relation);\r
-               if(object == null) return null;\r
-               else return getValue2(object, subject);\r
-       } catch (DatabaseException e) {\r
-               return null;\r
-       }\r
-    }\r
-\r
-    @Override\r
-    public <T> T getRelatedValue2(Resource subject, Resource relation, Object context) throws DatabaseException {\r
-               if(Development.DEVELOPMENT) {\r
-                       String error = L0Validations.checkValueType(this, subject, relation);\r
-                       if(error != null) {\r
-                               Logger.defaultLogError(new ValidationException(error));\r
-                               //throw new ValidationException(error);\r
-                               new ValidationException(error).printStackTrace();\r
-                       }\r
-               }\r
-        return getValue2(getSingleObject(subject, relation), context);\r
-    }\r
-    \r
-    @Override\r
-    public Variant getRelatedVariantValue2(Resource subject, Resource relation, Object context) throws DatabaseException {\r
-        if(Development.DEVELOPMENT) {\r
-            String error = L0Validations.checkValueType(this, subject, relation);\r
-            if(error != null) {\r
-                Logger.defaultLogError(new ValidationException(error));\r
-                //throw new ValidationException(error);\r
-                new ValidationException(error).printStackTrace();\r
-            }\r
-        }\r
-        return getVariantValue2(getSingleObject(subject, relation), context);\r
-    }\r
-    \r
-    @Override\r
-    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation, Object context) throws DatabaseException {\r
-       try {\r
-               Resource object = getPossibleObject(subject, relation);\r
-               if(object == null) return null;\r
-               else return getValue2(object, context);\r
-       } catch (DatabaseException e) {\r
-               return null;\r
-       }\r
-    }\r
-\r
-    @Override\r
-    public <T> T getRelatedValue2(Resource subject, Resource relation, Binding binding) throws DatabaseException {\r
-       return getRelatedValue2(subject, relation, subject, binding);\r
-    }\r
-    \r
-    @Override\r
-    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation, Binding binding) throws DatabaseException {\r
-       try {\r
-               Resource object = getPossibleObject(subject, relation);\r
-               if(object == null) return null;\r
-               return getValue2(object, subject, binding);\r
-       } catch (DatabaseException e) {\r
-               return null;\r
-       }\r
-    }\r
-\r
-    @Override\r
-    public <T> T getRelatedValue2(Resource subject, Resource relation, Object context, Binding binding) throws DatabaseException {\r
-        return getValue2(getSingleObject(subject, relation), context, binding);\r
-    }\r
-    \r
-    @Override\r
-    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation, Object context, Binding binding) throws DatabaseException {\r
-       try {\r
-               Resource object = getPossibleObject(subject, relation);\r
-               if(object == null) return null;\r
-               else return getValue2(object, context, binding);\r
-       } catch (DatabaseException e) {\r
-               return null;\r
-       }\r
-    }\r
-    \r
-    @Override\r
-    public Type getRelatedValueType(Resource subject, Resource relation) throws DatabaseException {\r
-        Layer0 L0 = processor.getL0(this);\r
-        Resource property = getSingleObject(subject, relation);\r
-        String typeText = (String)getRelatedValue(property, L0.HasValueType, Bindings.STRING);\r
-        try {\r
-            return org.simantics.scl.compiler.types.Types.parseType(typeText);\r
-        } catch (SCLTypeParseException e) {\r
-            throw new DatabaseException(e);\r
-        }\r
-    }\r
-    \r
-    @Override\r
-    public boolean setSynchronous(boolean value) {\r
-        boolean old = processor.synch;\r
-        processor.synch = value;\r
-        return old;\r
-    }\r
-    \r
-    @Override\r
-    public boolean getSynchronous() {\r
-        return processor.synch;\r
-    }\r
-    \r
-    public void ensureLoaded(int resource) {\r
-       processor.querySupport.ensureLoaded(this, resource);\r
-    }\r
-    \r
-    public void ensureLoaded(int resource, int predicate) {\r
-       processor.querySupport.ensureLoaded(this, resource, predicate);\r
-    }\r
-\r
-    public byte[] getValue(int resource) {\r
-       return processor.querySupport.getValue(this, resource);\r
-    }\r
-    \r
-    public int thread(int resource) {\r
-       return (resource >>> 16) & processor.THREAD_MASK;\r
-    }\r
-\r
-    public int thread(Resource resource) {\r
-       return (((ResourceImpl)resource).id >>> 16) & processor.THREAD_MASK;\r
-    }\r
-    \r
-    public ResourceSupport getResourceSupport() {\r
-       return processor.getResourceSupport();\r
-    }\r
-    \r
-    @Override\r
-    public Object getModificationCounter() {\r
-       return processor.getSession().getModificationCounter();\r
-    }\r
-    \r
-}\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2018 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.impl.graph;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import org.eclipse.core.runtime.Platform;
+import org.simantics.databoard.Accessors;
+import org.simantics.databoard.Bindings;
+import org.simantics.databoard.accessor.Accessor;
+import org.simantics.databoard.accessor.error.AccessorConstructionException;
+import org.simantics.databoard.adapter.AdaptException;
+import org.simantics.databoard.binding.Binding;
+import org.simantics.databoard.binding.error.RuntimeBindingConstructionException;
+import org.simantics.databoard.binding.impl.ObjectVariantBinding;
+import org.simantics.databoard.binding.mutable.Variant;
+import org.simantics.databoard.serialization.Serializer;
+import org.simantics.databoard.type.Datatype;
+import org.simantics.databoard.util.binary.BinaryFile;
+import org.simantics.databoard.util.binary.RandomAccessBinary;
+import org.simantics.db.AsyncReadGraph;
+import org.simantics.db.ComputationalValue;
+import org.simantics.db.DevelopmentKeys;
+import org.simantics.db.ExternalValueSupport;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.RelationContext;
+import org.simantics.db.RelationInfo;
+import org.simantics.db.Resource;
+import org.simantics.db.Session;
+import org.simantics.db.Statement;
+import org.simantics.db.adaption.AdaptionService;
+import org.simantics.db.common.primitiverequest.Adapter;
+import org.simantics.db.common.primitiverequest.Builtin;
+import org.simantics.db.common.primitiverequest.DatatypeBinding;
+import org.simantics.db.common.primitiverequest.ForEachAssertedObject;
+import org.simantics.db.common.primitiverequest.ForEachAssertedStatement;
+import org.simantics.db.common.primitiverequest.HasStatement;
+import org.simantics.db.common.primitiverequest.HasStatementSubject;
+import org.simantics.db.common.primitiverequest.HasStatementSubjectObject;
+import org.simantics.db.common.primitiverequest.HasValue;
+import org.simantics.db.common.primitiverequest.Inverse;
+import org.simantics.db.common.primitiverequest.IsInheritedFrom;
+import org.simantics.db.common.primitiverequest.IsInstanceOf;
+import org.simantics.db.common.primitiverequest.IsSubrelationOf;
+import org.simantics.db.common.primitiverequest.OrderedSet;
+import org.simantics.db.common.primitiverequest.PossibleAdapter;
+import org.simantics.db.common.primitiverequest.PossibleInverse;
+import org.simantics.db.common.primitiverequest.PossibleObject;
+import org.simantics.db.common.primitiverequest.PossibleRelatedValue;
+import org.simantics.db.common.primitiverequest.PossibleRelatedValueImplied;
+import org.simantics.db.common.primitiverequest.PossibleStatement;
+import org.simantics.db.common.primitiverequest.PossibleType;
+import org.simantics.db.common.primitiverequest.PossibleUniqueAdapter;
+import org.simantics.db.common.primitiverequest.PossibleValue;
+import org.simantics.db.common.primitiverequest.PossibleValueImplied;
+import org.simantics.db.common.primitiverequest.RelatedValue;
+import org.simantics.db.common.primitiverequest.RelatedValueImplied;
+import org.simantics.db.common.primitiverequest.SingleObject;
+import org.simantics.db.common.primitiverequest.SingleStatement;
+import org.simantics.db.common.primitiverequest.SingleType;
+import org.simantics.db.common.primitiverequest.SingleTypeAny;
+import org.simantics.db.common.primitiverequest.Types;
+import org.simantics.db.common.primitiverequest.UniqueAdapter;
+import org.simantics.db.common.primitiverequest.Value;
+import org.simantics.db.common.primitiverequest.ValueImplied;
+import org.simantics.db.common.primitiverequest.VariantValueImplied;
+import org.simantics.db.common.procedure.adapter.AsyncMultiProcedureAdapter;
+import org.simantics.db.common.procedure.adapter.AsyncProcedureAdapter;
+import org.simantics.db.common.procedure.adapter.ProcedureAdapter;
+import org.simantics.db.common.procedure.adapter.SyncMultiProcedureAdapter;
+import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
+import org.simantics.db.common.procedure.adapter.TransientCacheListener;
+import org.simantics.db.common.procedure.single.SyncReadProcedure;
+import org.simantics.db.common.procedure.single.wrapper.DeepSingleOrErrorProcedure;
+import org.simantics.db.common.procedure.single.wrapper.DeepSingleOrNullProcedure;
+import org.simantics.db.common.procedure.single.wrapper.ExceptionToNullProcedure;
+import org.simantics.db.common.procedure.single.wrapper.NullSingleOrNullProcedure;
+import org.simantics.db.common.procedure.single.wrapper.SingleFunctionalOrNullProcedure;
+import org.simantics.db.common.procedure.single.wrapper.SingleOrErrorProcedure;
+import org.simantics.db.common.procedure.single.wrapper.SingleOrNullProcedure;
+import org.simantics.db.common.procedure.wrapper.NoneToAsyncListener;
+import org.simantics.db.common.procedure.wrapper.NoneToAsyncMultiListener;
+import org.simantics.db.common.procedure.wrapper.NoneToAsyncMultiProcedure;
+import org.simantics.db.common.procedure.wrapper.NoneToAsyncProcedure;
+import org.simantics.db.common.procedure.wrapper.NoneToAsyncSetProcedure;
+import org.simantics.db.common.procedure.wrapper.NoneToSyncMultiListener;
+import org.simantics.db.common.procedure.wrapper.NoneToSyncMultiProcedure;
+import org.simantics.db.common.procedure.wrapper.SyncToAsyncListener;
+import org.simantics.db.common.procedure.wrapper.SyncToAsyncMultiListener;
+import org.simantics.db.common.procedure.wrapper.SyncToAsyncMultiProcedure;
+import org.simantics.db.common.procedure.wrapper.SyncToAsyncProcedure;
+import org.simantics.db.common.procedure.wrapper.SyncToAsyncSetProcedure;
+import org.simantics.db.common.request.AdaptValue;
+import org.simantics.db.common.request.ResourceRead;
+import org.simantics.db.common.utils.Logger;
+import org.simantics.db.common.utils.NameUtils;
+import org.simantics.db.common.validation.L0Validations;
+import org.simantics.db.exception.AdaptionException;
+import org.simantics.db.exception.ArgumentException;
+import org.simantics.db.exception.AssumptionException;
+import org.simantics.db.exception.BindingException;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.exception.DoesNotContainValueException;
+import org.simantics.db.exception.EmptyResourceException;
+import org.simantics.db.exception.InternalException;
+import org.simantics.db.exception.InvalidLiteralException;
+import org.simantics.db.exception.ManyObjectsForFunctionalRelationException;
+import org.simantics.db.exception.NoInverseException;
+import org.simantics.db.exception.NoSingleResultException;
+import org.simantics.db.exception.ResourceNotFoundException;
+import org.simantics.db.exception.ServiceException;
+import org.simantics.db.exception.ValidationException;
+import org.simantics.db.impl.RelationContextImpl;
+import org.simantics.db.impl.ResourceImpl;
+import org.simantics.db.impl.internal.RandomAccessValueSupport;
+import org.simantics.db.impl.internal.ResourceData;
+import org.simantics.db.impl.procedure.ResultCallWrappedSyncQueryProcedure;
+import org.simantics.db.impl.query.CacheEntry;
+import org.simantics.db.impl.query.QueryCache;
+import org.simantics.db.impl.query.QueryCacheBase;
+import org.simantics.db.impl.query.QueryProcessor;
+import org.simantics.db.impl.query.QueryProcessor.SessionTask;
+import org.simantics.db.impl.query.QuerySupport;
+import org.simantics.db.impl.query.TripleIntProcedure;
+import org.simantics.db.impl.support.ResourceSupport;
+import org.simantics.db.procedure.AsyncListener;
+import org.simantics.db.procedure.AsyncMultiListener;
+import org.simantics.db.procedure.AsyncMultiProcedure;
+import org.simantics.db.procedure.AsyncProcedure;
+import org.simantics.db.procedure.AsyncSetListener;
+import org.simantics.db.procedure.Listener;
+import org.simantics.db.procedure.ListenerBase;
+import org.simantics.db.procedure.MultiListener;
+import org.simantics.db.procedure.MultiProcedure;
+import org.simantics.db.procedure.Procedure;
+import org.simantics.db.procedure.SetListener;
+import org.simantics.db.procedure.StatementProcedure;
+import org.simantics.db.procedure.SyncListener;
+import org.simantics.db.procedure.SyncMultiListener;
+import org.simantics.db.procedure.SyncMultiProcedure;
+import org.simantics.db.procedure.SyncProcedure;
+import org.simantics.db.procedure.SyncSetListener;
+import org.simantics.db.request.AsyncMultiRead;
+import org.simantics.db.request.AsyncRead;
+import org.simantics.db.request.DelayedWrite;
+import org.simantics.db.request.DelayedWriteResult;
+import org.simantics.db.request.ExternalRead;
+import org.simantics.db.request.MultiRead;
+import org.simantics.db.request.Read;
+import org.simantics.db.request.ReadInterface;
+import org.simantics.db.request.Write;
+import org.simantics.db.request.WriteInterface;
+import org.simantics.db.request.WriteOnly;
+import org.simantics.db.request.WriteOnlyResult;
+import org.simantics.db.request.WriteResult;
+import org.simantics.layer0.Layer0;
+import org.simantics.scl.compiler.types.Type;
+import org.simantics.scl.compiler.types.exceptions.SCLTypeParseException;
+import org.simantics.scl.reflection.ReflectionUtils;
+import org.simantics.scl.reflection.ValueNotFoundException;
+import org.simantics.scl.runtime.function.Function3;
+import org.simantics.utils.DataContainer;
+import org.simantics.utils.Development;
+import org.simantics.utils.datastructures.Pair;
+import org.simantics.utils.datastructures.collections.CollectionUtils;
+import org.slf4j.LoggerFactory;
+
+import gnu.trove.map.hash.TObjectIntHashMap;
+
+public class ReadGraphImpl implements AsyncReadGraph {
+
+    private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(ReadGraphImpl.class);
+
+    final static boolean EMPTY_RESOURCE_CHECK = false;
+    
+       final public CacheEntry parent;
+       public final ReadGraphImpl parentGraph;
+       final public QueryProcessor processor;
+       
+       public final AsyncBarrierImpl asyncBarrier;
+       
+       final static Binding DATA_TYPE_BINDING_INTERNAL = Bindings.getBindingUnchecked(Datatype.class);
+       final static Serializer DATA_TYPE_SERIALIZER = Bindings.getSerializerUnchecked(DATA_TYPE_BINDING_INTERNAL);
+
+       final public static TObjectIntHashMap<String> counters = new TObjectIntHashMap<String>(); 
+       
+       public static void resetCounters() {
+               counters.clear();
+       }
+       
+       public static String listCounters(File file) throws IOException {
+               
+               PrintStream b = new PrintStream(new BufferedOutputStream(new FileOutputStream(file)));
+
+               for(Pair<String,Integer> p : CollectionUtils.valueSortedEntries(counters)) {
+                       b.print(-p.second + " " + p.first + "\n");
+               }
+
+               b.close();
+
+               return "Dumped " + counters.size() + " queries.";
+               
+       }
+       
+       /*
+        * Implementation of the interface ReadGraph
+        */
+       final public String getURI(final Resource resource)     throws AssumptionException, ValidationException, ServiceException {
+               
+               assert (resource != null);
+
+               try {
+
+                       return syncRequest(new org.simantics.db.common.uri.ResourceToURI(resource));
+
+               } catch (AssumptionException e) {
+
+                       throw new AssumptionException(e);
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+       
+       final public String getPossibleURI(final Resource resource)     throws ValidationException,     ServiceException {
+
+               assert (resource != null);
+
+               try {
+
+                       return syncRequest(new org.simantics.db.common.uri.ResourceToPossibleURI(resource));
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       final public Resource getResource(final String id)
+                       throws ResourceNotFoundException, ValidationException,
+                       ServiceException {
+
+               assert (id != null);
+
+               try {
+
+                       Integer rid = QueryCache.resultURIToResource(this, id, parent, null);
+                       // FIXME: stupid to throw this here and catch and wrap it right away
+                       if(rid == 0) throw new ResourceNotFoundException(id);
+                       return processor.querySupport.getResource(rid);
+
+               } catch (ResourceNotFoundException e) {
+
+                       throw new ResourceNotFoundException(id, e);
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       final public Resource getPossibleResource(final String id)
+       throws ResourceNotFoundException, ValidationException,
+       ServiceException {
+
+               assert (id != null);
+
+               try {
+
+                       return getResource(id);
+
+               } catch (ResourceNotFoundException e) {
+                       
+                       return null;
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+       
+       @Override
+       public Map<String, Resource> getChildren(Resource resource) throws ValidationException, ServiceException {
+               
+               assert (resource != null);
+
+               try {
+
+                       int rId = processor.querySupport.getId(resource);
+                       return QueryCache.resultChildMap(this, rId, parent, null);
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+               
+       }
+
+       final public Resource getRootLibrary() {
+               return processor.getRootLibraryResource();
+       }
+       
+       final public Resource getBuiltin(final String id)
+                       throws ResourceNotFoundException, ServiceException {
+
+               assert (id != null);
+
+               try {
+
+                       return syncRequest(new Builtin(id));
+
+               } catch (ResourceNotFoundException e) {
+
+                       throw new ResourceNotFoundException(id, e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       static class StatementReadProcedure extends TIntArrayListInternal implements StatementProcedure {
+
+               private static Throwable DONE = new Throwable();
+               
+               Throwable exception = null;
+               
+               final ResourceSupport support;
+               
+               public StatementReadProcedure(ResourceSupport support) {
+                       this.support = support;
+               }
+               
+               @Override
+               public synchronized void execute(AsyncReadGraph graph, int s, int p, int o) {
+                       add(s);
+                       add(p);
+                       add(o);
+               }
+               
+               @Override
+               public void finished(AsyncReadGraph graph) {
+                       exception = DONE;
+               }
+
+               @Override
+               public void exception(AsyncReadGraph graph, Throwable t) {
+                       exception = t;
+               }
+               
+               public void checkAndThrow() throws DatabaseException {
+                       if(exception != DONE) {
+                               if (exception instanceof DatabaseException)
+                                       throw (DatabaseException) exception;
+                               else
+                                       throw new DatabaseException(
+                                                       "Unexpected exception in ReadGraph.syncRequest(AsyncMultiRead)",
+                                                       exception);
+                       }
+               }
+               
+               public boolean done() {
+                       return exception != null;
+               }
+
+               @Override
+               public boolean contains(Object obj) {
+                   if(!(obj instanceof InternalStatement))
+                       return false;
+                   InternalStatement statement = (InternalStatement)obj;
+                   int s = statement.s;
+                   int p = statement.p;
+                   int o = statement.o;
+                   for(int i=0;i<sizeInternal();i+=3)
+                if(s==getQuick(i) && p==getQuick(i+1) && o==getQuick(i+2))
+                    return true;
+                   return false;
+               }
+
+               @SuppressWarnings("unchecked")
+        @Override
+               public <T> T[] toArray(T[] a) {
+                   int length = sizeInternal() / 3;
+                   if(length > a.length) {
+                       Class<?> arrayType = a.getClass();
+                       a = (arrayType == Object[].class) 
+                               ? (T[]) new Object[length]
+                               : (T[]) Array.newInstance(arrayType.getComponentType(), length);
+                   }
+                   else {
+                       for(int i=length;i<a.length;++i)
+                           a[i] = null;
+                   }
+            for(int i=0,j=0;i<sizeInternal();i+=3,++j)
+                a[j] = (T)new InternalStatement(support, getQuick(i), getQuick(i+1), getQuick(i+2));
+            return a;
+               }
+
+               @Override
+               public boolean add(Statement e) {
+                       throw new UnsupportedOperationException();
+               }
+
+               @Override
+               public boolean remove(Object o) {
+                       throw new UnsupportedOperationException();
+               }
+
+               @Override
+               public boolean addAll(Collection<? extends Statement> c) {
+                       throw new UnsupportedOperationException();
+               }
+
+               class IteratorImpl implements ListIterator<Statement> {
+            
+            int index;
+            
+            public IteratorImpl(int index) {
+                this.index = index;
+            }
+
+            @Override
+            public boolean hasNext() {
+                return index < sizeInternal(); 
+            }
+
+            @Override
+            public Statement next() {
+                Statement result = new InternalStatement(support, getQuick(index), getQuick(index+1), getQuick(index+2)); 
+                index += 3;
+                return result;
+            }
+
+            @Override
+            public void remove() {
+                throw new Error("Not supported");
+            }
+
+            @Override
+            public boolean hasPrevious() {
+                return index > 0;
+            }
+
+            @Override
+            public Statement previous() {
+                index -= 3;
+                Statement result = new InternalStatement(support, getQuick(index), getQuick(index+1), getQuick(index+2)); 
+                return result;
+            }
+
+            @Override
+            public int nextIndex() {
+                return index/3;
+            }
+
+            @Override
+            public int previousIndex() {
+                return index/3-1;
+            }
+
+            @Override
+            public void set(Statement e) {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public void add(Statement e) {
+                throw new UnsupportedOperationException();
+            }
+            
+        };
+        
+               @Override
+               public Iterator<Statement> iterator() {
+                       return new IteratorImpl(0);
+               }
+               
+               @Override
+               public int size() {
+                       return sizeInternal() / 3;
+               }
+
+               @Override
+               public Object[] toArray() {
+                   Object[] result = new Object[sizeInternal() / 3];
+                   for(int i=0,j=0;j<sizeInternal();i++,j+=3)
+                       result[i] = new InternalStatement(support, getQuick(j), getQuick(j+1), getQuick(j+2));
+                       return result;
+               }
+
+        @Override
+        public boolean addAll(int index, Collection<? extends Statement> c) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Statement get(int index) {
+            index += 3;
+            if(index < 0 || index >= sizeInternal())
+                throw new IndexOutOfBoundsException();
+            return new InternalStatement(support, getQuick(index), getQuick(index+1), getQuick(index+2));
+        }
+
+        @Override
+        public Statement set(int index, Statement element) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void add(int index, Statement element) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Statement remove(int index) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int indexOf(Object obj) {
+            if(!(obj instanceof InternalStatement))
+                return -1;
+            InternalStatement statement = (InternalStatement)obj;
+            int s = statement.s;
+            int p = statement.p;
+            int o = statement.o;
+            for(int i=0;i<sizeInternal();i+=3)
+                if(s==getQuick(i) && p==getQuick(i+1) && o==getQuick(i+2))
+                    return i/3;
+            return -1;
+        }
+
+        @Override
+        public int lastIndexOf(Object obj) {
+            if(!(obj instanceof InternalStatement))
+                return -1;
+            InternalStatement statement = (InternalStatement)obj;
+            int s = statement.s;
+            int p = statement.p;
+            int o = statement.o;
+            for(int i=sizeInternal()-3;i>=0;i-=3)
+                if(s==getQuick(i) && p==getQuick(i+1) && o==getQuick(i+2))
+                    return i/3;
+            return -1;
+        }
+
+        @Override
+        public ListIterator<Statement> listIterator() {
+            return new IteratorImpl(0);
+        }
+
+        @Override
+        public ListIterator<Statement> listIterator(int index) {
+            return new IteratorImpl(index*3);
+        }
+
+        @Override
+        public List<Statement> subList(int fromIndex, int toIndex) {
+            if(fromIndex < 0 || toIndex*3 >= sizeInternal() || fromIndex > toIndex)
+                throw new IndexOutOfBoundsException();
+            return new RandomAccessSubList<Statement>(this, fromIndex, toIndex-fromIndex);
+        }
+       }
+       
+       @Override
+       final public Collection<Statement> getStatements(final Resource subject,
+                       final Resource relation)
+                       throws ManyObjectsForFunctionalRelationException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+
+                       StatementReadProcedure procedure = new StatementReadProcedure(getResourceSupport());
+                       processor.forEachStatement(this, subject, relation, procedure);
+                       procedure.checkAndThrow();
+                       return procedure;
+                       
+               } catch (DatabaseException e) {
+
+                       System.err.println(INTERNAL_ERROR_STRING + " getStatements " + subject + " " + relation);
+
+                       StatementReadProcedure procedure = new StatementReadProcedure(getResourceSupport());
+                       processor.forEachStatement(this, subject, relation, procedure);
+                       
+                       return Collections.emptyList();
+               
+//                     throw new ServiceException(INTERNAL_ERROR_STRING + " getStatements " + subject + " " + relation, e);
+
+               }
+
+       }
+
+       @Override
+       final public Collection<Statement> getAssertedStatements(final Resource subject, final Resource relation)
+                       throws ManyObjectsForFunctionalRelationException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+
+                       return syncRequest(new ForEachAssertedStatement(subject, relation));
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
+
+                       throw new ManyObjectsForFunctionalRelationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Collection<Resource> getPredicates(final Resource subject) throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       return processor.getPredicates(this, subject);
+
+//                     AsyncMultiReadProcedure<Resource> procedure = new AsyncMultiReadProcedure<Resource>();
+//                     processor.forEachPredicate(this, subject, procedure);
+//                     procedure.checkAndThrow();
+//                     return procedure;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }  catch (Throwable e) {
+
+            throw new ServiceException(e);
+
+               }
+
+       }
+
+       @Override
+       final public Collection<Resource> getPrincipalTypes(final Resource subject)
+                       throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       AsyncMultiReadProcedure<Resource> procedure = new AsyncMultiReadProcedure<Resource>();
+                       processor.forEachPrincipalType(this, subject, procedure);
+                       procedure.checkAndThrow();
+                       return procedure;
+                       
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Set<Resource> getTypes(final Resource subject) throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+                       
+                       return processor.getTypes(this, subject);
+                       
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+                       
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+        } catch (Throwable e) {
+
+            throw new ServiceException(e);
+
+               }
+
+       }
+
+       @Override
+       final public Set<Resource> getSupertypes(final Resource subject)
+                       throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       SyncReadProcedure<Set<Resource>> procedure = new SyncReadProcedure<Set<Resource>>();
+                       processor.forSupertypes(this, subject, procedure);
+                       procedure.checkAndThrow();
+                       return procedure.result;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Set<Resource> getSuperrelations(final Resource subject)
+                       throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       SyncReadProcedure<Set<Resource>> procedure = new SyncReadProcedure<Set<Resource>>();
+                       processor.forSuperrelations(this, subject, procedure);
+                       procedure.checkAndThrow();
+                       return procedure.result;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+       
+       @Override
+       public Resource getPossibleSuperrelation(Resource subject) throws ServiceException {
+               
+               try {
+
+                       SyncReadProcedure<Resource> procedure = new SyncReadProcedure<Resource>();
+                       processor.forPossibleSuperrelation(this, subject, procedure);
+                       procedure.checkAndThrow();
+                       return procedure.result;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Collection<Resource> getObjects(final Resource subject, final Resource relation)
+                       throws ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               if(Development.DEVELOPMENT) {
+            if(Development.isTrue(DevelopmentKeys.READGRAPH_COUNT)) {
+               counters.adjustOrPutValue("objects $" + subject.getResourceId() + " $" + relation.getResourceId(), 1, 1);
+            }
+            //if(subject.getResourceId()==xx && relation.getResourceId()==xx) new Exception().printStackTrace();
+               }
+               
+               try {
+
+                       AsyncMultiReadProcedure<Resource> procedure = new AsyncMultiReadProcedure<Resource>();
+                       processor.forEachObject(this, subject, relation, procedure);
+                       procedure.checkAndThrow();
+                       return procedure;
+                       
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Collection<Resource> getAssertedObjects(
+                       final Resource subject, final Resource relation)
+                       throws ManyObjectsForFunctionalRelationException, ServiceException {
+
+        if (subject == null)
+            throw new ArgumentException("Subject must not be null.");
+        if (relation == null)
+            throw new ArgumentException("Relation must not be null. Subject=" + subject);
+
+               try {
+
+                       return syncRequest(new ForEachAssertedObject(subject, relation));
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
+
+                       throw new ManyObjectsForFunctionalRelationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Resource getInverse(final Resource relation) throws NoInverseException, ServiceException {
+
+               assert (relation != null);
+
+               try {
+
+                       return getSingleObject(relation, processor.querySupport.getResource(processor.getInverseOf()));
+
+               } catch (NoSingleResultException e) {
+
+                       throw new NoInverseException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               }
+
+       }
+
+       @Override
+       final public Resource getSingleObject(final Resource subject, final Resource relation) throws NoSingleResultException, ServiceException {
+
+               if( subject == null) throw new IllegalArgumentException("subject can not be null");
+               if( relation == null) throw new IllegalArgumentException("relation can not be null");
+
+               try {
+                       int single = processor.getSingleObject(this, subject, relation);
+                       if (single == 0) {
+                               if (EMPTY_RESOURCE_CHECK) {
+                                       if (!hasStatement(subject)) {
+                                               throw new EmptyResourceException("Resource " + debugString(subject));
+                                       }
+                               }
+                               throw new NoSingleResultException("No single object for subject " + debugString(subject)
+                                               + " and relation " + debugString(relation), single);
+                       }
+                       return processor.querySupport.getResource(single);
+               } catch (NoSingleResultException e) {
+                       throw e;
+               } catch (DatabaseException e) {
+                       throw new ServiceException(e);
+               } 
+       }
+
+       @Override
+       final public Statement getSingleStatement(final Resource subject, final Resource relation) throws NoSingleResultException, ManyObjectsForFunctionalRelationException, ServiceException {
+               assert (subject != null);
+               assert (relation != null);
+               try {
+                       Collection<Statement> statements = getStatements(subject, relation);
+                       if (statements.size() == 1) {
+                               return statements.iterator().next();
+                       } else {
+                               if (EMPTY_RESOURCE_CHECK)
+                                       if (!hasStatement(subject))
+                                               throw new EmptyResourceException("Resource " + debugString(subject));
+                               throw new NoSingleResultException("No single statement for subject " + debugString(subject)
+                                               + " and relation " + debugString(relation), statements.size());
+                       }
+               } catch (ServiceException e) {
+                       throw new ServiceException(e);
+               } 
+       }
+
+       @Override
+       final public Resource getSingleType(final Resource subject) throws NoSingleResultException, ServiceException {
+               assert (subject != null);
+               try {
+                       ArrayList<Resource> principalTypes = (ArrayList<Resource>)getPrincipalTypes(subject);
+                       if (principalTypes.size() == 1) {
+                           return principalTypes.get(0);
+                       } else {
+                           throw new NoSingleResultException("No single type for subject " + debugString(subject), principalTypes.size());
+                       }
+               } catch (ServiceException e) {
+                       throw new ServiceException(e);
+               } 
+       }
+
+       @Override
+       final public Resource getSingleType(final Resource subject,
+                       final Resource baseType) throws NoSingleResultException,
+                       ServiceException {
+
+               assert (subject != null);
+               assert (baseType != null);
+
+               try {
+                       return syncRequest(new SingleType(subject, baseType));
+               } catch (DatabaseException e) {
+                   throw new NoSingleResultException("subject=" + subject + ", baseType=" + baseType, 0, e);
+               }
+       }
+
+       @Override
+       final public <T> T getValue(final Resource subject) throws DoesNotContainValueException, ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       Layer0 L0 = processor.getL0(this);
+            int object = processor.getSingleObject(this, subject, L0.HasDataType);
+            if(object == 0) throw new DoesNotContainValueException("No data type for " + subject);
+            
+            if(processor.isImmutable(object)) {
+               Binding binding = syncRequest(new DatatypeBinding(processor.querySupport.getResource(object)), TransientCacheListener.<Binding>instance()); 
+                       return getValue(subject, binding);
+            } else {
+                   byte[] dt = processor.getValue(this, object);
+                   if(dt == null) throw new ServiceException("No data type for " + subject);
+                   Datatype datatype = (Datatype)DATA_TYPE_SERIALIZER.deserialize(dt);
+                   Binding binding = Bindings.getBinding(datatype);
+                   return getValue(subject, binding);
+            }
+                       
+        } catch (IOException e) {
+
+            throw new ServiceException(e);
+
+               } catch (DoesNotContainValueException e) {
+
+                       throw new DoesNotContainValueException(e, subject);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+        }
+
+       }
+
+    @Override
+    final public Variant getVariantValue(final Resource subject) throws DoesNotContainValueException, ServiceException {
+
+        assert (subject != null);
+
+        try {
+
+            Layer0 L0 = processor.getL0(this);
+            int object = processor.getSingleObject(this, subject, L0.HasDataType);
+            if(object == 0) throw new DoesNotContainValueException("No data type for " + subject);
+            
+            if(processor.isImmutable(object)) {
+                Binding binding = syncRequest(new DatatypeBinding(processor.querySupport.getResource(object)), TransientCacheListener.<Binding>instance()); 
+                return new Variant(binding, getValue(subject, binding));
+            } else {
+                byte[] dt = processor.getValue(this, object);
+                if(dt == null) throw new ServiceException("No data type for " + subject);
+                Datatype datatype = (Datatype)DATA_TYPE_SERIALIZER.deserialize(dt);
+                Binding binding = Bindings.getBinding(datatype);
+                return new Variant(binding, getValue(subject, binding));
+            }
+            
+        } catch (IOException e) {
+
+            throw new ServiceException(e);
+
+        } catch (DoesNotContainValueException e) {
+
+            throw new DoesNotContainValueException(e, subject);
+
+        } catch (ServiceException e) {
+
+            throw new ServiceException(e);
+
+        } catch (DatabaseException e) {
+
+            throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+        }              
+       }
+
+       static final IdentityHashMap<Binding,Serializer> serializers = new IdentityHashMap<Binding,Serializer>();
+       
+       static {
+               serializers.put(Bindings.STRING, Bindings.STRING.serializer());
+       }
+       
+       final protected Serializer getSerializer(Binding binding) {
+           return binding.serializer();
+       }
+       
+       @Override
+       final public <T> T getValue(final Resource subject, final Binding binding) throws DoesNotContainValueException, BindingException,
+                       ServiceException {
+
+               assert (subject != null);
+
+               byte[] bytes = null;
+               try {
+                       
+                       bytes = processor.getValue(this, subject);
+                       if (bytes == null) throw new DoesNotContainValueException("No value for resource " + subject);
+
+                       Serializer serializer = getSerializer(binding);
+                       return (T)serializer.deserialize(bytes);
+
+               } catch (DoesNotContainValueException e) {
+
+                       throw new DoesNotContainValueException(e);
+
+               } catch (Throwable t) {
+                       throw new ServiceException("Could not getValue for subject " + debugString(subject) + " and binding " + String.valueOf(binding) + " with bytes " + safeArrayToString(bytes), t);
+               }
+       }
+
+       @Override
+       final public <T> T getRelatedValue(final Resource subject, final Resource relation) throws NoSingleResultException,
+                       DoesNotContainValueException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+                       Resource object = getSingleObject(subject, relation);
+                       return getValue(object);
+               } catch (NoSingleResultException e) {
+                       throw new NoSingleResultException("No single value found for subject " + debugString(subject) + " and relation " + debugString(relation), e.getResultCount(), e);
+               } catch (DoesNotContainValueException e) {
+                       try {
+                               Layer0 L0 = processor.getL0(this);
+                               Resource object = getPossibleObject(subject, relation);
+                               if(isInstanceOf(object, L0.Value)) {
+                                       if(isInstanceOf(object, L0.Literal)) {
+                                               throw new DoesNotContainValueException(e);
+                                       } else {
+                                               throw new InvalidLiteralException("The object " + object + " is not an instance of L0.Literal (use getRelatedValue2 instead)", e);
+                                       }
+                               } else {
+                                       throw new DoesNotContainValueException("The object " + object + " is not an instance of L0.Value", e);
+                               }
+                       } catch (DoesNotContainValueException e2) {
+                               throw e2;
+                       } catch (DatabaseException e2) {
+                               throw new InternalException("The client failed to analyse the cause of the following exception", e);
+                       }
+               } catch (ServiceException e) {
+                       throw new ServiceException(e);
+               }
+       }
+
+    @Override
+    final public Variant getRelatedVariantValue(final Resource subject, final Resource relation) throws NoSingleResultException,
+            DoesNotContainValueException, ServiceException {
+
+        assert (subject != null);
+        assert (relation != null);
+
+        try {
+            Resource object = getSingleObject(subject, relation);
+            return getVariantValue(object);
+        } catch (NoSingleResultException e) {
+            throw new NoSingleResultException("No single object for subject " + debugString(subject) + " and relation " + debugString(relation), e.getResultCount(), e);
+        } catch (DoesNotContainValueException e) {
+            try {
+                Layer0 L0 = processor.getL0(this);
+                Resource object = getPossibleObject(subject, relation);
+                if(isInstanceOf(object, L0.Value)) {
+                    if(isInstanceOf(object, L0.Literal)) {
+                        throw new DoesNotContainValueException(e);
+                    } else {
+                        throw new InvalidLiteralException("The object " + object + " is not an instance of L0.Literal (use getRelatedValue2 instead)", e);
+                    }
+                } else {
+                    throw new DoesNotContainValueException("The object " + object + " is not an instance of L0.Value", e);
+                }
+            } catch (DoesNotContainValueException e2) {
+                throw e2;
+            } catch (DatabaseException e2) {
+                throw new InternalException("The client failed to analyse the cause of the following exception", e);
+            }
+        } catch (ServiceException e) {
+            throw new ServiceException(e);
+        } 
+    }
+    
+       @Override
+       final public <T> T getRelatedValue(final Resource subject, final Resource relation, final Binding binding)
+                       throws NoSingleResultException, DoesNotContainValueException, BindingException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+                       Resource object = getSingleObject(subject, relation);
+                       return getValue(object, binding);
+               } catch (NoSingleResultException e) {
+                   String message = "";
+                   try {
+                   String subjectName = NameUtils.getSafeName(this, subject, true);
+                   String relationName = NameUtils.getSafeName(this, relation, true);
+                   message = "Subject: " + subjectName + ", Relation: " + relationName;
+                   } catch (DatabaseException e2) {
+                       
+                   }
+            throw new NoSingleResultException(message, e.getResultCount(), e);
+               } catch (DoesNotContainValueException e) {
+                       throw new DoesNotContainValueException(e);
+               } catch (ServiceException e) {
+                       throw new ServiceException(e);
+               }
+       }
+
+       @Override
+       final public <T> T adapt(final Resource resource, final Class<T> clazz)
+                       throws AdaptionException, ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (clazz != null);
+
+               try {
+
+                       return syncRequest(new Adapter<T>(resource, clazz));
+
+               } catch (AdaptionException e) {
+
+                       throw new AdaptionException(e);
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public <T,C> T adaptContextual(final Resource resource, final C context, final Class<C> contextClass, final Class<T> clazz)
+                       throws AdaptionException, ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (context != null);
+
+               class ContextualAdapter implements AsyncRead<T> {
+
+                       final private Resource resource;
+                       final private C context;
+                   final private Class<T> clazz;
+                   
+                   @Override
+                   public int hashCode() {
+                       return resource.hashCode() + 31 * (clazz.hashCode() + 41 * context.hashCode());
+                   }
+                   
+                   @Override
+                   final public int threadHash() {
+                       return resource.getThreadHash();
+                   }
+                   
+                   @Override
+                   public boolean equals(Object object) {
+                       if (this == object)
+                           return true;
+                       else if (object == null)
+                           return false;
+                       else if (getClass() != object.getClass())
+                           return false;
+                       ContextualAdapter r = (ContextualAdapter)object;
+                       return resource.equals(r.resource) && context.equals(r.context) && clazz.equals(r.clazz);
+                   }
+
+                   @Override
+                   public int getFlags() {
+                       return 0;
+                   }
+                   
+                   public ContextualAdapter(Resource resource, C context, Class<T> clazz) {
+                       this.resource = resource;
+                       this.context = context;
+                       this.clazz = clazz;
+                   }
+
+                   @Override
+                   public void perform(AsyncReadGraph graph, AsyncProcedure<T> procedure) {
+                       
+                               final AdaptionService service = getSession().peekService(AdaptionService.class);
+                               if (service == null)
+                                       procedure.exception(graph, new ServiceException("No AdaptionService available")); 
+                               else
+                                       service.adapt(graph, resource, context, contextClass, clazz, false, procedure); 
+                       
+                   }
+
+                   @Override
+                   public String toString() {
+                       return "Adapter for (" + resource + "," + context + ") as " + clazz.getName();
+                   }
+                   
+               }
+               
+               try {
+
+                       return syncRequest(new ContextualAdapter(resource, context, clazz));
+
+               } catch (AdaptionException e) {
+
+                       throw new AdaptionException(e);
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+       
+       @Override
+       final public <T> T adaptRelated(final Resource resource, final Resource relation, final Class<T> clazz)
+                       throws AdaptionException, NoSingleResultException, ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (clazz != null);
+
+               Statement stm = getSingleStatement(resource, relation);
+               
+               Object o = adaptContextual(stm.getObject(), new RelationContextImpl(resource, stm), RelationContext.class, clazz);
+               if (clazz.isInstance(o))
+                       return (T)o;
+               throw new AdaptionException("Returned value is not expected class , got " + o.getClass().getName()+ " , expected " + clazz.getName());
+               
+       }
+
+       @Override
+       final public <T> T getPossibleRelatedAdapter(final Resource resource, final Resource relation, final Class<T> clazz)
+                       throws ValidationException, ServiceException {
+
+               try {
+                       return adaptRelated(resource, relation, clazz);
+               } catch (DatabaseException e) {
+                       return null;
+               }
+               
+       }
+
+       @Override
+       final public <T,C> T getPossibleContextualAdapter(final Resource resource, final C context, final Class<C> contextClass, final Class<T> clazz)
+                       throws ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (context != null);
+
+               class PossibleContextualAdapter implements AsyncRead<T> {
+
+                       final private Resource resource;
+                       final private C context;
+                   final private Class<T> clazz;
+                   
+                   @Override
+                   public int hashCode() {
+                       return resource.hashCode() + 31 * (clazz.hashCode() + 41 * context.hashCode());
+                   }
+                   
+                   @Override
+                   final public int threadHash() {
+                       return resource.getThreadHash();
+                   }
+                   
+                   @Override
+                   public boolean equals(Object object) {
+                       if (this == object)
+                           return true;
+                       else if (object == null)
+                           return false;
+                       else if (getClass() != object.getClass())
+                           return false;
+                       PossibleContextualAdapter r = (PossibleContextualAdapter)object;
+                       return resource.equals(r.resource) && context.equals(r.context) && clazz.equals(r.clazz);
+                   }
+
+                   @Override
+                   public int getFlags() {
+                       return 0;
+                   }
+                   
+                   public PossibleContextualAdapter(Resource resource, C context, Class<T> clazz) {
+                       this.resource = resource;
+                       this.context = context;
+                       this.clazz = clazz;
+                   }
+
+                   @Override
+                   public void perform(AsyncReadGraph graph, AsyncProcedure<T> procedure) {
+                       
+                               final AdaptionService service = getSession().peekService(AdaptionService.class);
+                               if (service == null)
+                                       procedure.exception(graph, new ServiceException("No AdaptionService available")); 
+                               else
+                                       service.adapt(graph, resource, context, contextClass, clazz, true, procedure); 
+                       
+                   }
+
+                   @Override
+                   public String toString() {
+                       return "Possible adapter for (" + resource + "," + context + ") as " + clazz.getName();
+                   }
+                   
+               }
+               
+               try {
+
+                       return syncRequest(new PossibleContextualAdapter(resource, context, clazz));
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+               
+       }
+
+       @Override
+       final public <T> T adaptUnique(final Resource resource, final Class<T> clazz)
+                       throws AdaptionException, ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (clazz != null);
+
+               try {
+
+                       return syncRequest(new UniqueAdapter<T>(resource, clazz));
+
+               } catch (AdaptionException e) {
+
+                       throw new AdaptionException(e);
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public Resource getPossibleInverse(final Resource relation)
+                       throws ServiceException {
+
+               assert (relation != null);
+
+               try {
+
+                       return getPossibleObject(relation, processor.querySupport.getResource(processor.getInverseOf()));
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       public Resource getPossibleObject(final Resource subject, final Resource relation)
+                       throws ManyObjectsForFunctionalRelationException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+
+                       int result = processor.getSingleObject(this, subject, relation);
+                       if(result == 0) return null;
+
+                       return processor.querySupport.getResource(result);
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
+
+                       throw new ManyObjectsForFunctionalRelationException("Many objects in " + subject + " for functional relation " + relation);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(e);
+
+               }
+               
+       }
+
+       @Override
+       final public Statement getPossibleStatement(final Resource subject, final Resource relation)
+                       throws ManyObjectsForFunctionalRelationException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+
+                       Collection<Statement> statements = getStatements(subject, relation);
+                       if(statements.size() == 1) return statements.iterator().next();
+                       else return null;
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
+
+                       throw new ManyObjectsForFunctionalRelationException("Many objects in " + subject + " for functional relation " + relation);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } 
+
+       }
+
+       @Override
+       final public Resource getPossibleType(final Resource subject, final Resource baseType) throws ServiceException {
+
+               assert (subject != null);
+               assert (baseType != null);
+
+               try {
+
+                       AsyncReadProcedure<Resource> procedure = new AsyncReadProcedure<Resource>();
+                       forPossibleType(subject, baseType, procedure);
+                       procedure.checkAndThrow();
+                       return procedure.result;                        
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public <T> T getPossibleValue(final Resource subject) throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+                   
+                   int object = processor.getSingleObject(this, subject, processor.getL0(this).HasDataType);
+                   if(object == 0) return null;
+                   
+            if(processor.isImmutable(object)) {
+               Binding binding = syncRequest(new DatatypeBinding(processor.querySupport.getResource(object)), TransientCacheListener.<Binding>instance()); 
+                       return getPossibleValue(subject, binding);
+            } else {
+                   byte[] dt = processor.getValue(this, object);
+                   if(dt == null) return null;
+                   Datatype datatype = (Datatype)DATA_TYPE_SERIALIZER.deserialize(dt);
+                   Binding binding = Bindings.getBinding(datatype);
+                   return getPossibleValue(subject, binding);
+            }
+                   
+        } catch (IOException e) {
+            
+            throw new ServiceException(e);
+            
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+        }
+
+       }
+
+       @Override
+       final public <T> T getPossibleValue(final Resource subject, final Binding binding) throws BindingException, ServiceException {
+
+               assert (subject != null);
+               assert (binding != null);
+
+               try {
+
+            byte[] dt = processor.getValue(this, subject);
+            if(dt == null) return null;
+                       Serializer serializer = getSerializer(binding);
+            return (T)serializer.deserialize(dt);
+
+        } catch (IOException e) {
+
+            throw new ServiceException(e);
+            
+               } catch (BindingException e) {
+
+                       throw new BindingException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+                       e.printStackTrace();
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+        }
+
+       }
+
+       @Override
+       public <T> T getPossibleRelatedValue(final Resource subject, final Resource relation)
+                       throws ManyObjectsForFunctionalRelationException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+
+                       Resource object = getPossibleObject(subject, relation);
+                       if(object == null) return null;
+                       else return getPossibleValue(object);
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
+
+                       throw new ManyObjectsForFunctionalRelationException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } 
+
+       }
+
+       @Override
+       public <T> T getPossibleRelatedValue(final Resource subject, final Resource relation, final Binding binding)
+                       throws ManyObjectsForFunctionalRelationException, BindingException, ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (binding != null);
+
+               try {
+
+                       Resource object = getPossibleObject(subject, relation);
+                       if(object == null) return null;
+                       else return getPossibleValue(object, binding);
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
+
+                       throw new ManyObjectsForFunctionalRelationException(e);
+
+               } catch (BindingException e) {
+
+                       throw new BindingException(e);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               }
+
+       }
+
+       @Override
+       public <T> T getPossibleAdapter(Resource resource, Class<T> clazz) throws ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (clazz != null);
+
+               try {
+
+                       return syncRequest(new PossibleAdapter<T>(resource, clazz));
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (AdaptionException e) {
+
+                       return null;
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+       }
+
+       @Override
+       public <T> T getPossibleUniqueAdapter(Resource resource, Class<T> clazz) throws ValidationException, ServiceException {
+
+               assert (resource != null);
+               assert (clazz != null);
+
+               try {
+
+                       return syncRequest(new PossibleUniqueAdapter<T>(resource, clazz));
+
+               } catch (AdaptionException e) {
+
+                       return null;
+
+               } catch (ValidationException e) {
+
+                       throw new ValidationException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+    @Override
+    final public boolean isInstanceOf(final Resource resource, final Resource type) throws ServiceException {
+
+        assert (resource != null);
+        assert (type != null);
+
+        Set<Resource> resources = getTypes(resource);
+        // This check was necessary because some of the callers of this method got stuck when the NPE was thrown from here.
+        if (null == resources)
+            return false;
+        
+        if(EMPTY_RESOURCE_CHECK) {
+            if (resources.isEmpty()) {
+                if(!hasStatement(resource)) throw new EmptyResourceException("Resource " + debugString(resource));
+            }
+        }
+        
+        return resources.contains(type);
+
+    }
+
+       @Override
+       final public boolean isInheritedFrom(final Resource resource, final Resource type) throws ServiceException {
+
+               assert (resource != null);
+               assert (type != null);
+
+               try {
+
+                       if(resource.equals(type)) return true;
+                       
+                       return getSupertypes(resource).contains(type);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } 
+               
+       }
+
+       @Override
+       final public boolean isSubrelationOf(final Resource resource, final Resource type) throws ServiceException {
+
+               assert (resource != null);
+               assert (type != null);
+
+               try {
+
+                       if(resource.equals(type)) return true;
+                       
+                       return getSuperrelations(resource).contains(type);
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } 
+
+       }
+
+       @Override
+       final public boolean hasStatement(final Resource subject) throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       SyncReadProcedure<Boolean> procedure = new SyncReadProcedure<Boolean>();
+                       processor.forHasStatement(this, subject, procedure);
+                       procedure.checkAndThrow();
+                       return procedure.result;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       @Override
+       final public boolean hasStatement(final Resource subject, final Resource relation) throws ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+
+               try {
+
+                       RelationInfo rinfo = processor.getRelationInfo(this, relation);
+                       Collection<Resource> predicates = getPredicates(subject);
+
+                       if (rinfo.isFinal) {
+
+                               return predicates.contains(relation);
+
+                       } else if (rinfo.isFunctional) {
+
+                               try {
+                                       return processor.getSingleObject(this, subject, relation) != 0;
+                               } catch (ManyObjectsForFunctionalRelationException e) {
+                                       return true;
+                               } catch (DatabaseException e) {
+                                       throw new ServiceException(e);
+                               }
+
+                       } else {
+
+                               for (Resource predicate : getPredicates(subject)) {
+                                       if (isSubrelationOf(predicate, relation))
+                                               return true;
+                               }
+
+                       }
+
+                       return false;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               } 
+               
+       }
+
+       @Override
+       final public boolean hasStatement(final Resource subject, final Resource relation, final Resource object) throws ServiceException {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (object != null);
+
+               try {
+
+                       for(Resource o : getObjects(subject, relation)) {
+                               if(object.equals(o)) return true;
+                       }
+                       
+                       return false;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               }
+
+       }
+
+       @Override
+       final public boolean hasValue(final Resource subject) throws ServiceException {
+
+               assert (subject != null);
+
+               try {
+
+                       SyncReadProcedure<Boolean> procedure = new SyncReadProcedure<Boolean>();
+                       processor.forHasValue(this, subject, procedure);
+                       procedure.checkAndThrow();
+                       return procedure.result;
+
+               } catch (ServiceException e) {
+
+                       throw new ServiceException(e);
+
+               } catch (DatabaseException e) {
+
+                       throw new ServiceException(INTERNAL_ERROR_STRING, e);
+
+               }
+
+       }
+
+       final AsyncProcedure<?> NONE = new AsyncProcedure<Object>() {
+
+               @Override
+               public void execute(AsyncReadGraph graph, Object result) {
+               }
+
+               @Override
+               public void exception(AsyncReadGraph graph, Throwable throwable) {
+               }
+               
+       };
+       
+       /*
+        * Implementation of the interface RequestProcessor
+        */
+
+    @Override
+    public <T> T syncRequest(final Read<T> request) throws DatabaseException {
+        assert (request != null);
+        return (T)QueryCache.runnerReadEntry(this, request, parent, null, null, true);
+    }
+
+       @Override
+       public <T> T syncRequest(Read<T> request, SyncListener<T> procedure)
+                       throws DatabaseException {
+               return syncRequest(request, new SyncToAsyncListener<T>(procedure));
+       }
+
+       @Override
+       public <T> T syncRequest(Read<T> request, final Listener<T> procedure)
+                       throws DatabaseException {
+               return syncRequest(request, new NoneToAsyncListener<T>(procedure));
+       }
+
+    @Override
+    public <T> T syncRequest(final Read<T> request, final AsyncProcedure<T> procedure) throws DatabaseException {
+        assert (request != null);
+        ListenerBase listener = procedure != null ? getListenerBase(procedure) : null;
+        return (T)QueryCache.runnerReadEntry(this, request, parent, listener, procedure, true);
+    }
+
+       @Override
+       public <T> T syncRequest(final Read<T> request,
+                       final SyncProcedure<T> procedure) throws DatabaseException {
+               return syncRequest(request, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> T syncRequest(Read<T> request, Procedure<T> procedure)
+                       throws DatabaseException {
+               return syncRequest(request, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       static class AsyncReadProcedure<T> implements AsyncProcedure<T> {
+
+               private static Throwable DONE = new Throwable();
+               
+               T result = null;
+               Throwable exception = null;
+               
+               @Override
+               public void execute(AsyncReadGraph graph, T t) {
+                       result = t;
+                       exception = DONE;
+               }
+
+               @Override
+               public void exception(AsyncReadGraph graph, Throwable t) {
+                       exception = t;
+               }
+               
+               public void checkAndThrow() throws DatabaseException {
+                       if(exception != DONE) {
+                               if (exception instanceof DatabaseException)
+                                       throw (DatabaseException) exception;
+                               else
+                                       throw new DatabaseException(
+                                                       "Unexpected exception in ReadGraph.syncRequest(AsyncRead)",
+                                                       exception);
+                       }
+               }
+               
+               public boolean done() {
+                       return exception != null;
+               }
+               
+       }
+       
+       @Override
+       public <T> T syncRequest(final AsyncRead<T> request)
+                       throws DatabaseException {
+
+               assert (request != null);
+               return syncRequest(request, new AsyncProcedureAdapter<>() );
+
+       }
+
+       @Override
+       public <T> T syncRequest(AsyncRead<T> request, AsyncListener<T> procedure)
+                       throws DatabaseException {
+               return syncRequest(request, (AsyncProcedure<T>) procedure);
+       }
+
+       @Override
+       public <T> T syncRequest(AsyncRead<T> request, SyncListener<T> procedure)
+                       throws DatabaseException {
+               return syncRequest(request, new SyncToAsyncListener<T>(procedure));
+       }
+
+       @Override
+       public <T> T syncRequest(AsyncRead<T> request, Listener<T> procedure)
+                       throws DatabaseException {
+               return syncRequest(request, new NoneToAsyncListener<T>(procedure));
+       }
+
+    @Override
+    final public <T> T syncRequest(final AsyncRead<T> request,
+            final AsyncProcedure<T> procedure) throws DatabaseException {
+        assert (request != null);
+        ListenerBase listener = getListenerBase(procedure);
+        return (T)QueryCache.runnerAsyncReadEntry(this, request, parent, listener, procedure, true); 
+    }
+
+       @Override
+       public <T> T syncRequest(AsyncRead<T> request,
+                       final SyncProcedure<T> procedure) throws DatabaseException {
+               return syncRequest(request, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> T syncRequest(final AsyncRead<T> request,
+                       final Procedure<T> procedure) throws DatabaseException {
+               return syncRequest(request, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(final MultiRead<T> request)
+                       throws DatabaseException {
+
+               assert (request != null);
+
+               final ArrayList<T> result = new ArrayList<T>();
+               final DataContainer<Throwable> exception = new DataContainer<Throwable>();
+
+               syncRequest(request, new SyncMultiProcedure<T>() {
+
+                       @Override
+                       public void execute(ReadGraph graph, T t) {
+                               synchronized (result) {
+                                       result.add(t);
+                               }
+                       }
+
+                       @Override
+                       public void finished(ReadGraph graph) {
+                       }
+
+                       @Override
+                       public void exception(ReadGraph graph, Throwable t) {
+                               exception.set(t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "syncRequest(MultiRead) -> " + request;
+                       }
+
+               });
+
+               Throwable t = exception.get();
+               if (t != null) {
+                       if (t instanceof DatabaseException)
+                               throw (DatabaseException) t;
+                       else
+                               throw new DatabaseException(
+                                               "Unexpected exception in ReadGraph.syncRequest(Read)",
+                                               t);
+               }
+
+               return result;
+
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(MultiRead<T> request,
+                       SyncMultiListener<T> procedure) {
+               return syncRequest(request, (SyncMultiProcedure<T>)procedure);
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(MultiRead<T> request,
+                       MultiListener<T> procedure) {
+               return syncRequest(request, new NoneToSyncMultiListener<T>(procedure));
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(MultiRead<T> request,
+                       SyncMultiProcedure<T> procedure) {
+
+               assert (request != null);
+
+               ListenerBase listener = getListenerBase(procedure);
+
+               final ResultCallWrappedSyncQueryProcedure<T> wrapper = new ResultCallWrappedSyncQueryProcedure<T>(procedure);
+
+               if (parent != null || listener != null) {
+
+//                     Object syncParent = request;
+
+//                     final ReadGraphImpl newGraph = newSync();
+
+                       processor.query(this, request, parent, wrapper, listener);
+
+//                     newGraph.waitAsync(syncParent);
+
+               } else {
+
+//                     Object syncParent = request;
+
+//                     final ReadGraphImpl newGraph = newSync();
+
+                       try {
+                               request.perform(this, wrapper);
+                       } catch (Throwable t) {
+                               wrapper.exception(this, t);
+                       }
+
+               }
+
+               return wrapper.get();
+
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(MultiRead<T> request,
+                       MultiProcedure<T> procedure) {
+               return syncRequest(request, new NoneToSyncMultiProcedure<T>(procedure));
+       }
+
+       static class AsyncMultiReadProcedure<T> extends ArrayList<T> implements AsyncMultiProcedure<T> {
+
+               private static Throwable DONE = new Throwable();
+               
+               private static final long serialVersionUID = -6494230465108115812L;
+               
+               Throwable exception = null;
+               
+               @Override
+               public synchronized void execute(AsyncReadGraph graph, T t) {
+                       add(t);
+               }
+
+               @Override
+               public void finished(AsyncReadGraph graph) {
+                       exception = DONE;
+               }
+
+               @Override
+               public void exception(AsyncReadGraph graph, Throwable t) {
+                       exception = t;
+               }
+               
+               public void checkAndThrow() throws DatabaseException {
+                       if(exception != DONE) {
+                               if (exception instanceof DatabaseException)
+                                       throw (DatabaseException) exception;
+                               else
+                                       throw new DatabaseException(
+                                                       "Unexpected exception in ReadGraph.syncRequest(AsyncMultiRead)",
+                                                       exception);
+                       }
+               }
+               
+               public boolean done() {
+                       return exception != null;
+               }
+               
+       }
+
+       @Override
+       final public <T> Collection<T> syncRequest(AsyncMultiRead<T> request)
+                       throws DatabaseException {
+
+               assert (request != null);
+
+               final AsyncMultiReadProcedure<T> procedure = new AsyncMultiReadProcedure<T>();
+               
+               syncRequest(request, procedure);
+               
+               procedure.checkAndThrow();
+               return procedure;
+
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,
+                       AsyncMultiListener<T> procedure) {
+               return syncRequest(request, (AsyncMultiProcedure<T>) procedure);
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,
+                       SyncMultiListener<T> procedure) {
+               return syncRequest(request, new SyncToAsyncMultiListener<T>(procedure));
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,
+                       MultiListener<T> procedure) {
+               return syncRequest(request, new NoneToAsyncMultiListener<T>(procedure));
+       }
+
+       final private <T> void syncRequest(final AsyncMultiRead<T> request,
+                       final AsyncMultiReadProcedure<T> procedure) {
+
+               assert (request != null);
+               assert (procedure != null);
+
+               ListenerBase listener = getListenerBase(procedure);
+
+               if (parent != null || listener != null) {
+
+//                     Object syncParent = request;
+
+//                     final ReadGraphImpl newGraph = newSync();
+
+                       processor.query(this, request, parent, procedure, listener);
+
+//                     newGraph.waitAsync(syncParent);
+                       waitAsyncProcedure(procedure);
+
+               } else {
+
+//                     Object syncParent = callerThread == Integer.MIN_VALUE ? null
+//                                     : request;
+//
+//                     final ReadGraphImpl newGraph = newSyncAsync(syncParent);
+
+                       try {
+
+//                             inc();
+//                             ReadGraphImpl sync = newSync();
+                               request.perform(this, procedure);
+//                             sync.waitAsync(null);
+                               waitAsyncProcedure(procedure);
+//                             dec();
+
+                       } catch (Throwable t) {
+
+                               waitAsyncProcedure(procedure);
+//                             dec();
+
+                       }
+
+               }
+
+       }
+       
+       
+       @Override
+       final public <T> Collection<T> syncRequest(final AsyncMultiRead<T> request,
+                       final AsyncMultiProcedure<T> procedure) {
+
+               assert (request != null);
+               assert (procedure != null);
+
+               ListenerBase listener = getListenerBase(procedure);
+
+               if (parent != null || listener != null) {
+
+//                     Object syncParent = request;
+
+//                     final ReadGraphImpl newGraph = newSync();
+
+                       processor.query(this, request, parent, procedure, listener);
+
+//                     newGraph.waitAsync(syncParent);
+
+               } else {
+
+//                     Object syncParent = request;
+
+//                     final ReadGraphImpl newGraph = newSync();
+
+                       try {
+
+                               request.perform(this, new AsyncMultiProcedure<T>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph, T result) {
+                                               procedure.execute(graph, result);
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               procedure.finished(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               procedure.exception(graph, t);
+                                       }
+
+                                       @Override
+                                       public String toString() {
+                                               return "syncRequest(AsyncMultiRead) -> " + procedure;
+                                       }
+
+                               });
+
+                       } catch (Throwable t) {
+
+                       }
+
+               }
+
+               // TODO!!
+               return null;
+
+       }
+
+       @Override
+       public <T> Collection<T> syncRequest(AsyncMultiRead<T> request,
+                       final SyncMultiProcedure<T> procedure) {
+               return syncRequest(request, new SyncToAsyncMultiProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> Collection<T> syncRequest(final AsyncMultiRead<T> request,
+                       final MultiProcedure<T> procedure) {
+               return syncRequest(request, new NoneToAsyncMultiProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> T syncRequest(final ExternalRead<T> request)
+                       throws DatabaseException {
+
+               assert (request != null);
+
+               return syncRequest(request, new Procedure<T>() {
+
+                       @Override
+                       public void execute(T t) {
+                       }
+
+                       @Override
+                       public void exception(Throwable t) {
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "syncRequest(AsyncRead) -> " + request;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public <T> T syncRequest(ExternalRead<T> request, Listener<T> procedure) throws DatabaseException {
+               return syncRequest(request, (Procedure<T>) procedure);
+       }
+
+       @Override
+       final public <T> T syncRequest(final ExternalRead<T> request,
+                       final Procedure<T> procedure) throws DatabaseException {
+
+        assert (request != null);
+
+        ListenerBase listener = procedure != null ? getListenerBase(procedure) : null;
+        return QueryCache.resultExternalReadEntry(this, request, parent, listener, procedure);
+
+       }
+
+       @Override
+       public void syncRequest(final Write request) throws DatabaseException {
+
+               assert (request != null);
+
+               throw new DatabaseException(
+                               "Write operations are not supported during read transactions!");
+
+       }
+
+       @Override
+       public <T> T syncRequest(final WriteResult<T> request) throws DatabaseException {
+
+               assert (request != null);
+
+               throw new DatabaseException(
+                               "Write operations are not supported during read transactions!");
+
+       }
+
+       @Override
+       public void syncRequest(final DelayedWrite request)
+                       throws DatabaseException {
+
+               assert (request != null);
+
+               throw new DatabaseException(
+                               "Write operations are not supported during read transactions!");
+
+       }
+
+       @Override
+       public <T> T syncRequest(final DelayedWriteResult<T> request) throws DatabaseException {
+
+               assert (request != null);
+
+               throw new DatabaseException(
+                               "Write operations are not supported during read transactions!");
+
+       }
+       
+       @Override
+       public void syncRequest(final WriteOnly request) throws DatabaseException {
+
+               assert (request != null);
+
+               throw new DatabaseException(
+                               "Write operations are not supported during read transactions!");
+
+       }
+
+       @Override
+       public <T> T syncRequest(final WriteOnlyResult<T> request) throws DatabaseException {
+
+               assert (request != null);
+
+               throw new DatabaseException(
+                               "Write operations are not supported during read transactions!");
+
+       }
+       
+       @Override
+       public <T> void async(ReadInterface<T> r, AsyncProcedure<T> procedure) {
+               r.request(this, procedure);
+       }
+       
+       @Override
+       public <T> void async(ReadInterface<T> r, Procedure<T> procedure) {
+               r.request(this, procedure);
+       }
+       
+       @Override
+       public <T> void async(ReadInterface<T> r, SyncProcedure<T> procedure) {
+               r.request(this, procedure);
+       }
+       
+       @Override
+       public <T> void async(ReadInterface<T> r, AsyncListener<T> procedure) {
+               r.request(this, procedure);
+       }
+       
+       @Override
+       public <T> void async(ReadInterface<T> r, Listener<T> procedure) {
+               r.request(this, procedure);
+       }
+       
+       @Override
+       public <T> void async(ReadInterface<T> r, SyncListener<T> procedure) {
+               r.request(this, procedure);
+       }
+
+       @Override
+       public <T> T sync(ReadInterface<T> r) throws DatabaseException {
+               return r.request(this);
+       }
+       
+       @Override
+       public <T> T sync(WriteInterface<T> r) throws DatabaseException {
+               return r.request(this);
+       }
+       
+       @Override
+       public <T> void async(WriteInterface<T> r, Procedure<T> procedure) {
+               r.request(this, procedure);
+       }
+
+       @Override
+       public <T> void async(WriteInterface<T> r) {
+               r.request(this, new ProcedureAdapter<T>());
+       }
+
+       /*
+        * Implementation of the interface AsyncReadGraph
+        */
+
+       @Override
+       public void forURI(Resource resource, AsyncListener<String> listener) {
+               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),
+                               listener);
+       }
+
+       @Override
+       public void forURI(Resource resource, SyncListener<String> listener) {
+               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),
+                               listener);
+       }
+
+       @Override
+       public void forURI(Resource resource, Listener<String> listener) {
+               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),
+                               listener);
+       }
+
+       @Override
+       final public void forURI(final Resource resource,
+                       final AsyncProcedure<String> procedure) {
+
+               assert (resource != null);
+               assert (procedure != null);
+
+               asyncRequest(new org.simantics.db.common.uri.ResourceToURI(resource),
+                               procedure);
+
+       }
+
+       @Override
+       public void forURI(Resource resource, SyncProcedure<String> procedure) {
+               forURI(resource, new SyncToAsyncProcedure<String>(procedure));
+       }
+
+       @Override
+       public void forURI(Resource resource, Procedure<String> procedure) {
+               forURI(resource, new NoneToAsyncProcedure<String>(procedure));
+       }
+       
+       @Override
+       public void forResource(String id, AsyncListener<Resource> listener) {
+               asyncRequest(new org.simantics.db.common.primitiverequest.Resource(id),
+                               listener);
+       }
+
+       @Override
+       public void forResource(String id, SyncListener<Resource> listener) {
+               asyncRequest(new org.simantics.db.common.primitiverequest.Resource(id),
+                               listener);
+       }
+
+       @Override
+       public void forResource(String id, Listener<Resource> listener) {
+               asyncRequest(new org.simantics.db.common.primitiverequest.Resource(id),
+                               listener);
+       }
+
+       @Override
+       final public void forResource(final String id,
+                       final AsyncProcedure<Resource> procedure) {
+
+               assert (id != null);
+               assert (procedure != null);
+
+               processor.forResource(this, id, procedure);
+
+       }
+
+       @Override
+       public void forResource(String id, SyncProcedure<Resource> procedure) {
+               forResource(id, new SyncToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forResource(String id, Procedure<Resource> procedure) {
+               forResource(id, new NoneToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forBuiltin(String id, AsyncListener<Resource> listener) {
+               asyncRequest(new Builtin(id), listener);
+       }
+
+       @Override
+       public void forBuiltin(String id, SyncListener<Resource> listener) {
+               asyncRequest(new Builtin(id), listener);
+       }
+
+       @Override
+       public void forBuiltin(String id, Listener<Resource> listener) {
+               asyncRequest(new Builtin(id), listener);
+       }
+
+       @Override
+       final public void forBuiltin(final String id,
+                       final AsyncProcedure<Resource> procedure) {
+
+               assert (id != null);
+               assert (procedure != null);
+
+               processor.forBuiltin(this, id, procedure);
+
+       }
+
+       @Override
+       public void forBuiltin(String id, SyncProcedure<Resource> procedure) {
+               forBuiltin(id, new SyncToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forBuiltin(String id, Procedure<Resource> procedure) {
+               forBuiltin(id, new NoneToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       final public void forEachStatement(Resource subject, Resource relation,
+                       AsyncMultiProcedure<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachStatement(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       public void forEachStatement(Resource subject, Resource relation,
+                       SyncMultiProcedure<Statement> procedure) {
+               forEachStatement(subject, relation,
+                               new SyncToAsyncMultiProcedure<Statement>(procedure));
+       }
+
+       @Override
+       final public void forEachStatement(Resource subject, Resource relation,
+                       MultiProcedure<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachStatement(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       final public void forStatementSet(Resource subject, Resource relation,
+                       AsyncSetListener<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forStatementSet(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       final public void forStatementSet(Resource subject, Resource relation,
+                       SyncSetListener<Statement> procedure) {
+               forStatementSet(subject, relation,
+                               new SyncToAsyncSetProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forStatementSet(Resource subject, Resource relation,
+                       SetListener<Statement> listener) {
+               forStatementSet(subject, relation,
+                               new NoneToAsyncSetProcedure<Statement>(listener));
+       }
+
+       @Override
+       final public void forEachAssertedStatement(final Resource subject,
+                       final Resource relation,
+                       final AsyncMultiProcedure<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachAssertedStatement(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       public void forEachAssertedStatement(Resource subject, Resource relation,
+                       SyncMultiProcedure<Statement> procedure) {
+               forEachAssertedStatement(subject, relation,
+                               new SyncToAsyncMultiProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forEachAssertedStatement(Resource subject, Resource relation,
+                       MultiProcedure<Statement> procedure) {
+               forEachAssertedStatement(subject, relation,
+                               new NoneToAsyncMultiProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forAssertedStatementSet(Resource subject, Resource relation,
+                       AsyncSetListener<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forAssertedStatementSet(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       public void forAssertedStatementSet(Resource subject, Resource relation,
+                       SyncSetListener<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forAssertedStatementSet(subject, relation,
+                               new SyncToAsyncSetProcedure<Statement>(procedure));
+
+       }
+
+       @Override
+       public void forAssertedStatementSet(Resource subject, Resource relation,
+                       SetListener<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forAssertedStatementSet(subject, relation,
+                               new NoneToAsyncSetProcedure<Statement>(procedure));
+
+       }
+
+       @Override
+       final public void forEachPredicate(final Resource subject,
+                       final AsyncMultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forEachPredicate(this, subject, procedure);
+
+       }
+
+       @Override
+       public void forEachPredicate(Resource subject,
+                       SyncMultiProcedure<Resource> procedure) {
+               forEachPredicate(subject, new SyncToAsyncMultiProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       final public void forEachPredicate(final Resource subject,
+                       final MultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forEachPredicate(this, subject, procedure);
+
+       }
+
+       @Override
+       final public void forPredicateSet(final Resource subject,
+                       final AsyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forPredicateSet(this, subject, procedure);
+
+       }
+
+       @Override
+       final public void forPredicateSet(final Resource subject,
+                       final SyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               forPredicateSet(subject, new SyncToAsyncSetProcedure<Resource>(
+                               procedure));
+
+       }
+
+       @Override
+       final public void forPredicateSet(final Resource subject,
+                       final SetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               forPredicateSet(subject, new NoneToAsyncSetProcedure<Resource>(
+                               procedure));
+
+       }
+
+       @Override
+       final public void forEachPrincipalType(final Resource subject,
+                       final AsyncMultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forEachPrincipalType(this, subject, procedure);
+
+       }
+
+       @Override
+       public void forEachPrincipalType(Resource subject,
+                       SyncMultiProcedure<Resource> procedure) {
+               forEachPrincipalType(subject, new SyncToAsyncMultiProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       final public void forEachPrincipalType(final Resource subject,
+                       final MultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forEachPrincipalType(this, subject, procedure);
+
+       }
+
+       @Override
+       final public void forPrincipalTypeSet(final Resource subject,
+                       final AsyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forPrincipalTypeSet(this, subject, procedure);
+
+       }
+
+       @Override
+       final public void forPrincipalTypeSet(final Resource subject,
+                       final SyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               forPrincipalTypeSet(subject, new SyncToAsyncSetProcedure<Resource>(
+                               procedure));
+
+       }
+
+       @Override
+       final public void forPrincipalTypeSet(final Resource subject,
+                       final SetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               forPrincipalTypeSet(subject, new NoneToAsyncSetProcedure<Resource>(
+                               procedure));
+
+       }
+
+       @Override
+       public void forTypes(Resource subject, AsyncListener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       public void forTypes(Resource subject, SyncListener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       public void forTypes(Resource subject, Listener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       final public void forTypes(final Resource subject,
+                       final AsyncProcedure<Set<Resource>> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forTypes(this, subject, procedure);
+
+       }
+
+       @Override
+       public void forTypes(Resource subject,
+                       SyncProcedure<Set<Resource>> procedure) {
+               forTypes(subject, new SyncToAsyncProcedure<Set<Resource>>(procedure));
+       }
+
+       @Override
+       public void forTypes(Resource subject, Procedure<Set<Resource>> procedure) {
+               forTypes(subject, new NoneToAsyncProcedure<Set<Resource>>(procedure));
+       }
+
+       @Override
+       public void forSupertypes(Resource subject,
+                       AsyncListener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       public void forSupertypes(Resource subject,
+                       SyncListener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       public void forSupertypes(Resource subject, Listener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       final public void forSupertypes(final Resource subject,
+                       final AsyncProcedure<Set<Resource>> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forSupertypes(this, subject, procedure);
+
+       }
+
+       @Override
+       public void forSupertypes(Resource subject,
+                       SyncProcedure<Set<Resource>> procedure) {
+               forSupertypes(subject, new SyncToAsyncProcedure<Set<Resource>>(
+                               procedure));
+       }
+
+       @Override
+       public void forSupertypes(Resource subject,
+                       Procedure<Set<Resource>> procedure) {
+               forSupertypes(subject, new NoneToAsyncProcedure<Set<Resource>>(
+                               procedure));
+       }
+
+       @Override
+       public void forDirectSuperrelations(Resource subject,
+                       AsyncMultiProcedure<Resource> procedure) {
+               
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forDirectSuperrelations(this, subject, procedure);
+               
+       }
+
+       @Override
+       public void forPossibleSuperrelation(Resource subject, AsyncProcedure<Resource> procedure) {
+               
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forPossibleSuperrelation(this, subject, procedure);
+               
+       }
+
+       @Override
+       public void forSuperrelations(Resource subject,
+                       AsyncListener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       public void forSuperrelations(Resource subject,
+                       SyncListener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       public void forSuperrelations(Resource subject,
+                       Listener<Set<Resource>> listener) {
+               asyncRequest(new Types(subject), listener);
+       }
+
+       @Override
+       final public void forSuperrelations(final Resource subject,
+                       final AsyncProcedure<Set<Resource>> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forSuperrelations(this, subject, procedure);
+
+       }
+
+       @Override
+       public void forSuperrelations(Resource subject,
+                       SyncProcedure<Set<Resource>> procedure) {
+               forSuperrelations(subject, new SyncToAsyncProcedure<Set<Resource>>(
+                               procedure));
+       }
+
+       @Override
+       public void forSuperrelations(Resource subject,
+                       Procedure<Set<Resource>> procedure) {
+               forSuperrelations(subject, new NoneToAsyncProcedure<Set<Resource>>(
+                               procedure));
+       }
+
+       @Override
+       final public void forEachObject(final Resource subject, final Resource relation, final AsyncMultiProcedure<Resource> procedure) {
+               processor.forEachObject(this, subject, relation, procedure);
+       }
+
+       @Override
+       public void forEachObject(Resource subject, Resource relation,
+                       SyncMultiProcedure<Resource> procedure) {
+               forEachObject(subject, relation,
+                               new SyncToAsyncMultiProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forEachObject(Resource subject, Resource relation,
+                       MultiProcedure<Resource> procedure) {
+
+               processor.forEachObject(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       final public void forEachDirectPredicate(final Resource subject, final AsyncProcedure<Set<Resource>> procedure) {
+               processor.forEachDirectPredicate(this, subject, procedure);
+       }
+
+       @Override
+       final public void forEachDirectPredicate(final Resource subject, final SyncProcedure<Set<Resource>> procedure) {
+               forEachDirectPredicate(subject, new SyncToAsyncProcedure<Set<Resource>>(procedure));
+       }
+
+       @Override
+       public void forEachDirectPredicate(Resource subject, Procedure<Set<Resource>> procedure) {
+               forEachDirectPredicate(subject, new NoneToAsyncProcedure<Set<Resource>>(procedure));
+       }
+
+       @Override
+       final public void forObjectSet(final Resource subject,
+                       final Resource relation, final AsyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forObjectSet(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       final public void forObjectSet(final Resource subject,
+                       final Resource relation, final SyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forObjectSet(subject, relation, new SyncToAsyncSetProcedure<Resource>(
+                               procedure));
+
+       }
+
+       @Override
+       final public void forObjectSet(final Resource subject,
+                       final Resource relation, final SetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forObjectSet(subject, relation, new NoneToAsyncSetProcedure<Resource>(
+                               procedure));
+
+       }
+
+       @Override
+       final public void forEachAssertedObject(final Resource subject,
+                       final Resource relation,
+                       final AsyncMultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachAssertedObject(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       public void forEachAssertedObject(Resource subject, Resource relation,
+                       SyncMultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forEachAssertedObject(subject, relation,
+                               new SyncToAsyncMultiProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forEachAssertedObject(Resource subject, Resource relation,
+                       MultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forEachAssertedObject(subject, relation,
+                               new NoneToAsyncMultiProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forAssertedObjectSet(Resource subject, Resource relation,
+                       AsyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forAssertedObjectSet(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       public void forAssertedObjectSet(Resource subject, Resource relation,
+                       SyncSetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forAssertedObjectSet(subject, relation,
+                               new SyncToAsyncSetProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forAssertedObjectSet(Resource subject, Resource relation,
+                       SetListener<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               forAssertedObjectSet(subject, relation,
+                               new NoneToAsyncSetProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forInverse(Resource relation, AsyncListener<Resource> listener) {
+               asyncRequest(new Inverse(relation), listener);
+       }
+
+       @Override
+       public void forInverse(Resource relation, SyncListener<Resource> listener) {
+               asyncRequest(new Inverse(relation), listener);
+       }
+
+       @Override
+       public void forInverse(Resource relation, Listener<Resource> listener) {
+               asyncRequest(new Inverse(relation), listener);
+       }
+
+       @Override
+       final public void forInverse(final Resource relation,
+                       final AsyncProcedure<Resource> procedure) {
+
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forInverse(this, relation, new AsyncProcedure<Resource>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, Resource result) {
+                               if (result != null)
+                                       procedure.execute(graph, result);
+                               else {
+                                       procedure.exception(graph, new NoInverseException(relation
+                                                       .toString()));
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable throwable) {
+                               procedure.exception(graph, throwable);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forInverse -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void forInverse(Resource relation, SyncProcedure<Resource> procedure) {
+               forInverse(relation, new SyncToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forInverse(Resource relation, Procedure<Resource> procedure) {
+               forInverse(relation, new NoneToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forSingleObject(Resource subject, Resource relation,
+                       AsyncListener<Resource> listener) {
+               asyncRequest(new SingleObject(subject, relation), listener);
+       }
+
+       @Override
+       public void forSingleObject(Resource subject, Resource relation,
+                       SyncListener<Resource> listener) {
+               asyncRequest(new SingleObject(subject, relation), listener);
+       }
+
+       @Override
+       public void forSingleObject(Resource subject, Resource relation,
+                       Listener<Resource> listener) {
+               asyncRequest(new SingleObject(subject, relation), listener);
+       }
+
+       @Override
+       final public void forSingleObject(final Resource subject,
+                       final Resource relation, final AsyncProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachObject(this, subject, relation,
+                               new SingleOrErrorProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forSingleObject(Resource subject, Resource relation,
+                       SyncProcedure<Resource> procedure) {
+               forSingleObject(subject, relation, new SyncToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forSingleObject(Resource subject, Resource relation,
+                       Procedure<Resource> procedure) {
+               forSingleObject(subject, relation, new NoneToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forSingleStatement(Resource subject, Resource relation,
+                       AsyncListener<Statement> listener) {
+               asyncRequest(new SingleStatement(subject, relation), listener);
+       }
+
+       @Override
+       public void forSingleStatement(Resource subject, Resource relation,
+                       SyncListener<Statement> listener) {
+               asyncRequest(new SingleStatement(subject, relation), listener);
+       }
+
+       @Override
+       public void forSingleStatement(Resource subject, Resource relation,
+                       Listener<Statement> listener) {
+               asyncRequest(new SingleStatement(subject, relation), listener);
+       }
+
+       @Override
+       final public void forSingleStatement(final Resource subject,
+                       final Resource relation, final AsyncProcedure<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachStatement(this, subject, relation,
+                               new SingleOrErrorProcedure<Statement>(procedure));
+
+       }
+
+       @Override
+       public void forSingleStatement(Resource subject, Resource relation,
+                       SyncProcedure<Statement> procedure) {
+               forSingleStatement(subject, relation,
+                               new SyncToAsyncProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forSingleStatement(Resource subject, Resource relation,
+                       Procedure<Statement> procedure) {
+               forSingleStatement(subject, relation,
+                               new NoneToAsyncProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forSingleType(Resource subject,
+                       AsyncListener<Resource> listener) {
+               asyncRequest(new SingleTypeAny(subject), listener);
+       }
+
+       @Override
+       public void forSingleType(Resource subject,
+                       SyncListener<Resource> listener) {
+               asyncRequest(new SingleTypeAny(subject), listener);
+       }
+
+       @Override
+       public void forSingleType(Resource subject,
+                       Listener<Resource> listener) {
+               asyncRequest(new SingleTypeAny(subject), listener);
+       }
+
+       @Override
+       final public void forSingleType(final Resource subject, final AsyncProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               final DeepSingleOrErrorProcedure<Resource> checkedProcedure = new DeepSingleOrErrorProcedure<Resource>(procedure);
+
+               processor.forEachPrincipalType(this, subject, new AsyncMultiProcedureAdapter<Resource>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, final Resource principalType) {
+                               checkedProcedure.offer(graph, principalType);
+                       }
+
+                       @Override
+                       public void finished(AsyncReadGraph graph) {
+                               checkedProcedure.dec(graph);
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               checkedProcedure.exception(graph, t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forSingleType -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void forSingleType(Resource subject, SyncProcedure<Resource> procedure) {
+               forSingleType(subject, new SyncToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forSingleType(Resource subject, Procedure<Resource> procedure) {
+               forSingleType(subject, new NoneToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forSingleType(Resource subject, Resource relation,
+                       AsyncListener<Resource> listener) {
+               asyncRequest(new SingleType(subject, relation), listener);
+       }
+
+       @Override
+       public void forSingleType(Resource subject, Resource relation,
+                       SyncListener<Resource> listener) {
+               asyncRequest(new SingleType(subject, relation), listener);
+       }
+
+       @Override
+       public void forSingleType(Resource subject, Resource relation,
+                       Listener<Resource> listener) {
+               asyncRequest(new SingleType(subject, relation), listener);
+       }
+
+       @Override
+       final public void forSingleType(final Resource subject,
+                       final Resource baseType, final AsyncProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               final DeepSingleOrErrorProcedure<Resource> checkedProcedure = new DeepSingleOrErrorProcedure<Resource>(procedure);
+
+               processor.forEachPrincipalType(this, subject,
+                               new AsyncMultiProcedureAdapter<Resource>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph,
+                                                       final Resource principalType) {
+
+                                               checkedProcedure.inc();
+
+                                               if(baseType == null) {
+
+                                                       checkedProcedure.offer(graph, principalType);
+                                                       checkedProcedure.dec(graph);
+
+                                               } else if(principalType.equals(baseType)) {
+
+                                                       checkedProcedure.offer(graph, principalType);
+                                                       checkedProcedure.dec(graph);
+
+                                               } else {
+
+                                                       processor.forSupertypes((ReadGraphImpl)graph, principalType,
+                                                                       new AsyncProcedure<Set<Resource>>() {
+
+                                                                               @Override
+                                                                               public void execute(
+                                                                                               AsyncReadGraph graph,
+                                                                                               Set<Resource> result) {
+
+                                                                                       if (result.contains(baseType))
+                                                                                               checkedProcedure.offer(graph,
+                                                                                                               principalType);
+                                                                                       checkedProcedure.dec(graph);
+
+                                                                               }
+
+                                                                               @Override
+                                                                               public void exception(
+                                                                                               AsyncReadGraph graph,
+                                                                                               Throwable t) {
+                                                                                       checkedProcedure
+                                                                                                       .exception(graph, t);
+                                                                               }
+
+                                                                       });
+
+                                               }
+
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               checkedProcedure.exception(graph, t);
+                                       }
+
+                                       @Override
+                                       public String toString() {
+                                               return "forSingleType -> " + procedure;
+                                       }
+
+                               });
+
+       }
+
+       @Override
+       public void forSingleType(Resource subject, Resource relation,
+                       SyncProcedure<Resource> procedure) {
+               forSingleType(subject, relation, new SyncToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forSingleType(Resource subject, Resource relation,
+                       Procedure<Resource> procedure) {
+               forSingleType(subject, relation, new NoneToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, Binding binding,
+                       AsyncListener<T> listener) {
+               asyncRequest(new Value<T>(subject, binding), listener);
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, Binding binding,
+                       SyncListener<T> listener) {
+               asyncRequest(new Value<T>(subject, binding), listener);
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, Binding binding,
+                       Listener<T> listener) {
+               asyncRequest(new Value<T>(subject, binding), listener);
+       }
+
+       @Override
+       public <T> void forValue(final Resource resource, final Binding binding,
+                       final AsyncProcedure<T> procedure) {
+
+               assert (resource != null);
+               assert (binding != null);
+               assert (procedure != null);
+               
+               processor.forValue(this, resource, new AsyncProcedure<byte[]>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, byte[] result) {
+                               
+                               try {
+
+                                       if (result == null) {
+                                               procedure.exception(graph,
+                                                               new DoesNotContainValueException(
+                                                                               "No value for resource " + resource));
+                                               return;
+                                       }
+
+                                       Serializer serializer = binding.serializer();
+//                                     Serializer serializer = Bindings.getSerializer( binding );
+                                       Object obj = serializer.deserialize(result);
+//                                     if (!binding.isInstance(obj))
+//                                             procedure.exception(graph, new ClassCastException(
+//                                                             "Cannot get value " + obj + " with binding "
+//                                                                             + binding));
+//                                     else
+                                               procedure.execute(graph, (T) obj);
+
+                               } catch (Throwable t) {
+                                   procedure.exception(graph, new ServiceException("Could not forValue for subject " + debugString(resource) + " and binding " + String.valueOf(binding) + " with bytes " + safeArrayToString(result), t));
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               try {
+                                       procedure.exception(graph, t);
+                               } catch (Throwable t2) {
+                               Logger.defaultLogError(t2);
+                               }
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forValue -> " + procedure;
+                       }
+
+               });
+
+       }
+       
+    private static String safeArrayToString(byte[] a) {
+        if (a == null)
+            return "null";
+        int iMax = a.length - 1;
+        if (iMax == -1)
+            return "[]";
+
+        StringBuilder b = new StringBuilder();
+        b.append('[');
+        for (int i = 0; i < 100; i++) { // limit to first 100 items 
+            b.append(a[i]);
+            if (i == iMax)
+                return b.append(']').toString();
+            b.append(", ");
+        }
+        return b.append(", ... (" + a.length + ")]").toString();
+    }
+
+       @Override
+       public <T> void forValue(Resource subject, Binding binding,
+                       SyncProcedure<T> procedure) {
+               forValue(subject, binding, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, Binding binding,
+                       Procedure<T> procedure) {
+               forValue(subject, binding, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, AsyncListener<T> listener) {
+               asyncRequest(new ValueImplied<T>(subject), listener);
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, SyncListener<T> listener) {
+               asyncRequest(new ValueImplied<T>(subject), listener);
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, Listener<T> listener) {
+               asyncRequest(new ValueImplied<T>(subject), listener);
+       }
+
+       @Override
+       final public <T> void forValue(final Resource subject, final AsyncProcedure<T> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+               
+               forRelatedValue(subject, processor.getL0(this).HasDataType, DATA_TYPE_BINDING_INTERNAL, new AsyncProcedure<Datatype>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, Datatype type) {
+                               // TODO: consider trying Bindings.getBeanBinding(type);
+                               Binding binding = Bindings.getBinding(type);
+                               graph.forValue(subject, binding, procedure);
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable throwable) {
+                               procedure.exception(graph, new DoesNotContainValueException("Invalid data type", throwable));
+                       }
+                       
+               });
+
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, SyncProcedure<T> procedure) {
+               forValue(subject, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forValue(Resource subject, Procedure<T> procedure) {
+               forValue(subject, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       AsyncListener<T> listener) {
+               asyncRequest(new RelatedValueImplied<T>(subject, relation), listener);
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       SyncListener<T> listener) {
+               asyncRequest(new RelatedValueImplied<T>(subject, relation), listener);
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Listener<T> listener) {
+               asyncRequest(new RelatedValueImplied<T>(subject, relation), listener);
+       }
+
+       @Override
+       final public <T> void forRelatedValue(final Resource subject,
+                       final Resource relation, final AsyncProcedure<T> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               final DeepSingleOrErrorProcedure<T> checkedProcedure = new DeepSingleOrErrorProcedure<T>(procedure);
+
+               processor.forEachObject(this, subject, relation,
+                               new AsyncMultiProcedureAdapter<Resource>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph,
+                                                       final Resource object) {
+
+                                               checkedProcedure.inc();
+
+                                               graph.forValue(object, new AsyncProcedure<Object>() {
+
+                                                       @Override
+                                                       public void execute(AsyncReadGraph graph,
+                                                                       Object result) {
+                                                               checkedProcedure.offer(graph, (T) result);
+                                                               checkedProcedure.dec(graph);
+                                                       }
+
+                                                       @Override
+                                                       public void exception(AsyncReadGraph graph,
+                                                                       Throwable t) {
+                                                               checkedProcedure.exception(graph, t);
+                                                       }
+
+                                                       @Override
+                                                       public String toString() {
+                                                               return "forRelatedValue -> " + procedure;
+                                                       }
+
+                                               });
+
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               checkedProcedure.exception(graph, t);
+                                       }
+
+                               });
+
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       SyncProcedure<T> procedure) {
+               forRelatedValue(subject, relation, new SyncToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Procedure<T> procedure) {
+               forRelatedValue(subject, relation, new NoneToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Binding binding, AsyncListener<T> listener) {
+               asyncRequest(new RelatedValue<T>(subject, relation, binding), listener);
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Binding binding, SyncListener<T> listener) {
+               asyncRequest(new RelatedValue<T>(subject, relation, binding), listener);
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Binding binding, Listener<T> listener) {
+               asyncRequest(new RelatedValue<T>(subject, relation, binding), listener);
+       }
+
+       @Override
+       final public <T> void forRelatedValue(final Resource subject,
+                       final Resource relation, final Binding binding,
+                       final AsyncProcedure<T> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (binding != null);
+               assert (procedure != null);
+
+               final DeepSingleOrErrorProcedure<T> checkedProcedure = new DeepSingleOrErrorProcedure<T>(procedure);
+               
+               processor.forEachObject(this, subject, relation,
+                               new AsyncMultiProcedureAdapter<Resource>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph,
+                                                       final Resource object) {
+
+                                               checkedProcedure.inc();
+
+                                               graph.forValue(object, binding, new AsyncProcedure<Object>() {
+
+                                                                       @Override
+                                                                       public void execute(AsyncReadGraph graph,
+                                                                                       Object result) {
+                                                                               
+                                                                               checkedProcedure.offer(graph,
+                                                                                               (T) result);
+                                                                               checkedProcedure.dec(graph);
+                                                                       }
+
+                                                                       @Override
+                                                                       public void exception(AsyncReadGraph graph,
+                                                                                       Throwable t) {
+                                                                               checkedProcedure.exception(graph, t);
+                                                                       }
+
+                                                                       @Override
+                                                                       public String toString() {
+                                                                               return "forRelatedValue -> "
+                                                                                               + procedure;
+                                                                       }
+
+                                                               });
+
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               checkedProcedure.exception(graph, t);
+                                       }
+
+                               });
+
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Binding binding, SyncProcedure<T> procedure) {
+               forRelatedValue(subject, relation, binding,
+                               new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forRelatedValue(Resource subject, Resource relation,
+                       Binding binding, Procedure<T> procedure) {
+               forRelatedValue(subject, relation, binding,
+                               new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forAdapted(Resource resource, Class<T> clazz,
+                       AsyncListener<T> listener) {
+               asyncRequest(new Adapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forAdapted(Resource resource, Class<T> clazz,
+                       SyncListener<T> listener) {
+               asyncRequest(new Adapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forAdapted(Resource resource, Class<T> clazz,
+                       Listener<T> listener) {
+               asyncRequest(new Adapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       final public <T> void forAdapted(final Resource resource,
+                       final Class<T> clazz, final AsyncProcedure<T> procedure) {
+
+               assert (resource != null);
+               assert (clazz != null);
+               assert (procedure != null);
+
+               final AdaptionService service = getSession().peekService(AdaptionService.class);
+               if (service == null)
+                       procedure.exception(this, new ServiceException("No AdaptionService available")); 
+               else
+                       service.adapt(this, resource, resource, Resource.class, clazz, false, procedure); 
+
+       }
+
+       @Override
+       public <T> void forAdapted(Resource resource, Class<T> clazz,
+                       SyncProcedure<T> procedure) {
+               forAdapted(resource, clazz, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forAdapted(Resource resource, Class<T> clazz,
+                       Procedure<T> procedure) {
+               forAdapted(resource, clazz, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,
+                       AsyncListener<T> listener) {
+               asyncRequest(new UniqueAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,
+                       SyncListener<T> listener) {
+               asyncRequest(new UniqueAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,
+                       Listener<T> listener) {
+               asyncRequest(new UniqueAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       final public <T> void forUniqueAdapted(final Resource resource,
+                       final Class<T> clazz, final AsyncProcedure<T> procedure) {
+
+               assert (resource != null);
+               assert (clazz != null);
+               assert (procedure != null);
+
+               final AdaptionService service = getSession().peekService(AdaptionService.class);
+               if (service == null)
+                       procedure.exception(this, new ServiceException("No AdaptionService available")); 
+               else
+                       service.adaptNew(this, resource, clazz, false, procedure);
+
+       }
+
+       @Override
+       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,
+                       SyncProcedure<T> procedure) {
+               forUniqueAdapted(resource, clazz,
+                               new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forUniqueAdapted(Resource resource, Class<T> clazz,
+                       Procedure<T> procedure) {
+               forUniqueAdapted(resource, clazz,
+                               new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public void forPossibleInverse(Resource subject,
+                       AsyncListener<Resource> listener) {
+               asyncRequest(new PossibleInverse(subject), listener);
+       }
+
+       @Override
+       public void forPossibleInverse(Resource subject,
+                       SyncListener<Resource> listener) {
+               asyncRequest(new PossibleInverse(subject), listener);
+       }
+
+       @Override
+       public void forPossibleInverse(Resource subject, Listener<Resource> listener) {
+               asyncRequest(new PossibleInverse(subject), listener);
+       }
+
+       @Override
+       final public void forPossibleInverse(final Resource relation,
+                       final AsyncProcedure<Resource> procedure) {
+
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forInverse(this, relation, new ExceptionToNullProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forPossibleInverse(Resource subject,
+                       SyncProcedure<Resource> procedure) {
+               forPossibleInverse(subject, new SyncToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forPossibleInverse(Resource subject,
+                       Procedure<Resource> procedure) {
+               forPossibleInverse(subject, new NoneToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forPossibleObject(Resource subject, Resource relation,
+                       AsyncListener<Resource> listener) {
+               asyncRequest(new PossibleObject(subject, relation), listener);
+       }
+
+       @Override
+       public void forPossibleObject(Resource subject, Resource relation,
+                       SyncListener<Resource> listener) {
+               asyncRequest(new PossibleObject(subject, relation), listener);
+       }
+
+       @Override
+       public void forPossibleObject(Resource subject, Resource relation,
+                       Listener<Resource> listener) {
+               asyncRequest(new PossibleObject(subject, relation), listener);
+       }
+
+       @Override
+       final public void forPossibleObject(final Resource subject,
+                       final Resource relation, final AsyncProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachObject(this, subject, relation,
+                               new SingleOrNullProcedure<Resource>(procedure));
+
+       }
+
+       @Override
+       public void forPossibleObject(Resource subject, Resource relation,
+                       SyncProcedure<Resource> procedure) {
+               forPossibleObject(subject, relation,
+                               new SyncToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forPossibleObject(Resource subject, Resource relation,
+                       Procedure<Resource> procedure) {
+               forPossibleObject(subject, relation,
+                               new NoneToAsyncProcedure<Resource>(procedure));
+       }
+
+       @Override
+       public void forPossibleStatement(Resource subject, Resource relation,
+                       AsyncListener<Statement> listener) {
+               asyncRequest(new PossibleStatement(subject, relation), listener);
+       }
+
+       @Override
+       public void forPossibleStatement(Resource subject, Resource relation,
+                       SyncListener<Statement> listener) {
+               asyncRequest(new PossibleStatement(subject, relation), listener);
+       }
+
+       @Override
+       public void forPossibleStatement(Resource subject, Resource relation,
+                       Listener<Statement> listener) {
+               asyncRequest(new PossibleStatement(subject, relation), listener);
+       }
+
+       @Override
+       final public void forPossibleStatement(final Resource subject,
+                       final Resource relation, final AsyncProcedure<Statement> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forEachStatement(this, subject, relation,
+                               new SingleFunctionalOrNullProcedure<Statement>(
+                                               "forPossibleStatement", procedure));
+
+       }
+
+       @Override
+       public void forPossibleStatement(Resource subject, Resource relation,
+                       SyncProcedure<Statement> procedure) {
+               forPossibleStatement(subject, relation,
+                               new SyncToAsyncProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forPossibleStatement(Resource subject, Resource relation,
+                       Procedure<Statement> procedure) {
+               forPossibleStatement(subject, relation,
+                               new NoneToAsyncProcedure<Statement>(procedure));
+       }
+
+       @Override
+       public void forPossibleType(Resource subject, Resource relation,
+                       AsyncListener<Resource> listener) {
+               asyncRequest(new PossibleType(subject, relation), listener);
+       }
+
+       @Override
+       public void forPossibleType(Resource subject, Resource relation,
+                       SyncListener<Resource> listener) {
+               asyncRequest(new PossibleType(subject, relation), listener);
+       }
+
+       @Override
+       public void forPossibleType(Resource subject, Resource relation,
+                       Listener<Resource> listener) {
+               asyncRequest(new PossibleType(subject, relation), listener);
+       }
+
+       @Override
+       final public void forPossibleType(final Resource subject,
+                       final Resource baseType, final AsyncProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               final NullSingleOrNullProcedure<Resource> checkedProcedure = new NullSingleOrNullProcedure<Resource>(procedure);
+
+               processor.forEachPrincipalType(this, subject, new AsyncMultiProcedureAdapter<Resource>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph,
+                                                       final Resource principalType) {
+
+                                               if (baseType == null) {
+
+                                                       checkedProcedure.offer(graph, principalType);
+
+                                               } else if (principalType.equals(baseType)) {
+
+                                                       checkedProcedure.offer(graph, principalType);
+
+                                               } else {
+
+                                                       checkedProcedure.inc();
+
+                                                       processor.forSupertypes((ReadGraphImpl)graph, principalType,
+                                                                       new AsyncProcedure<Set<Resource>>() {
+
+                                                                               @Override
+                                                                               public void execute(
+                                                                                               AsyncReadGraph graph,
+                                                                                               Set<Resource> result) {
+
+                                                                                       if (result.contains(baseType)) {
+                                                                                               checkedProcedure.offer(graph,
+                                                                                                               principalType);
+                                                                                       }
+
+                                                                                       checkedProcedure.dec(graph);
+
+                                                                               }
+
+                                                                               @Override
+                                                                               public void exception(
+                                                                                               AsyncReadGraph graph,
+                                                                                               Throwable t) {
+                                                                                       checkedProcedure.exception(graph, t);
+                                                                                       checkedProcedure.dec(graph);
+                                                                               }
+
+                                                                               @Override
+                                                                               public String toString() {
+                                                                                       return "forPossibleType -> "
+                                                                                                       + procedure;
+                                                                               }
+
+                                                                       });
+
+                                               }
+
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               checkedProcedure.exception(graph, t);
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                               });
+
+       }
+
+       @Override
+       public void forPossibleType(Resource subject, Resource relation,
+                       SyncProcedure<Resource> procedure) {
+               forPossibleType(subject, relation, new SyncToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forPossibleType(Resource subject, Resource relation,
+                       Procedure<Resource> procedure) {
+               forPossibleType(subject, relation, new NoneToAsyncProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, AsyncListener<T> listener) {
+               asyncRequest(new PossibleValueImplied<T>(subject), listener);
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, SyncListener<T> listener) {
+               asyncRequest(new PossibleValueImplied<T>(subject), listener);
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Listener<T> listener) {
+               asyncRequest(new PossibleValueImplied<T>(subject), listener);
+       }
+
+       @Override
+       final public <T> void forPossibleValue(final Resource subject,
+                       final AsyncProcedure<T> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+               
+               forPossibleRelatedValue(subject, processor.getL0(this).HasDataType, DATA_TYPE_BINDING_INTERNAL, new AsyncProcedure<Datatype>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, final Datatype type) {
+                               if (type == null) {
+                                       procedure.execute(graph, null);
+                               } else {
+                                       try {
+                                               // TODO: consider trying Bindings.getBeanBinding(type);
+                                               Binding binding = Bindings.getBinding(type);
+                                               graph.forPossibleValue(subject, binding, procedure);
+                                       } catch (RuntimeBindingConstructionException e) {
+                                               procedure.exception(graph, e);
+                                       }
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               procedure.exception(graph, t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forPossibleValue -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject,
+                       SyncProcedure<T> procedure) {
+               forPossibleValue(subject, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Procedure<T> procedure) {
+               forPossibleValue(subject, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Binding binding,
+                       AsyncListener<T> listener) {
+               asyncRequest(new PossibleValue<T>(subject, binding), listener);
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Binding binding,
+                       SyncListener<T> listener) {
+               asyncRequest(new PossibleValue<T>(subject, binding), listener);
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Binding binding,
+                       Listener<T> listener) {
+               asyncRequest(new PossibleValue<T>(subject, binding), listener);
+       }
+
+       @Override
+       final public <T> void forPossibleValue(final Resource resource,
+                       final Binding binding, final AsyncProcedure<T> procedure) {
+
+               assert (resource != null);
+               assert (binding != null);
+               assert (procedure != null);
+
+               processor.forValue(this, resource, new AsyncProcedure<byte[]>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, byte[] result) {
+
+                               try {
+
+                                       if (result == null) {
+                                               procedure.execute(graph, null);
+                                               return;
+                                       }
+
+                                       Serializer serializer = Bindings.getSerializer( binding );
+                                       Object obj = serializer.deserialize(result);
+                                       if (!binding.isInstance(obj))
+                                               procedure.exception(graph, new ClassCastException(
+                                                               "Cannot get value " + obj + " with binding "
+                                                                               + binding));
+                                       else
+                                               procedure.execute(graph, (T) obj);
+
+                               } catch (Throwable t) {
+                                       procedure.exception(graph, new ServiceException("Could not forValue for subject " + debugString(resource) + " and binding " + String.valueOf(binding) + " with bytes " + safeArrayToString(result), t));
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               try {
+                                       procedure.exception(graph, t);
+                               } catch (Throwable t2) {
+                               Logger.defaultLogError(t2);
+                               }
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forPossibleValue -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Binding binding,
+                       SyncProcedure<T> procedure) {
+               forPossibleValue(subject, binding, new SyncToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleValue(Resource subject, Binding binding,
+                       Procedure<T> procedure) {
+               forPossibleValue(subject, binding, new NoneToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, AsyncListener<T> listener) {
+               asyncRequest(new PossibleRelatedValueImplied<T>(subject, relation),
+                               listener);
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, SyncListener<T> listener) {
+               asyncRequest(new PossibleRelatedValueImplied<T>(subject, relation),
+                               listener);
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Listener<T> listener) {
+               asyncRequest(new PossibleRelatedValueImplied<T>(subject, relation),
+                               listener);
+       }
+
+       @Override
+       final public <T> void forPossibleRelatedValue(final Resource subject,
+                       final Resource relation, final AsyncProcedure<T> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               final DeepSingleOrNullProcedure<T> checkedProcedure = new DeepSingleOrNullProcedure<T>(procedure);
+               
+               processor.forEachObject(this, subject, relation,
+                               new AsyncMultiProcedureAdapter<Resource>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph,
+                                                       final Resource object) {
+
+                                               checkedProcedure.inc();
+
+                                               graph.forValue(object, new AsyncProcedure<Object>() {
+
+                                                       @Override
+                                                       public void execute(AsyncReadGraph graph,
+                                                                       Object result) {
+                                                               checkedProcedure.offer(graph, (T) result);
+                                                               checkedProcedure.dec(graph);
+                                                       }
+
+                                                       @Override
+                                                       public void exception(AsyncReadGraph graph,
+                                                                       Throwable t) {
+                                                               checkedProcedure.exception(graph, t);
+                                                               checkedProcedure.dec(graph);
+                                                       }
+
+                                               });
+
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               checkedProcedure.exception(graph, t);
+                                               checkedProcedure.dec(graph);
+                                       }
+
+                                       @Override
+                                       public String toString() {
+                                               return "forPossibleRelatedValue -> " + procedure;
+                                       }
+                               });
+
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, SyncProcedure<T> procedure) {
+               forPossibleRelatedValue(subject, relation, new SyncToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Procedure<T> procedure) {
+               forPossibleRelatedValue(subject, relation, new NoneToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Binding binding, AsyncListener<T> listener) {
+               asyncRequest(new PossibleRelatedValue<T>(subject, relation, binding),
+                               listener);
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Binding binding, SyncListener<T> listener) {
+               asyncRequest(new PossibleRelatedValue<T>(subject, relation, binding),
+                               listener);
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Binding binding, Listener<T> listener) {
+               asyncRequest(new PossibleRelatedValue<T>(subject, relation, binding),
+                               listener);
+       }
+
+       final public <T> void forPossibleRelatedValue(final Resource subject, final Resource relation, final Binding binding,
+                       final AsyncProcedure<T> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forPossibleObject(this, subject, relation, new AsyncProcedure<Resource>() {
+                       
+                       @Override
+                       public void execute(AsyncReadGraph graph, Resource object) {
+                               
+                               if(object == null) {
+                                       procedure.execute(graph, null);
+                                       return;
+                               }
+
+                               processor.forPossibleValue((ReadGraphImpl)graph, object, new AsyncProcedure<byte[]>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph, byte[] bytes) {
+
+                                               if(bytes != null) {
+
+                                                       try {
+                                                       
+                                                               Serializer serializer = binding.serializer();
+                                                               Object obj = serializer.deserialize(bytes);
+                                                               if (!binding.isInstance(obj)) {
+                                                                       procedure.exception(graph, new ClassCastException("Cannot get value " + obj + " with binding " + binding));
+                                                               } else {
+                                                                       procedure.execute(graph, (T) obj);
+                                                               }
+
+                                                       } catch (Throwable t) {
+                                                               
+                                                               procedure.exception(graph, t);
+                                                               
+                                                       }
+                                                       
+                                               } else {
+                                                       
+                                                       procedure.execute(graph, null);
+                                                       
+                                               }
+                                               
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               procedure.exception(graph, t);
+                                       }
+
+                               });
+                               
+                       }
+                       
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable throwable) {
+                               throwable.printStackTrace();
+                               procedure.exception(graph, throwable);
+                       }
+                       
+               });
+
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Binding binding, SyncProcedure<T> procedure) {
+               forPossibleRelatedValue(subject, relation, binding,
+                               new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void forPossibleRelatedValue(Resource subject,
+                       Resource relation, Binding binding, Procedure<T> procedure) {
+               forPossibleRelatedValue(subject, relation, binding,
+                               new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public void forIsInstanceOf(Resource subject, Resource relation,
+                       AsyncListener<Boolean> listener) {
+               asyncRequest(new IsInstanceOf(subject, relation), listener);
+       }
+
+       @Override
+       public void forIsInstanceOf(Resource subject, Resource relation,
+                       SyncListener<Boolean> listener) {
+               asyncRequest(new IsInstanceOf(subject, relation), listener);
+       }
+
+       @Override
+       public void forIsInstanceOf(Resource subject, Resource relation,
+                       Listener<Boolean> listener) {
+               asyncRequest(new IsInstanceOf(subject, relation), listener);
+       }
+
+       @Override
+       final public void forIsInstanceOf(final Resource resource,
+                       final Resource type, final AsyncProcedure<Boolean> procedure) {
+
+               assert (resource != null);
+               assert (type != null);
+               assert (procedure != null);
+
+               forTypes(resource, new AsyncProcedure<Set<Resource>>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, Set<Resource> result) {
+                               
+                               try {
+                                       if (result.contains(type))
+                                               procedure.execute(graph, true);
+                                       else
+                                               procedure.execute(graph, false);
+                               } catch (Throwable t) {
+                               Logger.defaultLogError(t);
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               try {
+                                       procedure.exception(graph, t);
+                               } catch (Throwable t2) {
+                               Logger.defaultLogError(t2);
+                               }
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forIsInstanceOf -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void forIsInstanceOf(Resource subject, Resource relation,
+                       SyncProcedure<Boolean> procedure) {
+               forIsInstanceOf(subject, relation, new SyncToAsyncProcedure<Boolean>(
+                               procedure));
+       }
+
+       @Override
+       public void forIsInstanceOf(Resource subject, Resource relation,
+                       Procedure<Boolean> procedure) {
+               forIsInstanceOf(subject, relation, new NoneToAsyncProcedure<Boolean>(
+                               procedure));
+       }
+
+       @Override
+       public void forIsInheritedFrom(Resource subject, Resource relation,
+                       AsyncListener<Boolean> listener) {
+               asyncRequest(new IsInheritedFrom(subject, relation), listener);
+       }
+
+       @Override
+       public void forIsInheritedFrom(Resource subject, Resource relation,
+                       SyncListener<Boolean> listener) {
+               asyncRequest(new IsInheritedFrom(subject, relation), listener);
+       }
+
+       @Override
+       public void forIsInheritedFrom(Resource subject, Resource relation,
+                       Listener<Boolean> listener) {
+               asyncRequest(new IsInheritedFrom(subject, relation), listener);
+       }
+
+       @Override
+       final public void forIsInheritedFrom(final Resource resource,
+                       final Resource type, final AsyncProcedure<Boolean> procedure) {
+
+               assert (resource != null);
+               assert (type != null);
+               assert (procedure != null);
+
+               if (resource.equals(type)) {
+                       try {
+                               procedure.execute(this, true);
+                       } catch (Throwable t) {
+                       Logger.defaultLogError(t);
+                       }
+                       return;
+               }
+
+               forSupertypes(resource, new AsyncProcedure<Set<Resource>>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, Set<Resource> result) {
+                               try {
+                                       if (result.contains(type))
+                                               procedure.execute(graph, true);
+                                       else
+                                               procedure.execute(graph, false);
+                               } catch (Throwable t) {
+                               Logger.defaultLogError(t);
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               try {
+                                       procedure.exception(graph, t);
+                               } catch (Throwable t2) {
+                               Logger.defaultLogError(t2);
+                               }
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forIsInheritedFrom -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void forIsInheritedFrom(Resource subject, Resource relation,
+                       SyncProcedure<Boolean> procedure) {
+               forIsInheritedFrom(subject, relation,
+                               new SyncToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forIsInheritedFrom(Resource subject, Resource relation,
+                       Procedure<Boolean> procedure) {
+               forIsInheritedFrom(subject, relation,
+                               new NoneToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forIsSubrelationOf(Resource subject, Resource relation,
+                       AsyncListener<Boolean> listener) {
+               asyncRequest(new IsSubrelationOf(subject, relation), listener);
+       }
+
+       @Override
+       public void forIsSubrelationOf(Resource subject, Resource relation,
+                       SyncListener<Boolean> listener) {
+               asyncRequest(new IsSubrelationOf(subject, relation), listener);
+       }
+
+       @Override
+       public void forIsSubrelationOf(Resource subject, Resource relation,
+                       Listener<Boolean> listener) {
+               asyncRequest(new IsSubrelationOf(subject, relation), listener);
+       }
+
+       @Override
+       final public void forIsSubrelationOf(final Resource resource,
+                       final Resource relation, final AsyncProcedure<Boolean> procedure) {
+
+               assert (resource != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               if (resource.equals(relation)) {
+                       procedure.execute(this, true);
+                       return;
+               }
+
+               forSuperrelations(resource, new AsyncProcedure<Set<Resource>>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, Set<Resource> result) {
+                               try {
+                                       if (result.contains(relation))
+                                               procedure.execute(graph, true);
+                                       else
+                                               procedure.execute(graph, false);
+                               } catch (Throwable t) {
+                               Logger.defaultLogError(t);
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               try {
+                                       procedure.exception(graph, t);
+                               } catch (Throwable t2) {
+                               Logger.defaultLogError(t2);
+                               }
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forIsSubrelationOf -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void forIsSubrelationOf(Resource subject, Resource relation,
+                       SyncProcedure<Boolean> procedure) {
+               forIsSubrelationOf(subject, relation,
+                               new SyncToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forIsSubrelationOf(Resource subject, Resource relation,
+                       Procedure<Boolean> procedure) {
+               forIsSubrelationOf(subject, relation,
+                               new NoneToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forHasStatement(Resource subject,
+                       AsyncListener<Boolean> listener) {
+               asyncRequest(new HasStatementSubject(subject), listener);
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, SyncListener<Boolean> listener) {
+               asyncRequest(new HasStatementSubject(subject), listener);
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Listener<Boolean> listener) {
+               asyncRequest(new HasStatementSubject(subject), listener);
+       }
+
+       @Override
+       final public void forHasStatement(final Resource subject,
+                       final AsyncProcedure<Boolean> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forHasStatement(this, subject, procedure);
+
+       }
+
+       @Override
+       public void forHasStatement(Resource subject,
+                       SyncProcedure<Boolean> procedure) {
+               forHasStatement(subject, new SyncToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Procedure<Boolean> procedure) {
+               forHasStatement(subject, new NoneToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       AsyncListener<Boolean> listener) {
+               asyncRequest(new HasStatement(subject, relation), listener);
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       SyncListener<Boolean> listener) {
+               asyncRequest(new HasStatement(subject, relation), listener);
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Listener<Boolean> listener) {
+               asyncRequest(new HasStatement(subject, relation), listener);
+       }
+
+       @Override
+       final public void forHasStatement(final Resource subject,
+                       final Resource relation, final AsyncProcedure<Boolean> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (procedure != null);
+
+               processor.forHasStatement(this, subject, relation, procedure);
+
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       SyncProcedure<Boolean> procedure) {
+               forHasStatement(subject, relation, new SyncToAsyncProcedure<Boolean>(
+                               procedure));
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Procedure<Boolean> procedure) {
+               forHasStatement(subject, relation, new NoneToAsyncProcedure<Boolean>(
+                               procedure));
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Resource object, AsyncListener<Boolean> listener) {
+               asyncRequest(new HasStatementSubjectObject(subject, relation, object),
+                               listener);
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Resource object, SyncListener<Boolean> listener) {
+               asyncRequest(new HasStatementSubjectObject(subject, relation, object),
+                               listener);
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Resource object, Listener<Boolean> listener) {
+               asyncRequest(new HasStatementSubjectObject(subject, relation, object),
+                               listener);
+       }
+
+       @Override
+       final public void forHasStatement(final Resource subject,
+                       final Resource relation, final Resource object,
+                       final AsyncProcedure<Boolean> procedure) {
+
+               assert (subject != null);
+               assert (relation != null);
+               assert (object != null);
+               assert (procedure != null);
+
+               processor.forHasStatement(this, subject, relation, object, procedure);
+
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Resource object, SyncProcedure<Boolean> procedure) {
+               forHasStatement(subject, relation, object,
+                               new SyncToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forHasStatement(Resource subject, Resource relation,
+                       Resource object, Procedure<Boolean> procedure) {
+               forHasStatement(subject, relation, object,
+                               new NoneToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forHasValue(Resource subject, AsyncListener<Boolean> listener) {
+               asyncRequest(new HasValue(subject), listener);
+       }
+
+       @Override
+       public void forHasValue(Resource subject, SyncListener<Boolean> listener) {
+               asyncRequest(new HasValue(subject), listener);
+       }
+
+       @Override
+       public void forHasValue(Resource subject, Listener<Boolean> listener) {
+               asyncRequest(new HasValue(subject), listener);
+       }
+
+       @Override
+       final public void forHasValue(final Resource subject,
+                       final AsyncProcedure<Boolean> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forValue(this, subject, new AsyncProcedure<byte[]>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, byte[] result) {
+                               try {
+                                       if (result == null)
+                                               procedure.execute(graph, false);
+                                       else
+                                               procedure.execute(graph, true);
+                               } catch (Throwable t) {
+                               Logger.defaultLogError(t);
+                               }
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               try {
+                                       procedure.exception(graph, t);
+                               } catch (Throwable t2) {
+                               Logger.defaultLogError(t2);
+                               }
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "forHasValue -> " + procedure;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void forHasValue(Resource subject, SyncProcedure<Boolean> procedure) {
+               forHasValue(subject, new SyncToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forHasValue(Resource subject, Procedure<Boolean> procedure) {
+               forHasValue(subject, new NoneToAsyncProcedure<Boolean>(procedure));
+       }
+
+       @Override
+       public void forOrderedSet(Resource subject,
+                       AsyncMultiListener<Resource> listener) {
+               asyncRequest(new OrderedSet(subject), listener);
+       }
+
+       @Override
+       public void forOrderedSet(Resource subject,
+                       SyncMultiListener<Resource> listener) {
+               asyncRequest(new OrderedSet(subject), listener);
+       }
+
+       @Override
+       public void forOrderedSet(Resource subject, MultiListener<Resource> listener) {
+               asyncRequest(new OrderedSet(subject), listener);
+       }
+
+       @Override
+       final public void forOrderedSet(final Resource subject,
+                       final AsyncMultiProcedure<Resource> procedure) {
+
+               assert (subject != null);
+               assert (procedure != null);
+
+               processor.forOrderedSet(this, subject,
+                               new AsyncMultiProcedure<Resource>() {
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               try {
+                                                       procedure.finished(graph);
+                                               } catch (Throwable t) {
+                                               Logger.defaultLogError(t);
+                                               }
+                                       }
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph, Resource result) {
+                                               try {
+                                                       procedure.execute(graph, result);
+                                               } catch (Throwable t) {
+                                               Logger.defaultLogError(t);
+                                               }
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               try {
+                                                       procedure.exception(graph, t);
+                                               } catch (Throwable t2) {
+                                               Logger.defaultLogError(t2);
+                                               }
+                                       }
+
+                                       @Override
+                                       public String toString() {
+                                               return "forOrderedSet -> " + procedure;
+                                       }
+
+                               });
+
+       }
+
+       @Override
+       public void forOrderedSet(Resource subject,
+                       SyncMultiProcedure<Resource> procedure) {
+               forOrderedSet(subject, new SyncToAsyncMultiProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public void forOrderedSet(Resource subject,
+                       MultiProcedure<Resource> procedure) {
+               forOrderedSet(subject, new NoneToAsyncMultiProcedure<Resource>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,
+                       AsyncListener<T> listener) {
+               asyncRequest(new PossibleAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,
+                       SyncListener<T> listener) {
+               asyncRequest(new PossibleAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,
+                       Listener<T> listener) {
+               asyncRequest(new PossibleAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       final public <T> void forPossibleAdapted(final Resource resource,
+                       final Class<T> clazz, final AsyncProcedure<T> procedure) {
+
+               assert (resource != null);
+               assert (clazz != null);
+               assert (procedure != null);
+
+               final AdaptionService service = getSession().peekService(AdaptionService.class);
+               if (service == null)
+                       procedure.exception(this, new ServiceException("No AdaptionService available")); 
+               else
+                       service.adapt(this, resource, resource, Resource.class, clazz, true, procedure);
+       }
+
+       @Override
+       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,
+                       SyncProcedure<T> procedure) {
+               forPossibleAdapted(resource, clazz, new SyncToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleAdapted(Resource resource, Class<T> clazz,
+                       Procedure<T> procedure) {
+               forPossibleAdapted(resource, clazz, new NoneToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,
+                       AsyncListener<T> listener) {
+               asyncRequest(new PossibleUniqueAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,
+                       SyncListener<T> listener) {
+               asyncRequest(new PossibleUniqueAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,
+                       Listener<T> listener) {
+               asyncRequest(new PossibleUniqueAdapter<T>(resource, clazz), listener);
+       }
+
+       @Override
+       final public <T> void forPossibleUniqueAdapted(final Resource resource,
+                       final Class<T> clazz, final AsyncProcedure<T> procedure) {
+
+               assert (resource != null);
+               assert (clazz != null);
+               assert (procedure != null);
+
+               final AdaptionService service = getSession().peekService(AdaptionService.class);
+               if (service == null)
+                       procedure.exception(this, new ServiceException("No AdaptionService available")); 
+               else
+                       service.adaptNew(this, resource, clazz, true, procedure);
+
+       }
+
+       @Override
+       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,
+                       SyncProcedure<T> procedure) {
+               forPossibleUniqueAdapted(resource, clazz, new SyncToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       @Override
+       public <T> void forPossibleUniqueAdapted(Resource resource, Class<T> clazz,
+                       Procedure<T> procedure) {
+               forPossibleUniqueAdapted(resource, clazz, new NoneToAsyncProcedure<T>(
+                               procedure));
+       }
+
+       /*
+        * Implementation of the interface AsyncRequestProcessor
+        */
+
+       @Override
+       final public Session getSession() {
+               return processor.getSession();
+       }
+
+       @Override
+       public <T> void asyncRequest(final Read<T> request) {
+
+               asyncRequest(request, new AsyncProcedure<T>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, T result) {
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                               Logger.defaultLogError(t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "asyncRequest(Read) -> " + request;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public <T> void asyncRequest(Read<T> request, AsyncListener<T> procedure) {
+               asyncRequest(request, (AsyncProcedure<T>) procedure);
+       }
+
+       @Override
+       public <T> void asyncRequest(Read<T> request,
+                       final SyncListener<T> procedure) {
+               asyncRequest(request, new SyncToAsyncListener<T>(procedure));
+       }
+
+       @Override
+       public <T> void asyncRequest(Read<T> request, final Listener<T> procedure) {
+               asyncRequest(request, new NoneToAsyncListener<T>(procedure));
+       }
+
+       @Override
+       public <T> void asyncRequest(final Read<T> request, final AsyncProcedure<T> procedure) {
+
+               assert (request != null);
+               assert (procedure != null);
+               
+               AsyncBarrierImpl barrier = asyncBarrier;
+               if(barrier != null)
+                   barrier.inc();
+               
+               processor.scheduleNow(new SessionTask(this) {
+
+                       @Override
+                       public void run0(int thread) {
+                               try {
+                                       final ListenerBase listener = getListenerBase(procedure);
+                                       QueryCache.runnerReadEntry(ReadGraphImpl.this, request, parent, listener, procedure, false);
+                               } catch (DatabaseException e) {
+                                       Logger.defaultLogError(e);
+                               } finally {
+                               if(barrier != null)
+                                   barrier.dec();
+                               }
+                       }
+                       
+               });
+
+       }
+
+    public static ReadGraphImpl createAsync(QueryProcessor support) {
+        return new ReadGraphImpl(null, null, support);
+    }
+
+       @Override
+       public <T> void asyncRequest(Read<T> request, SyncProcedure<T> procedure) {
+               asyncRequest(request, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void asyncRequest(Read<T> request, final Procedure<T> procedure) {
+               asyncRequest(request, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(final AsyncRead<T> request) {
+
+               assert (request != null);
+
+               asyncRequest(request, new AsyncProcedure<T>() {
+
+                       @Override
+                       public void execute(AsyncReadGraph graph, T result) {
+                       }
+
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                       Logger.defaultLogError(t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "asyncRequest(AsyncRead) -> " + request;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public <T> void asyncRequest(AsyncRead<T> request,
+                       AsyncListener<T> procedure) {
+               asyncRequest(request, (AsyncProcedure<T>) procedure);
+       }
+
+       @Override
+       final public <T> void asyncRequest(AsyncRead<T> request,
+                       final SyncListener<T> procedure) {
+               asyncRequest(request, new SyncToAsyncListener<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(AsyncRead<T> request,
+                       final Listener<T> procedure) {
+               asyncRequest(request, new NoneToAsyncListener<T>(procedure));
+       }
+
+    @Override
+    final public <T> void asyncRequest(final AsyncRead<T> request,
+            final AsyncProcedure<T> procedure) {
+
+        assert (request != null);
+        assert (procedure != null);
+
+        AsyncBarrierImpl barrier = asyncBarrier;
+        if(barrier != null)
+            barrier.inc();
+
+        processor.scheduleNow(new SessionTask(this) {
+
+            @Override
+            public void run0(int thread) {
+
+                if(barrier != null)
+                    barrier.inc();
+
+                try {
+                    final ListenerBase listener = getListenerBase(procedure);
+                    QueryCache.runnerAsyncReadEntry(ReadGraphImpl.this, request, parent, listener, new AsyncProcedure<T>() {
+
+                        @Override
+                        public void execute(AsyncReadGraph graph, T result) {
+                            procedure.execute(graph, result);
+                            if(barrier != null)
+                                barrier.dec();
+                        }
+
+                        @Override
+                        public void exception(AsyncReadGraph graph, Throwable throwable) {
+                            procedure.exception(graph, throwable);
+                            if(barrier != null)
+                                barrier.dec();
+                        }
+
+                    }, false);
+                } catch (DatabaseException e) {
+                    LOGGER.error("Error while executing async request", e);
+                } finally {
+                    if(barrier != null)
+                        barrier.dec();
+                }
+            }
+
+        });
+
+    }
+
+       @Override
+       public <T> void asyncRequest(AsyncRead<T> request,
+                       SyncProcedure<T> procedure) {
+               asyncRequest(request, new SyncToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(final AsyncRead<T> request,
+                       final Procedure<T> procedure) {
+               asyncRequest(request, new NoneToAsyncProcedure<T>(procedure));
+       }
+
+       @Override
+       public <T> void asyncRequest(final MultiRead<T> request) {
+
+               assert (request != null);
+
+               asyncRequest(request, new SyncMultiProcedureAdapter<T>() {
+                       @Override
+                       public void exception(ReadGraph graph, Throwable t) {
+                       Logger.defaultLogError(t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "asyncRequest(MultiRead) -> " + request;
+                       }
+               });
+
+       }
+
+       @Override
+       public <T> void asyncRequest(MultiRead<T> request,
+                       SyncMultiListener<T> procedure) {
+               asyncRequest(request, (SyncMultiProcedure<T>)procedure);
+       }
+
+       @Override
+       public <T> void asyncRequest(MultiRead<T> request,
+                       MultiListener<T> procedure) {
+               asyncRequest(request, new NoneToSyncMultiListener<T>(procedure));
+       }
+
+       
+       @Override
+       public <T> void asyncRequest(final MultiRead<T> request,
+                       final SyncMultiProcedure<T> procedure) {
+
+               assert (request != null);
+               assert (procedure != null);
+
+               final ListenerBase listener = getListenerBase(procedure);
+
+               if (parent != null || listener != null) {
+
+//                 final ReadGraphImpl newGraph = newSync();
+                   processor.query(this, request, parent, procedure,listener);
+
+               } else {
+
+//                 final ReadGraphImpl newGraph = newSync();
+
+                   try {
+
+                       request.perform(this, procedure);
+
+                   } catch (Throwable t) {
+
+                       try {
+                                       procedure.exception(this, t);
+                               } catch (DatabaseException e) {
+                                       LOGGER.error("Unexpected exception while handling exception", e);
+                               }
+
+                   }                           
+
+               }
+
+       }
+
+       @Override
+       public <T> void asyncRequest(MultiRead<T> request,
+                       MultiProcedure<T> procedure) {
+               asyncRequest(request, new NoneToSyncMultiProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(final AsyncMultiRead<T> request) {
+
+               assert (request != null);
+
+               asyncRequest(request, new AsyncMultiProcedureAdapter<T>() {
+                       @Override
+                       public void exception(AsyncReadGraph graph, Throwable t) {
+                       Logger.defaultLogError(t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "asyncRequest(AsyncMultiRead) -> " + request;
+                       }
+               });
+
+       }
+
+       @Override
+       public <T> void asyncRequest(AsyncMultiRead<T> request,
+                       AsyncMultiListener<T> procedure) {
+               asyncRequest(request, (AsyncMultiProcedure<T>) procedure);
+       }
+
+       @Override
+       public <T> void asyncRequest(AsyncMultiRead<T> request,
+                       SyncMultiListener<T> procedure) {
+               asyncRequest(request, new SyncToAsyncMultiListener<T>(procedure));
+       }
+
+       @Override
+       public <T> void asyncRequest(AsyncMultiRead<T> request,
+                       MultiListener<T> procedure) {
+               asyncRequest(request, new NoneToAsyncMultiListener<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(AsyncMultiRead<T> request,
+                       final AsyncMultiProcedure<T> procedure) {
+
+               assert (request != null);
+               assert (procedure != null);
+
+               ListenerBase listener = getListenerBase(procedure);
+
+               if (parent != null || listener != null) {
+
+                       processor.query(this, request, parent, procedure, listener);
+
+               } else {
+
+                       try {
+
+                               request.perform(this, new AsyncMultiProcedure<T>() {
+
+                                       @Override
+                                       public void execute(AsyncReadGraph graph, T result) {
+                                               procedure.execute(graph, result);
+                                       }
+
+                                       @Override
+                                       public void finished(AsyncReadGraph graph) {
+                                               procedure.finished(graph);
+                                       }
+
+                                       @Override
+                                       public void exception(AsyncReadGraph graph, Throwable t) {
+                                               procedure.exception(graph, t);
+                                       }
+
+                                       @Override
+                                       public String toString() {
+                                               return "asyncRequest(AsyncMultiRead) -> " + procedure;
+                                       }
+
+                               });
+
+                       } catch (Throwable t) {
+
+                               procedure.exception(this, new DatabaseException(t));
+
+                       }
+               }
+
+       }
+
+       @Override
+       public <T> void asyncRequest(AsyncMultiRead<T> request,
+                       SyncMultiProcedure<T> procedure) {
+               asyncRequest(request, new SyncToAsyncMultiProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(AsyncMultiRead<T> request,
+                       final MultiProcedure<T> procedure) {
+               asyncRequest(request, new NoneToAsyncMultiProcedure<T>(procedure));
+       }
+
+       @Override
+       final public <T> void asyncRequest(final ExternalRead<T> request) {
+
+               assert (request != null);
+
+               asyncRequest(request, new Procedure<T>() {
+
+                       @Override
+                       public void execute(T result) {
+                       }
+
+                       @Override
+                       public void exception(Throwable t) {
+                       Logger.defaultLogError(t);
+                       }
+
+                       @Override
+                       public String toString() {
+                               return "asyncRequest(PrimitiveRead) -> " + request;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public <T> void asyncRequest(ExternalRead<T> request,
+                       final Listener<T> procedure) {
+               asyncRequest(request, (Procedure<T>) procedure);
+       }
+
+       @Override
+       final public <T> void asyncRequest(final ExternalRead<T> request,
+                       final Procedure<T> procedure) {
+
+               assert (request != null);
+               assert (procedure != null);
+
+               final ListenerBase listener = getListenerBase(procedure);
+
+               if (parent != null || listener != null) {
+
+                       try {
+                               QueryCacheBase.resultExternalReadEntry(this, request, parent, listener, procedure);
+                       } catch (DatabaseException e) {
+                               Logger.defaultLogError(e);
+                               // This throwable has already been transferred to procedure at this point - do nothing about it
+                       }
+
+               } else {
+
+                       request.register(this, new Listener<T>() {
+                               @Override
+                               public void execute(T result) {
+                                       procedure.execute(result);
+                               }
+
+                               @Override
+                               public void exception(Throwable t) {
+                                       procedure.exception(t);
+                               }
+
+                               @Override
+                               public String toString() {
+                                       return "asyncRequest(PrimitiveRead) -> " + request;
+                               }
+
+                               @Override
+                               public boolean isDisposed() {
+                                       return true;
+                               }
+
+                       });
+
+               }
+
+       }
+
+       @Override
+       public void asyncRequest(final Write request) {
+
+               assert (request != null);
+               
+               getSession().asyncRequest(request);
+
+//             processor.asyncWrite(request);
+
+       }
+
+       @Override
+       public <T> void asyncRequest(final WriteResult<T> request, Procedure<T> procedure) {
+               throw new Error("Not implemented.");
+       }
+       
+       @Override
+       public void asyncRequest(Write request, Consumer<DatabaseException> callback) {
+               
+               assert (request != null);
+               
+               getSession().asyncRequest(request, callback);
+               
+       }
+
+       @Override
+       public void asyncRequest(final DelayedWrite request) {
+
+               assert (request != null);
+
+               getSession().asyncRequest(request);
+
+       }
+
+       @Override
+       public <T> void asyncRequest(final DelayedWriteResult<T> request, Procedure<T> procedure) {
+               throw new Error("Not implemented.");
+       }
+       
+       @Override
+       public void asyncRequest(DelayedWrite r,
+                       Consumer<DatabaseException> callback) {
+               throw new Error("Not implemented.");
+       }
+
+       @Override
+       public void asyncRequest(final WriteOnly request) {
+
+               assert (request != null);
+
+               getSession().asyncRequest(request);
+
+       }
+
+       @Override
+       public <T> void asyncRequest(final WriteOnlyResult<T> request, Procedure<T> procedure) {
+               throw new Error("Not implemented.");
+       }
+       
+       @Override
+       public void asyncRequest(WriteOnly r, Consumer<DatabaseException> callback) {
+               throw new Error("Not implemented.");
+       }
+
+       /*
+        * Implementation of the interface ServiceLocator
+        */
+
+       @Override
+       public <T> T getService(Class<T> api) {
+           if(WriteSupport.class == api) {
+               if(this instanceof WriteGraphImpl) {
+                   WriteGraphImpl impl = (WriteGraphImpl)this;
+                   return (T)impl.writeSupport;
+               }
+           }
+               return getSession().getService(api);
+       }
+
+       @Override
+       public <T> T peekService(Class<T> api) {
+               return getSession().peekService(api);
+       }
+
+       @Override
+       public boolean hasService(Class<?> api) {
+               return getSession().hasService(api);
+       }
+
+       @Override
+       public <T> void registerService(Class<T> api, T service) {
+               getSession().registerService(api, service);
+       }
+       
+       @Override
+       public boolean isImmutable(Resource resource) throws DatabaseException {
+               ResourceImpl impl = (ResourceImpl)resource;
+               return processor.isImmutable(impl.id);
+       }
+
+       /*
+        * Internal routines
+        */
+
+       protected static String INTERNAL_ERROR_STRING = "Transaction aborted due to internal client error.";
+
+       /*
+        * callerThread is the currently running thread state.syncThread is blocking for
+        * this execution state.syncParent is the blocking request
+        */
+
+       ReadGraphImpl(ReadGraphImpl parentGraph, CacheEntry parent, QueryProcessor support) {
+               this.parentGraph = parentGraph;
+               this.parent = parent;
+               this.processor = support;
+               this.asyncBarrier = prepareBarrier(parentGraph, parent, null, false);
+       }
+
+    ReadGraphImpl(ReadGraphImpl parentGraph, CacheEntry parent, QueryProcessor support, AsyncBarrierImpl asyncBarrier) {
+        this.parentGraph = parentGraph;
+        this.parent = parent;
+        this.processor = support;
+        this.asyncBarrier = asyncBarrier;
+    }
+
+       ReadGraphImpl(ReadGraphImpl graph, CacheEntry parent) {
+               this(graph, parent, graph.processor);
+       }
+
+    ReadGraphImpl(ReadGraphImpl parentGraph, CacheEntry parent, Runnable callback, boolean needsToBlock) {
+        this(parentGraph, parent, parentGraph.processor, prepareBarrier(parentGraph, parent, callback, needsToBlock));
+    }
+
+    static AsyncBarrierImpl prepareBarrier(ReadGraphImpl parentGraph, CacheEntry parent, Runnable callback, boolean needsToBlock) {
+        return new AsyncBarrierImpl(parentGraph != null ? parentGraph.asyncBarrier : null, parent, callback, needsToBlock);
+    }
+    
+       ReadGraphImpl(ReadGraphImpl graph) {
+               this(graph, graph.parent);
+       }
+
+       public ReadGraphImpl withParent(CacheEntry parent, Runnable callback, boolean needsToBlock) {
+               return new ReadGraphImpl(this, parent, callback, needsToBlock);
+       }
+
+       public ReadGraphImpl forRecompute(CacheEntry parent) {
+               return new ReadGraphImpl(null, parent, processor);
+       }
+
+    public static ReadGraphImpl create(QueryProcessor support) {
+        ReadGraphImpl result = new ReadGraphImpl(null, null, support);
+        return result;
+    }
+
+       public ReadGraphImpl newRestart(ReadGraphImpl impl) {
+
+               WriteGraphImpl write = processor.getSession().getService(
+                               WriteGraphImpl.class);
+
+               return write;
+
+       }
+
+       final private ListenerBase getListenerBase(final Object procedure) {
+               if (procedure instanceof ListenerBase)
+                       return (ListenerBase) procedure;
+               else
+                       return null;
+       }
+
+       public <T> void waitAsyncProcedure(AsyncMultiReadProcedure<T> procedure) {
+               
+               assert(procedure.done());
+               
+       }
+
+       public <T> void waitAsyncProcedure(AsyncReadProcedure<T> procedure) {
+               
+               assert(procedure.done());
+               
+       }
+
+       public boolean resumeTasks() {
+               return processor.resumeTasks(this);
+       }
+
+       Class<?> singleClass(Set<Resource> types) {
+               Class<?> result = null;
+               for (Resource type : types) {
+                       Class<?> clazz = processor.getBuiltinValue(type);
+                       if (clazz != null) {
+                               if (result != null)
+                                       return null;
+                               else
+                                       result = clazz;
+                       }
+               }
+               return result;
+       }
+
+       private String debugString(Resource r) {
+               String name = null;
+               try {
+                       name = getPossibleRelatedValue(r, processor.getL0(this).HasName);
+               } catch (ManyObjectsForFunctionalRelationException e) {
+               Logger.defaultLogError(e);
+               } catch (ServiceException e) {
+               Logger.defaultLogError(e);
+               }
+               return "[" + name + " - " + r + "]";
+       }
+
+       @Override
+       public String toString() {
+               return "ReadGraphImpl[thread=" + Thread.currentThread() + "]";
+       }
+
+       @Override
+       final public int thread() {
+               return 0;
+       }
+       
+    static class MultiTripleIntProcedure implements TripleIntProcedure {
+
+       final private AsyncMultiProcedure<Statement> procedure;
+       final private ReadGraphImpl impl;
+       final private QuerySupport support;
+       
+       public MultiTripleIntProcedure(AsyncMultiProcedure<Statement> procedure, ReadGraphImpl impl, QuerySupport support) {
+               this.procedure = procedure;
+               this.impl = impl;
+               this.support = support;
+       }
+       
+       @Override
+       public void execute(ReadGraphImpl graph, int s, int p, int o) {
+               try {
+                       procedure.execute(graph, support.getStatement(s, p, o));
+               } catch (Throwable t2) {
+                       Logger.defaultLogError(t2);
+               }
+       }
+
+       @Override
+       public void finished(ReadGraphImpl graph) {
+               try {
+                       procedure.finished(graph);
+//                     impl.state.barrier.dec("ReadGraphSupportImpl.516");
+               } catch (Throwable t2) {
+                       Logger.defaultLogError(t2);
+               }
+       }
+
+       @Override
+       public void exception(ReadGraphImpl graph, Throwable t) {
+               try {
+                       procedure.exception(graph, t);
+               } catch (Throwable t2) {
+                       Logger.defaultLogError(t2);
+               }
+//             impl.state.barrier.dec("ReadGraphSupportImpl.516");
+       }
+
+       @Override
+       public String toString() {
+               return "forEachObject with " + procedure;
+       }
+       
+    }
+
+//    private AsyncMultiProcedure<Resource> cacheKey = null;
+//    private MultiIntProcedure cacheResult = null;
+//    
+//    final IntProcedure forMultiProcedure(final AsyncMultiProcedure<Resource> procedure) {
+//     
+//     if(procedure == cacheKey) return cacheResult; 
+//     
+//     cacheResult = new MultiIntProcedure(procedure, this, processor.support);
+//     cacheKey = procedure;
+//     
+//     return cacheResult;
+//     
+//    }
+//
+//    private AsyncMultiProcedure<Statement> cacheKey2 = null;
+//    private MultiTripleIntProcedure cacheResult2 = null;
+//
+//    final synchronized TripleIntProcedure forMultiProcedure(final AsyncMultiProcedure<Statement> procedure) {
+//     
+//     if(procedure == cacheKey2) return cacheResult2; 
+//     
+//     cacheResult2 = new MultiTripleIntProcedure(procedure, this, processor.support);
+//     cacheKey2 = procedure;
+//     
+//     return cacheResult2;
+//     
+//    }
+    
+    @Override
+    public Datatype getDataType(Resource subject) throws DatabaseException {
+       for(Resource dataTypeResource : getObjects(subject, processor.getL0(this).HasDataType))
+               return getValue(dataTypeResource, Bindings.getBindingUnchecked(Datatype.class));
+       throw new DoesNotContainValueException("The literal has no data type.");
+    }
+    
+    protected <T extends Accessor> T getAccessor4File(Resource subject)
+    throws DatabaseException {
+        return null;
+        /*        
+        byte[]  bytes = processor.support.getValue(g, subject);
+        if (null == bytes)
+            return null;
+        try {
+            BinaryVariant va = (BinaryVariant) Accessors.getAccessor(bytes, Datatypes.VARIANT);
+            Accessor ca = va.getContentAccessor();
+            return (T)ca;
+        } catch (AccessorConstructionException e) {
+            throw new DatabaseException(e);
+        }
+        */
+        /*
+        if (null == bytes)
+            return null;
+        Binding datatype_binding = Bindings.getBindingUnchecked(DataType.class);
+        Serializer datatype_serializer = datatype_binding.serializer();
+        DataType datatype;
+        try {
+            BinaryMemory in = new BinaryMemory(ByteBuffer.wrap(bytes));
+            datatype = (DataType)datatype_serializer.deserialize(in);
+            Binding data_binding = Bindings.getBinding(datatype);
+            Serializer data_serializer = data_binding.serializer(BinarySerializationFormat.INSTANCE);
+            Object o = data_serializer.deserialize(in);
+            try {
+                return (T)Accessors.getAccessor(data_binding, o);
+            } catch(AccessorConstructionException e) {
+                return null;
+            }
+        } catch (Exception e) {
+            throw new DatabaseException(e);
+        }*/
+    }
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Accessor> T getAccessor(Resource subject) throws DatabaseException {
+        RandomAccessBinary rab = getRandomAccessBinary(subject);
+        try {
+            return (T)Accessors.getAccessor(rab, getDataType(subject));
+        } catch(AccessorConstructionException e) {
+            throw new DatabaseException(e);
+        }
+    }
+    @SuppressWarnings("unchecked")
+    protected <T extends Accessor> T createAccessor(Resource resource, Datatype datatype, Object intialValue)
+    throws DatabaseException {
+        RandomAccessBinary rab = createRandomAccessBinary(resource, datatype, intialValue);
+        try {
+            return (T)Accessors.getAccessor(rab, datatype);
+        } catch(AccessorConstructionException e) {
+            throw new DatabaseException(e);
+        }
+    }
+    @Override
+    public RandomAccessBinary getRandomAccessBinary(Resource subject) throws DatabaseException {
+        RandomAccessValueSupport ravs = getSession().getService(RandomAccessValueSupport.class);
+        ResourceData rd = ravs.get(subject);
+        if (null != rd)
+            return rd;
+        try {
+            ExternalValueSupport evs = getService(ExternalValueSupport.class);
+            long size = evs.getValueSize(this, subject); // Throws DatabaseException if no old external value.
+            try {
+                File platform = Platform.getLocation().toFile();
+                File tempFiles = new File(platform, "tempFiles");
+                File dbDir = new File(tempFiles, "db");
+                dbDir.mkdirs();
+                File file = new File(dbDir, "ResourceFile" + subject.getResourceId());
+                rd = new ResourceData(new BinaryFile(file), true); // Old external value.
+                final int N = 1<<20;
+                long left = size;
+                long offset = 0;
+                while (left > 0) {
+                    int length = N < left ? N : (int)left;
+                    byte[] bytes = evs.readValue(this, subject, offset, length);
+                    offset += bytes.length;
+                    left -= bytes.length;
+                    rd.binaryFile.write(bytes);
+                }
+                ravs.put(subject, rd);
+                return rd;
+            } catch (Exception e) {
+                throw new DatabaseException("Resource " + subject + " have value but there was problem with accessing value data.", e);
+            }
+        } catch (Exception e) {
+            if(Development.DEVELOPMENT) {
+                if(Development.<Boolean>getProperty(DevelopmentKeys.WRITEGRAPH_EXCEPTION_STACKTRACES, Bindings.BOOLEAN)) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        Datatype datatype = getDataType(subject);
+        Object value = getPossibleValue(subject, Bindings.getBinding(datatype));
+        return createRandomAccessBinary(subject, datatype, value);
+    }
+    public RandomAccessBinary createRandomAccessBinary(Resource resource, Datatype datatype, Object initialValue)
+    throws DatabaseException {
+        RandomAccessValueSupport ravs = getSession().getService(RandomAccessValueSupport.class);
+        try {
+            File platform = Platform.getLocation().toFile();
+            File tempFiles = new File(platform, "tempFiles");
+            File dbDir = new File(tempFiles, "db");
+            dbDir.mkdirs();
+            File file = new File(dbDir, "ResourceFile" + resource.getResourceId());
+            ResourceData rd = new ResourceData(new BinaryFile(file), false);
+            Binding binding = Bindings.getBinding(datatype);
+            if (null == initialValue) {
+                initialValue = binding.createDefault();
+            }
+            Serializer serializer = binding.serializer();
+            byte[] bytes = serializer.serialize(initialValue);
+            // In case the file has been previously accessed and was larger we set the correct size now
+            rd.binaryFile.setLength(bytes.length);
+            rd.binaryFile.write(bytes);
+            ravs.put(resource, rd);
+            return rd;
+        } catch (Exception e) {
+            if (e instanceof DatabaseException)
+                throw (DatabaseException)e;
+            else
+                throw new DatabaseException(e);
+        }
+    }
+
+//    static class ExternalValueRequest<T> extends ResourceRead<T> {
+//
+//             public ExternalValueRequest(Resource resource) {
+//                     super(resource);
+//             }
+//
+//             @SuppressWarnings("unchecked")
+//             @Override
+//             public T perform(ReadGraph graph) throws DatabaseException {
+//             try {
+//                     
+//                     String uri = graph.getURI(resource);
+//                     if(Layer0.URIs.Functions_functionApplication.equals(uri)) return (T)functionApplication;
+//                     
+//                     return (T)ReflectionUtils.getValue(uri).getValue();
+//                     
+//             } catch(ValueNotFoundException e) {
+//                     throw new DatabaseException("Couldn't convert to external value (r=" + resource + ")", e);
+//             } catch(ClassCastException e) {
+//                     throw new DatabaseException("Couldn't convert to external value (r=" + resource + ")", e);
+//             }
+//             }
+//     
+//    }
+    
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T getValue2(Resource r, Object context) throws DatabaseException {
+       Layer0 L0 = processor.getL0(this);
+       Set<Resource> types = getTypes(r);
+       
+       if(types.contains(L0.Literal)) {
+               if(isImmutable(r)) {
+                       return syncRequest(new ValueImplied<T>(r));
+               } else {
+                       return getValue(r);
+               }
+       }
+       else if(types.contains(L0.ExternalValue)) {
+               return (T)syncRequest(new AdaptValue(r), TransientCacheListener.<Object>instance());
+       }
+       else {
+
+           Function3<ReadGraph,Resource,Object,T> function = requestValueFunction(r);
+           if(function == null) throw new DoesNotContainValueException("Couldn't convert to a value function " + r);
+           try {
+               return function.apply(this, r, context);
+           } catch(RuntimeException e) {
+               DatabaseException dte = findPossibleRootException(e);
+               if(dte != null) throw dte;
+               else throw new DatabaseException(e);
+           }
+               
+       }
+    }
+
+    @Override
+    public Variant getVariantValue2(Resource r, Object context) throws DatabaseException {
+        Layer0 L0 = processor.getL0(this);
+        Set<Resource> types = getTypes(r);
+        
+        if(types.contains(L0.Literal)) {
+            if(isImmutable(r)) {
+                return syncRequest(new VariantValueImplied(r));
+            } else {
+                return getVariantValue(r);
+            }
+        }
+        else if(types.contains(L0.ExternalValue)) {
+            Object value = syncRequest(new AdaptValue(r), TransientCacheListener.<Object>instance());
+            try {
+                return new Variant(Bindings.OBJECT.getContentBinding(value), value);
+            } catch ( org.simantics.databoard.binding.error.BindingException e ) {
+                throw new BindingException( "No binding found for class " + value.getClass().getName(), e );
+            }
+        }
+        else {
+
+            Function3<ReadGraph,Resource,Object,Object> function = requestValueFunction(r);
+            if(function == null) throw new DoesNotContainValueException("Couldn't convert to a value function " + r);
+            try {
+                Object value = function.apply(this, r, context);
+                try {
+                    return new Variant(Bindings.OBJECT.getContentBinding(value), value);
+                } catch ( org.simantics.databoard.binding.error.BindingException e ) {
+                    throw new BindingException( "No binding found for class " + value.getClass().getName(), e );
+                }
+            } catch(RuntimeException e) {
+                DatabaseException dte = findPossibleRootException(e);
+                if(dte != null) throw dte;
+                else throw new DatabaseException(e);
+            }
+        }
+    }
+    
+    @Override
+    public <T> T getPossibleValue2(Resource subject, Object context) throws DatabaseException {
+       try {
+               return getValue2(subject, context);
+       } catch (DatabaseException e) {
+               return null;
+       }
+    }
+
+    static class PossibleConverterFunction<T> extends ResourceRead<Function3<ReadGraph,Resource,Object,T>> {
+       
+       public PossibleConverterFunction(Resource resource) {
+                       super(resource);
+               }
+
+        @Override
+        public Function3<ReadGraph,Resource,Object,T> perform(ReadGraph graph) throws DatabaseException {
+               return compute(graph, resource);
+        }
+        
+        @SuppressWarnings("unchecked")
+               public static <T> Function3<ReadGraph,Resource,Object,T> compute(ReadGraph graph, Resource resource) throws DatabaseException {
+            Layer0 L0 = Layer0.getInstance(graph);
+            for(Resource converter : graph.getObjects(resource, L0.ConvertsToValueWith)) {
+                try {
+                       if(L0.Functions_functionApplication.equals(converter)) {
+                               return (Function3<ReadGraph,Resource,Object,T>)graph.syncRequest(new AdaptValue(resource));
+                       } else {
+                               return graph.getValue2(converter, resource);
+                       }
+                } catch(RuntimeException e) {
+                    DatabaseException dte = findPossibleRootException(e);
+                    if(dte != null) throw dte;
+                    else throw new DatabaseException(e);
+                }
+            }
+            return null;
+        }
+        
+    }
+    
+    <T> Function3<ReadGraph,Resource,Object,T> requestValueFunction(Resource r) throws DatabaseException {
+       if(isImmutable(r))
+               return syncRequest(new PossibleConverterFunction<T>(r), TransientCacheAsyncListener.<Function3<ReadGraph,Resource,Object,T>>instance());
+       else
+               return syncRequest(new PossibleConverterFunction<T>(r));
+    }
+    
+    /**
+     * Get a value associated with a graph {@link Resource}, using a possible context object and
+     * a desired value binding. The following methods are tried in order to retreive the value:
+     * <ol>
+     *   <li>If the given resource is a {@code L0.Literal}, the value of the literal is returned, using the binding specified by {@code binding}.</li>
+     *   <li>If the resource is a {@code L0.ExternalValue}, the value is acquired using
+     *       {@link ReflectionUtils#getValue(String)}.</li>
+     *   <li>If the resource is associated with a suitable value converter with relation {@code L0.ConvertsToValueWith}
+     *       (see {@link #requestValueFunction(Resource)}), the value function is called with the graph, the resource
+     *       and the context object.</li>
+     * </ul>
+     * 
+     * @param r  A graph resource with which the value is associated
+     * @param context  A context object that is used for acquiring the value (only applied in case 3)
+     * @param binding  A binding for the value type (only applied in case 1)
+     * @return  The value of the graph node.
+     * @throws DoesNotContainValueException  No value is associated with the graph node.
+     * @throws DatabaseException  Other errors, such as an error in casting the value to the return type or
+     *         a runtime error in the value function.
+     */
+    @SuppressWarnings("unchecked")
+       @Override
+    public <T> T getValue2(Resource r, Object context, Binding binding) throws DatabaseException {
+       if (binding instanceof ObjectVariantBinding)
+               return getValue2(r, context);
+       
+       Layer0 L0 = processor.getL0(this);
+       Set<Resource> types = getTypes(r);
+       if(types.contains(L0.Literal)) {
+               if(isImmutable(r)) {
+                       return syncRequest(new Value<T>(r, binding));
+               } else {
+                       return getValue(r, binding);
+               }
+       } else if(types.contains(L0.ExternalValue)) {
+               ComputationalValue cv = syncRequest(new PossibleAdapter<ComputationalValue>(r, ComputationalValue.class), TransientCacheAsyncListener.instance());
+               if(cv != null) {
+                       return cv.getValue(this, r);
+               } else {
+                       // This should not even be possible since L0 defines an adapter for all values
+                       try {
+                               return (T)ReflectionUtils.getValue(getURI(r)).getValue();
+                       } catch(ValueNotFoundException e) {
+                               throw new DatabaseException(e);
+                       } catch(ClassCastException e) {
+                               throw new DatabaseException(e);
+                       }
+               }
+       }
+       else {
+           Function3<ReadGraph,Resource,Object,T> function = requestValueFunction(r);
+           if(function == null) throw new DoesNotContainValueException("Couldn't convert to a value function.");
+           try {
+               Object value = function.apply(this, r, context);
+               if(binding.isInstance(value)) return (T)value;
+               Binding srcBinding = Bindings.OBJECT.getContentBinding(value);
+               return (T)Bindings.adapt(value, srcBinding, binding);
+           } catch(RuntimeException e) {
+               DatabaseException dte = findPossibleRootException(e);
+               if(dte != null) throw dte;
+               else throw new DatabaseException(e);
+           } catch (AdaptException e) {
+               throw new DatabaseException(e);
+                       } catch (org.simantics.databoard.binding.error.BindingException e) {
+               throw new DatabaseException(e);
+                       }
+       }
+    }
+    
+    @Override
+    public <T> T getPossibleValue2(Resource subject, Object context, Binding binding) throws DatabaseException {
+       try {
+               return getValue2(subject, context, binding);
+       } catch (DatabaseException e) {
+               return null;
+       }
+    }
+    
+       private static DatabaseException findPossibleRootException(Throwable t) {
+               if(t == null) return null;
+               if(t instanceof DatabaseException) return (DatabaseException)t;
+               if(t instanceof RuntimeException || t instanceof InvocationTargetException) {
+                       return findPossibleRootException(t.getCause());
+               }
+               return null;
+       }
+    
+    @Override
+    public <T> T getRelatedValue2(Resource subject, Resource relation) throws DatabaseException {
+       return getRelatedValue2(subject, relation, subject);
+    }
+    
+    @Override
+    public Variant getRelatedVariantValue2(Resource subject, Resource relation) throws DatabaseException {
+        return getRelatedVariantValue2(subject, relation, subject);
+    }
+    
+    @Override
+    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation) throws DatabaseException {
+       try {
+               Resource object = getPossibleObject(subject, relation);
+               if(object == null) return null;
+               else return getValue2(object, subject);
+       } catch (DatabaseException e) {
+               return null;
+       }
+    }
+
+    @Override
+    public <T> T getRelatedValue2(Resource subject, Resource relation, Object context) throws DatabaseException {
+               if(Development.DEVELOPMENT) {
+                       if(Development.<Boolean>getProperty(DevelopmentKeys.L0_VALIDATION, Bindings.BOOLEAN)) {
+                               String error = L0Validations.checkValueType(this, subject, relation);
+                               if(error != null) {
+                                       Logger.defaultLogError(new ValidationException(error));
+                                       throw new ValidationException(error);
+                               }
+                       }
+               }
+        return getValue2(getSingleObject(subject, relation), context);
+    }
+    
+    @Override
+    public Variant getRelatedVariantValue2(Resource subject, Resource relation, Object context) throws DatabaseException {
+        if(Development.DEVELOPMENT) {
+                       if(Development.<Boolean>getProperty(DevelopmentKeys.L0_VALIDATION, Bindings.BOOLEAN)) {
+                               String error = L0Validations.checkValueType(this, subject, relation);
+                               if(error != null) {
+                                       Logger.defaultLogError(new ValidationException(error));
+                                       throw new ValidationException(error);
+                               }
+                       }
+        }
+        return getVariantValue2(getSingleObject(subject, relation), context);
+    }
+    
+    @Override
+    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation, Object context) throws DatabaseException {
+       try {
+               Resource object = getPossibleObject(subject, relation);
+               if(object == null) return null;
+               else return getValue2(object, context);
+       } catch (DatabaseException e) {
+               return null;
+       }
+    }
+
+    @Override
+    public <T> T getRelatedValue2(Resource subject, Resource relation, Binding binding) throws DatabaseException {
+       return getRelatedValue2(subject, relation, subject, binding);
+    }
+    
+    @Override
+    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation, Binding binding) throws DatabaseException {
+       try {
+               Resource object = getPossibleObject(subject, relation);
+               if(object == null) return null;
+               return getValue2(object, subject, binding);
+       } catch (DatabaseException e) {
+               return null;
+       }
+    }
+
+    @Override
+    public <T> T getRelatedValue2(Resource subject, Resource relation, Object context, Binding binding) throws DatabaseException {
+        return getValue2(getSingleObject(subject, relation), context, binding);
+    }
+    
+    @Override
+    public <T> T getPossibleRelatedValue2(Resource subject, Resource relation, Object context, Binding binding) throws DatabaseException {
+       try {
+               Resource object = getPossibleObject(subject, relation);
+               if(object == null) return null;
+               else return getValue2(object, context, binding);
+       } catch (DatabaseException e) {
+               return null;
+       }
+    }
+    
+    @Override
+    public Type getRelatedValueType(Resource subject, Resource relation) throws DatabaseException {
+        Layer0 L0 = processor.getL0(this);
+        Resource property = getSingleObject(subject, relation);
+        String typeText = (String)getRelatedValue(property, L0.HasValueType, Bindings.STRING);
+        try {
+            return org.simantics.scl.compiler.types.Types.parseType(typeText);
+        } catch (SCLTypeParseException e) {
+            throw new DatabaseException(e);
+        }
+    }
+
+    private static ThreadLocal<Boolean> syncGraph = new ThreadLocal<Boolean>() {
+        protected Boolean initialValue() {
+            return true;
+        }
+    };
+
+    @Override
+    public boolean setSynchronous(boolean value) {
+        boolean old = getSynchronous();
+        syncGraph.set(value);
+        return old;
+    }
+
+    @Override
+    public boolean getSynchronous() {
+        return syncGraph.get();
+    }
+    
+    public void ensureLoaded(int resource) {
+       processor.querySupport.ensureLoaded(this, resource);
+    }
+    
+    public void ensureLoaded(int resource, int predicate) {
+       processor.querySupport.ensureLoaded(this, resource, predicate);
+    }
+
+    public byte[] getValue(int resource) {
+       return processor.querySupport.getValue(this, resource);
+    }
+    
+    public int thread(int resource) {
+       return (resource >>> 16) & processor.THREAD_MASK;
+    }
+
+    public int thread(Resource resource) {
+       return (((ResourceImpl)resource).id >>> 16) & processor.THREAD_MASK;
+    }
+    
+    public ResourceSupport getResourceSupport() {
+       return processor.getResourceSupport();
+    }
+    
+    @Override
+    public Object getModificationCounter() {
+       return processor.getSession().getModificationCounter();
+    }
+
+    @Override
+    public boolean performPending() {
+        return processor.performPending(this);
+    }
+    
+    public Set<ReadGraphImpl> ancestorSet() {
+        HashSet<ReadGraphImpl> result = new HashSet<>();
+        ReadGraphImpl g = this;
+        while(g != null) {
+            result.add(g);
+            g = g.parentGraph;
+        }
+        return result;
+    }
+    
+    public int getLevel() {
+        return getLevelStatic(this);
+    }
+    
+    private static int getLevelStatic(ReadGraphImpl impl) {
+        if(impl == null) return 0;
+        else return 1 + getLevelStatic(impl.parentGraph);
+    }
+    
+    public boolean isParent(ReadGraphImpl impl) {
+        if(impl == null) return false;
+        if(this == impl) return true;
+        return isParent(impl.parentGraph);
+    }
+    
+    public ReadGraphImpl getTopLevelGraph() {
+        return getTopLevelGraphStatic(this);
+    }
+
+    private static ReadGraphImpl getTopLevelGraphStatic(ReadGraphImpl impl) {
+        if(impl.parentGraph == null) return impl;
+        else return getTopLevelGraphStatic(impl.parentGraph);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T l0() {
+        return (T) processor.getL0();
+    }
+
+}