public void moveToHistory(Step step) {
    List currentSteps =
        (List) SerializableCache.getInstance().currentStepsCache.get(new Long(step.getEntryId()));

    List historySteps =
        (List) SerializableCache.getInstance().historyStepsCache.get(new Long(step.getEntryId()));

    if (historySteps == null) {
      historySteps = new ArrayList();
      SerializableCache.getInstance()
          .historyStepsCache
          .put(new Long(step.getEntryId()), historySteps);
    }

    SimpleStep simpleStep = (SimpleStep) step;

    for (Iterator iterator = currentSteps.iterator(); iterator.hasNext(); ) {
      Step currentStep = (Step) iterator.next();

      if (simpleStep.getId() == currentStep.getId()) {
        iterator.remove();
        historySteps.add(simpleStep);

        break;
      }
    }

    SerializableCache.store();
  }
  public Step markFinished(Step step, int actionId, Date finishDate, String status, String caller) {
    List currentSteps =
        (List) SerializableCache.getInstance().currentStepsCache.get(new Long(step.getEntryId()));

    for (Iterator iterator = currentSteps.iterator(); iterator.hasNext(); ) {
      SimpleStep theStep = (SimpleStep) iterator.next();

      if (theStep.getId() == step.getId()) {
        theStep.setStatus(status);
        theStep.setActionId(actionId);
        theStep.setFinishDate(finishDate);
        theStep.setCaller(caller);

        return theStep;
      }
    }

    SerializableCache.store();

    return null;
  }
  public static void main(String args[]) {
    try {
      DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();

      // Define a bean and register it
      beanFactory.registerSingleton("args", Arrays.asList(args));
      GenericApplicationContext cmdArgCxt = new GenericApplicationContext(beanFactory);
      // Must call refresh to initialize context
      cmdArgCxt.refresh();

      String configs[] = {"/META-INF/spring/app-config.xml"};
      AbstractApplicationContext context = new ClassPathXmlApplicationContext(configs, cmdArgCxt);
      context.registerShutdownHook();
      Workflow workflow = (Workflow) context.getBean("workflow");
      System.out.println("Workflow names:");
      int i = 1;
      for (String name : workflow.getWorkflowNames()) {
        System.out.format("%02d) %s%n", i++, name);
      }

      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

      System.out.print("User: "******"caller", username);

      String command;
      do {
        try {
          System.out.print("Enter command: ");
          command = in.readLine();

          if (command == null || "q".equals(command) || "quit".equals(command)) break;

          if ("log".equals(command)) {
            System.out.print("User: "******"caller", username);
          }
          if ("init".equals(command)) {
            System.out.print("Workflow name: ");
            String workflowName = in.readLine();

            long id = workflow.initialize(workflowName, 1, inputs);
            System.out.println("Workflow initialized with id: " + id);
          } else if ("desc".equals(command)) {
            System.out.print("Workflow ID: ");
            long id = Long.parseLong(in.readLine());

            String workflowName = workflow.getWorkflowName(id);
            WorkflowDescriptor descriptor = workflow.getWorkflowDescriptor(workflowName);

            System.out.print("Workflow state: ");
            switch (workflow.getEntryState(id)) {
              case WorkflowEntry.CREATED:
                System.out.println("CREATED");
                break;
              case WorkflowEntry.ACTIVATED:
                System.out.println("ACTIVATED");
                break;
              case WorkflowEntry.SUSPENDED:
                System.out.println("SUSPENDED");
                break;
              case WorkflowEntry.KILLED:
                System.out.println("KILLED");
                break;
              case WorkflowEntry.COMPLETED:
                System.out.println("COMPLETED");
                break;
              default:
                System.out.println("UNKNOWN");
            }

            List<Step> currentSteps = workflow.getCurrentSteps(id);
            System.out.println("Current steps:");
            int j = 0;
            for (Step step : currentSteps) {
              ++j;
              StepDescriptor stepDesc = descriptor.getStep(step.getStepId());
              System.out.println("Meta attributes:");
              System.out.format("\t%s%n", stepDesc.getMetaAttributes().toString());
              System.out.format(
                  "%02d) %s (%s - %s)%n",
                  step.getStepId(), stepDesc.getName(), step.getStatus(), step.getOwner());
            }

            int[] availableActions = workflow.getAvailableActions(id, inputs);
            System.out.println("Available actions:");
            for (j = 0; j < availableActions.length; j++) {
              ActionDescriptor action = descriptor.getAction(availableActions[j]);
              System.out.println(String.format("%02d) %s", availableActions[j], action.getName()));
            }
          } else if ("exec".equals(command)) {
            System.out.print("Workflow ID: ");
            long id = Long.parseLong(in.readLine());
            System.out.print("Action ID: ");
            int actionId = Integer.parseInt(in.readLine());

            workflow.doAction(id, actionId, inputs);
          } else if ("query".equals(command)) {
            Set<WorkflowNameAndStep> stepInfos = new LinkedHashSet<WorkflowNameAndStep>();
            stepInfos.add(new WorkflowNameAndStep(1, "example"));
            stepInfos.add(new WorkflowNameAndStep(2, "sp3-moderation"));
            List ids = workflow.getWorkflowsByNamesAndSteps(stepInfos);
            System.out.println("Found ids are: " + ids);
          }
        } catch (Exception e) {
          e.printStackTrace();
        }

        System.out.println("-------------------------------------");
      } while (true);

      System.out.println("Exiting");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }