@Monitor(
      server = EMAIL_SERVER,
      parserClass = ServiceUrlParserFactory.CLASS_XML_WEBSERVICE,
      serviceUrlKeys = "EMAILSERVICE")
  private DetectResult monitorEmailServer() {
    DetectResult result = new DetectResult();
    try {
      UserProfile userProfile = BackendServerMonitorUtil.createUserProfile();
      TnContext tc = BackendServerMonitorUtil.createTnContext();
      EmailConfirmationRequest request = new EmailConfirmationRequest();
      request.setContextString(tc.toContextString());
      request.setEmail("*****@*****.**");
      request.setEmailType(UserTypeDef.COMMON_EMAIL);
      request.setUserId(userProfile.getUserId());
      EmailConfirmationResponse response =
          TelepersonalizeProxy.getInstance().sendEmail(request, tc);
      if (response.isSuccess()) {
        result.isSuccess = true;
      } else {
        result.isSuccess = false;
        result.msg = response.getErrorMessage();
      }

    } catch (Exception ex) {
      logger.fatal("#monitorEmailServer", ex);
      result.isSuccess = false;
      result.msg =
          "Exception occurs when sendMail()"
              + ". Exception msg->"
              + ExceptionUtil.collectExceptionMsg(ex);
    }
    return result;
  }
  private void setUserProfileToTnContext(
      TnContext tc, UserProfile userProfile, ExecutorContext context) {
    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();

    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", context.getServerUrl());
    tc.addProperty("map_dpi", mapDpi);
    tc.addProperty("locale", locale);
    tc.addProperty(PROP_PROGRAM_CODE, programCode);

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

    tc.addProperty(PROP_REGION, userProfile.getRegion());
  }
  @Monitor(
      server = USER_MANAGEMENT_SERVER,
      parserClass = ServiceUrlParserFactory.CLASS_PROPERTIES,
      filePath = "config/web_services.properties",
      serviceUrlKeys = "URL_POI_REVIEW_WRITE")
  private DetectResult monitorUserManagementServer() {

    DetectResult result = new DetectResult();

    UserManagementServiceStub stub = null;
    try {
      UserProfile userProfile = BackendServerMonitorUtil.createUserProfile();
      TnContext tc = BackendServerMonitorUtil.createTnContext();

      GetUserRequestDTO getUserRequest = new GetUserRequestDTO();
      getUserRequest.setParam(userProfile.getUserId() + "");
      getUserRequest.setParamType(UserQueryBy.USER_ID);

      getUserRequest.setClientName(HtmlConstants.clientName);
      getUserRequest.setClientVersion(HtmlConstants.clientVersion);
      getUserRequest.setContextString(tc.toContextString());
      getUserRequest.setTransactionId(HtmlPoiUtil.getTrxId());
      // get userInfo
      stub = new UserManagementServiceStub(WebServiceConfigurator.getUrlOfPoiReviewWrite());
      GetUserResponseDTO response = stub.getUser(getUserRequest);
      if (response != null) {
        if (response.getUser() != null) {
          result.isSuccess = true;
        } else {
          result.isSuccess = false;
          result.msg = "GetUserResponseDTO.getUser() is null";
        }
      } else {
        result.isSuccess = false;
        result.msg = "GetUserResponseDTO is Null";
      }
    } catch (Exception ex) {
      logger.fatal("#monitorUserManagementServer", ex);
      result.isSuccess = false;
      result.msg =
          "Exception occurs when getUserName"
              + ". Exception msg->"
              + ExceptionUtil.collectExceptionMsg(ex);
    } finally {
      if (stub != null) {
        WebServiceUtils.cleanupStub(stub);
      }
    }
    return result;
  }
  /* used in ShareAddressExecutor */
  @Monitor(
      server = SHAREADDRESS_SERVER,
      parserClass = ServiceUrlParserFactory.CLASS_XML_WEBSERVICE,
      serviceUrlKeys = "ADDRESSSHARING")
  private DetectResult monitorShareAddressServer() {
    DetectResult result = new DetectResult();

    try {
      UserProfile userProfile = BackendServerMonitorUtil.createUserProfile();
      TnContext tc = BackendServerMonitorUtil.createTnContext();

      AddressSharingRequest addressSharingRequest = new AddressSharingRequest();
      addressSharingRequest.setUserId(PoiUtil.getLongFrom(userProfile.getUserId()));
      addressSharingRequest.setPtn(userProfile.getMin());
      addressSharingRequest.setContextString(tc.toContextString());
      addressSharingRequest.setAddress(BackendServerMonitorUtil.createStop());

      ContactInfo contact = new ContactInfo();
      contact.setName("test");
      contact.setPtn(userProfile.getMin());
      List<ContactInfo> contactlist = new ArrayList<ContactInfo>();
      contactlist.add(contact);
      addressSharingRequest.setContactList(contactlist);

      AddressSharingResponse addressSharingResponse =
          AddressSharingServiceProxy.getInstance().shareAddress(addressSharingRequest, tc);
      String statusCode = addressSharingResponse.getStatusCode();
      String statusMessage = addressSharingResponse.getStatusMessage();

      if ("OK".equalsIgnoreCase(statusCode)) {
        result.isSuccess = true;
      } else {
        result.isSuccess = false;
        result.msg = "statusCode = " + statusCode + ", statusMessage = " + statusMessage;
      }
    } catch (Exception ex) {
      logger.fatal("#monitorShareAddressServer", ex);
      result.isSuccess = false;
      result.msg =
          "Exception occurs when share address"
              + ". Exception msg->"
              + ExceptionUtil.collectExceptionMsg(ex);
    }

    return result;
  }
  @Monitor(
      server = ONEBOXSEARCH_SERVER,
      parserClass = ServiceUrlParserFactory.CLASS_PROPERTIES,
      filePath = "config/web_services.properties",
      serviceUrlKeys = "URL_ONE_BOX_SEARCH")
  private DetectResult monitorOneBoxSearchServer() {
    DetectResult result = new DetectResult();

    OneboxSearchServiceStub stub = null;
    try {
      UserProfile userProfile = BackendServerMonitorUtil.createUserProfile();
      TnContext tc = BackendServerMonitorUtil.createTnContext();

      OneboxSearchRequest obReq = new OneboxSearchRequest();

      // set user
      UserInformation user = new UserInformation();
      UserProfile usrProfile = userProfile;
      user.setUserId(usrProfile.getUserId());
      user.setPtn(usrProfile.getMin());
      obReq.setUserInfo(user);

      // set client info
      Date today = new Date();
      // using date only
      String trxnId = String.valueOf(today.getTime());
      obReq.setClientName(ClientNameEnum._MOBILE);
      obReq.setClientVersion("1");
      obReq.setTransactionId(trxnId);

      // set POI data set() and MAP data set
      obReq.setContextString(tc.toContextString());

      // set anchor
      com.telenav.ws.datatypes.address.GeoCode latLon =
          new com.telenav.ws.datatypes.address.GeoCode();
      latLon.setLatitude(37.37453);
      latLon.setLongitude(-121.99983);
      obReq.setAnchor(latLon);

      // set query
      obReq.setQuery("coffee");
      obReq.setStartIndex(0);
      obReq.setResultCount(10);
      // TODO: check sponsor number
      obReq.setSponsorStartIndex(0);
      obReq.setSponsorResultCount(1);
      obReq.setLocale(CommonUtil.getTnLocal(userProfile.getLocale()));
      obReq.setSponsorResultCount(100);
      obReq.setTransactionId(System.currentTimeMillis() + "");

      stub = new OneboxSearchServiceStub(WebServiceConfigurator.getUrlOfOneBox());
      OneboxSearchResponse response = stub.oneboxSearch(obReq);

      if (response != null && "RESULT_FOUND".equals(response.getResponseStatus().getStatusCode())) {
        result.isSuccess = true;
      } else {
        result.isSuccess = false;
        result.msg =
            response == null
                ? "Response is null."
                : "StatusCode = "
                    + response.getResponseStatus().getStatusCode()
                    + ", StatusMessage = "
                    + response.getResponseStatus().getStatusMessage();
      }

    } catch (Exception e) {
      logger.fatal("#monitorOneBoxSearchServer", e);
      result.isSuccess = false;
      result.msg =
          "Exception occurs when one box search"
              + ". Exception msg->"
              + ExceptionUtil.collectExceptionMsg(e);
    } finally {
      if (stub != null) {
        WebServiceUtils.cleanupStub(stub);
      }
    }
    return result;
  }
  @Monitor(
      server = POISEARCH_SERVER,
      parserClass = ServiceUrlParserFactory.CLASS_XML_WEBSERVICE,
      serviceUrlKeys = "POI_SEARCH")
  private DetectResult monitorPoiSearchServer() {
    DetectResult result = new DetectResult();

    try {
      UserProfile userProfile = BackendServerMonitorUtil.createUserProfile();

      PoiSearchProxy proxy = new PoiSearchProxy(new TnContext());

      PoiSearchRequest poiReq = new PoiSearchRequest();
      poiReq.setRegion(userProfile.getRegion());
      Address anchor = new Address();
      anchor.setLatitude(37.37453);
      anchor.setLongitude(-121.99983);
      poiReq.setAnchor(anchor);
      poiReq.setCategoryId(-1);
      poiReq.setCategoryVersion("YP50");
      poiReq.setHierarchyId(1);
      poiReq.setNeedUserPreviousRating(false);
      poiReq.setPoiQuery("coff");
      // poiReq.setPoiSortType();
      poiReq.setRadiusInMeter(7000);
      poiReq.setUserId(Long.parseLong(userProfile.getUserId()));
      poiReq.setPageNumber(0);
      poiReq.setPageSize(10);
      poiReq.setMaxResult(10);
      poiReq.setOnlyMostPopular(false);
      poiReq.setAutoExpandSearchRadius(true);
      // poiReq.setSponsorListingNumber(poiRequest.getSponsorListingNumber());
      poiReq.setNeedUserGeneratePois(true);
      poiReq.setNeedSponsoredPois(true);

      poiReq.setTransactionId(System.currentTimeMillis() + "");

      PoiSearchResponse response = proxy.searchWithinDistance(poiReq);

      if (response != null && response.getPoiSearchStatus() == ErrorCode.POI_STATUS_SUCCESS) {
        if (response.getPois().size() != 0) {
          result.isSuccess = true;
          this.samplePoiId = response.getPois().get(0).getPoiId();
        } else {
          result.isSuccess = false;
          result.msg = "Status is successful. But response don't contain any poi";
        }
      } else {
        result.isSuccess = false;
        result.msg =
            response == null ? "response is null" : "StatusCode = " + response.getPoiSearchStatus();
      }
    } catch (Exception ex) {
      logger.fatal("#monitorPoiSearchServer", ex);
      result.isSuccess = false;
      result.msg =
          "Exception occurs when search poi"
              + ". Exception msg->"
              + ExceptionUtil.collectExceptionMsg(ex);
    }

    return result;
  }
  public TnContext getTnContext(UserProfile userProfile, ExecutorContext context) {

    String userID = userProfile.getUserId();

    long lUserID = -1;
    if (userID != null && userID.length() > 0) {
      lUserID = Long.parseLong(userID);
    }

    ContextMgrService cms = new ContextMgrService();
    ContextMgrStatus myStatus = null;

    if (logger.isDebugEnabled()) {
      logger.debug("needRegister:" + needRegister);
    }

    TnContext tc = new TnContext();
    try {
      if (needRegister) {
        // get the tncontext from DSM db
        // tc = getTnContextFromDsmDB(userProfile.getMin());
        // set user profile into tncontext
        setUserProfileToTnContext(tc, userProfile, context);
        // set the need register dsm rule into tncontext
        setNeedRegisterDsmRuleToTnContext(userProfile, tc);
        if (logger.isDebugEnabled()) {
          logger.debug("tc -->" + tc);
          logger.debug("tc.length = " + tc.toContextString().length());
        }
        myStatus = cms.registerContext(lUserID, Constants.CALLER_CSERVER, tc);

      } else {
        // set user profile into tncontext
        setUserProfileToTnContext(tc, userProfile, context);
        myStatus = cms.updateContext(tc);
      }
    } catch (Exception e) {
      logger.fatal(e, e);
    }

    // set all the dsm rules in to tncontext
    setAllDsmRuleToTnContext(userProfile, tc);

    DevicePropertiesHolder deviceHolder =
        (DevicePropertiesHolder) ResourceHolderManager.getResourceHolder(HolderType.DEVICE_TYPE);
    if (deviceHolder != null) {
      DeviceProperties deviceProperties = deviceHolder.getDeviceProperties(userProfile, tc);
      if (deviceProperties != null) {
        tc.addProperty(
            GENERATE_LANE_INFO,
            String.valueOf(deviceProperties.getBooleanDefFalse(NAV_ENABLE_LANE_ASSIST)));
      }
    }

    if (myStatus == null || myStatus.getStatusCode() != Error.NO_ERROR) {
      CliTransaction cli =
          com.telenav.cserver.framework.cli.CliTransactionFactory.getInstance(
              CliConstants.TYPE_MODULE);
      cli.setFunctionName("getTnContext");
      cli.addData(
          "cms_status(has issue)", myStatus != null ? myStatus.getStatusCode() + "" : "null");

      tc = getDefaultTnContext(tc);
      if (logger.isDebugEnabled()) {
        logger.debug("tnContext has issue.");
      }

      cli.complete();
    }
    logger.debug("final tc:>>" + tc);
    return tc;
  }