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