]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.issues.common/src/org/simantics/issues/common/DependencyTrackerBatchIssueSource.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.issues.common / src / org / simantics / issues / common / DependencyTrackerBatchIssueSource.java
1 package org.simantics.issues.common;
2
3 import java.util.Collections;
4 import java.util.HashMap;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Set;
9
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;
25
26 public class DependencyTrackerBatchIssueSource implements BatchIssueSource {
27
28         final Resource source;
29         
30         public DependencyTrackerBatchIssueSource(Resource source) {
31                 this.source = source;
32         }
33         
34         @Override
35         public Map<Resource, Set<Issue>> run(IProgressMonitor monitor, ReadGraph graph, BatchIssueValidationContext context) throws DatabaseException {
36                 
37         SubMonitor progress = SubMonitor.convert(monitor);
38
39                 Layer0 L0 = Layer0.getInstance(graph);
40                 IssueResource IR = IssueResource.getInstance(graph);
41                 
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);
45                 
46                 String sourceName = NameUtils.getSafeName(graph, source);
47
48         QueryControl qc = graph.getService(QueryControl.class);
49         qc.flush(graph);
50
51         progress.subTask(sourceName);
52         progress.worked(1);
53         
54                 HashMap<Resource, Set<Issue>> result = new HashMap<Resource, Set<Issue>>();
55                 
56                 // Allow this process to make 50k queries
57                 QueryMemoryWatcher memory = new QueryMemoryWatcher(graph, 50000, 0.5, 300);
58
59                 int number = 0;
60                 
61                 DomainOnlyProcessor domain = context.domain;
62
63                 for(int i=0;i<domain.internals.size();i++) {
64
65                         Resource r = domain.internals.get(i);
66                         Resource singleType = domain.internalTypes.get(i);
67
68                         if (number % 1000 == 0) {
69                                 if(progress.isCanceled()) return Collections.emptyMap();
70                                 memory.maintain();
71                                 progress.subTask(sourceName + " " + (100*number)/domain.internals.size() + "% done.");
72                         }
73                         ++number;
74
75
76                         if(singleType != null) {
77                                 if(!graph.syncRequest(new IsInheritedFrom(singleType, type), TransientCacheAsyncListener.<Boolean>instance())) continue;
78                         } else {
79                                 if(!graph.isInstanceOf(r, type)) continue;
80                         }
81
82                         @SuppressWarnings("unchecked")
83                         List<Issue> is = (List<Issue>)Functions.exec(graph, function, graph, r);
84                         if(is.isEmpty())
85                                 result.put(r, Collections.<Issue>emptySet());
86                         else
87                                 result.put(r, new HashSet<Issue>(is));
88
89                 }
90
91                 return result;
92
93         }
94
95         @Override
96         public Resource getResource() {
97                 return source;
98         }
99
100 }