X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Fscl%2FSCLAction.java;fp=bundles%2Forg.simantics.db.layer0%2Fsrc%2Forg%2Fsimantics%2Fdb%2Flayer0%2Fscl%2FSCLAction.java;h=b2225f7c904aac95e59c6806c80ae129cdaf2545;hb=a977a268131482dc9ba090c437f866a8b03f399d;hp=0000000000000000000000000000000000000000;hpb=43355222d559c87975f7f39dce18d36f35ea9b94;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/SCLAction.java b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/SCLAction.java new file mode 100644 index 000000000..b2225f7c9 --- /dev/null +++ b/bundles/org.simantics.db.layer0/src/org/simantics/db/layer0/scl/SCLAction.java @@ -0,0 +1,73 @@ +package org.simantics.db.layer0.scl; + +import org.simantics.db.ReadGraph; +import org.simantics.db.Resource; +import org.simantics.db.Session; +import org.simantics.db.common.request.ResourceRead; +import org.simantics.db.exception.DatabaseException; +import org.simantics.db.layer0.adapter.ActionFactory; +import org.simantics.db.layer0.internal.SimanticsInternal; +import org.simantics.db.layer0.util.DatabaseExceptionUtils; +import org.simantics.db.layer0.variable.Variable; +import org.simantics.db.layer0.variable.Variables; +import org.simantics.layer0.Layer0; +import org.simantics.scl.runtime.function.Function1; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SCLAction implements ActionFactory { + + private static final Logger LOGGER = LoggerFactory.getLogger(SCLAction.class); + + private final Resource rule; + + public SCLAction(ReadGraph graph, Resource rule) throws DatabaseException { + this.rule = rule; + } + + static class RuleFunctionRequest extends ResourceRead> { + + protected RuleFunctionRequest(Resource rule) { + super(rule); + } + + @Override + public Function1 perform(ReadGraph graph) throws DatabaseException { + Variable ruleVariable = Variables.getVariable(graph, resource); + Layer0 L0 = Layer0.getInstance(graph); + return ruleVariable.getPossiblePropertyValue(graph, L0.SCLAction_action); + } + + } + + static class SCLActionRunnable implements Runnable { + + public final Resource rule; + public final Resource target; + + public SCLActionRunnable(Resource rule, Resource target) { + this.rule = rule; + this.target = target; + } + + @Override + public void run() { + Session s = SimanticsInternal.getSession(); + Resource resource = (Resource) target; + s.markUndoPoint(); + try { + Function1 function = s.syncRequest(new RuleFunctionRequest(rule)); + function.apply(resource); + } catch (DatabaseException e) { + LOGGER.error("Error while executing action " + DatabaseExceptionUtils.showResource(s, resource), e); + } + } + + } + + @Override + public Runnable create(final Object target) { + return new SCLActionRunnable(rule, (Resource) target); + } + +}