@Override
  public Object execute(Context context) {
    KieSession kieSession = ((KnowledgeCommandContext) context).getKieSession();
    TimerManager tm = getTimerManager(kieSession);

    RuleFlowProcessInstance wfp =
        (RuleFlowProcessInstance) kieSession.getProcessInstance(processInstanceId);

    for (NodeInstance nodeInstance : wfp.getNodeInstances()) {
      if (nodeInstance instanceof TimerNodeInstance) {
        TimerNodeInstance tni = (TimerNodeInstance) nodeInstance;
        if (tni.getNodeName().equals(timerName)) {
          TimerInstance timer = tm.getTimerMap().get(tni.getTimerId());

          tm.cancelTimer(timer.getTimerId());
          TimerInstance newTimer = new TimerInstance();

          if (delay != 0) {
            long diff = System.currentTimeMillis() - timer.getActivated().getTime();
            newTimer.setDelay(delay * 1000 - diff);
          }
          newTimer.setPeriod(period);
          newTimer.setRepeatLimit(repeatLimit);
          newTimer.setTimerId(timer.getTimerId());
          tm.registerTimer(newTimer, wfp);

          tni.internalSetTimerId(newTimer.getId());

          break;
        }
      }
    }
    return null;
  }
  protected NodeInstanceImpl readNodeInstanceContent(
      JBPMMessages.ProcessInstance.NodeInstance _node,
      MarshallerReaderContext context,
      WorkflowProcessInstance processInstance)
      throws IOException {
    NodeInstanceImpl nodeInstance = null;
    NodeInstanceContent _content = _node.getContent();
    switch (_content.getType()) {
      case RULE_SET_NODE:
        nodeInstance = new RuleSetNodeInstance();
        ((RuleSetNodeInstance) nodeInstance)
            .setRuleFlowGroup(_content.getRuleSet().getRuleFlowGroup());
        if (_content.getRuleSet().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getRuleSet().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((RuleSetNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }

        if (_content.getRuleSet().getMapEntryCount() > 0) {
          Map<String, FactHandle> factInfo = new HashMap<String, FactHandle>();

          for (TextMapEntry entry : _content.getRuleSet().getMapEntryList()) {
            factInfo.put(entry.getName(), new DefaultFactHandle(entry.getValue()));
          }

          ((RuleSetNodeInstance) nodeInstance).setFactHandles(factInfo);
        }
        break;
      case HUMAN_TASK_NODE:
        nodeInstance = new HumanTaskNodeInstance();
        ((HumanTaskNodeInstance) nodeInstance)
            .internalSetWorkItemId(_content.getHumanTask().getWorkItemId());
        if (_content.getHumanTask().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getHumanTask().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((HumanTaskNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case WORK_ITEM_NODE:
        nodeInstance = new WorkItemNodeInstance();
        ((WorkItemNodeInstance) nodeInstance)
            .internalSetWorkItemId(_content.getWorkItem().getWorkItemId());
        if (_content.getWorkItem().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getWorkItem().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((WorkItemNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case SUBPROCESS_NODE:
        nodeInstance = new SubProcessNodeInstance();
        ((SubProcessNodeInstance) nodeInstance)
            .internalSetProcessInstanceId(_content.getSubProcess().getProcessInstanceId());
        if (_content.getSubProcess().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getSubProcess().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((SubProcessNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case MILESTONE_NODE:
        nodeInstance = new MilestoneNodeInstance();
        if (_content.getMilestone().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getMilestone().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((MilestoneNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case TIMER_NODE:
        nodeInstance = new TimerNodeInstance();
        ((TimerNodeInstance) nodeInstance).internalSetTimerId(_content.getTimer().getTimerId());
        break;
      case EVENT_NODE:
        nodeInstance = new EventNodeInstance();
        break;
      case JOIN_NODE:
        nodeInstance = new JoinInstance();
        if (_content.getJoin().getTriggerCount() > 0) {
          Map<Long, Integer> triggers = new HashMap<Long, Integer>();
          for (JBPMMessages.ProcessInstance.NodeInstanceContent.JoinNode.JoinTrigger _join :
              _content.getJoin().getTriggerList()) {
            triggers.put(_join.getNodeId(), _join.getCounter());
          }
          ((JoinInstance) nodeInstance).internalSetTriggers(triggers);
        }
        break;
      case COMPOSITE_CONTEXT_NODE:
        nodeInstance = new CompositeContextNodeInstance();

        if (_content.getComposite().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getComposite().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((CompositeContextNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case FOR_EACH_NODE:
        nodeInstance = new ForEachNodeInstance();
        break;
      case DYNAMIC_NODE:
        nodeInstance = new DynamicNodeInstance();
        if (_content.getComposite().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getComposite().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((CompositeContextNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case STATE_NODE:
        nodeInstance = new StateNodeInstance();
        if (_content.getState().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getState().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((CompositeContextNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      case EVENT_SUBPROCESS_NODE:
        nodeInstance = new EventSubProcessNodeInstance();

        if (_content.getComposite().getTimerInstanceIdCount() > 0) {
          List<Long> timerInstances = new ArrayList<Long>();
          for (Long _timerId : _content.getComposite().getTimerInstanceIdList()) {
            timerInstances.add(_timerId);
          }
          ((CompositeContextNodeInstance) nodeInstance).internalSetTimerInstances(timerInstances);
        }
        break;
      default:
        throw new IllegalArgumentException("Unknown node type: " + _content.getType());
    }
    return nodeInstance;
  }