/******************************************************************************* * Copyright (c) 2007, 2011 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.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; import org.simantics.db.common.request.TernaryAsyncRead; import org.simantics.db.procedure.AsyncMultiProcedure; import org.simantics.db.procedure.AsyncProcedure; import org.simantics.issues.Severity; import org.simantics.issues.ontology.IssueResource; /** * @author Tuukka Lehtonen */ public class MaxIssueSeverityRecursive extends TernaryAsyncRead, Severity> { public MaxIssueSeverityRecursive(Resource resource, Resource childRelation, Set typesToRecurse) { super(resource, childRelation, typesToRecurse); } @Override public void perform(AsyncReadGraph graph, final AsyncProcedure procedure) { IssueResource ISSUE = graph.getService(IssueResource.class); AtomicInteger issues = new AtomicInteger(); AtomicBoolean excepted = new AtomicBoolean(false); graph.forEachObject(parameter, ISSUE.Issue_HasContext_Inverse, new AsyncMultiProcedure() { @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() { @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() { @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); } }); } } }