ブログ

さて、前回はALAbstractFormDataについて見てみましたが、次は一覧画面・詳細画面表示の基底クラスALAbstractSelectDataについて紐解いてみましょう。

Aipoにおける一覧・詳細系の処理はとりあえずここを見ましょう。

ALAbstractSelectData.java

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

トップ画面・最大化画面はActionが起点になるので、ToDoのActionを見てみましょう。

ToDoAction.java

のトップ画面を表示するbuildNormalContextの中を見てみます。

 
    ToDoSelectData listData = new ToDoSelectData();
    listData.initField();
    listData.doViewList(this, rundata, context);

トップ画面ではdoViewListが呼ばれていることがわかります。

それでは詳細画面はどうでしょうか。

ToDoDetailScreen.java

 
      ToDoSelectData detailData = new ToDoSelectData();
      detailData.initField();
      detailData.doViewDetail(this, rundata, context);

doViewDetailが呼ばれていることがわかります。

これを踏まえた上で、ALAbstractSelectData.javaのdoViewList、doViewDetailのそれぞれの中身を見て行きましょう。

doViewList

 
  /**
   * 一覧表示します。
   * 
   * @param action
   * @param rundata
   * @param context
   * @return TRUE 成功 FASLE 失敗
   */
  public boolean doViewList(ALAction action, RunData rundata, Context context) {
    try {
      init(action, rundata, context);
      doCheckAclPermission(
        rundata,
        context,
        ALAccessControlConstants.VALUE_ACL_LIST);
      action.setMode(ALEipConstants.MODE_LIST);
      ResultList<M1> resultList = selectList(rundata, context);
      if (resultList != null) {
        if (resultList.getTotalCount() > 0) {
          setPageParam(resultList.getTotalCount());
        }
        list = new ArrayList<Object>();
        for (M1 model : resultList) {
          Object object = getResultData(model);
          if (object != null) {
            list.add(object);
          }
        }
      }
      action.setResultData(this);
      action.putData(rundata, context);
      ALEipUtils.removeTemp(rundata, context, ALEipConstants.ENTITY_ID);
      return (list != null);
    } catch (ALPermissionException e) {
      ALEipUtils.redirectPermissionError(rundata);
      return false;
    } catch (ALPageNotFoundException e) {
      ALEipUtils.redirectPageNotFound(rundata);
      return false;
    } catch (ALDBErrorException e) {
      ALEipUtils.redirectDBError(rundata);
      return false;
    }

  }

doViewDetail

 

  /**
   * 詳細表示します。
   * 
   * @param action
   * @param rundata
   * @param context
   * @return TRUE 成功 FASLE 失敗
   */
  public boolean doViewDetail(ALAction action, RunData rundata, Context context) {
    try {
      init(action, rundata, context);
      doCheckAclPermission(
        rundata,
        context,
        ALAccessControlConstants.VALUE_ACL_DETAIL);
      action.setMode(ALEipConstants.MODE_DETAIL);
      M2 obj = selectDetail(rundata, context);
      if (obj != null) {
        data = getResultDataDetail(obj);
      }
      action.setResultData(this);
      action.putData(rundata, context);
      return (data != null);
    } 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
  • selectList
  • getResultData
  • getResultDataDetail
  • setResultData

などが呼ばれていることがわかります。

ここに書かれているこれらのメソッドの実態は、各portletsの中にあるXXXXSelectData内のそれぞれの処理が呼ばれています。

ToDoSelectData.javaの場合はどのようになっているでしょうか。

getResultDataDetailの場合

 
  /**
   * ResultData に値を格納して返します。(詳細データ) <BR>
   * 
   * @param obj
   * @return
   */
  @Override
  protected Object getResultDataDetail(EipTTodo record) {
    try {
      ToDoResultData rd = new ToDoResultData();
      rd.initField();
      rd.setTodoName(record.getTodoName());
      rd.setTodoId(record.getTodoId().longValue());
      rd
        .setCategoryId(record.getEipTTodoCategory().getCategoryId().longValue());
      rd.setCategoryName(record.getEipTTodoCategory().getCategoryName());
      rd.setUserName(ALEipUtils
        .getALEipUser(record.getUserId())
        .getAliasName()
        .getValue());
      if (!ToDoUtils.isEmptyDate(record.getStartDate())) {
        rd.setStartDate(ALDateUtil
          .format(record.getStartDate(), "yyyy年M月d日(E)"));
      }
      if (!ToDoUtils.isEmptyDate(record.getEndDate())) {
        rd.setEndDate(ALDateUtil.format(record.getEndDate(), "yyyy年M月d日(E)"));
      }
      rd.setStateString(ToDoUtils.getStateString(record.getState().intValue()));
      rd.setPriorityString(ToDoUtils.getPriorityString(record
        .getPriority()
        .intValue()));
      rd.setNote(record.getNote());
      rd.setCreateUserName(ALEipUtils
        .getALEipUser(record.getCreateUserId())
        .getAliasName()
        .getValue());
      // 公開/非公開を設定する.
      rd.setPublicFlag("T".equals(record.getPublicFlag()));
      rd.setAddonScheduleFlg("T".equals(record.getAddonScheduleFlg()));
      rd.setCreateDate(ALDateUtil
        .format(record.getCreateDate(), "yyyy年M月d日(E)"));
      rd.setUpdateDate(record.getUpdateDate());

      // 自身のToDoかを設定する
      rd.setIsSelfTodo(record.getUserId() == login_user_id);

      rd.setAclEditTodoOther(hasAclEditTodoOther);
      rd.setAclDeleteTodoOther(hasAclDeleteTodoOther);
      return rd;
    } catch (Exception ex) {
      logger.error("todo", ex);
      return null;
    }
  }

それぞれのメソッドの役割についても軽く触れておきます。

selectList

検索条件を定義してデータベースの検索を行います。

メソッド内の

query.getResultList()

でSQLが実行されます。

getResultData、getResultDataDetail

データベースから取得してきたオブジェクトをResultDataにセットします。


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

ALAbstractFormDataと合わせて見ておくことでAipoにおける基本的なCRUD処理について把握しやすくなるのではないかと思います。

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

2013/09/03 16:00:00
岩崎