[New] Added ConfirmationPolicy and ActivityArchivalPolicy
This commit is contained in:
parent
24749ae05b
commit
76fb797102
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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>
|
|
@ -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>
|
||||
|
||||
|
|
Loading…
Reference in New Issue