]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling/src/org/simantics/modeling/scl/AnalyseSCLValueRequest.java
Multiple readers and variable optimization
[simantics/platform.git] / bundles / org.simantics.modeling / src / org / simantics / modeling / scl / AnalyseSCLValueRequest.java
1 package org.simantics.modeling.scl;
2
3 import org.simantics.db.ReadGraph;
4 import org.simantics.db.Resource;
5 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
6 import org.simantics.db.exception.DatabaseException;
7 import org.simantics.db.layer0.scl.ExpressionAnalysis;
8 import org.simantics.db.layer0.variable.Variable;
9 import org.simantics.scl.runtime.SCLContext;
10 import org.simantics.scl.runtime.function.Function1;
11 import org.simantics.structural2.scl.AnalyseStructuralValueRequest;
12
13 public class AnalyseSCLValueRequest extends AnalyseStructuralValueRequest {
14
15     public AnalyseSCLValueRequest(ReadGraph graph, Resource component, Resource value, Resource predicate)
16             throws DatabaseException {
17         super(component, value, predicate);
18     }
19
20     @Override
21     protected ExpressionAnalysis<Variable> getAnalysis(AnalysisCompilationContext context, Function1<Variable, Object> fn) {
22         return new ExpressionAnalysis(fn, context.getConsumed());
23     }
24     
25     public static ExpressionAnalysis analyse(ReadGraph graph, Resource component, Resource predicate, Resource value) throws DatabaseException {
26         SCLContext sclContext = SCLContext.getCurrent();
27         Object oldGraph = sclContext.get("graph");
28         try {
29             ExpressionAnalysis result = graph.syncRequest(new AnalyseSCLValueRequest(graph, component, value, predicate),
30                     TransientCacheListener.<ExpressionAnalysis<Variable>>instance());
31             sclContext.put("graph", graph);
32             return result;
33         } catch (DatabaseException e) {
34             throw (DatabaseException)e;
35         } catch (Throwable t) {
36             throw new DatabaseException(t);
37         } finally {
38             sclContext.put("graph", oldGraph);
39         }
40     }
41     
42 }