]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/SCLAction.java
Define actions already in L0
[simantics/platform.git] / bundles / org.simantics.db.layer0 / src / org / simantics / db / layer0 / scl / SCLAction.java
1 package org.simantics.db.layer0.scl;
2
3 import org.simantics.db.ReadGraph;
4 import org.simantics.db.Resource;
5 import org.simantics.db.Session;
6 import org.simantics.db.common.request.ResourceRead;
7 import org.simantics.db.exception.DatabaseException;
8 import org.simantics.db.layer0.adapter.ActionFactory;
9 import org.simantics.db.layer0.internal.SimanticsInternal;
10 import org.simantics.db.layer0.util.DatabaseExceptionUtils;
11 import org.simantics.db.layer0.variable.Variable;
12 import org.simantics.db.layer0.variable.Variables;
13 import org.simantics.layer0.Layer0;
14 import org.simantics.scl.runtime.function.Function1;
15 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory;
17
18 public class SCLAction implements ActionFactory {
19
20     private static final Logger LOGGER = LoggerFactory.getLogger(SCLAction.class);
21
22     private final Resource rule;
23
24     public SCLAction(ReadGraph graph, Resource rule) throws DatabaseException {
25         this.rule = rule;
26     }
27
28     static class RuleFunctionRequest extends ResourceRead<Function1<Resource, Object>> {
29
30         protected RuleFunctionRequest(Resource rule) {
31             super(rule);
32         }
33
34         @Override
35         public Function1<Resource, Object> perform(ReadGraph graph) throws DatabaseException {
36             Variable ruleVariable = Variables.getVariable(graph, resource);
37             Layer0 L0 = Layer0.getInstance(graph);
38             return ruleVariable.getPossiblePropertyValue(graph, L0.SCLAction_action);
39         }
40
41     }
42
43     static class SCLActionRunnable implements Runnable {
44
45         public final Resource rule;
46         public final Resource target;
47
48         public SCLActionRunnable(Resource rule, Resource target) {
49             this.rule = rule;
50             this.target = target;
51         }
52
53         @Override
54         public void run() {
55             Session s = SimanticsInternal.getSession();
56             Resource resource = (Resource) target;
57             s.markUndoPoint();
58             try {
59                 Function1<Resource, Object> function = s.syncRequest(new RuleFunctionRequest(rule));
60                 function.apply(resource);
61             } catch (DatabaseException e) {
62                 LOGGER.error("Error while executing action " + DatabaseExceptionUtils.showResource(s, resource), e);
63             }
64         }
65
66     }
67
68     @Override
69     public Runnable create(final Object target) {
70         return new SCLActionRunnable(rule, (Resource) target);
71     }
72
73 }