private String processPostQuery(HttpServletRequest request) {
    StringBuilder msg = new StringBuilder();
    String sessionHandle = request.getParameter("sessionHandle");
    String action = request.getParameter("action");
    String workItemID = request.getParameter("workItemID");
    String specIdentifier = request.getParameter("specidentifier");
    String specVersion = request.getParameter("specversion");
    String specURI = request.getParameter("specuri");
    String taskID = request.getParameter("taskID");

    try {
      debug(request, "Post");

      if (action != null) {
        if (action.equals("checkConnection")) {
          msg.append(_engine.checkConnection(sessionHandle));
        } else if (action.equals("connect")) {
          String userID = request.getParameter("userid");
          String password = request.getParameter("password");
          int interval = request.getSession().getMaxInactiveInterval();
          msg.append(_engine.connect(userID, password, interval));
        } else if ("disconnect".equals(action)) {
          msg.append(_engine.disconnect(sessionHandle));
        } else if (action.equals("checkout")) {
          msg.append(_engine.startWorkItem(workItemID, sessionHandle));
        } else if (action.equals("checkin")) {
          String data = request.getParameter("data");
          String logPredicate = request.getParameter("logPredicate");
          msg.append(
              _engine.completeWorkItem(workItemID, data, logPredicate, false, sessionHandle));
        } else if (action.equals("rejectAnnouncedEnabledTask")) {
          msg.append(_engine.rejectAnnouncedEnabledTask(workItemID, sessionHandle));
        } else if (action.equals("launchCase")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          URI completionObserver = getCompletionObserver(request);
          String caseParams = request.getParameter("caseParams");
          String logDataStr = request.getParameter("logData");
          String mSecStr = request.getParameter("mSec");
          String startStr = request.getParameter("start");
          String waitStr = request.getParameter("wait");
          if (mSecStr != null) {
            msg.append(
                _engine.launchCase(
                    specID,
                    caseParams,
                    completionObserver,
                    logDataStr,
                    StringUtil.strToLong(mSecStr, 0),
                    sessionHandle));
          } else if (startStr != null) {
            long time = StringUtil.strToLong(startStr, 0);
            Date date = time > 0 ? new Date(time) : new Date();
            msg.append(
                _engine.launchCase(
                    specID, caseParams, completionObserver, logDataStr, date, sessionHandle));
          } else if (waitStr != null) {
            msg.append(
                _engine.launchCase(
                    specID,
                    caseParams,
                    completionObserver,
                    logDataStr,
                    StringUtil.strToDuration(waitStr),
                    sessionHandle));
          } else
            msg.append(
                _engine.launchCase(
                    specID, caseParams, completionObserver, logDataStr, sessionHandle));
        } else if (action.equals("cancelCase")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.cancelCase(caseID, sessionHandle));
        } else if (action.equals("getWorkItem")) {
          msg.append(_engine.getWorkItem(workItemID, sessionHandle));
        } else if (action.equals("startOne")) {
          String userID = request.getParameter("user");
          msg.append(_engine.startWorkItem(userID, sessionHandle));
        } else if (action.equals("getLiveItems")) {
          msg.append(_engine.describeAllWorkItems(sessionHandle));
        } else if (action.equals("getAllRunningCases")) {
          msg.append(_engine.getAllRunningCases(sessionHandle));
        } else if (action.equals("getWorkItemsWithIdentifier")) {
          String idType = request.getParameter("idType");
          String id = request.getParameter("id");
          msg.append(_engine.getWorkItemsWithIdentifier(idType, id, sessionHandle));
        } else if (action.equals("getWorkItemsForService")) {
          String serviceURI = request.getParameter("serviceuri");
          msg.append(_engine.getWorkItemsForService(serviceURI, sessionHandle));
        } else if (action.equals("taskInformation")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getTaskInformation(specID, taskID, sessionHandle));
        } else if (action.equals("getMITaskAttributes")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getMITaskAttributes(specID, taskID, sessionHandle));
        } else if (action.equals("getResourcingSpecs")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getResourcingSpecs(specID, taskID, sessionHandle));
        } else if (action.equals("checkIsAdmin")) {
          msg.append(_engine.checkConnectionForAdmin(sessionHandle));
        } else if (action.equals("checkAddInstanceEligible")) {
          msg.append(_engine.checkElegibilityToAddInstances(workItemID, sessionHandle));
        } else if (action.equals("getSpecificationPrototypesList")) {
          msg.append(_engine.getSpecificationList(sessionHandle));
        } else if (action.equals("getSpecification")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getProcessDefinition(specID, sessionHandle));
        } else if (action.equals("getSpecificationData")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getSpecificationData(specID, sessionHandle));
        } else if (action.equals("getSpecificationDataSchema")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getSpecificationDataSchema(specID, sessionHandle));
        } else if (action.equals("getCasesForSpecification")) {
          YSpecificationID specID = new YSpecificationID(specIdentifier, specVersion, specURI);
          msg.append(_engine.getCasesForSpecification(specID, sessionHandle));
        } else if (action.equals("getSpecificationForCase")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.getSpecificationForCase(caseID, sessionHandle));
        } else if (action.equals("getSpecificationIDForCase")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.getSpecificationIDForCase(caseID, sessionHandle));
        } else if (action.equals("getCaseState")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.getCaseState(caseID, sessionHandle));
        } else if (action.equals("getCaseData")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.getCaseData(caseID, sessionHandle));
        } else if (action.equals("getChildren")) {
          msg.append(_engine.getChildrenOfWorkItem(workItemID, sessionHandle));
        } else if (action.equals("getWorkItemExpiryTime")) {
          msg.append(_engine.getWorkItemExpiryTime(workItemID, sessionHandle));
        } else if (action.equals("getCaseInstanceSummary")) {
          msg.append(_engine.getCaseInstanceSummary(sessionHandle));
        } else if (action.equals("getWorkItemInstanceSummary")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.getWorkItemInstanceSummary(caseID, sessionHandle));
        } else if (action.equals("getParameterInstanceSummary")) {
          String caseID = request.getParameter("caseID");
          msg.append(_engine.getParameterInstanceSummary(caseID, workItemID, sessionHandle));
        } else if (action.equals("createInstance")) {
          String paramValueForMICreation = request.getParameter("paramValueForMICreation");
          msg.append(_engine.createNewInstance(workItemID, paramValueForMICreation, sessionHandle));
        } else if (action.equals("suspend")) {
          msg.append(_engine.suspendWorkItem(workItemID, sessionHandle));
        } else if (action.equals("rollback")) {
          msg.append(_engine.rollbackWorkItem(workItemID, sessionHandle));
        } else if (action.equals("unsuspend")) {
          msg.append(_engine.unsuspendWorkItem(workItemID, sessionHandle));
        } else if (action.equals("skip")) {
          msg.append(_engine.skipWorkItem(workItemID, sessionHandle));
        } else if (action.equals("getStartingDataSnapshot")) {
          msg.append(_engine.getStartingDataSnapshot(workItemID, sessionHandle));
        }
      } // action is null
      else if (request.getRequestURI().endsWith("ib")) {
        msg.append(_engine.getAvailableWorkItemIDs(sessionHandle));
      } else if (request.getRequestURI().contains("workItem")) {
        msg.append(
            _engine.getWorkItemOptions(
                workItemID, request.getRequestURL().toString(), sessionHandle));
      } else _log.error("Interface B called with null action.");
    } catch (RemoteException e) {
      _log.error("Remote Exception in Interface B with action: " + action, e);
    }
    _log.debug("InterfaceB_EngineBasedServer::doPost() result = {}", msg);
    return msg.toString();
  }