]> 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 48662d1903a08267a13dded57e04e04f8b85db6d..2309af76440b10bc2a3e9d336cf2fc4bdfc14819 100644 (file)
@@ -50,6 +50,7 @@ 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;
@@ -188,8 +189,6 @@ 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.simantics.utils.threads.logger.ITask;
-import org.simantics.utils.threads.logger.ThreadLogger;
 import org.slf4j.LoggerFactory;
 
 import gnu.trove.map.hash.TObjectIntHashMap;
@@ -1351,7 +1350,10 @@ public class ReadGraphImpl implements AsyncReadGraph {
 
                Statement stm = getSingleStatement(resource, relation);
                
-               return adaptContextual(stm.getObject(), new RelationContextImpl(resource, stm), RelationContext.class, clazz);
+               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());
                
        }
 
@@ -1513,15 +1515,15 @@ public class ReadGraphImpl implements AsyncReadGraph {
 
                try {
 
-                   int result = processor.getSingleObject(this, subject, relation);
-                   if(result == 0) return null;
-                   
-                   return processor.querySupport.getResource(result);
+                       int result = processor.getSingleObject(this, subject, relation);
+                       if(result == 0) return null;
+
+                       return processor.querySupport.getResource(result);
+
+               } catch (ManyObjectsForFunctionalRelationException e) {
 
-            } catch (ManyObjectsForFunctionalRelationException e) {
+                       throw new ManyObjectsForFunctionalRelationException("Many objects in " + subject + " for functional relation " + relation);
 
-                throw new ManyObjectsForFunctionalRelationException("subject=" + subject + ", relation=" + relation, e);
-                
                } catch (DatabaseException e) {
 
                        throw new ServiceException(e);
@@ -1848,13 +1850,42 @@ public class ReadGraphImpl implements AsyncReadGraph {
 
                try {
 
-                       Collection<Resource> objects = getObjects(subject, relation);
-                       return !objects.isEmpty();
+                       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);
+
                } 
                
        }
@@ -1922,14 +1953,11 @@ public class ReadGraphImpl implements AsyncReadGraph {
         * Implementation of the interface RequestProcessor
         */
 
-       @Override
-       public <T> T syncRequest(final Read<T> request) throws DatabaseException {
-               assert (request != null);
-
-               T result = (T)QueryCache.runnerReadEntry(this, request, parent, null, null, true);
-               return result;
-               
-       }
+    @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)
@@ -1943,16 +1971,12 @@ public class ReadGraphImpl implements AsyncReadGraph {
                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;
-               T result = (T)QueryCache.runnerReadEntry(this, request, parent, listener, procedure, true);
-               return result;
-
-       }
+    @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,
@@ -2028,17 +2052,13 @@ public class ReadGraphImpl implements AsyncReadGraph {
                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);
-               T result = (T)QueryCache.runnerAsyncReadEntry(this, request, parent, listener, procedure, true); 
-               return result;
-
-       }
+    @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,
@@ -5235,54 +5255,55 @@ public class ReadGraphImpl implements AsyncReadGraph {
                asyncRequest(request, new NoneToAsyncListener<T>(procedure));
        }
 
-       @Override
-       final public <T> void asyncRequest(final AsyncRead<T> request,
-                       final AsyncProcedure<T> procedure) {
+    @Override
+    final public <T> void asyncRequest(final AsyncRead<T> request,
+            final AsyncProcedure<T> procedure) {
 
-               assert (request != null);
-               assert (procedure != null);
+        assert (request != null);
+        assert (procedure != null);
 
         AsyncBarrierImpl barrier = asyncBarrier;
         if(barrier != null)
             barrier.inc();
 
-               processor.scheduleNow(new SessionTask(this) {
+        processor.scheduleNow(new SessionTask(this) {
 
-                       @Override
-                       public void run0(int thread) {
+            @Override
+            public void run0(int thread) {
 
-                           if(barrier != null)
-                           barrier.inc();
+                if(barrier != null)
+                    barrier.inc();
 
-                           try {
-                                       final ListenerBase listener = getListenerBase(procedure);
-                                       QueryCache.runnerAsyncReadEntry(ReadGraphImpl.this, request, parent, listener, new AsyncProcedure<T>() {
+                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 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);
+                        @Override
+                        public void exception(AsyncReadGraph graph, Throwable throwable) {
+                            procedure.exception(graph, throwable);
                             if(barrier != null)
                                 barrier.dec();
-                                               }
-                                               
-                                       }, false);
-                               if(barrier != null)
-                                   barrier.dec();
-                               } catch (DatabaseException e) {
-                                       Logger.defaultLogError(e);
-                               }
-                       }
-                       
-               });
+                        }
+
+                    }, 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,
@@ -6399,4 +6420,10 @@ public class ReadGraphImpl implements AsyncReadGraph {
         else return getTopLevelGraphStatic(impl.parentGraph);
     }
 
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T> T l0() {
+        return (T) processor.getL0();
+    }
+
 }