private void handleError(int statusCode, String responseErrorMsg) {
    logger.log(Level.SEVERE, responseErrorMsg);
    procObj.transactionId = procObj.transactionId;
    procObj.statusCode = statusCode;
    procObj.errorMessage = responseErrorMsg;

    if (procObj.processedResults != null) procObj.processedResults.clear();
  }
  @Override
  public void doProcess(ExecutorRequest req, ExecutorResponse resp, ExecutorContext execContext)
      throws Exception {
    executorType = req.getExecutorType();

    if (DSR_SIGNAL_TYPE.equals(executorType)) {
      String signal = (String) req.getAttributes().get(SIGNAL);

      if (END_AUDIO_SIGNAL.equals(signal)) {
        procObj.getProfile().netIOEnd();
        // tell the recognizer that it has all the audio
        proxy.endAudio();

        // Stop reading chunk data
        callback.doEnd();
      } else if (CANCEL_SIGNAL.equals(signal)) {
        // The user canceled, so tell the recognizer to stop processing
        proxy.release();
      } else if (INIT_RECOGNIZER_SIGNAL.equals(signal)) {

        // HARD CODE TNCONTEXT - REMOVE ONCE DONGHENG FIXES DSM RULES
        hardCodeTnContext(execContext, req.getUserProfile());

        procObj.profile.netIOBegin();
        procObj.profile.totalProcessBegin();
        RecContext rc = (RecContext) req.getAttributes().get(ProtocolConstants.REC_CONTEXT);

        rc.user = req.getUserProfile();
        rc.ttsFormat = rc.user.getAudioFormat();
        rc.tnContext = execContext.getTnContext();

        List<GpsData> gpsData = req.getGpsData();

        if (gpsData != null && gpsData.size() > 0) {
          // just use the first fix
          GpsData data = gpsData.get(0);
          rc.location = new Stop();
          rc.location.lat = data.lat;
          rc.location.lon = data.lon;
        } else {
          logger.log(Level.WARNING, "Unablet o get GPS data from request.");
          rc.location = new Stop();
          rc.location.lat = 0;
          rc.location.lon = 0;
        }

        // process the meta information
        processMetaInfo(rc);

        // Initialize the recognizer
        proxy.init(procObj);
      } else logger.log(Level.WARNING, "Unrecognized dsr signal: " + signal);
    } else if (DSR_AUDIO_TYPE.equals(executorType)) {
      // write audio packet to the recognizer
      byte[] audioData = (byte[]) req.getAttributes().get(ProtocolConstants.AUDIO);
      proxy.addAudioSeg(audioData);
    } else logger.log(Level.WARNING, "Did not recognize dsr packet type: " + executorType);
  }
  @Override
  public void handleResult(ProcessObject procObj) {
    try {
      logger.log(Level.INFO, "DSR Status Code: " + procObj.getProfile().getDsrStatusCode());
      if (procObj.getProfile().getDsrStatusCode() == ResourceConst.SERVER_ERROR) {
        // DSR Recognition Failure
        logger.log(Level.WARNING, "No reponse bytes return. Failed to recognize speech.");
        String responseMsg = "Failed to recognize speech.[-1]";
        handleError(ResourceConst.SERVER_ERROR, responseMsg);
      } else {
        // pipeline flow
        for (IResultsHandler handler : processConfig.getHandlers())
          procObj = handler.process(procObj);

        procObj.statusCode = ResourceConst.SERVER_SUCCESS;
      }
    } catch (Exception e) {
      logger.log(Level.WARNING, "Unable to process request due to ", e);
      String responseMsg = "DSR C-server Error";
      handleError(ResourceConst.SERVER_ERROR, responseMsg);
    }

    DSRExecutorResponse er = new DSRExecutorResponse();
    er.setStatus(procObj.statusCode);
    er.setErrorMessage(procObj.errorMessage);
    er.setProcessObject(procObj);
    er.setExecutorType(executorType);
    procObj.profile.totalProcessEnd();
    // call back to the framework with the result
    try {
      callback.doCallback(null, er);
    } catch (Exception e) {
      logger.log(Level.WARNING, "Exception calling back to server", e);
    }

    // callback.doEnd();
  }
  private void processMetaInfo(RecContext context) {
    profile.netIOBegin();
    profile.totalProcessBegin();

    CliTransaction cli = new CliTransaction(CliConstants.TYPE_MODULE);
    cli.setFunctionName("handleMeta");

    // handle meta information
    if (context == null) {
      String responseMsg = "Unable to parse request meta data.";
      handleError(ResourceConst.SERVER_ERROR, responseMsg);
      cli.setStatus("responseMsg");
      cli.complete();
    }

    logger.log(Level.INFO, "Meta handled successfully");
    // Set context obtained form meta
    procObj.setContext(context);

    // Set profiling data
    setProfileInfo();

    // Obtain processConfig for corresponding recType
    int configId = procObj.getContext().recType;
    processConfig = ProcessConfigurationFactory.getConfiguration("" + configId);
    logger.log(Level.INFO, "Obtained process config instance for config id : " + configId);

    // Obtain proxy object
    proxy = processConfig.getProxy();
    proxy.addResultListener(this);

    logger.log(Level.INFO, "Obtained proxy instance from process config");

    // proxy.init(procObj);
    cli.complete();
  }
  private void setProfileInfo() {

    profile.setCarrier(procObj.getContext().user.getCarrier());
    profile.setDeviceType(procObj.getContext().user.getDevice());
    profile.setPtn(procObj.getContext().user.getUserId());
    logger.log(
        Level.INFO,
        "CARRIER: "
            + procObj.getContext().user.getCarrier()
            + "; DEVICE: "
            + procObj.getContext().user.getDevice()
            + "; USERID: "
            + procObj.getContext().user.getUserId());
    String cserver_machine_name = null;
    try {
      InetAddress addr = InetAddress.getLocalHost();
      cserver_machine_name = addr.getHostName().toString();
    } catch (Exception e) {
      logger.log(Level.WARNING, "fail to get the server name", e);
    }
    profile.setCserver_machine_name(cserver_machine_name);
    procObj.setProfile(profile);
  }
