/*
 * Aipo is a groupware program developed by Aimluck,Inc.
 * Copyright (C) 2004-2008 Aimluck,Inc.
 * http://aipostyle.com/
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.document;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.jar.Attributes;

import org.apache.cayenne.DataRow;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.SQLTemplate;
import org.apache.cayenne.query.SelectQuery;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.services.TurbineServices;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;

import com.aimluck.commons.field.ALDateTimeField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.commons.utils.ALDateUtil;
import com.aimluck.eip.document.common.DocumentConstants;
import com.aimluck.eip.document.util.DocumentUtils;
import com.aimluck.eip.cayenne.om.portlet.ImwTDocumentFile;
import com.aimluck.eip.cayenne.om.portlet.ImwTDocumentFileMap;
import com.aimluck.eip.cayenne.om.portlet.ImwTDocumentFolder;
import com.aimluck.eip.cayenne.om.portlet.ImwTDocumentFolderMap;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.cayenne.om.security.TurbineUserGroupRole;
import com.aimluck.eip.common.ALAbstractSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALEipUser;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.DatabaseOrmService;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.services.accessctl.ALAccessControlFactoryService;
import com.aimluck.eip.services.accessctl.ALAccessControlHandler;
import com.aimluck.eip.util.ALEipUtils;

/**
 * 文書管理のファイル検索用データ．
 *
 */
public class DocumentFileWordSelectData extends ALAbstractSelectData {
  /** logger */
  private static final JetspeedLogger logger = JetspeedLogFactoryService
      .getLogger(DocumentFileWordSelectData.class.getName());

  /** 検索ワード */
  private ALStringField searchWord;
  
  /** チェックインユーザIDで検索を行ったか */
  private boolean checkout_flag = false;
  
  /** 申請者IDで検索を行ったか */
  private boolean request_flag = false;
  
  /** 検索対象のユーザID */
  private String target_user_id = "all";

  /** 検索結果件数 */
  private int searchSum = 0;

  /** 選択されたフォルダ情報 */
  private FolderInfo selected_folderinfo = null;

  private ArrayList folder_hierarchy_list;

  /** ログインユーザが文書管理システム管理者かどうか */
  private boolean isDocAdmin = false;
  
  private RunData rundata;

  /** <code>target_user_id</code> 表示対象のユーザ ID */
  //private String target_user_id;

  /** <code>userList</code> 表示切り替え用のユーザリスト */
  private List userList = null;

  /** <code>today</code> 今日 */
  private ALDateTimeField today;
  
  /**
   * @see com.aimluck.eip.common.ALAbstractSelectData#init(com.aimluck.eip.modules.actions.common.ALAction,
   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
   */
  public void init(ALAction action, RunData rundata, Context context)
      throws ALPageNotFoundException, ALDBErrorException {

    //セッションにソート情報が存在しない場合、フォルダ名でソート
    String sort = ALEipUtils.getTemp(rundata, context, LIST_SORT_STR);
    if (sort == null || sort.equals("")) {
      ALEipUtils.setTemp(rundata, context, LIST_SORT_STR, "folder_name");
    }

    int fid = DocumentUtils.ROOT_FODLER_ID;
    String tmpfid = ALEipUtils.getTemp(rundata, context,
        DocumentUtils.KEY_FOLDER_ID);
    if (tmpfid != null && !"".equals(tmpfid)) {
      try {
        fid = Integer.parseInt(tmpfid);
      } catch (Exception e) {
        fid = DocumentUtils.ROOT_FODLER_ID;
      }
    }
    folder_hierarchy_list = DocumentUtils.getFolderList();
    if (folder_hierarchy_list != null && folder_hierarchy_list.size() > 0) {
      int size = folder_hierarchy_list.size();
      for (int i = 0; i < size; i++) {
        FolderInfo info = (FolderInfo) folder_hierarchy_list.get(i);
        if (info.getFolderId() == fid) {
          selected_folderinfo = info;
          break;
        }
      }
      if (selected_folderinfo == null) {
        selected_folderinfo = (FolderInfo) folder_hierarchy_list.get(0);
      }
    }
    // ログインユーザが文書管理システム管理者かどうか
    isDocAdmin = DocumentUtils.isDocAdmin(rundata);

    // 今日
    today = new ALDateTimeField("yyyy-MM-dd");
    Calendar to = Calendar.getInstance();
    to.set(Calendar.HOUR_OF_DAY, 0);
    to.set(Calendar.MINUTE, 0);
    today.setValue(to.getTime());
    
    // 指定ユーザをセッションに設定する．
    setupLists(rundata, context);
    
    this.rundata = rundata;

    super.init(action, rundata, context);
  }

  /**
   *
   * @see com.aimluck.eip.common.ALAbstractSelectData#selectList(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context)
   */
  protected List selectList(RunData rundata, Context context) {
    // ページャからきた場合に検索ワードをセッションへ格納する
    if (!rundata.getParameters().containsKey(ALEipConstants.LIST_START)
        && !rundata.getParameters().containsKey(ALEipConstants.LIST_SORT)
        && rundata.getParameters().containsKey("sword")) {
      ALEipUtils.setTemp(rundata, context, "DocumentFileWord", rundata
          .getParameters().getString("sword"));
      /*
      ALEipUtils.setTemp(rundata, context, "DocumentFileCheckOutFlag", rundata
          .getParameters().get("checkout_flag"));
      ALEipUtils.setTemp(rundata, context, "DocumentFileRequestFlag", rundata
          .getParameters().get("request_flag"));
      */
    }

    // 検索ワードの設定
    searchWord = new ALStringField();
    searchWord.setTrim(true);
    // セッションから値を取得する。
    // 検索ワード未指定時は空文字が入力される
    searchWord
        .setValue(ALEipUtils.getTemp(rundata, context, "DocumentFileWord"));
    // 特殊文字をエスケープ
    String escape = "#";
    String sword = DocumentUtils.escapeSpecial(searchWord.getValue(), escape);
    
    // チェックアウトフラグ
    checkout_flag = rundata.getParameters().getBoolean("checkout_flag");
    // 申請フラグ
    request_flag = rundata.getParameters().getBoolean("request_flag");
    // 検索対象のユーザID
    target_user_id = rundata.getParameters().getString("target_user_id");
    
    // ユーザIDが数値でなければ"all"　（全てのユーザで検索）に変換する
    if(!"all".equals(target_user_id)
        && !DocumentUtils.isNumber(target_user_id)){
          target_user_id = "all";
    }
    
    StringBuffer statement = new StringBuffer();
    statement.append(" SELECT");
    statement.append("      FILE.FILE_ID");
    statement.append("     ,FILE.DOC_ID");
    statement.append("     ,FILE.FILE_REV_MJ");
    statement.append("     ,FILE.FILE_REV_MN");
    statement.append("     ,FILE.FOLDER_ID");
    statement.append("     ,FILE.FILE_TITLE");
    statement.append("     ,FILE.FILE_NAME");
    statement.append("     ,FILE.FILE_SIZE");
    statement.append("     ,FILE.FILE_PATH");
    statement.append("     ,FILE.OPEN_END_DATE");
    statement.append("     ,FILE.SAVE_END_DATE");
    statement.append("     ,FILE.STATUS");
    statement.append("     ,FILE.CHECKIN_COMMENT");
    statement.append("     ,FILE.NOTE");
    statement.append("     ,FILE.CREATE_USER_ID");
    statement.append("     ,FILE.CHECKOUT_USER_ID");
    statement.append("     ,FILE.UPDATE_USER_ID");
    statement.append("     ,FILE.CREATE_DATE");
    statement.append("     ,FILE.CHECKOUT_DATE");
    statement.append("     ,FILE.UPDATE_DATE");
    statement.append("     ,REQUEST_USER.USER_ID AS REQUEST_USER_ID");
    statement.append("     ,REQUEST_MAP.REQUEST_TYPE");
    statement.append("     ,FOLDER.FOLDER_NAME");
    statement.append(" FROM IMW_T_DOCUMENT_FILE FILE");
    statement.append("     LEFT OUTER JOIN IMW_T_DOCUMENT_REQUEST_MAP REQUEST_MAP ON");
    statement.append("             FILE.DOC_ID = REQUEST_MAP.DOC_ID");
    statement.append("         AND (");
    statement.append("                   REQUEST_MAP.PAST =  0");
    statement.append("                OR REQUEST_MAP.PAST IS NULL");
    statement.append("             )");
    statement.append("     LEFT OUTER JOIN TURBINE_USER CHECKOUT_USER ON");
    statement.append("             CHECKOUT_USER.USER_ID  = FILE.CHECKOUT_USER_ID");
    statement.append("     LEFT OUTER JOIN TURBINE_USER REQUEST_USER ON");
    statement.append("             REQUEST_USER.USER_ID  = REQUEST_MAP.REQUEST_USER_ID");
    statement.append("     LEFT OUTER JOIN IMW_T_DOCUMENT_FOLDER FOLDER ON");
    statement.append("             FOLDER.FOLDER_ID      = FILE.FOLDER_ID");
    statement.append(" WHERE");

    if (isDocAdmin) {
      // 管理者
      statement.append("         (     (     REQUEST_MAP.REQUEST_USER_ID IS NOT NULL");
      statement.append("                 AND (     (     REQUEST_MAP.REQUEST_TYPE    IN (1, 3)");
      statement.append("                             AND FILE.STATUS                 =  '3'");
      statement.append("                           )");
      statement.append("                        OR (     REQUEST_MAP.REQUEST_TYPE    IN (2, 4, 5)");
      statement.append("                             AND FILE.STATUS                 IN ('0','1')");
      statement.append("                           )");
      statement.append("                     )");
      statement.append("               )");
      statement.append("            OR (     REQUEST_MAP.REQUEST_USER_ID IS NULL");
      statement.append("                 AND FILE.STATUS                 IN ('0','1')");
      statement.append("               )");
      statement.append("         )");
    } else {
      // 一般ユーザ
      statement.append("         (     (     REQUEST_MAP.REQUEST_TYPE IN (1, 3)");
      statement.append("                 AND (     (     REQUEST_MAP.REQUEST_USER_ID =  " + ALEipUtils.getALEipUser(rundata).getUserId().getValue());
      statement.append("                             AND FILE.STATUS                 =  '3'");
      statement.append("                           )");
      statement.append("                        OR (     REQUEST_MAP.REQUEST_USER_ID <> " + ALEipUtils.getALEipUser(rundata).getUserId().getValue());
      statement.append("                             AND FILE.STATUS                 IN ('0','1')");
      statement.append("                           )");
      statement.append("                     )");
      statement.append("               )");
      statement.append("            OR (     REQUEST_MAP.REQUEST_TYPE    IN (2, 4, 5)");
      statement.append("                 AND REQUEST_MAP.REQUEST_USER_ID IS NOT NULL");
      statement.append("                 AND FILE.STATUS                 IN ('0','1')");
      statement.append("               )");
      statement.append("            OR (     REQUEST_MAP.REQUEST_USER_ID IS NULL");
      statement.append("                 AND FILE.STATUS                 IN ('0','1')");
      statement.append("               )");
      statement.append("         )");
      statement.append("     AND (");
      statement.append("             FILE.OPEN_END_DATE IS NULL");
      statement.append("         OR  FILE.OPEN_END_DATE >= to_date('" + today.toString() + "','YYYY-MM-DD')");
      statement.append("         )");
      statement.append("     AND FILE.DOC_ID    IN (" + getVisibleDocIdStr() + ")");
    }
    
    // 検索条件の追加
    if (!searchWord.getValue().toString().equals("")) {
      statement.append("     AND (");

      statement.append("             FILE.FILE_TITLE LIKE '%$searchWord%' ESCAPE '" + escape + "'");
      statement.append("         OR  FILE.FILE_NAME  LIKE '%$searchWord%' ESCAPE '" + escape + "'");
      statement.append("         OR  FILE.NOTE       LIKE '%$searchWord%' ESCAPE '" + escape + "'");

      //statement.append("             FILE.FILE_TITLE LIKE '%" + sword + "%'");
      //statement.append("         OR  FILE.FILE_NAME  LIKE '%" + sword + "%'");
      //statement.append("         OR  FILE.NOTE       LIKE '%" + sword + "%'");

      //statement.append("             FILE.FILE_TITLE LIKE '%$searchWord%'" );
      //statement.append("         OR  FILE.FILE_NAME  LIKE '%$searchWord%'" );
      //statement.append("         OR  FILE.NOTE       LIKE '%$searchWord%'" );
      statement.append("         )");
    }
    
    // 検索条件：チェックアウトユーザーID
    if (checkout_flag){
      if(target_user_id==null || "all".equals(target_user_id)){
        // 対象ユーザなしの場合、チェックアウト中の全てのファイル
        statement.append("     AND  FILE.CHECKOUT_USER_ID != -1" );
      } else {
        //　対象ユーザありの場合、対象ユーザがチェックアウトしているファイル
        statement.append("     AND  FILE.CHECKOUT_USER_ID = " + target_user_id );
      }
    }
    
    // 検索条件：申請者ID
    if (request_flag){
      if(target_user_id==null || "all".equals(target_user_id)){
        // 対象ユーザなしの場合、申請中の全てのファイル
        statement.append("     AND  REQUEST_MAP.REQUEST_USER_ID IS NOT NULL" );      
      } else {
        //　対象ユーザありの場合、対象ユーザが申請しているファイル
        statement.append("     AND  REQUEST_MAP.REQUEST_USER_ID = " + target_user_id );
      }
    }
    
    // ソート順の設定
    String listSortStr = ALEipUtils.getTemp(rundata, context, LIST_SORT_STR);
    String listSortTypeStr = "";
    if (ALEipUtils.getTemp(rundata, context, LIST_SORT_TYPE_STR) != null) {
      listSortTypeStr = ALEipUtils.getTemp(rundata, context, LIST_SORT_TYPE_STR);
    }

    super.setCurrentSort(listSortStr);
    super.setCurrentSortType(listSortTypeStr);
    
    statement.append(" ORDER BY");
    if(listSortStr.equals("file_title")){
      statement.append("      FILE.FILE_TITLE " + listSortTypeStr);
    } else if(listSortStr.equals("file_name")){
      statement.append("      FILE.FILE_NAME " + listSortTypeStr);
    } else if(listSortStr.equals("file_rev")){
      statement.append("      FILE.FILE_REV_MJ " + listSortTypeStr);
      statement.append("     ,FILE.FILE_REV_MN " + listSortTypeStr);
    } else if(listSortStr.equals("update_date")){
      statement.append("      FILE.UPDATE_DATE " + listSortTypeStr);
    } else if(listSortStr.equals("file_size")){
      statement.append("      FILE.FILE_SIZE " + listSortTypeStr);
    } else if(listSortStr.equals("checkout_user")){
      statement.append("      CHECKOUT_USER.LAST_NAME_KANA " + listSortTypeStr);
      statement.append("     ,CHECKOUT_USER.FIRST_NAME_KANA " + listSortTypeStr);
    } else if(listSortStr.equals("request_user")){
      statement.append("      REQUEST_USER.LAST_NAME_KANA " + listSortTypeStr);
      statement.append("     ,REQUEST_USER.FIRST_NAME_KANA " + listSortTypeStr);
    } else if(listSortStr.equals("folder_name")){
      statement.append("      FOLDER.FOLDER_NAME " + listSortTypeStr);
    }
  
    String query = statement.toString();
    
    try {
      DocumentUtils.setFolderVisible(folder_hierarchy_list, selected_folderinfo, rundata);

      DataContext dataContext = DatabaseOrmService.getInstance().getDataContext();
      //SQLTemplate rawSelect = new SQLTemplate(ImwTDocumentFile.class, query, true);
      SQLTemplate rawSelect = new SQLTemplate(ImwTDocumentFile.class, query, false);
      // 名前付きパラメータの設定
      rawSelect.setParameters(Collections.singletonMap("searchWord", sword));
      rawSelect.setFetchingDataRows(true);
      List list = dataContext.performQuery(rawSelect);

      int recordNum = list.size();
      DataRow dataRow;
      List worklist = new ArrayList();
      for (int i = 0; i < recordNum; i++) {
        dataRow = (DataRow) list.get(i);
        ImwTDocumentFile imwTDocumentFile = new ImwTDocumentFile();
        imwTDocumentFile.setFileId((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_ID_COLUMN).toString());
        imwTDocumentFile.setDocId((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.DOC_ID_COLUMN));
        imwTDocumentFile.setFileRevMj((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_REV_MJ_COLUMN));
        imwTDocumentFile.setFileRevMn((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_REV_MN_COLUMN));
        imwTDocumentFile.setFolderId((Integer) Integer.valueOf(ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FOLDER_ID_COLUMN).toString()));
        imwTDocumentFile.setFileTitle((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_TITLE_COLUMN));
        imwTDocumentFile.setFileName((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_NAME_COLUMN));
        imwTDocumentFile.setFileSize((Long) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_SIZE_COLUMN));
        imwTDocumentFile.setFilePath((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FILE_PATH_COLUMN));
        imwTDocumentFile.setOpenEndDate((Date) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.OPEN_END_DATE_COLUMN));
        imwTDocumentFile.setSaveEndDate((Date) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.SAVE_END_DATE_COLUMN));
        imwTDocumentFile.setStatus((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.STATUS_COLUMN));
        imwTDocumentFile.setCheckinComment((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.CHECKIN_COMMENT_COLUMN));
        imwTDocumentFile.setNote((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.NOTE_COLUMN));
        imwTDocumentFile.setCreateUserId((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.CREATE_USER_ID_COLUMN));
        imwTDocumentFile.setCheckoutUserId((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.CHECKOUT_USER_ID_COLUMN));
        imwTDocumentFile.setUpdateUserId((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.UPDATE_USER_ID_COLUMN));
        imwTDocumentFile.setCreateDate((Date) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.CREATE_DATE_COLUMN));
        imwTDocumentFile.setCheckoutDate((Date) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.CHECKOUT_DATE_COLUMN));
        imwTDocumentFile.setUpdateDate((Date) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.UPDATE_DATE_COLUMN));
        imwTDocumentFile.setRequestUserId((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.REQUEST_USER_ID_COLUMN));
        imwTDocumentFile.setRequestType((Integer) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.REQUEST_TYPE_COLUMN));
        imwTDocumentFile.setFolderName((String) ALEipUtils.getObjFromDataRow(dataRow,ImwTDocumentFile.FOLDER_NAME_COLUMN));
        worklist.add(imwTDocumentFile);
      }
      // ファイル総数をセットする．
      if (list == null) {
        return new ArrayList();
      } else {
        searchSum = worklist.size();
      }
      return buildPaginatedList(worklist);
      
    } catch (Exception ex) {
      logger.error("Exception", ex);
      return null;
    }

