/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.gpdb;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
import org.apache.commons.lang.StringUtils;
import org.apache.jetspeed.portal.portlets.VelocityPortlet;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.cayenne.om.portlet.EipTGpdb;
import com.aimluck.eip.cayenne.om.portlet.EipTGpdbItem;
import com.aimluck.eip.cayenne.om.portlet.EipTGpdbRecord;
import com.aimluck.eip.common.ALAbstractSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALData;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.gpdb.util.GpdbUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.orm.query.SQLTemplate;
import com.aimluck.eip.util.ALEipUtils;
/**
* Webデータベースレコードの検索データを管理するクラスです。 <BR>
*
*/
public class GpdbRecordSelectData extends
ALAbstractSelectData<EipTGpdbRecord, EipTGpdbRecord> implements ALData {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(GpdbRecordSelectData.class.getName());
/** 項目定義よりフィールド一覧を保持する */
private List<GpdbItemResultData> gpdbItemList;
/** WebデータベースID */
private String gpdbId;
/** Webデータベース */
private GpdbResultData gpdb;
/** Webデータベース全リスト */
private List<GpdbResultData> gpdbAllList;
/** Webデータベースレコードマップ。キー:項目定義ID */
private Map<String, GpdbRecordResultData> mapGpdbRecord;
/** 区分値マップ。キー:区分値ID */
private Map<String, List<GpdbKubunValueResultData>> mapGpdbKubunValue;
/** ターゲット */
private ALStringField searchWord;
/**
* 初期設定
*
* @param action
* ALAction
* @param rundata
* RunData
* @param context
* Context
*/
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
String sort = ALEipUtils.getTemp(rundata, context, LIST_SORT_STR);
if (sort == null || "".equals(sort.trim())) {
ALEipUtils
.setTemp(rundata, context, LIST_SORT_STR, GpdbUtils.SORT_STRING);
}
searchWord = new ALStringField();
super.init(action, rundata, context);
// super.init()後にLIST_FILTER_STRに格納される
// gpdbId = ALEipUtils.getTemp(rundata, context, LIST_FILTER_STR);
}
/**
* 一覧データを取得します。
*
* @param rundata
* RunData
* @param context
* Context
* @return ResultList
*/
@Override
protected ResultList<EipTGpdbRecord> selectList(RunData rundata,
Context context) {
try {
// 全Webデータベース
gpdbAllList = GpdbUtils.getGpdbAllList();
// セッション情報を設定
setCurrentFilterAndSort(rundata, context);
if (gpdbAllList == null || gpdbAllList.size() == 0) {
// データベース未登録時
return null;
}
// -----------------------
// 項目定義を取得
// -----------------------
gpdbItemList = GpdbUtils.getGpdbItemResultList(gpdbId);
// dbデータを取得
{
EipTGpdb etgpdb = GpdbUtils.getEipTGpdb(gpdbId);
if (etgpdb != null) {
gpdb = GpdbUtils.getGpdbResultData(etgpdb);
}
}
// -----------------------
// ソート項目の設定
// -----------------------
Integer sort;
try {
sort = Integer.valueOf(current_sort); // ソート項目クリックで項目定義IDが選択される
} catch (Exception e) {
sort = null;
}
if (sort == null) {
// デフォルトソート項目を取得
for (GpdbItemResultData item : gpdbItemList) {
if (GpdbUtils.FLG_ON.equals(item.getDefaultSortFlg().getValue())) {
sort = (int) item.getGpdbItemId().getValue();
current_sort_type = item.getAscDesc().getValue();
}
}
}
String sortWhere;
String sortValue;
String nullSort = "";
if (sort == null) {
// ソータなしの場合(初期表示時)
// 新しく更新された順で並べる
sortWhere =
" AND r2.gpdb_item_id = ("
+ " SELECT r3.gpdb_item_id"
+ " FROM eip_t_gpdb_record r3"
+ " WHERE r3.record_no = r2.record_no"
+ " ORDER BY update_date DESC"
+ " LIMIT 1"
+ " )";
sortValue = "r2.update_date";
} else {
// ソータが選択された場合
sortWhere = " AND r2.gpdb_item_id = #bind($sort) ";
EipTGpdbItem item = GpdbUtils.getEipTGpdbItem("" + sort);
if (item != null && GpdbUtils.ITEM_TYPE_SEQ.equals(item.getType())) {
// 自動採番項目の場合は数値として扱う
sortValue = Database.castToIntRawColumn("r2.value");
nullSort = " IS NULL ";
} else if (item != null
&& (GpdbUtils.ITEM_TYPE_CREATE_DATE.equals(item.getType()) || GpdbUtils.ITEM_TYPE_UPDATE_DATE
.equals(item.getType()))) {
// 作成日時、更新日時の場合はタイムスタンプとして扱う
sortValue = Database.castToDateTimeRawColumn("r2.value");
nullSort = " IS NULL ";
} else if (item != null
&& GpdbUtils.ITEM_TYPE_DATE.equals(item.getType())) {
// 日付の場合は日付として扱う
sortValue = Database.castToDateRawColumn("r2.value");
nullSort = " IS NULL ";
} else {
sortValue = "r2.value";
nullSort = " = '' ";
}
}
if (GpdbUtils.hasResetKeywordFlag(rundata, context)) {
GpdbUtils.resetKeyword(rundata, context, this.getClass().getName());
}
searchWord.setValue(GpdbUtils.getSearchword(rundata, context));
String searchValue;
if (!searchWord.getValue().equals("")) {
searchValue = " AND r4.value LIKE #bind($keyword)";
} else {
searchValue = "";
}
String ascDesc;
if (current_sort_type == null) {
ascDesc = "DESC";
} else {
ascDesc = current_sort_type;
}
// -----------------------
// レコード情報を取得
// -----------------------
StringBuilder sql = new StringBuilder();
if (searchValue != "") {
sql
.append("SELECT r.* FROM eip_t_gpdb_record r")
.append(" INNER JOIN eip_t_gpdb_item i")
.append(" ON i.gpdb_item_id = r.gpdb_item_id")
.append(" INNER JOIN eip_t_gpdb g")
.append(" ON g.gpdb_id = r.gpdb_id")
.append(" WHERE r.gpdb_id = #bind($gpdb_id)")
.append(" AND i.list_flg = #bind($list_flg)")
.append(" AND r.record_no IN (")
.append(" SELECT DISTINCT r4.record_no FROM eip_t_gpdb_record r4")
.append(" INNER JOIN eip_t_gpdb_item i2")
.append(" ON i2.gpdb_item_id = r4.gpdb_item_id")
.append(" WHERE r4.gpdb_id = #bind($gpdb_id)")
.append(searchValue)
.append(
" AND i2.type IN (#bind($type1),#bind($type2),#bind($type3),#bind($type4))")
.append(" ) ")
.append(" ORDER BY (SELECT " + sortValue)
.append(" FROM eip_t_gpdb_record r2")
.append(" WHERE r2.record_no = r.record_no")
.append(sortWhere)
.append(" ) " + nullSort + ascDesc)
.append(" , (SELECT " + sortValue)
.append(" FROM eip_t_gpdb_record r2")
.append(" WHERE r2.record_no = r.record_no")
.append(sortWhere)
.append(" ) " + ascDesc)
.append(" , r.record_no")
.append(" , i.order_no");
} else {
sql
.append("SELECT r.* FROM eip_t_gpdb_record r")
.append(" INNER JOIN eip_t_gpdb_item i")
.append(" ON i.gpdb_item_id = r.gpdb_item_id")
.append(" INNER JOIN eip_t_gpdb g")
.append(" ON g.gpdb_id = r.gpdb_id")
.append(" WHERE r.gpdb_id = #bind($gpdb_id)")
.append(" AND i.list_flg = #bind($list_flg)")
.append(" ORDER BY (SELECT " + sortValue)
.append(" FROM eip_t_gpdb_record r2")
.append(" WHERE r2.record_no = r.record_no")
.append(sortWhere)
.append(" ) " + nullSort + ascDesc)
.append(" , (SELECT " + sortValue)
.append(" FROM eip_t_gpdb_record r2")
.append(" WHERE r2.record_no = r.record_no")
.append(sortWhere)
.append(" ) " + ascDesc)
.append(" , r.record_no")
.append(" , i.order_no");
}
SQLTemplate<EipTGpdbRecord> sqltemp =
Database.sql(EipTGpdbRecord.class, String.valueOf(sql));
sqltemp.param("gpdb_id", Integer.valueOf(gpdbId));
sqltemp.param("list_flg", GpdbUtils.FLG_ON);
if (sort != null) {
sqltemp.param("sort", sort);
sqltemp.param("sort", sort);
}
if (searchValue != "") {
sqltemp.param("keyword", "%" + searchWord + "%");
sqltemp.param("type1", GpdbUtils.ITEM_TYPE_TEXTAREA);
sqltemp.param("type2", GpdbUtils.ITEM_TYPE_TEXT);
sqltemp.param("type3", GpdbUtils.ITEM_TYPE_LINK);
sqltemp.param("type4", GpdbUtils.ITEM_TYPE_MAIL);
}
ResultList<EipTGpdbRecord> list =
new ResultList<EipTGpdbRecord>(sqltemp.fetchList());
// ページャ情報反映
return new ResultList<EipTGpdbRecord>(buildPaginatedList(list));
} catch (RuntimeException ex) {
logger.error("RuntimeException", ex);
return null;
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* フィルタ項目、ソート項目を保持する
*
* @param rundata
* RunData
* @param context
* Context
*/
private void setCurrentFilterAndSort(RunData rundata, Context context) {
// buildSelectQueryForFilterを呼ばないため自前で設定
current_filter = ALEipUtils.getTemp(rundata, context, LIST_FILTER_STR);
current_filter_type =
ALEipUtils.getTemp(rundata, context, LIST_FILTER_TYPE_STR);
// buildSelectQueryForListViewSortを呼ばないため自前で設定
current_sort = ALEipUtils.getTemp(rundata, context, LIST_SORT_STR);
current_sort_type =
ALEipUtils.getTemp(rundata, context, LIST_SORT_TYPE_STR);
}
/**
* ページング結果のリストを取得します。
*
* @param records
* 検索結果
*/
@Override
protected List<EipTGpdbRecord> buildPaginatedList(List<EipTGpdbRecord> records) {
List<EipTGpdbRecord> list = new ArrayList<EipTGpdbRecord>();
// 一覧画面の表示項目数を割り出す
int countDisp = 0;
for (GpdbItemResultData item : gpdbItemList) {
if (GpdbUtils.FLG_ON.equals(item.getListFlg().getValue())) {
countDisp++;
}
}
int size = records.size(); // 全レコード
// 開始レコードを設定(表示上のレコード数を引数にする)
setPageParam(size / countDisp);
int start = getStart() * countDisp; // ページ開始レコード
int rowNum = getRowsNum() * countDisp; // ページ内表示レコード数
// 表示する最終レコードを割り出す
int end = (start + rowNum <= size) ? start + rowNum : size;
for (int i = start; i < end; i++) {
list.add(records.get(i));
}
return list;
}
/**
* 詳細データを取得します。
*
* @param rundata
* RunData
* @param context
* Context
* @return 項目定義オブジェクト
* @throws ALPageNotFoundException
*/
@Override
protected EipTGpdbRecord selectDetail(RunData rundata, Context context)
throws ALPageNotFoundException {
// セッション情報を設定
setCurrentFilterAndSort(rundata, context);
// 区分値を取得
mapGpdbKubunValue = GpdbUtils.getKubunMap();
// レコード情報を取得
mapGpdbRecord =
GpdbUtils.getGpdbRecordMap(gpdbId, ALEipUtils.getTemp(
rundata,
context,
ALEipConstants.ENTITY_ID));
// オブジェクトモデルを取得(ダミーデータ)
// 実際はgetResultDataで取得
return new EipTGpdbRecord();
}
/**
* ResultDataを取得します。(一覧データ)
*
* @param record
* レコード
* @return ResultData
*/
@Override
protected Object getResultData(EipTGpdbRecord record) {
return GpdbUtils.getGpdbRecordResultData(record);
}
/**
* ResultDataを取得します。(詳細データ)
*
* @param record
* レコード
* @return ResultData
*/
@Override
protected List<GpdbItemResultData> getResultDataDetail(EipTGpdbRecord record) {
List<GpdbItemResultData> list = GpdbUtils.getGpdbItemResultList(gpdbId);
// 添付ファイルを設定する
for (GpdbItemResultData item : list) {
String type = item.getType().getValue();
if (!GpdbUtils.ITEM_TYPE_FILE.equals(type)
&& !GpdbUtils.ITEM_TYPE_IMAGE.equals(type)) {
continue;
}
GpdbRecordResultData data =
mapGpdbRecord.get("" + item.getGpdbItemId().getValue());
data.setAttachmentFiles(GpdbUtils.getAttachmentFiles((int) data
.getGpdbRecordId()
.getValue()));
}
return list;
}
/**
* 項目情報を取得する
*
* @return 項目情報
*/
@Override
protected Attributes getColumnMap() {
Attributes map = new Attributes();
map.putValue("gpdb_id", EipTGpdb.GPDB_ID_PK_COLUMN);
return map;
}
/**
* WebデータベースIDを取得する
*
* @return WebデータベースID
*/
public String getGpdbId() {
return gpdbId;
}
/**
* WebデータベースIDの設定
*
*/
public void setGpdbId(Context context, RunData rundata) {
String gpdbId = rundata.getParameters().getString("filter", "");
String sesGpdbId = ALEipUtils.getTemp(rundata, context, LIST_FILTER_STR);
if ("".equals(gpdbId)) {
gpdbId = null == sesGpdbId ? "" : sesGpdbId;
}
String filterType = rundata.getParameters().getString("filtertype", "");
List<GpdbResultData> gpdbAllList = GpdbUtils.getGpdbAllList();
if (!"".equals(gpdbId)
&& ("gpdb_id".equals(filterType) || filterType == null || ""
.equals(filterType))) { // 最大化画面でデータベース選択した場合と詳細画面
if (validateGpdbId(gpdbAllList, gpdbId)) {
this.gpdbId = gpdbId;
}
}
if (this.gpdbId == null) {
VelocityPortlet portlet = ALEipUtils.getPortlet(rundata, context);
String database =
portlet.getPortletConfig().getInitParameter("p1d-database", "");
if (!database.isEmpty() && StringUtils.isNumeric(database)) {
if (validateGpdbId(gpdbAllList, database)) {
this.gpdbId = database;
}
}
if (this.gpdbId == null && gpdbAllList.size() > 0) {// 初期設定されていない場合リストの一番目を表示
this.gpdbId = gpdbAllList.get(0).gpdb_id.toString();
}
}
GpdbUtils.passPSML(rundata, context, "p1d-database", this.gpdbId);
ALEipUtils.setTemp(rundata, context, LIST_FILTER_STR, this.gpdbId);
}
/**
* Webデータベース全リストを取得する
*
* @return Webデータベース全リスト
*/
public List<GpdbResultData> getGpdbAllList() {
return gpdbAllList;
}
/**
* 項目定義リストを取得します。
*
* @return 項目定義リスト
*/
public List<GpdbItemResultData> getGpdbItemList() {
return gpdbItemList;
}
/**
* 項目定義リストを取得します。
*
* @return 項目定義リスト
*/
public GpdbResultData getGpdb() {
return gpdb;
}
/**
* 指定した項目定義IDのレコード情報を取得します。
*
* @param gpdbItemId
* 項目定義ID
* @return レコード情報
*/
public GpdbRecordResultData getRecordResult(String gpdbItemId) {
return mapGpdbRecord.get(gpdbItemId);
}
/**
* 指定区分の区分値リストを取得します。
*
* @param kubunId
* 区分マスタID
* @return 区分値リスト
*/
public List<GpdbKubunValueResultData> getKubunValueList(String kubunId) {
return mapGpdbKubunValue.get(kubunId);
}
private boolean validateGpdbId(List<GpdbResultData> allList, String gpdbId) {
for (GpdbResultData gpdb : allList) {
if (gpdb.getGpdbId().toString().equals(gpdbId)) {
return true;
}
}
return false;
}
/**
* @return target_keyword
*/
public ALStringField getSearchWord() {
return searchWord;
}
}