]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.issues.common/src/org/simantics/issues/common/RunActiveValidations.java
Merge "Revert "Support enumerated property types in UC interface""
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / RunActiveValidations.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2019 Association for Decentralized Information Management
3  * in Industry THTH ry.
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
8  *
9  * Contributors:
10  *     VTT Technical Research Centre of Finland - initial API and implementation
11  *     Semantum Oy - Reorganization
12  *******************************************************************************/
13 package org.simantics.issues.common;
14
15 import java.util.ArrayList;
16 import java.util.Collection;
17 import java.util.Collections;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Set;
21
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;
40
41 /**
42  * @author Tuukka Lehtonen
43  */
44 public class RunActiveValidations {
45
46     public static void run(IProgressMonitor monitor) throws DatabaseException {
47         Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource()));
48         if (model != null)
49             run(monitor, model);
50     }
51
52     public static void run(IProgressMonitor monitor, Resource model) throws DatabaseException {
53
54         final Session session = Simantics.getSession();
55
56         // 1. query for which composites to run the validation
57         final Collection<BatchIssueSource> validations = new ArrayList<>();
58         final BatchIssueValidationContext context = new BatchIssueValidationContext();
59
60         try {
61             toBatchIssueSources(session,
62                     session.syncRequest(new SelectedModelBatchIssueSources(model)),
63                     validations);
64
65             SubMonitor.convert(monitor, Messages.RunActiveValidations_MonitorPreparingResourcesForValidation, 100);
66             context.contexts = Collections.singletonList(model);
67             context.domain = ModelTransferableGraphSourceRequest.getDomainOnly(session, monitor, model);
68
69             if (monitor.isCanceled())
70                 throw new OperationCanceledException();
71
72         } finally {
73             monitor.done();
74         }
75
76         if (!validations.isEmpty() && !context.contexts.isEmpty())
77             run(monitor, validations, context);
78
79     }
80
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));
84             if (bis != null)
85                 result.add(bis);
86         }
87         return result;
88     }
89
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();
98
99             Collection<Resource> removed = Simantics.getSession().syncRequest(new ResourceRead<Collection<Resource>>(source.getResource()) {
100                 @Override
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);
107                         if (l.size() > 0) {
108                             Resource mainContext = l.get(0);
109                             if (!BatchValidations.isLinkedToOtherThan(graph, mainContext, issue))
110                                 result.add(mainContext);
111                         }
112                     }
113                     return result;
114                 }
115             });
116
117             for (Resource r : removed) {
118                 results.put(r, Collections.<Issue>emptySet());
119             }
120             if (progress.isCanceled())
121                 throw new OperationCanceledException();
122
123             int wroteIssues = BatchValidations.store(progress.newChild(10, SubMonitor.SUPPRESS_NONE), source.getResource(), results, Math.max(0, maxWrittenIssues - writtenIssues));
124             writtenIssues += wroteIssues;
125
126             // Try to keep resource consumption down.
127             SessionGarbageCollection.gc(null, Simantics.getSession(), true, null);
128
129         }
130
131     }
132
133 }