public class DSRStreamingChunkProcessor extends AbstractChunkProcssor
    implements RecognizerResultListener, ProtocolConstants {

  private static Logger logger = Logger.getLogger(DSRStreamingChunkProcessor.class.getName());

  private ProcessObject procObj = new ProcessObject();
  private ProcessConfiguration processConfig;
  private RecognizerProxy proxy;
  private ProcessProfile profile = procObj.getProfile();
  private String executorType;

  @Override
  public void doProcess(ExecutorRequest req, ExecutorResponse resp, ExecutorContext execContext)
      throws Exception {
    executorType = req.getExecutorType();

    if (DSR_SIGNAL_TYPE.equals(executorType)) {
      String signal = (String) req.getAttributes().get(SIGNAL);

      if (END_AUDIO_SIGNAL.equals(signal)) {
        procObj.getProfile().netIOEnd();
        // tell the recognizer that it has all the audio
        proxy.endAudio();

        // Stop reading chunk data
        callback.doEnd();
      } else if (CANCEL_SIGNAL.equals(signal)) {
        // The user canceled, so tell the recognizer to stop processing
        proxy.release();
      } else if (INIT_RECOGNIZER_SIGNAL.equals(signal)) {

        // HARD CODE TNCONTEXT - REMOVE ONCE DONGHENG FIXES DSM RULES
        hardCodeTnContext(execContext, req.getUserProfile());

        procObj.profile.netIOBegin();
        procObj.profile.totalProcessBegin();
        RecContext rc = (RecContext) req.getAttributes().get(ProtocolConstants.REC_CONTEXT);

        rc.user = req.getUserProfile();
        rc.ttsFormat = rc.user.getAudioFormat();
        rc.tnContext = execContext.getTnContext();

        List<GpsData> gpsData = req.getGpsData();

        if (gpsData != null && gpsData.size() > 0) {
          // just use the first fix
          GpsData data = gpsData.get(0);
          rc.location = new Stop();
          rc.location.lat = data.lat;
          rc.location.lon = data.lon;
        } else {
          logger.log(Level.WARNING, "Unablet o get GPS data from request.");
          rc.location = new Stop();
          rc.location.lat = 0;
          rc.location.lon = 0;
        }

        // process the meta information
        processMetaInfo(rc);

        // Initialize the recognizer
        proxy.init(procObj);
      } else logger.log(Level.WARNING, "Unrecognized dsr signal: " + signal);
    } else if (DSR_AUDIO_TYPE.equals(executorType)) {
      // write audio packet to the recognizer
      byte[] audioData = (byte[]) req.getAttributes().get(ProtocolConstants.AUDIO);
      proxy.addAudioSeg(audioData);
    } else logger.log(Level.WARNING, "Did not recognize dsr packet type: " + executorType);
  }

  private void hardCodeTnContext(ExecutorContext execContext, UserProfile userProfile) {
    String loginName = userProfile.getMin();
    String carrier = userProfile.getCarrier();
    String device = userProfile.getDevice();
    String product = userProfile.getPlatform();
    String version = userProfile.getVersion();
    String userID = userProfile.getUserId();
    String applicationName = userProfile.getProduct();
    // String mapDpi = userProfile.getMapDpi();
    String locale = userProfile.getLocale();
    // String programCode = userProfile.getProgramCode();

    TnContext tc = new TnContext();
    tc.addProperty(TnContext.PROP_LOGIN_NAME, loginName);
    tc.addProperty(TnContext.PROP_CARRIER, carrier);
    tc.addProperty(TnContext.PROP_DEVICE, device);
    tc.addProperty(TnContext.PROP_PRODUCT, product);
    tc.addProperty(TnContext.PROP_VERSION, version);
    //      tc.addProperty("user_family",
    // Long.toString(ResourceLoader.getInstance().getUserFamily(userProfile)));
    tc.addProperty("application", applicationName); // "application" should defined in TnContext
    tc.addProperty("c-server class", Constants.CSERVER_CLASS);
    tc.addProperty("c-server url", execContext.getServerUrl());
    // tc.addProperty("map_dpi", mapDpi);
    tc.addProperty("locale", locale);
    // tc.addProperty("program_code", programCode);

    tc.addProperty(TnContext.PROP_REQUESTOR, TnContext.TT_REQUESTOR_TNCLIENT);
  }

  private void handleError(int statusCode, String responseErrorMsg) {
    logger.log(Level.SEVERE, responseErrorMsg);
    procObj.transactionId = procObj.transactionId;
    procObj.statusCode = statusCode;
    procObj.errorMessage = responseErrorMsg;

    if (procObj.processedResults != null) procObj.processedResults.clear();
  }

  private void processMetaInfo(RecContext context) {
    profile.netIOBegin();
    profile.totalProcessBegin();

    CliTransaction cli = new CliTransaction(CliConstants.TYPE_MODULE);
    cli.setFunctionName("handleMeta");

    // handle meta information
    if (context == null) {
      String responseMsg = "Unable to parse request meta data.";
      handleError(ResourceConst.SERVER_ERROR, responseMsg);
      cli.setStatus("responseMsg");
      cli.complete();
    }

    logger.log(Level.INFO, "Meta handled successfully");
    // Set context obtained form meta
    procObj.setContext(context);

    // Set profiling data
    setProfileInfo();

    // Obtain processConfig for corresponding recType
    int configId = procObj.getContext().recType;
    processConfig = ProcessConfigurationFactory.getConfiguration("" + configId);
    logger.log(Level.INFO, "Obtained process config instance for config id : " + configId);

    // Obtain proxy object
    proxy = processConfig.getProxy();
    proxy.addResultListener(this);

    logger.log(Level.INFO, "Obtained proxy instance from process config");

    // proxy.init(procObj);
    cli.complete();
  }

  private void setProfileInfo() {

    profile.setCarrier(procObj.getContext().user.getCarrier());
    profile.setDeviceType(procObj.getContext().user.getDevice());
    profile.setPtn(procObj.getContext().user.getUserId());
    logger.log(
        Level.INFO,
        "CARRIER: "
            + procObj.getContext().user.getCarrier()
            + "; DEVICE: "
            + procObj.getContext().user.getDevice()
            + "; USERID: "
            + procObj.getContext().user.getUserId());
    String cserver_machine_name = null;
    try {
      InetAddress addr = InetAddress.getLocalHost();
      cserver_machine_name = addr.getHostName().toString();
    } catch (Exception e) {
      logger.log(Level.WARNING, "fail to get the server name", e);
    }
    profile.setCserver_machine_name(cserver_machine_name);
    procObj.setProfile(profile);
  }

  @Override
  public void handleResult(ProcessObject procObj) {
    try {
      logger.log(Level.INFO, "DSR Status Code: " + procObj.getProfile().getDsrStatusCode());
      if (procObj.getProfile().getDsrStatusCode() == ResourceConst.SERVER_ERROR) {
        // DSR Recognition Failure
        logger.log(Level.WARNING, "No reponse bytes return. Failed to recognize speech.");
        String responseMsg = "Failed to recognize speech.[-1]";
        handleError(ResourceConst.SERVER_ERROR, responseMsg);
      } else {
        // pipeline flow
        for (IResultsHandler handler : processConfig.getHandlers())
          procObj = handler.process(procObj);

        procObj.statusCode = ResourceConst.SERVER_SUCCESS;
      }
    } catch (Exception e) {
      logger.log(Level.WARNING, "Unable to process request due to ", e);
      String responseMsg = "DSR C-server Error";
      handleError(ResourceConst.SERVER_ERROR, responseMsg);
    }

    DSRExecutorResponse er = new DSRExecutorResponse();
    er.setStatus(procObj.statusCode);
    er.setErrorMessage(procObj.errorMessage);
    er.setProcessObject(procObj);
    er.setExecutorType(executorType);
    procObj.profile.totalProcessEnd();
    // call back to the framework with the result
    try {
      callback.doCallback(null, er);
    } catch (Exception e) {
      logger.log(Level.WARNING, "Exception calling back to server", e);
    }

    // callback.doEnd();
  }
}