protected Void copyTemplateCrossZoneCallBack(
      AsyncCallbackDispatcher<TemplateServiceImpl, CreateCmdResult> callback,
      TemplateOpContext<TemplateApiResult> context) {
    if (s_logger.isDebugEnabled()) {
      s_logger.debug("Performing copy template cross zone callback after completion");
    }
    TemplateInfo destTemplate = context.getTemplate();
    CreateCmdResult result = callback.getResult();
    AsyncCallFuture<TemplateApiResult> future = context.getFuture();
    TemplateApiResult res = new TemplateApiResult(destTemplate);
    try {
      if (result.isFailed()) {
        res.setResult(result.getResult());
        destTemplate.processEvent(Event.OperationFailed);
      } else {
        destTemplate.processEvent(Event.OperationSuccessed, result.getAnswer());
      }
      future.complete(res);
    } catch (Exception e) {
      s_logger.debug("Failed to process copy template cross zones callback", e);
      res.setResult(e.toString());
      future.complete(res);
    }

    return null;
  }
  protected Void syncTemplateCallBack(
      AsyncCallbackDispatcher<TemplateServiceImpl, CopyCommandResult> callback,
      TemplateOpContext<TemplateApiResult> context) {
    TemplateInfo destTemplate = context.getTemplate();
    CopyCommandResult result = callback.getResult();
    AsyncCallFuture<TemplateApiResult> future = context.getFuture();
    TemplateApiResult res = new TemplateApiResult(destTemplate);
    try {
      if (result.isFailed()) {
        res.setResult(result.getResult());
        // no change to existing template_store_ref, will try to re-sync later if other call
        // triggers this sync operation, like copy template
      } else {
        // this will update install path properly, next time it will not sync anymore.
        destTemplate.processEvent(Event.OperationSuccessed, result.getAnswer());
      }
      future.complete(res);
    } catch (Exception e) {
      s_logger.debug("Failed to process sync template callback", e);
      res.setResult(e.toString());
      future.complete(res);
    }

    return null;
  }
  protected Void createTemplateCallback(
      AsyncCallbackDispatcher<TemplateServiceImpl, CreateCmdResult> callback,
      TemplateOpContext<TemplateApiResult> context) {
    TemplateObject template = context.getTemplate();
    AsyncCompletionCallback<TemplateApiResult> parentCallback = context.getParentCallback();
    TemplateApiResult result = new TemplateApiResult(template);
    CreateCmdResult callbackResult = callback.getResult();
    if (callbackResult.isFailed()) {
      template.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed);
      result.setResult(callbackResult.getResult());
      if (parentCallback != null) {
        parentCallback.complete(result);
      }
      return null;
    }

    try {
      template.processEvent(ObjectInDataStoreStateMachine.Event.OperationSuccessed);
    } catch (Exception e) {
      result.setResult(e.toString());
      if (parentCallback != null) {
        parentCallback.complete(result);
      }
      return null;
    }

    if (parentCallback != null) {
      parentCallback.complete(result);
    }
    return null;
  }
 public Void deleteTemplateCallback(
     AsyncCallbackDispatcher<TemplateServiceImpl, CommandResult> callback,
     TemplateOpContext<TemplateApiResult> context) {
   CommandResult result = callback.getResult();
   TemplateObject vo = context.getTemplate();
   if (result.isSuccess()) {
     vo.processEvent(Event.OperationSuccessed);
   } else {
     vo.processEvent(Event.OperationFailed);
   }
   TemplateApiResult apiResult = new TemplateApiResult(vo);
   apiResult.setResult(result.getResult());
   apiResult.setSuccess(result.isSuccess());
   context.future.complete(apiResult);
   return null;
 }