//    try {
//      DocumentUtils.setFolderVisible(folder_hierarchy_list, selected_folderinfo,
//          rundata);
//
//      DataContext dataContext = DatabaseOrmService.getInstance()
//          .getDataContext();
//
//      SelectQuery query = getSelectQuery(rundata, context);
//      buildSelectQueryForListView(query);
//      buildSelectQueryForListViewSort(query, rundata, context);
//      //バージョンでソートする場合、マイナー番号のソート文を追加
//      if(ALEipUtils.getTemp(rundata, context, LIST_SORT_STR).equals("file_rev")){
//        String sort_type = ALEipUtils.getTemp(rundata, context, LIST_SORT_TYPE_STR);
//        if (sort_type != null
//            && ALEipConstants.LIST_SORT_TYPE_DESC.equals(sort_type)) {
//          //取得ソートタイプが降順、またはNULL以外の場合
//          query.addOrdering(ImwTDocumentFile.FILE_REV_MN_PROPERTY, false);
//        } else {
//          //取得ソートタイプが昇順の場合
//          query.addOrdering(ImwTDocumentFile.FILE_REV_MN_PROPERTY, true);
//        }
//      }
//
//      List list = dataContext.performQuery(query);
//      
//      
//      // 総数をセットする．
//      if (list != null) {
//        searchSum = list.size();
//        return buildPaginatedList(list);
//      } else {
//        logger.info("documentFile search > result is null");
//        return new ArrayList();
//      }
//    } catch (Exception ex) {
//      logger.error("Exception", ex);
//      return null;
//    }
  }

  /**
   * 未使用。
   *
   * @see com.aimluck.eip.common.ALAbstractSelectData#selectDetail(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context)
   */
  protected Object selectDetail(RunData rundata, Context context) {
    return null;
  }

  /**
   * @see com.aimluck.eip.common.ALAbstractSelectData#getResultData(java.lang.Object)
   */
  protected Object getResultData(Object obj) {
    try {
      ImwTDocumentFile record = (ImwTDocumentFile) obj;

      DocumentFileResultData rd = new DocumentFileResultData();
      rd.initField();
      rd.setFileId(record.getFileId().longValue());
      rd.setFileTitle(record.getFileTitle());
      rd.setFileName(record.getFileName());
      rd.setFileRevMj(record.getFileRevMj());
      rd.setFileRevMn(record.getFileRevMn());
      rd.setFileSize(record.getFileSize().longValue());
      rd.setFolderId(record.getFolderId());
      rd.setFolderName(record.getFolderName());
      
      // 申請中かどうか
      rd.setIsRequesting(DocumentUtils.isDocRequesting(record));
      
      // 再申請の条件を満たすか
      rd.setIsReqAgain(DocumentUtils.isDocReqAgain(record.getDocId()));
      
      //チェックアウトユーザ名取得
      String checkoutUserName = "";
      if (record.getCheckoutUserId() != null) {
        ALEipUser checkoutUser = ALEipUtils.getALEipUser(record.getCheckoutUserId()
            .intValue());
        if (checkoutUser != null) {
          checkoutUserName = checkoutUser.getAliasName().getValue();
        }
        if (record.getCheckoutUserId() == ALEipUtils.getALEipUser(rundata).getUserId().getValue()) {
          //チェックアウトユーザとログインユーザが同一の場合
          rd.setCheckoutStatus(2);
        } else if (record.getCheckoutUserId() != -1) {
          //チェックアウトユーザが存在する場合
          rd.setCheckoutStatus(1);
        } else {
          //チェックアウトされていない場合
          rd.setCheckoutStatus(0);
        }
      }
      rd.setCheckoutUser(checkoutUserName);
      //申請者名取得
      String requestUserName = "";
      if (record.getRequestUserId() != null) {
        ALEipUser requestUser = ALEipUtils.getALEipUser(record.getRequestUserId()
            .intValue());
        if (requestUser != null) {
          requestUserName = requestUser.getAliasName().getValue();
          }
        if (record.getRequestUserId() == ALEipUtils.getALEipUser(rundata).getUserId().getValue()) {
          //申請者とログインユーザが同一の場合
          rd.setRequestStatus(2);
        } else if (record.getRequestUserId() != -1) {
          //申請者が存在する場合
          rd.setRequestStatus(1);
        } else {
          //申請されていない場合
          rd.setRequestStatus(0);
        }
      }
      rd.setRequestUser(requestUserName);
      //申請種類取得
      Integer requestType = 0;
      String requestTypeName = "";
      if (record.getRequestType() != null) {
        requestType = record.getRequestType();
      }
      requestTypeName = DocumentUtils.decodeIdRequest(requestType, DocumentConstants.NAME_REQUESTING);
      rd.setRequestType(requestTypeName);
      
      rd.setUpdateDate(ALDateUtil.format(record.getUpdateDate(), "yyyy年M月d日"));

      return rd;
    } catch (Exception ex) {
      logger.error("Exception", ex);
      return null;
    }
  }

  /**
   * 未使用。
   *
   * @see com.aimluck.eip.common.ALAbstractSelectData#getResultDataDetail(java.lang.Object)
   */
  protected Object getResultDataDetail(Object obj) {
    return null;
  }

  /**
   * @see com.aimluck.eip.common.ALAbstractSelectData#getColumnMap()
   */
  protected Attributes getColumnMap() {
    Attributes map = new Attributes();
    map.putValue("folder_name", ImwTDocumentFile.IMW_TDOCUMENT_FOLDER_PROPERTY
        + "." + ImwTDocumentFolder.FOLDER_NAME_PROPERTY);
    map.putValue("file_title", ImwTDocumentFile.FILE_TITLE_PROPERTY);
    map.putValue("file_name", ImwTDocumentFile.FILE_NAME_PROPERTY);
    map.putValue("file_rev", ImwTDocumentFile.FILE_REV_MJ_PROPERTY);
    map.putValue("update_date", ImwTDocumentFile.UPDATE_DATE_PROPERTY);
    map.putValue("file_size", ImwTDocumentFile.FILE_SIZE_PROPERTY);
    //チェックアウトユーザ名のソートにはユーザの苗字カナを指定
    map.putValue("checkout_user", ImwTDocumentFile.TURBINE_USER_PROPERTY
        + "." + TurbineUser.LAST_NAME_KANA_PROPERTY);
    return map;
  }

  /**
   * 検索条件を設定した SelectQuery を返します。 <BR>
   *
   * @param rundata
   * @param context
   * @return
   */
  private SelectQuery getSelectQuery(RunData rundata, Context context) {
    SelectQuery query = new SelectQuery(ImwTDocumentFile.class);

    String word = searchWord.getValue();
    
    // ログインユーザが文書管理システム管理者かどうか
    boolean isDocAdmin = DocumentUtils.isDocAdmin(rundata);

    //検索文字列でファイルタイトル、ファイル名、メモを曖昧検索
    Expression exp11 = ExpressionFactory.likeExp(
        ImwTDocumentFile.FILE_TITLE_PROPERTY, "%" + word + "%");
    Expression exp12 = ExpressionFactory.likeExp(
        ImwTDocumentFile.FILE_NAME_PROPERTY, "%" + word + "%");
    Expression exp13 = ExpressionFactory.likeExp(
        ImwTDocumentFile.NOTE_PROPERTY, "%" + word + "%");
    //ステータスが0か1（最新のファイル）のみ取得
    Expression exp14 = ExpressionFactory.matchExp(
        ImwTDocumentFile.STATUS_PROPERTY, '0');
    Expression exp15 = ExpressionFactory.matchExp(
        ImwTDocumentFile.STATUS_PROPERTY, '1');
    //公開終了日が未設定、または現在日以降のファイルのみ取得
    Expression exp16 = ExpressionFactory.matchExp(
        ImwTDocumentFile.OPEN_END_DATE_PROPERTY, null);
    Expression exp17 = ExpressionFactory.greaterOrEqualExp(
        ImwTDocumentFile.OPEN_END_DATE_PROPERTY, 
        ALDateUtil.format(new Date(), "yyyy-MM-dd"));
    //参照可能ファイルのみ取得
    Expression exp18;
    if (getVisibleDocId().size() == 0) {
      //参照可能ファイルが存在しない場合
      exp18 = ExpressionFactory.matchExp(
          ImwTDocumentFile.DOC_ID_PROPERTY, null);
    } else {
      //参照可能ファイルが存在する場合
      exp18 = ExpressionFactory.inExp(
          ImwTDocumentFile.DOC_ID_PROPERTY, getVisibleDocId());
    }
    //参照可能フォルダのみ取得
    Expression exp19 = ExpressionFactory.inExp(
        ImwTDocumentFile.FOLDER_ID_PROPERTY, getVisibleFolderId());
    if (getVisibleFolderId().size() == 0) {
      //参照可能ファイルが存在しない場合
      exp19 = ExpressionFactory.matchExp(
          ImwTDocumentFile.FOLDER_ID_PROPERTY, null);
    } else {
      //参照可能ファイルが存在する場合
      exp19 = ExpressionFactory.inExp(
          ImwTDocumentFile.FOLDER_ID_PROPERTY, getVisibleFolderId());
    }

    query.setQualifier(exp11.orExp(exp12).orExp(exp13));
    query.andQualifier(exp14.orExp(exp15));
    
    //文書管理システム管理者は、アクセス権限と公開期間に関係なくファイルを閲覧できる
    if (!isDocAdmin) {
      query.andQualifier(exp16.orExp(exp17));
      query.andQualifier(exp18);
      query.andQualifier(exp19);
    }

    return buildSelectQueryForFilter(query, rundata, context);
  }
  
  /**
   * ログインユーザが所属するグループの一覧を返します。 <BR>
   *
   * @return grouplist
   */
  private List getUserGroupId() {
    List grouplist = new ArrayList();
    DataContext dataContext = DatabaseOrmService.getInstance()
        .getDataContext();
    SelectQuery query = new SelectQuery(TurbineUserGroupRole.class);
    Expression exp1 = ExpressionFactory.matchExp(
        TurbineUserGroupRole.TURBINE_USER_PROPERTY,
        ALEipUtils.getALEipUser(rundata).getUserId().getValue());
    query.setQualifier(exp1);
    List maplist = dataContext.performQuery(query);

    for(int i = 0; i < maplist.size(); i++){
      TurbineUserGroupRole map = (TurbineUserGroupRole) maplist.get(i);
      grouplist.add(map.getTurbineGroup());
    }
    return grouplist;
  }

  /**
   * ユーザが参照可能な文書ファイルのDOC_IDを返します。\<BR>
   * （参照権限が複数指定されている場合、同じDOC_IDが取得されます）\<BR>
   *
   * @param 
   * @return docid
   */
  private String getVisibleDocIdStr() {
    String docidstr = "";
    List docidlist = getVisibleDocId();
    for(int i = 0; i < docidlist.size(); i++){
      if (i != 0) {
        docidstr += ",";
      }
      docidstr += "'" + docidlist.get(i).toString() + "'";
    }
    return docidstr;
  }  
  
  /**
   * ユーザが参照可能な文書ファイルのDOC_IDを返します。 <BR>
   * （参照権限が複数指定されている場合、同じDOC_IDが取得されます）\<BR>
   *
   * @param 
   * @return docidlist
   */
  private List getVisibleDocId() {
    List docidlist = new ArrayList();
    DataContext dataContext = DatabaseOrmService.getInstance()
        .getDataContext();
    SelectQuery query = new SelectQuery(ImwTDocumentFileMap.class);
    Expression exp1 = ExpressionFactory.matchExp(
        ImwTDocumentFileMap.USER_ID_PROPERTY,
        ALEipUtils.getALEipUser(rundata).getUserId().getValue());
    Expression exp2 = ExpressionFactory.inExp(
        ImwTDocumentFileMap.GROUP_ID_PROPERTY, getUserGroupId());
    Expression exp3 = ExpressionFactory.matchExp(
        ImwTDocumentFileMap.GROUP_ID_PROPERTY, -1);
    query.setQualifier(exp1.orExp(exp2).orExp(exp3));
    List maplist = dataContext.performQuery(query);

    for(int i = 0; i < maplist.size(); i++){
      ImwTDocumentFileMap map = (ImwTDocumentFileMap) maplist.get(i);
      docidlist.add(map.getDocId());
    }
    return docidlist;
  }

  
  /**
   * ユーザが参照可能なフォルダのFOLDER_IDを返します。 <BR>
   *
   * @param 
   * @return visiblefolderlist
   */
  private List getVisibleFolderId() {
    //可視フォルダリスト
    List visiblefolderlist = new ArrayList();
    //フォルダ権限取得用フォルダ階層情報オブジェクト
    FolderInfo folderinfo = new FolderInfo();
    //可視フォルダのファイルのみ取得
    for (int i=0; i < folder_hierarchy_list.size(); i++) {
      folderinfo = (FolderInfo) folder_hierarchy_list.get(i);
      if(folderinfo.isAuthorizedVisible()){
        visiblefolderlist.add(folderinfo.getFolderId());
      }
    }
    return visiblefolderlist;
  }

  /**
   * 検索ワードを取得します。
   *
   * @return
   */
  public ALStringField getSearchWord() {
    return searchWord;
  }

  public int getSearchSum() {
    return searchSum;
  }

  public ArrayList getFolderHierarchyList() {
    return folder_hierarchy_list;
  }

  public FolderInfo getSelectedFolderInfo() {
    return selected_folderinfo;
  }

  /**
   * アクセス権限チェック用メソッド。<br />
   * アクセス権限の機能名を返します。
   *
   * @return
   */
  public String getAclPortletFeature() {
    return ALAccessControlConstants.POERTLET_FEATURE_DOCUMENT_FILE;
  }

  public boolean getIsDocWorkflowCoop() {
    return DocumentUtils.isDocWorkflowCoop();
  }

  /**
   * 指定ユーザをセッションに設定する．
   * 
   * @param rundata
   * @param context
   * @throws ALDBErrorException
   */
  private void setupLists(RunData rundata, Context context) {
    userList = ALEipUtils.getUsers("LoginUser");

    if (userList == null || userList.size() == 0) {
      target_user_id = "";
      ALEipUtils.removeTemp(rundata, context, "target_user_id");
      return;
    }

    target_user_id = Integer.toString(ALEipUtils.getUserId(rundata));
  }

  /**
   * 表示切り替え時に指定するユーザ ID
   * 
   * @return
   */
/*
  public String getTargetUserId() {
    // ログインユーザの ID を設定する．
    return target_user_id;
  }
*/
  /**
   * ユーザの一覧を取得する．
   * 
   * @param groupname
   * @return
   */
  public List getUsers() {
    return userList;
  }

  public boolean getCheckoutFlag() {
    return checkout_flag;
  }

  public void setCheckoutFlag(boolean checkout_flag) {
    this.checkout_flag = checkout_flag;
  }

  public boolean getRequestFlag() {
    return request_flag;
  }

  public void setRequestFlag(boolean request_flag) {
    this.request_flag = request_flag;
  }

  public String getTargetUserId() {
    return target_user_id;
  }

  public void setTargetUserId(String target_user_id) {
    this.target_user_id = target_user_id;
  }

}
