1 package org.simantics.issues.common;
\r
3 import java.util.Collections;
\r
4 import java.util.HashMap;
\r
5 import java.util.HashSet;
\r
6 import java.util.List;
\r
7 import java.util.Map;
\r
8 import java.util.Set;
\r
10 import org.eclipse.core.runtime.IProgressMonitor;
\r
11 import org.eclipse.core.runtime.SubMonitor;
\r
12 import org.simantics.db.Issue;
\r
13 import org.simantics.db.ReadGraph;
\r
14 import org.simantics.db.Resource;
\r
15 import org.simantics.db.common.QueryMemoryWatcher;
\r
16 import org.simantics.db.common.primitiverequest.IsInheritedFrom;
\r
17 import org.simantics.db.common.procedure.adapter.TransientCacheAsyncListener;
\r
18 import org.simantics.db.common.utils.Functions;
\r
19 import org.simantics.db.common.utils.NameUtils;
\r
20 import org.simantics.db.exception.DatabaseException;
\r
21 import org.simantics.db.layer0.util.ModelTransferableGraphSourceRequest.DomainOnlyProcessor;
\r
22 import org.simantics.db.service.QueryControl;
\r
23 import org.simantics.issues.ontology.IssueResource;
\r
24 import org.simantics.layer0.Layer0;
\r
26 public class DependencyTrackerBatchIssueSource implements BatchIssueSource {
\r
28 final Resource source;
\r
30 public DependencyTrackerBatchIssueSource(Resource source) {
\r
31 this.source = source;
\r
35 public Map<Resource, Set<Issue>> run(IProgressMonitor monitor, ReadGraph graph, BatchIssueValidationContext context) throws DatabaseException {
\r
37 SubMonitor progress = SubMonitor.convert(monitor);
\r
39 Layer0 L0 = Layer0.getInstance(graph);
\r
40 IssueResource IR = IssueResource.getInstance(graph);
\r
42 Resource constraint = graph.getSingleObject(source, IR.Sources_DependencyTracker_HasConstraint);
\r
43 Resource type = graph.getSingleObject(constraint, L0.HasConstraint_Inverse);
\r
44 Resource function = graph.getSingleObject(constraint, L0.Constraint_Validator);
\r
46 String sourceName = NameUtils.getSafeName(graph, source);
\r
48 QueryControl qc = graph.getService(QueryControl.class);
\r
51 progress.subTask(sourceName);
\r
54 HashMap<Resource, Set<Issue>> result = new HashMap<Resource, Set<Issue>>();
\r
56 // Allow this process to make 50k queries
\r
57 QueryMemoryWatcher memory = new QueryMemoryWatcher(graph, 50000, 0.5, 300);
\r
61 DomainOnlyProcessor domain = context.domain;
\r
63 for(int i=0;i<domain.internals.size();i++) {
\r
65 Resource r = domain.internals.get(i);
\r
66 Resource singleType = domain.internalTypes.get(i);
\r
68 if (number % 1000 == 0) {
\r
69 if(progress.isCanceled()) return Collections.emptyMap();
\r
71 progress.subTask(sourceName + " " + (100*number)/domain.internals.size() + "% done.");
\r
76 if(singleType != null) {
\r
77 if(!graph.syncRequest(new IsInheritedFrom(singleType, type), TransientCacheAsyncListener.<Boolean>instance())) continue;
\r
79 if(!graph.isInstanceOf(r, type)) continue;
\r
82 @SuppressWarnings("unchecked")
\r
83 List<Issue> is = (List<Issue>)Functions.exec(graph, function, graph, r);
\r
85 result.put(r, Collections.<Issue>emptySet());
\r
87 result.put(r, new HashSet<Issue>(is));
\r
96 public Resource getResource() {
\r