[New] Added ConfirmationPolicy and ActivityArchivalPolicy

This commit is contained in:
Robert von Burg 2017-05-14 11:42:37 +02:00
parent 24749ae05b
commit 76fb797102
10 changed files with 159 additions and 23 deletions

View File

@ -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<String, Locator> 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
*

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 &lt;eitch@eitchnet.ch&gt;
*/
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
}
}

View File

@ -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 &lt;eitch@eitchnet.ch&gt;
*/
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
}
}

View File

@ -1,3 +1,15 @@
<StrolchPolicies>
<PolicyType Type="ExecutionPolicy" Api="li.strolch.execution.policy.ExecutionPolicy">
<Policy Key="DurationExecution" Class="li.strolch.execution.policy.DurationExecution" />
</PolicyType>
<PolicyType Type="ConfirmationPolicy" Api="li.strolch.execution.policy.ConfirmationPolicy">
<Policy Key="DefaultConfirmation" Class="li.strolch.execution.policy.ConfirmationPolicy" />
</PolicyType>
<PolicyType Type="ActivityArchivalPolicy" Api="li.strolch.execution.policy.ActivityArchivalPolicy">
<Policy Key="DefaultActivityArchival" Class="li.strolch.execution.policy.ActivityArchivalPolicy" />
</PolicyType>
</StrolchPolicies>

View File

@ -4,42 +4,48 @@
<Resource Id="bicycle" Name="Bicycle" Type="Product">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="article1" Name="Article 1" Type="Article">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="article2" Name="Article 2" Type="Article">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="article3" Name="Article 3" Type="Article">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="conveyor1" Name="Conveyor 1" Type="Conveyor">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="conveyor2" Name="Conveyor 2" Type="Conveyor">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
@ -50,13 +56,15 @@
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.ReservationExection" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>
<Resource Id="conveyor3" Name="Conveyor 3" Type="Conveyor">
<TimedState Id="quantity" Name="Quantity" Type="Integer" />
<Policies>
<Policy Type="ExecutionPolicy" Value="java:li.strolch.execution.policy.DurationExecution" />
<Policy Type="ExecutionPolicy" Value="key:DurationExecution" />
<Policy Type="ConfirmationPolicy" Value="key:DefaultConfirmation" />
</Policies>
</Resource>