1 /*******************************************************************************
2 * Copyright (c) 2007, 2019 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 * Semantum Oy - Reorganization
12 *******************************************************************************/
13 package org.simantics.issues.common;
15 import java.util.ArrayList;
16 import java.util.Collection;
17 import java.util.Collections;
18 import java.util.List;
22 import org.eclipse.core.runtime.IProgressMonitor;
23 import org.eclipse.core.runtime.OperationCanceledException;
24 import org.eclipse.core.runtime.SubMonitor;
25 import org.simantics.Simantics;
26 import org.simantics.db.Issue;
27 import org.simantics.db.ReadGraph;
28 import org.simantics.db.RequestProcessor;
29 import org.simantics.db.Resource;
30 import org.simantics.db.Session;
31 import org.simantics.db.common.request.Queries;
32 import org.simantics.db.common.request.ResourceRead;
33 import org.simantics.db.common.utils.ListUtils;
34 import org.simantics.db.exception.DatabaseException;
35 import org.simantics.db.layer0.request.PossibleActiveModel;
36 import org.simantics.db.layer0.util.ModelTransferableGraphSourceRequest;
37 import org.simantics.db.layer0.util.SessionGarbageCollection;
38 import org.simantics.issues.ontology.IssueResource;
39 import org.simantics.issues.preferences.IssuePreferenceUtil;
42 * @author Tuukka Lehtonen
44 public class RunActiveValidations {
46 public static void run(IProgressMonitor monitor) throws DatabaseException {
47 Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource()));
52 public static void run(IProgressMonitor monitor, Resource model) throws DatabaseException {
54 final Session session = Simantics.getSession();
56 // 1. query for which composites to run the validation
57 final Collection<BatchIssueSource> validations = new ArrayList<>();
58 final BatchIssueValidationContext context = new BatchIssueValidationContext();
61 toBatchIssueSources(session,
62 session.syncRequest(new SelectedModelBatchIssueSources(model)),
65 SubMonitor.convert(monitor, Messages.RunActiveValidations_MonitorPreparingResourcesForValidation, 100);
66 context.contexts = Collections.singletonList(model);
67 context.domain = ModelTransferableGraphSourceRequest.getDomainOnly(session, monitor, model);
69 if (monitor.isCanceled())
70 throw new OperationCanceledException();
76 if (!validations.isEmpty() && !context.contexts.isEmpty())
77 run(monitor, validations, context);
81 static Collection<BatchIssueSource> toBatchIssueSources(RequestProcessor processor, Collection<Resource> sources, Collection<BatchIssueSource> result) throws DatabaseException {
82 for (Resource source : sources) {
83 BatchIssueSource bis = processor.syncRequest(Queries.adapt(source, BatchIssueSource.class, true));
90 public static void run(IProgressMonitor monitor, final Collection<BatchIssueSource> validations, final BatchIssueValidationContext context) throws DatabaseException {
91 SubMonitor progress = SubMonitor.convert(monitor, Messages.RunActiveValidations_ValidateModel, 100);
92 int maxWrittenIssues = IssuePreferenceUtil.getPreferences().maxBatchIssuesToWrite;
93 int writtenIssues = 0;
94 for (BatchIssueSource source : validations) {
95 Map<Resource, Set<Issue>> results = BatchValidations.validate(progress.newChild(90, SubMonitor.SUPPRESS_NONE), source, context);
96 if (progress.isCanceled())
97 throw new OperationCanceledException();
99 Collection<Resource> removed = Simantics.getSession().syncRequest(new ResourceRead<Collection<Resource>>(source.getResource()) {
101 public Collection<Resource> perform(ReadGraph graph) throws DatabaseException {
102 IssueResource ISSUE = IssueResource.getInstance(graph);
103 ArrayList<Resource> result = new ArrayList<>();
104 for (Resource issue : graph.syncRequest(new ManagedIssues(resource))) {
105 Resource list = graph.getSingleObject(issue, ISSUE.Issue_HasContexts);
106 List<Resource> l = ListUtils.toList(graph, list);
108 Resource mainContext = l.get(0);
109 if (!BatchValidations.isLinkedToOtherThan(graph, mainContext, issue))
110 result.add(mainContext);
117 for (Resource r : removed) {
118 results.put(r, Collections.<Issue>emptySet());
120 if (progress.isCanceled())
121 throw new OperationCanceledException();
123 int wroteIssues = BatchValidations.store(progress.newChild(10, SubMonitor.SUPPRESS_NONE), source.getResource(), results, Math.max(0, maxWrittenIssues - writtenIssues));
124 writtenIssues += wroteIssues;
126 // Try to keep resource consumption down.
127 SessionGarbageCollection.gc(null, Simantics.getSession(), true, null);