]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.issues.common/src/org/simantics/issues/common/RunActiveValidations.java
Playground for Antti.
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / RunActiveValidations.java
1 /*******************************************************************************
2  * Copyright (c) 2007, 2011 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  *******************************************************************************/
12 package org.simantics.issues.common;
13
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.List;
18 import java.util.Map;
19 import java.util.Set;
20
21 import org.eclipse.core.runtime.IProgressMonitor;
22 import org.eclipse.core.runtime.OperationCanceledException;
23 import org.eclipse.core.runtime.SubMonitor;
24 import org.simantics.Simantics;
25 import org.simantics.db.Issue;
26 import org.simantics.db.ReadGraph;
27 import org.simantics.db.RequestProcessor;
28 import org.simantics.db.Resource;
29 import org.simantics.db.Session;
30 import org.simantics.db.common.request.Queries;
31 import org.simantics.db.common.request.ResourceRead;
32 import org.simantics.db.common.utils.ListUtils;
33 import org.simantics.db.exception.DatabaseException;
34 import org.simantics.db.layer0.request.PossibleActiveModel;
35 import org.simantics.db.layer0.util.ModelTransferableGraphSourceRequest;
36 import org.simantics.db.layer0.util.SessionGarbageCollection;
37 import org.simantics.issues.ontology.IssueResource;
38 import org.simantics.issues.preferences.IssuePreferenceUtil;
39
40 /**
41  * @author Tuukka Lehtonen
42  */
43 public class RunActiveValidations {
44     
45     public static void run(IProgressMonitor monitor) throws DatabaseException {
46         Resource model = Simantics.getSession().syncRequest(new PossibleActiveModel(Simantics.getProjectResource()));
47         if(model != null)
48             run(monitor, model);
49     }
50
51     public static void run(IProgressMonitor monitor, Resource model) throws DatabaseException {
52
53         final Session session = Simantics.getSession();
54
55         // 1. query for which composites to run the validation
56         final Collection<BatchIssueSource> validations = new ArrayList<>();
57         final BatchIssueValidationContext context = new BatchIssueValidationContext();
58         
59         try {
60             
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 }