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