@Override
  public Navigation run() throws Exception {

    UserModel userModel = null;

    try {
      userModel = getUser();
    } catch (Exception e) {
      return null;
    }
    ;

    // タスクは成功するまで実行されるため、失敗時は例外をキャッチして再実行をさせない
    try {
      // アクティビティの取得
      String activityId = asString("activityId");

      ActivityModel activityModel = ActivityService.getActivity(activityId);
      if (activityModel == null) return null;

      // 短縮URLの取得
      String shortUrl = getShortUrl(userModel, activityModel);

      // Twitter メッセージの作成
      String msg = getMessage(activityModel, shortUrl);

      // POST
      if (activityModel.getAttachmentsType() != null
          && (activityModel
                  .getAttachmentsType()
                  .getCategory()
                  .equals(Constants.GOOGLE_ACTIVITY_ATTACHMENTS_TYPE_PHOTO)
              || activityModel
                  .getAttachmentsType()
                  .getCategory()
                  .equals(Constants.GOOGLE_ACTIVITY_ATTACHMENTS_TYPE_ALBUM))
          && activityModel
              .getVerb()
              .getCategory()
              .equals(Constants.GOOGLE_ACTIVITY_VERB_TYPE_POST)) {

        // 自分が投稿した写真付きの場合もしくアルバム
        imageUpload(userModel, msg, activityModel.getAttachmentsImageUrlString());

      } else {
        postMessage(userModel, msg);
      }

    } catch (Exception e) {
      logger.severe(e.toString());
    }

    return null;
  }
  /**
   * Twitterの取得
   *
   * @throws IOException
   */
  private String getMessage(ActivityModel activityModel, String shortUrl) throws Exception {

    String twitterMessage = null;

    // 再共有の場合
    if (activityModel.getVerb().getCategory().equals(Constants.GOOGLE_ACTIVITY_VERB_TYPE_SHARE)) {
      // 追加コメントが存在しない場合
      if (activityModel.getAnnotationString() == null) {

        // タイトルが存在しない場合
        if (activityModel.getTitleString() == null) {
          return "[ #PluCial " + shortUrl + " ]";

          // タイトル存在する場合
        } else {
          twitterMessage = activityModel.getTitleString();
        }

        // 追加コメントが存在する場合
      } else {
        twitterMessage = activityModel.getAnnotationString();
      }

      // 通常投稿の場合
    } else {
      // タイトルが存在しない場合
      if (activityModel.getTitleString() == null) {

        // 添付コンテンツのタイトルが存在しない場合
        if (activityModel.getAttachmentsDisplayNameString() == null) {
          return "[ #PluCial " + shortUrl + " ]";

          // 添付コンテンツのタイトルが存在する場合
        } else {
          twitterMessage = activityModel.getAttachmentsDisplayNameString();
        }

        // タイトル存在する場合
      } else {
        twitterMessage = activityModel.getTitleString();
      }
    }

    if (twitterMessage == null) {
      return "[ #PluCial " + shortUrl + " ]";
    } else {
      // リンクタグを削除
      twitterMessage = Utils.removeLinkTags(twitterMessage);
      // 太文字を削除
      twitterMessage = Utils.removeBTags(twitterMessage);

      // 改行の変換
      twitterMessage = twitterMessage.replace("<br>", "\n");
      // spanタグを削除
      twitterMessage = Utils.removeSpanTags(twitterMessage);
    }

    String lastString = ("\n[ #PluCial " + shortUrl + " ]");
    int limit_num = 100;

    // 画像の場合はTwitterメディア分の23文字を減らす
    if (activityModel.getAttachmentsType() != null
        && (activityModel
                .getAttachmentsType()
                .getCategory()
                .equals(Constants.GOOGLE_ACTIVITY_ATTACHMENTS_TYPE_PHOTO)
            || activityModel
                .getAttachmentsType()
                .getCategory()
                .equals(Constants.GOOGLE_ACTIVITY_ATTACHMENTS_TYPE_ALBUM))
        && activityModel.getVerb().getCategory().equals(Constants.GOOGLE_ACTIVITY_VERB_TYPE_POST)) {
      limit_num = limit_num - 23;
    }

    // ドメイン分 の 23文字を削減
    int domainCount = getDomainCount(twitterMessage);
    limit_num = limit_num - (domainCount * 23);
    // URL複数含まれる投稿はマイナスになる可能性がある
    if (limit_num < 0) return "[ #PluCial " + shortUrl + " ]";

    // タイトルの文字数が問題ない場合
    if (twitterMessage.length() <= limit_num) return twitterMessage + lastString;

    // タイトルの文字数が制限オーバーの場合
    String message = twitterMessage.substring(0, limit_num - 3) + "...";
    return message + lastString;
  }