X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.issues.common%2Fsrc%2Forg%2Fsimantics%2Fissues%2Fcommon%2FRunActiveValidations.java;fp=bundles%2Forg.simantics.issues.common%2Fsrc%2Forg%2Fsimantics%2Fissues%2Fcommon%2FRunActiveValidations.java;h=9694d603b386251695f2930bca52a7854dfbb72f;hb=0ffcb1180dcccf28e66a391338885be224ba1c47;hp=0000000000000000000000000000000000000000;hpb=342a2b006b88330280060c16c2ab50374468a4c6;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.issues.common/src/org/simantics/issues/common/RunActiveValidations.java b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/RunActiveValidations.java new file mode 100644 index 000000000..9694d603b --- /dev/null +++ b/bundles/org.simantics.issues.common/src/org/simantics/issues/common/RunActiveValidations.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * 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.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.SubMonitor; +import org.simantics.Simantics; +import org.simantics.db.Issue; +import org.simantics.db.ReadGraph; +import org.simantics.db.RequestProcessor; +import org.simantics.db.Resource; +import org.simantics.db.Session; +import org.simantics.db.common.request.Queries; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.common.utils.ListUtils; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.request.PossibleActiveModel; +import org.simantics.db.layer0.util.ModelTransferableGraphSourceRequest; +import org.simantics.db.layer0.util.SessionGarbageCollection; +import org.simantics.issues.ontology.IssueResource; +import org.simantics.issues.preferences.IssuePreferenceUtil; + +/** + * @author Tuukka Lehtonen + */ +public class RunActiveValidations { + + public static void run(IProgressMonitor monitor) throws DatabaseException { + Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource())); + if(model != null) + run(monitor, model); + } + + public static void run(IProgressMonitor monitor, Resource model) throws DatabaseException { + + final Session session = Simantics.getSession(); + + // 1. query for which composites to run the validation + final Collection validations = new ArrayList<>(); + final BatchIssueValidationContext context = new BatchIssueValidationContext(); + + try { + + toBatchIssueSources(session, + session.syncRequest(new SelectedModelBatchIssueSources(model)), + validations); + + SubMonitor.convert(monitor, Messages.RunActiveValidations_MonitorPreparingResourcesForValidation, 100); + context.contexts = Collections.singletonList(model); + context.domain = ModelTransferableGraphSourceRequest.getDomainOnly(session, monitor, model); + + if (monitor.isCanceled()) + throw new OperationCanceledException(); + + } finally { + monitor.done(); + } + + if(!validations.isEmpty() && !context.contexts.isEmpty()) + run(monitor, validations, context); + + } + + static Collection toBatchIssueSources(RequestProcessor processor, Collection sources, Collection result) throws DatabaseException { + for (Resource source : sources) { + BatchIssueSource bis = processor.syncRequest(Queries.adapt(source, BatchIssueSource.class, true)); + if (bis != null) + result.add(bis); + } + return result; + } + + public static void run(IProgressMonitor monitor, final Collection validations, final BatchIssueValidationContext context) throws DatabaseException { + SubMonitor progress = SubMonitor.convert(monitor, Messages.RunActiveValidations_ValidateModel, 100); + int maxWrittenIssues = IssuePreferenceUtil.getPreferences().maxBatchIssuesToWrite; + int writtenIssues = 0; + for (BatchIssueSource source : validations) { + Map> results = BatchValidations.validate(progress.newChild(90, SubMonitor.SUPPRESS_NONE), source, context); + if (progress.isCanceled()) + throw new OperationCanceledException(); + + Collection removed = Simantics.getSession().syncRequest(new ResourceRead>(source.getResource()) { + @Override + public Collection perform(ReadGraph graph) throws DatabaseException { + IssueResource ISSUE = IssueResource.getInstance(graph); + ArrayList result = new ArrayList<>(); + for (Resource issue : graph.syncRequest(new ManagedIssues(resource))) { + Resource list = graph.getSingleObject(issue, ISSUE.Issue_HasContexts); + List l = ListUtils.toList(graph, list); + if (l.size() > 0) { + Resource mainContext = l.get(0); + if (!BatchValidations.isLinkedToOtherThan(graph, mainContext, issue)) + result.add(mainContext); + } + } + return result; + } + }); + + for(Resource r : removed) { + results.put(r, Collections.emptySet()); + } + if (progress.isCanceled()) + throw new OperationCanceledException(); + + int wroteIssues = BatchValidations.store(progress.newChild(10, SubMonitor.SUPPRESS_NONE), source.getResource(), results, Math.max(0, maxWrittenIssues - writtenIssues)); + writtenIssues += wroteIssues; + + // Try to keep resource consumption down. + SessionGarbageCollection.gc(null, Simantics.getSession(), true, null); + + } + + } + +}