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 2e2ab7ef9..ccb641d53 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 @@ -165,13 +165,44 @@ public class EventBasedExecutionHandler extends ExecutionHandler { }); } + private void archiveActivity(String realm, Locator activityLoc) { + this.executorService.execute(() -> { + try { + runAsAgent(ctx -> { + try (StrolchTransaction tx = openTx(realm, ctx.getCertificate(), ActivityArchivalPolicy.class)) { + tx.lock(activityLoc); + + Activity activity = tx.findElement(activityLoc); + + logger.info("Activity " + activity.getLocator() + " is in state " + activity.getState()); + + PolicyDef policyDef; + if (activity.hasPolicyDef(ActivityArchivalPolicy.class.getSimpleName())) { + policyDef = activity.getPolicyDef(ActivityArchivalPolicy.class.getSimpleName()); + } else { + policyDef = PolicyDef.valueOf(ActivityArchivalPolicy.class.getSimpleName(), + KEY_DEFAULT_ACTIVITY_ARCHIVAL); + } + + ActivityArchivalPolicy archivalPolicy = getComponent(PolicyHandler.class).getPolicy(policyDef, + tx); + archivalPolicy.archive(activity); + + } + }); + } catch (Exception e) { + logger.error("Failed to archive " + activityLoc + " due to " + e.getMessage(), e); + } + }); + } + private void toExecution(String realm, Locator elementLoc, PrivilegeContext ctx) { try (StrolchTransaction tx = openTx(realm, ctx.getCertificate(), ExecuteActivityCommand.class)) { Locator activityLoc = elementLoc.trim(3); tx.lock(activityLoc); - Activity activity = tx.findElement(activityLoc); + Activity activity = tx.findElement(activityLoc, true); if (activity == null) { logger.error("Element for locator " + elementLoc + " does not exist!"); synchronized (this.registeredActivities) { @@ -211,12 +242,11 @@ public class EventBasedExecutionHandler extends ExecutionHandler { if (activity.getState().isExecuted()) { synchronized (this.registeredActivities) { - this.registeredActivities.removeElement(realm, activityLoc); + if (!this.registeredActivities.removeElement(realm, activityLoc)) + logger.warn("Activity " + actionLoc + " already removed from registered activities!"); } - archiveActivity(tx, activity); - - logger.info("Activity " + activityLoc + " is in state " + activity.getState()); + archiveActivity(realm, activity.getLocator()); } else { @@ -237,15 +267,6 @@ 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/policy/RemoveActivityArchival.java b/li.strolch.service/src/main/java/li/strolch/execution/policy/RemoveActivityArchival.java new file mode 100644 index 000000000..67972a281 --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/execution/policy/RemoveActivityArchival.java @@ -0,0 +1,26 @@ +package li.strolch.execution.policy; + +import li.strolch.agent.api.ComponentContainer; +import li.strolch.command.RemoveActivityCommand; +import li.strolch.model.activity.Activity; +import li.strolch.persistence.api.StrolchTransaction; + +public class RemoveActivityArchival extends ActivityArchivalPolicy { + + public RemoveActivityArchival(ComponentContainer container, StrolchTransaction tx) { + super(container, tx); + } + + @Override + public void archive(Activity activity) { + + if (!activity.getState().isExecuted()) + throw new IllegalStateException("Can not archive non-executed " + activity.getLocator()); + + RemoveActivityCommand cmd = new RemoveActivityCommand(getContainer(), tx()); + cmd.setActivity(activity); + cmd.doCommand(); + + logger.info("Removed " + activity.getLocator()); + } +}