package com.neverwinterdp.registry.activity; import java.text.DecimalFormat; import java.util.List; import com.neverwinterdp.registry.BatchOperations; import com.neverwinterdp.registry.Node; import com.neverwinterdp.registry.NodeCreateMode; import com.neverwinterdp.registry.Registry; import com.neverwinterdp.registry.RegistryException; import com.neverwinterdp.registry.Transaction; public class ActivityService { static DecimalFormat ORDER_FORMATER = new DecimalFormat("#000"); private Registry registry; private Node activeNode; private Node historyNode; public ActivityService(Registry registry, String activityPath) throws RegistryException { this.registry = registry ; activeNode = registry.createIfNotExist(activityPath + "/active") ; historyNode = registry.createIfNotExist(activityPath + "/history") ; } public Activity create(ActivityBuilder builder) throws RegistryException { return create(builder.getActivity(), builder.getActivitySteps()); } public Activity create(Activity activity, List<ActivityStep> activitySteps) throws RegistryException { Node activityNode = activeNode.createChild(activity.getType() + "-", NodeCreateMode.PERSISTENT_SEQUENTIAL); activity.setId(activityNode.getName()); Transaction transaction = registry.getTransaction() ; transaction.setData(activityNode, activity); transaction.createChild(activityNode, "activity-steps", NodeCreateMode.PERSISTENT); for(int i = 0; i < activitySteps.size(); i++) { ActivityStep step = activitySteps.get(i) ; String id = ORDER_FORMATER.format(i) + "-" + step.getType(); step.setId(id); transaction.createDescendant(activityNode, "activity-steps/" + id, step, NodeCreateMode.PERSISTENT); } transaction.commit(); return activity; } public Activity getActivity(String name) throws RegistryException { return activeNode.getChild(name).getDataAs(Activity.class) ; } public List<Activity> getActiveActivities() throws RegistryException { return activeNode.getChildrenAs(Activity.class) ; } public List<Activity> getHistoryActivities() throws RegistryException { return historyNode.getChildrenAs(Activity.class) ; } public List<ActivityStep> getActivitySteps(Activity activity) throws RegistryException { return getActivitySteps(activity.getId()) ; } public ActivityStep getActivityStep(String activityName, String stepName) throws RegistryException { Node stepNode = activityStepNode(activityName, stepName); return stepNode.getDataAs(ActivityStep.class) ; } public List<ActivityStep> getActivitySteps(String name) throws RegistryException { Node stepsNode = activeNode.getDescendant(name + "/activity-steps"); return stepsNode.getChildrenAs(ActivityStep.class) ; } public <T> void assign(final Activity activity, final ActivityStep activityStep, final T workerInfo) throws RegistryException { BatchOperations<Boolean> ops = new BatchOperations<Boolean>() { @Override public Boolean execute(Registry registry) throws RegistryException { Node activityStepNode = activityStepNode(activity, activityStep); Transaction transaction = registry.getTransaction() ; activityStep.setStatus(ActivityStep.Status.ASSIGNED); transaction.setData(activityStepNode, activityStep); transaction.createChild(activityStepNode, "heartbeat", workerInfo, NodeCreateMode.EPHEMERAL) ; transaction.commit(); return true; } }; registry.executeBatch(ops, 3, 1000); } public void finish(final Activity activity, final ActivityStep activityStep) throws RegistryException { BatchOperations<Boolean> ops = new BatchOperations<Boolean>() { @Override public Boolean execute(Registry registry) throws RegistryException { Node activityStepNode = activityStepNode(activity, activityStep); Transaction transaction = registry.getTransaction() ; activityStep.setStatus(ActivityStep.Status.FINISHED); transaction.setData(activityStepNode, activityStep); transaction.deleteChild(activityStepNode, "heartbeat") ; transaction.commit(); return true; } }; registry.executeBatch(ops, 3, 1000); } public void history(Activity activity) throws RegistryException { String fromPath = activeNode.getChild(activity.getId()).getPath() ; String toPath = historyNode.getChild(activity.getId()).getPath() ; Transaction transaction = registry.getTransaction(); transaction.rcopy(fromPath, toPath); transaction.rdelete(fromPath); transaction.commit(); } private Node activityNode(Activity activity) throws RegistryException { return activeNode.getChild(activity.getId()); } private Node activityStepsNode(Activity activity) throws RegistryException { return activeNode.getChild(activity.getId() + "/activity-steps"); } private Node activityStepNode(Activity activity, ActivityStep step) throws RegistryException { return activityStepNode(activity.getId(), step.getId()); } private Node activityStepNode(String activityId, String stepId) throws RegistryException { return activeNode.getDescendant(activityId + "/activity-steps/" + stepId); } }