From 76fb7971024f6416de48c1f1031f142e3719a8be Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Sun, 14 May 2017 11:42:37 +0200 Subject: [PATCH] [New] Added ConfirmationPolicy and ActivityArchivalPolicy --- .../execution/EventBasedExecutionHandler.java | 24 ++++++-- .../execution/command/ExecutionCommand.java | 10 ++++ .../command/SetActionToErrorCommand.java | 6 +- .../command/SetActionToExecutedCommand.java | 6 +- .../command/SetActionToStoppedCommand.java | 6 +- .../command/SetActionToWarningCommand.java | 6 +- .../policy/ActivityArchivalPolicy.java | 30 ++++++++++ .../execution/policy/ConfirmationPolicy.java | 60 +++++++++++++++++++ .../executiontest/config/StrolchPolicies.xml | 12 ++++ .../executiontest/data/StrolchModel.xml | 22 ++++--- 10 files changed, 159 insertions(+), 23 deletions(-) create mode 100644 li.strolch.service/src/main/java/li/strolch/execution/policy/ActivityArchivalPolicy.java create mode 100644 li.strolch.service/src/main/java/li/strolch/execution/policy/ConfirmationPolicy.java diff --git a/li.strolch.service/src/main/java/li/strolch/execution/EventBasedExecutionHandler.java b/li.strolch.service/src/main/java/li/strolch/execution/EventBasedExecutionHandler.java index 2d2e335d4..2e2ab7ef9 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/EventBasedExecutionHandler.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/EventBasedExecutionHandler.java @@ -10,12 +10,15 @@ import li.strolch.execution.command.SetActionToErrorCommand; import li.strolch.execution.command.SetActionToExecutedCommand; import li.strolch.execution.command.SetActionToStoppedCommand; import li.strolch.execution.command.SetActionToWarningCommand; +import li.strolch.execution.policy.ActivityArchivalPolicy; import li.strolch.execution.policy.ExecutionPolicy; import li.strolch.model.Locator; import li.strolch.model.activity.Action; import li.strolch.model.activity.Activity; import li.strolch.model.activity.IActivityElement; +import li.strolch.model.policy.PolicyDef; import li.strolch.persistence.api.StrolchTransaction; +import li.strolch.policy.PolicyHandler; import li.strolch.privilege.model.Certificate; import li.strolch.privilege.model.PrivilegeContext; import li.strolch.runtime.ThreadPoolFactory; @@ -31,6 +34,8 @@ import li.strolch.utils.dbc.DBC; */ public class EventBasedExecutionHandler extends ExecutionHandler { + private static final String KEY_DEFAULT_ACTIVITY_ARCHIVAL = "key:DefaultActivityArchival"; + private ExecutorService executorService; private MapOfSets registeredActivities; @@ -202,19 +207,21 @@ public class EventBasedExecutionHandler extends ExecutionHandler { tx.flush(); // if the activity is now executed, remove it from the registered activities - if (action.getRootElement().getState().isExecuted()) { + Activity activity = action.getRootElement(); + if (activity.getState().isExecuted()) { synchronized (this.registeredActivities) { this.registeredActivities.removeElement(realm, activityLoc); } - logger.info("Activity " + activityLoc + " is in state " + action.getRootElement().getState()); + + archiveActivity(tx, activity); + + logger.info("Activity " + activityLoc + " is in state " + activity.getState()); } else { // otherwise execute any next action(s) for this action's activity - Activity activity = tx.findElement(activityLoc); - ExecuteActivityCommand execCommand = new ExecuteActivityCommand(getContainer(), tx); execCommand.setActivity(activity); tx.addCommand(execCommand); @@ -230,6 +237,15 @@ public class EventBasedExecutionHandler extends ExecutionHandler { triggerExecution(realm); } + private void archiveActivity(StrolchTransaction tx, Activity activity) { + + PolicyDef policyDef = PolicyDef.valueOf(ActivityArchivalPolicy.class.getSimpleName(), + KEY_DEFAULT_ACTIVITY_ARCHIVAL); + + ActivityArchivalPolicy archivalPolicy = getComponent(PolicyHandler.class).getPolicy(policyDef, tx); + archivalPolicy.archive(activity); + } + /** * Triggers a to execution for all registered activities in the given realm * diff --git a/li.strolch.service/src/main/java/li/strolch/execution/command/ExecutionCommand.java b/li.strolch.service/src/main/java/li/strolch/execution/command/ExecutionCommand.java index cb9c416b2..25d38e5b0 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/command/ExecutionCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/command/ExecutionCommand.java @@ -8,6 +8,7 @@ import java.util.Map.Entry; import li.strolch.agent.api.ComponentContainer; import li.strolch.command.UpdateActivityCommand; import li.strolch.exception.StrolchException; +import li.strolch.execution.policy.ConfirmationPolicy; import li.strolch.execution.policy.ExecutionPolicy; import li.strolch.model.Resource; import li.strolch.model.State; @@ -46,6 +47,12 @@ public abstract class ExecutionCommand extends Command implements TimeOrderingVi return getComponent(PolicyHandler.class).getPolicy(executionPolicyDef, tx()); } + protected ConfirmationPolicy getConfirmationPolicy(Action action) { + Resource resource = getResource(tx(), action); + PolicyDef executionPolicyDef = resource.getPolicyDefs().getPolicyDef(ConfirmationPolicy.class.getSimpleName()); + return getComponent(PolicyHandler.class).getPolicy(executionPolicyDef, tx()); + } + @Override public void visitSeries(Activity activity) { @@ -107,6 +114,7 @@ public abstract class ExecutionCommand extends Command implements TimeOrderingVi // this is only required because we execute actions in same TX as we set to executed any previous actions try { executionPolicy.toExecution(action); + getConfirmationPolicy(action).toExecution(action); } catch (Exception e) { logger.error("Failed to set " + action.getLocator() + " to execution due to " + e.getMessage(), e); action.setState(State.ERROR); @@ -114,6 +122,8 @@ public abstract class ExecutionCommand extends Command implements TimeOrderingVi UpdateActivityCommand command = new UpdateActivityCommand(getContainer(), tx()); command.setActivity(action.getRootElement()); command.doCommand(); + + getConfirmationPolicy(action).toError(action); } } diff --git a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToErrorCommand.java b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToErrorCommand.java index 11070c0d3..ff6259479 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToErrorCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToErrorCommand.java @@ -4,7 +4,6 @@ import java.text.MessageFormat; import li.strolch.agent.api.ComponentContainer; import li.strolch.exception.StrolchException; -import li.strolch.execution.policy.ExecutionPolicy; import li.strolch.model.State; import li.strolch.model.activity.Action; import li.strolch.persistence.api.StrolchTransaction; @@ -36,8 +35,9 @@ public class SetActionToErrorCommand extends ExecutionCommand { @Override public void doCommand() { tx().lock(this.action.getRootElement()); - ExecutionPolicy executionPolicy = getExecutionPolicy(this.action); - executionPolicy.toError(this.action); + + getExecutionPolicy(this.action).toError(this.action); + getConfirmationPolicy(this.action).toError(this.action); } @Override diff --git a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToExecutedCommand.java b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToExecutedCommand.java index 5a97d9f52..4789d583a 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToExecutedCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToExecutedCommand.java @@ -4,7 +4,6 @@ import java.text.MessageFormat; import li.strolch.agent.api.ComponentContainer; import li.strolch.exception.StrolchException; -import li.strolch.execution.policy.ExecutionPolicy; import li.strolch.model.State; import li.strolch.model.activity.Action; import li.strolch.persistence.api.StrolchTransaction; @@ -36,8 +35,9 @@ public class SetActionToExecutedCommand extends ExecutionCommand { @Override public void doCommand() { tx().lock(this.action.getRootElement()); - ExecutionPolicy executionPolicy = getExecutionPolicy(this.action); - executionPolicy.toExecuted(this.action); + + getExecutionPolicy(this.action).toExecuted(this.action); + getConfirmationPolicy(this.action).toExecuted(this.action); } @Override diff --git a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToStoppedCommand.java b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToStoppedCommand.java index 38ee5b856..3e476ff78 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToStoppedCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToStoppedCommand.java @@ -4,7 +4,6 @@ import java.text.MessageFormat; import li.strolch.agent.api.ComponentContainer; import li.strolch.exception.StrolchException; -import li.strolch.execution.policy.ExecutionPolicy; import li.strolch.model.State; import li.strolch.model.activity.Action; import li.strolch.persistence.api.StrolchTransaction; @@ -36,8 +35,9 @@ public class SetActionToStoppedCommand extends ExecutionCommand { @Override public void doCommand() { tx().lock(this.action.getRootElement()); - ExecutionPolicy executionPolicy = getExecutionPolicy(this.action); - executionPolicy.toStopped(this.action); + + getExecutionPolicy(this.action).toStopped(this.action); + getConfirmationPolicy(this.action).toStopped(this.action); } @Override diff --git a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToWarningCommand.java b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToWarningCommand.java index dfd03b35f..f95db57ee 100644 --- a/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToWarningCommand.java +++ b/li.strolch.service/src/main/java/li/strolch/execution/command/SetActionToWarningCommand.java @@ -4,7 +4,6 @@ import java.text.MessageFormat; import li.strolch.agent.api.ComponentContainer; import li.strolch.exception.StrolchException; -import li.strolch.execution.policy.ExecutionPolicy; import li.strolch.model.State; import li.strolch.model.activity.Action; import li.strolch.persistence.api.StrolchTransaction; @@ -36,8 +35,9 @@ public class SetActionToWarningCommand extends ExecutionCommand { @Override public void doCommand() { tx().lock(this.action.getRootElement()); - ExecutionPolicy executionPolicy = getExecutionPolicy(this.action); - executionPolicy.toWarning(this.action); + + getExecutionPolicy(this.action).toWarning(this.action); + getConfirmationPolicy(this.action).toWarning(this.action); } @Override diff --git a/li.strolch.service/src/main/java/li/strolch/execution/policy/ActivityArchivalPolicy.java b/li.strolch.service/src/main/java/li/strolch/execution/policy/ActivityArchivalPolicy.java new file mode 100644 index 000000000..ea3dd4bae --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/execution/policy/ActivityArchivalPolicy.java @@ -0,0 +1,30 @@ +package li.strolch.execution.policy; + +import li.strolch.agent.api.ComponentContainer; +import li.strolch.model.State; +import li.strolch.model.activity.Activity; +import li.strolch.persistence.api.StrolchTransaction; +import li.strolch.policy.StrolchPolicy; + +/** + * The {@link ActivityArchivalPolicy} is called when an {@link Activity} has reached the state {@link State#EXECUTED} + * and can thus be archived. Here the archivation of the {@link Activity} can be implemented, e.g. removing it, or + * exporting it to a different system etc. + * + * @author Robert von Burg <eitch@eitchnet.ch> + */ +public class ActivityArchivalPolicy extends StrolchPolicy { + + public ActivityArchivalPolicy(ComponentContainer container, StrolchTransaction tx) { + super(container, tx); + } + + public void archive(Activity activity) { + // do nothing + } + + @Override + public void undo() { + // nothing to undo + } +} diff --git a/li.strolch.service/src/main/java/li/strolch/execution/policy/ConfirmationPolicy.java b/li.strolch.service/src/main/java/li/strolch/execution/policy/ConfirmationPolicy.java new file mode 100644 index 000000000..a98b92a6b --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/execution/policy/ConfirmationPolicy.java @@ -0,0 +1,60 @@ +package li.strolch.execution.policy; + +import li.strolch.agent.api.ComponentContainer; +import li.strolch.model.activity.Action; +import li.strolch.persistence.api.StrolchTransaction; +import li.strolch.policy.StrolchPolicy; + +/** + * The {@link ConfirmationPolicy} is called for every state change of an {@link Action}. This is where extra tasks can + * be performed when an {@link Action} enters a specific state, e.g. send an e-mail, etc. + * + * @author Robert von Burg <eitch@eitchnet.ch> + */ +public class ConfirmationPolicy extends StrolchPolicy { + + public ConfirmationPolicy(ComponentContainer container, StrolchTransaction tx) { + super(container, tx); + } + + public void toCreated(Action action) { + // do nothing + } + + public void toPlanning(Action action) { + // do nothing + } + + public void toPlanned(Action action) { + // do nothing + } + + public void toExecution(Action action) { + // do nothing + } + + public void toStopped(Action action) { + // do nothing + } + + public void toWarning(Action action) { + // do nothing + } + + public void toError(Action action) { + // do nothing + } + + public void toExecuted(Action action) { + // do nothing + } + + public void toClosed(Action action) { + // do nothing + } + + @Override + public void undo() { + // nothing to undo + } +} diff --git a/li.strolch.service/src/test/resources/executiontest/config/StrolchPolicies.xml b/li.strolch.service/src/test/resources/executiontest/config/StrolchPolicies.xml index cba3b97d9..ecc45d00d 100644 --- a/li.strolch.service/src/test/resources/executiontest/config/StrolchPolicies.xml +++ b/li.strolch.service/src/test/resources/executiontest/config/StrolchPolicies.xml @@ -1,3 +1,15 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/li.strolch.service/src/test/resources/executiontest/data/StrolchModel.xml b/li.strolch.service/src/test/resources/executiontest/data/StrolchModel.xml index b4fbeb148..da8b300fd 100644 --- a/li.strolch.service/src/test/resources/executiontest/data/StrolchModel.xml +++ b/li.strolch.service/src/test/resources/executiontest/data/StrolchModel.xml @@ -4,42 +4,48 @@ - + + - + + - + + - + + - + + - + + @@ -50,13 +56,15 @@ + - + +