ブログ

Aipoにおけるフォーム系の処理はとりあえずここを見ましょう。

ALAbstractFormData.java

各portletsの中のXXXFormDataはここを継承しています。

例えば新規登録を見てみましょう。

ToDoの新規登録処理はToDoFormJSONScreen.javaが始点になります。

ToDoFormJSONScreen.java

新規登録時にはmodeの指定により、このファイル内の以下の分岐に処理が進みます。

 
      if (ALEipConstants.MODE_INSERT.equals(mode)) {
        //
        ToDoFormData formData = new ToDoFormData();
        formData.initField();
        formData.loadCategoryList(rundata);
        if (formData.doInsert(this, rundata, context)) {
        } else {
          JSONArray json =
            JSONArray
              .fromObject(context.get(ALEipConstants.ERROR_MESSAGE_LIST));
          result = json.toString();
        }

この処理の中に

if (formData.doInsert(this, rundata, context))

がありますが、その実態に当たる部分がALAbstractFormData.java内のdoInsertになります。

それではALAbstractFormData.javaのdoInsertを見て行きましょう。

 
  /**
   * データを新規登録します。
   * 
   * @param action
   * @param rundata
   * @param context
   * @return TRUE 成功 FALSE 失敗
   */
  public boolean doInsert(ALAction action, RunData rundata, Context context) {
    try {
      if (!doCheckSecurity(rundata, context)) {
        return false;
      }

      init(action, rundata, context);

      doCheckAclPermission(
        rundata,
        context,
        ALAccessControlConstants.VALUE_ACL_INSERT);

      action.setMode(ALEipConstants.MODE_INSERT);
      mode = action.getMode();
      rundata.getParameters().add(
        ALEipConstants.MODE,
        ALEipConstants.MODE_INSERT);
      List<String> msgList = new ArrayList<String>();
      setValidator();

      boolean res = false;
      if (isOverQuota()) {
        msgList.add(ALLocalizationUtils
          .getl10n("COMMON_FULL_DISK_DELETE_DETA_OR_CHANGE_PLAN"));
      } else {
        res =
          (setFormData(rundata, context, msgList) && validate(msgList) && insertFormData(
            rundata,
            context,
            msgList));
      }
      if (!res) {
        action.setMode(ALEipConstants.MODE_NEW_FORM);
        mode = action.getMode();
      }
      action.setResultData(this);
      if (!msgList.isEmpty()) {
        action.addErrorMessages(msgList);
      }
      action.putData(rundata, context);

      return res;
    } catch (ALPermissionException e) {
      ALEipUtils.redirectPermissionError(rundata);
      return false;
    } catch (ALPageNotFoundException e) {
      ALEipUtils.redirectPageNotFound(rundata);
      return false;
    } catch (ALDBErrorException e) {
      ALEipUtils.redirectDBError(rundata);
      return false;
    }
  }

initが呼ばれて、

setValidatorが呼ばれています。

更に処理が進むとsetFormData、validate、insertFormDataがあるのがわかります。

ここに書かれているinit、setValidator、setFormData、validate、insertFormDataの実態は、各portletsの中にあるXXXXFormData内のsetFormData、validate、insertFormDataそれぞれの処理が呼ばれています。

新規登録処理の中でエラーが発生している時には、各portletsの中にあるXXXXFormData内で呼ばれているsetFormData、validate、insertFormDataなどにブレイクポイントを置くことでエラー発生箇所の特定が早くできるようになります。

ToDoFormDataの場合のvalidateだとこんな感じになっていますね。

ToDoFormData.java

 
  /**
   * ToDoのフォームに入力されたデータの妥当性検証を行います。 <BR>
   * 
   * @param msgList
   * @return TRUE 成功 FALSE 失敗
   * 
   */
  @Override
  protected boolean validate(List<String> msgList) {

    try {
      Expression exp =
        ExpressionFactory.matchExp(
          EipTTodoCategory.CATEGORY_NAME_PROPERTY,
          category_name.getValue());

      Expression exp2 =
        ExpressionFactory.matchExp(EipTTodoCategory.USER_ID_PROPERTY, Integer
          .valueOf(0));

      Expression exp3 =
        ExpressionFactory.matchExp(
          EipTTodoCategory.USER_ID_PROPERTY,
          login_user_id);
      // 新規カテゴリの場合は重複していないかチェックを行います。
      if (is_new_category
        && Database.query(EipTTodoCategory.class, exp).andQualifier(
          exp2.orExp(exp3)).fetchList().size() != 0) {
        msgList.add(ALLocalizationUtils.getl10nFormat(
          "TODO_CATEGORY_NAME_ALREADY_REGISTERED",
          category_name.toString()));
      }

      // 担当者が存在するかどうかチェックを行います。
      if (Database.get(TurbineUser.class, user_id.getValue()) == null) {
        msgList.add(ALLocalizationUtils.getl10n("TODO_ALERT_NO_PREPARED"));
      }

    } catch (Exception ex) {
      logger.error("todo", ex);
      return false;
    }

    boolean isStartDate = false;
    // タイトル
    todo_name.validate(msgList);
    // 開始日指定フラグが設定されている場合は開始日入力フォームチェックを行いません。
    if (start_date_check.getValue() == null) {
      // 開始日
      isStartDate = start_date.validate(msgList);
    }
    // 締切日指定フラグが設定されている場合は締切日入力フォームチェックを行いません。
    if (end_date_check.getValue() == null) {
      // 締切日
      if (end_date.validate(msgList) && isStartDate) {
        try {
          if (end_date.getValue().getDate().before(
            start_date.getValue().getDate())) {
            msgList.add(ALLocalizationUtils.getl10n("TODO_ALERT_SET_TDATE"));
          }
        } catch (Exception e) {
          logger.error("todo", e);
        }
      }
    }
    // メモ
    note.validate(msgList);
    if (is_new_category) {
      // カテゴリ名
      category_name.validate(msgList);
    }

    return (msgList.size() == 0);

  }

Aipoのソースコードは継承があるので、その流れや実態がつかみにくいですが、このような構造になっています。

新規登録だけでなく、更新処理や削除処理などについてもALAbstractFormDataに記載がしてあるので、見ておくことでどのような処理を行っているか把握しやすくなるのではないかと思います。

現在私たちの仲間を募集しています!

2013/08/27 09:00:00
岩崎