]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.issues.common/src/org/simantics/issues/common/MaxIssueSeverityRecursive.java
Multiple readers in db client
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / MaxIssueSeverityRecursive.java
index 7646271e3d91443564d9d51fd47af401d2b9ca68..ed3d6c2b97f66c97d7e40a050c0699e9152b2f84 100644 (file)
  *******************************************************************************/
 package org.simantics.issues.common;
 
  *******************************************************************************/
 package org.simantics.issues.common;
 
+import java.util.Collection;
 import java.util.Set;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 
 
-import org.simantics.db.AsyncReadGraph;
+import org.simantics.db.ReadGraph;
 import org.simantics.db.Resource;
 import org.simantics.db.Resource;
-import org.simantics.db.common.request.TernaryAsyncRead;
-import org.simantics.db.procedure.AsyncMultiProcedure;
-import org.simantics.db.procedure.AsyncProcedure;
+import org.simantics.db.common.request.TernaryRead;
+import org.simantics.db.exception.DatabaseException;
 import org.simantics.issues.Severity;
 import org.simantics.issues.ontology.IssueResource;
 
 /**
  * @author Tuukka Lehtonen
  */
 import org.simantics.issues.Severity;
 import org.simantics.issues.ontology.IssueResource;
 
 /**
  * @author Tuukka Lehtonen
  */
-public class MaxIssueSeverityRecursive extends TernaryAsyncRead<Resource, Resource, Set<Resource>, Severity> {
+public class MaxIssueSeverityRecursive extends TernaryRead<Resource, Resource, Set<Resource>, Severity> {
 
     public MaxIssueSeverityRecursive(Resource resource, Resource childRelation, Set<Resource> typesToRecurse) {
         super(resource, childRelation, typesToRecurse);
     }
     
     @Override
 
     public MaxIssueSeverityRecursive(Resource resource, Resource childRelation, Set<Resource> typesToRecurse) {
         super(resource, childRelation, typesToRecurse);
     }
     
     @Override
-    public void perform(AsyncReadGraph graph, final AsyncProcedure<Severity> procedure) {
+    public Severity perform(ReadGraph graph) throws DatabaseException {
 
         IssueResource ISSUE = graph.getService(IssueResource.class);
 
 
         IssueResource ISSUE = graph.getService(IssueResource.class);
 
-        AtomicInteger issues = new AtomicInteger();
-        AtomicBoolean excepted = new AtomicBoolean(false);
-
-        graph.forEachObject(parameter, ISSUE.Issue_HasContext_Inverse, new AsyncMultiProcedure<Resource>() {
-            @Override
-            public void execute(AsyncReadGraph graph, Resource result) {
-                issues.incrementAndGet();
-            }
-            @Override
-            public void finished(AsyncReadGraph graph) {
-            
-            }
-            @Override
-            public void exception(AsyncReadGraph graph, Throwable throwable) {
-                if(excepted.compareAndSet(false, true))
-                    procedure.exception(graph, throwable);
-            }
-        });
-
-        graph.forEachObject(parameter, ISSUE.Issue_ContextList_Element_Inverse, new AsyncMultiProcedure<Resource>() {
-            @Override
-            public void execute(AsyncReadGraph graph, Resource result) {
-                issues.incrementAndGet();
-            }
-            @Override
-            public void finished(AsyncReadGraph graph) {
-            
-            }
-            @Override
-            public void exception(AsyncReadGraph graph, Throwable throwable) {
-                if(excepted.compareAndSet(false, true))
-                  procedure.exception(graph, throwable);
-            }
-        });
-        
-        if(excepted.get()) return;
-
-        if (issues.get() == 0) {
-            // This content does not have directly attached issues, try to look
-            // for some in the child components.
-            graph.asyncRequest(new ChildMaxIssueSeverity(parameter, parameter2, parameter3), procedure);
-        } else {
-            // Try local issues first
-            graph.asyncRequest(new MaxIssueSeveritySingle(parameter), new AsyncProcedure<Severity>() {
-                @Override
-                public void execute(AsyncReadGraph graph, Severity maxSeverity) {
-                    if (maxSeverity == null)
-                        // No severity for local issues, try children next.
-                        graph.asyncRequest(new ChildMaxIssueSeverity(parameter, parameter2, parameter3), procedure);
-                    else
-                        procedure.execute(graph, maxSeverity);
-                }
-                @Override
-                public void exception(AsyncReadGraph graph, Throwable throwable) {
-                    if(excepted.compareAndSet(false, true))
-                      procedure.exception(graph, throwable);
-                }
-            });
+        Collection<Resource> inv = graph.getObjects(parameter, ISSUE.Issue_HasContext_Inverse);
+        Collection<Resource> inv2 = graph.getObjects(parameter, ISSUE.Issue_ContextList_Element_Inverse);
+        if(inv.isEmpty() && inv2.isEmpty()) {
+            return graph.syncRequest(new ChildMaxIssueSeverity(parameter, parameter2, parameter3));
         }
         }
+        
+        Severity max = graph.syncRequest(new MaxIssueSeveritySingle(parameter));
+        if(max != null)
+            return max;
+        else
+            return graph.syncRequest(new ChildMaxIssueSeverity(parameter, parameter2, parameter3));
+            
     }
 
 }
     }
 
 }