]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.issues.common/src/org/simantics/issues/common/MaxIssueSeverityRecursive.java
Issue context modelling enhancements
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / MaxIssueSeverityRecursive.java
index db537ee26ac6d4ed826773b39deb81bc122307fe..7646271e3d91443564d9d51fd47af401d2b9ca68 100644 (file)
@@ -12,6 +12,8 @@
 package org.simantics.issues.common;
 
 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.Resource;
@@ -29,66 +31,71 @@ public class MaxIssueSeverityRecursive extends TernaryAsyncRead<Resource, Resour
     public MaxIssueSeverityRecursive(Resource resource, Resource childRelation, Set<Resource> typesToRecurse) {
         super(resource, childRelation, typesToRecurse);
     }
-
-//    @Override
-//    public Severity perform(ReadGraph graph) throws DatabaseException {
-//        Layer0 L0 = Layer0.getInstance(graph);
-//        IssueResource ISSUE = IssueResource.getInstance(graph);
-//        //System.out.println("severity: " + NameUtils.getSafeName(graph, resource));
-//        Collection<Resource> issues = graph.getObjects(resource, ISSUE.IsIssueContextOf);
-//        if (issues.isEmpty()) {
-//            // This content does not have directly attached issues, try to look
-//            // for some in the child components.
-//            return graph.syncRequest(new ChildMaxIssueSeverity(resource, L0.ConsistsOf));
-//        }
-//
-//        Severity maxSeverity = graph.syncRequest(new MaxIssueSeveritySingle(resource));
-//        if (maxSeverity == null)
-//            maxSeverity = graph.syncRequest(new ChildMaxIssueSeverity(resource, L0.ConsistsOf));
-//
-//        return maxSeverity;
-//    }
-
+    
     @Override
     public void perform(AsyncReadGraph graph, final AsyncProcedure<Severity> procedure) {
+
         IssueResource ISSUE = graph.getService(IssueResource.class);
-        //System.out.println(getClass().getSimpleName() + ": " + parameter);
+
+        AtomicInteger issues = new AtomicInteger();
+        AtomicBoolean excepted = new AtomicBoolean(false);
 
         graph.forEachObject(parameter, ISSUE.Issue_HasContext_Inverse, new AsyncMultiProcedure<Resource>() {
-            volatile int issues = 0;
             @Override
             public void execute(AsyncReadGraph graph, Resource result) {
-                ++issues;
+                issues.incrementAndGet();
             }
             @Override
             public void finished(AsyncReadGraph graph) {
-                if (issues == 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) {
-                            procedure.exception(graph, throwable);
-                        }
-                    });
-                }
+            
             }
             @Override
             public void exception(AsyncReadGraph graph, Throwable throwable) {
-                procedure.exception(graph, 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);
+                }
+            });
+        }
     }
 
 }