/*
* 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.util;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.PersistenceState;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.commons.lang.StringUtils;
import org.apache.jetspeed.om.security.UserIdPrincipal;
import org.apache.jetspeed.portal.PortletConfig;
import org.apache.jetspeed.portal.portlets.VelocityPortlet;
import org.apache.jetspeed.services.JetspeedSecurity;
import org.apache.jetspeed.services.customlocalization.CustomLocalizationService;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.resources.JetspeedResources;
import org.apache.jetspeed.util.ServiceUtil;
import org.apache.turbine.services.localization.LocalizationService;
import org.apache.turbine.util.RunData;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import com.aimluck.eip.cayenne.om.portlet.EipMGpdbKubun;
import com.aimluck.eip.cayenne.om.portlet.EipMGpdbKubunValue;
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.cayenne.om.portlet.EipTGpdbRecordFile;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.common.ALBaseUser;
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.fileupload.beans.FileuploadBean;
import com.aimluck.eip.fileupload.beans.FileuploadLiteBean;
import com.aimluck.eip.fileupload.util.FileuploadUtils;
import com.aimluck.eip.fileupload.util.FileuploadUtils.ShrinkImageSet;
import com.aimluck.eip.gpdb.GpdbItemResultData;
import com.aimluck.eip.gpdb.GpdbKubunResultData;
import com.aimluck.eip.gpdb.GpdbKubunValueResultData;
import com.aimluck.eip.gpdb.GpdbRecordResultData;
import com.aimluck.eip.gpdb.GpdbResultData;
import com.aimluck.eip.mail.ALAdminMailContext;
import com.aimluck.eip.mail.ALAdminMailMessage;
import com.aimluck.eip.mail.ALMailService;
import com.aimluck.eip.mail.util.ALEipUserAddr;
import com.aimluck.eip.mail.util.ALMailUtils;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SQLTemplate;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.orgutils.ALOrgUtilsService;
import com.aimluck.eip.services.storage.ALStorageService;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* Webデータベースのユーティリティクラスです。
*
*/
public class GpdbUtils {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(GpdbUtils.class.getName());
/** 項目定義名デフォルト値 */
public static final String ITEM_NAME_DEFAULT = "タイトル";
/** 項目定義形式:テキスト */
public static final String ITEM_TYPE_TEXT = "01";
/** 項目定義形式:テキストエリア */
public static final String ITEM_TYPE_TEXTAREA = "02";
/** 項目定義形式:リンク */
public static final String ITEM_TYPE_LINK = "03";
/** 項目定義形式:選択式(択一) */
public static final String ITEM_TYPE_SELECT = "04";
/** 項目定義形式:選択式(複数) */
public static final String ITEM_TYPE_SELECT_MULTI = "05";
/** 項目定義形式:ファイル */
public static final String ITEM_TYPE_FILE = "06";
/** 項目定義形式:画像 */
public static final String ITEM_TYPE_IMAGE = "07";
/** 項目定義形式:自動採番 */
public static final String ITEM_TYPE_SEQ = "08";
/** 項目定義形式:メール */
public static final String ITEM_TYPE_MAIL = "09";
/** 項目定義形式:日付 */
public static final String ITEM_TYPE_DATE = "10";
/** 項目定義形式:作成日 */
public static final String ITEM_TYPE_CREATE_DATE = "11";
/** 項目定義形式:更新日時 */
public static final String ITEM_TYPE_UPDATE_DATE = "12";
/** 項目定義形式:登録者 */
public static final String ITEM_TYPE_CREATE_USER = "13";
/** 項目定義形式:更新者 */
public static final String ITEM_TYPE_UPDATE_USER = "14";
/** 項目定義形式名:テキスト */
public static final String ITEM_TYPE_TITLE_TEXT = "テキスト";
/** 項目定義形式名:テキストエリア */
public static final String ITEM_TYPE_TITLE_TEXTAREA = "テキストエリア";
/** 項目定義形式名:リンク */
public static final String ITEM_TYPE_TITLE_LINK = "リンク";
/** 項目定義形式名:選択式(択一) */
public static final String ITEM_TYPE_TITLE_SELECT = "選択式(択一)";
/** 項目定義形式名:選択式(複数) */
public static final String ITEM_TYPE_TITLE_SELECT_MULTI = "選択式(複数)";
/** 項目定義形式名:ファイル */
public static final String ITEM_TYPE_TITLE_FILE = "ファイル";
/** 項目定義形式名:画像 */
public static final String ITEM_TYPE_TITLE_IMAGE = "画像";
/** 項目定義形式名:自動採番 */
public static final String ITEM_TYPE_TITLE_SEQ = "自動採番";
/** 項目定義形式名:メール */
public static final String ITEM_TYPE_TITLE_MAIL = "メール";
/** 項目定義形式名:日付 */
public static final String ITEM_TYPE_TITLE_DATE = "日付";
/** 項目定義形式名:作成日 */
public static final String ITEM_TYPE_TITLE_CREATE_DATE = "作成日";
/** 項目定義形式名:更新日時 */
public static final String ITEM_TYPE_TITLE_UPDATE_DATE = "更新日時";
/** 項目定義形式名:登録者 */
public static final String ITEM_TYPE_TITLE_CREATE_USER = "登録者";
/** 項目定義形式名:更新者 */
public static final String ITEM_TYPE_TITLE_UPDATE_USER = "更新者";
/** エラーメッセージ:タイトル項目削除不可エラー */
public static final String ERRMSG_TITLE_ITEM_DELETE = "タイトル指定された項目は削除できません。";
/** エラーメッセージ:データが存在する汎用DB削除不可エラー */
public static final String ERRMSG_DB_DELETE = "データが登録されているため、削除できません。";
/** ソート形式 */
public static final String SORT_STRING = "sort";
/** 検索キーワード */
private static final String SEARCH_WORD = "sword";
/** パラメータリセットの識別子 */
private static final String RESET_KEYWORD_FLAG = "reset_keyword_params";
/** 入力形式のマップ */
@SuppressWarnings("serial")
public static final Map<String, String> ITEM_TYPE = Collections
.unmodifiableMap(new LinkedHashMap<String, String>() {
{
// この順番でリスト表示されます。
put(ITEM_TYPE_TEXT, ITEM_TYPE_TITLE_TEXT); // テキスト
put(ITEM_TYPE_TEXTAREA, ITEM_TYPE_TITLE_TEXTAREA); // テキストエリア
put(ITEM_TYPE_LINK, ITEM_TYPE_TITLE_LINK); // リンク
put(ITEM_TYPE_SELECT, ITEM_TYPE_TITLE_SELECT); // 選択式(択一)
put(ITEM_TYPE_SELECT_MULTI, ITEM_TYPE_TITLE_SELECT_MULTI); // 選択式(複数)
put(ITEM_TYPE_FILE, ITEM_TYPE_TITLE_FILE); // ファイル
put(ITEM_TYPE_IMAGE, ITEM_TYPE_TITLE_IMAGE); // 画像
put(ITEM_TYPE_SEQ, ITEM_TYPE_TITLE_SEQ); // 自動採番
put(ITEM_TYPE_MAIL, ITEM_TYPE_TITLE_MAIL); // メール
put(ITEM_TYPE_DATE, ITEM_TYPE_TITLE_DATE); // 日付
put(ITEM_TYPE_CREATE_USER, ITEM_TYPE_TITLE_CREATE_USER); // 登録者
put(ITEM_TYPE_UPDATE_USER, ITEM_TYPE_TITLE_UPDATE_USER); // 更新者
put(ITEM_TYPE_CREATE_DATE, ITEM_TYPE_TITLE_CREATE_DATE); // 作成日
put(ITEM_TYPE_UPDATE_DATE, ITEM_TYPE_TITLE_UPDATE_DATE); // 更新日時
}
});
/** 選択肢/区分マスタ選択を表示する入力形式 */
@SuppressWarnings("serial")
public static final List<String> DISP_FIELD_SELECT_ITEM = Collections
.unmodifiableList(new ArrayList<String>() {
{
add(ITEM_TYPE_SELECT); // 選択式(択一)
add(ITEM_TYPE_SELECT_MULTI); // 選択式(複数)
}
});
/** 表示サイズ(横)を表示する入力形式 */
@SuppressWarnings("serial")
public static final List<String> DISP_FIELD_SIZE_COL = Collections
.unmodifiableList(new ArrayList<String>() {
{
add(ITEM_TYPE_TEXT); // テキスト
add(ITEM_TYPE_TEXTAREA); // テキストエリア
add(ITEM_TYPE_LINK); // リンク
add(ITEM_TYPE_MAIL); // メール
}
});
/** 表示サイズ(横)を表示する入力形式 */
@SuppressWarnings("serial")
public static final List<String> DISP_FIELD_SIZE_ROW = Collections
.unmodifiableList(new ArrayList<String>() {
{
add(ITEM_TYPE_TEXTAREA); // テキストエリア
}
});
/** 表示行数を表示する入力形式 */
@SuppressWarnings("serial")
public static final List<String> DISP_FIELD_LINE = Collections
.unmodifiableList(new ArrayList<String>() {
{
add(ITEM_TYPE_SELECT_MULTI); // 選択式(複数)
}
});
/** 必須フラグを表示する入力形式 */
@SuppressWarnings("serial")
public static final List<String> DISP_FIELD_REQUIRED = Collections
.unmodifiableList(new ArrayList<String>() {
{
add(ITEM_TYPE_TEXT); // テキスト
add(ITEM_TYPE_TEXTAREA); // テキストエリア
add(ITEM_TYPE_LINK); // リンク
add(ITEM_TYPE_SELECT); // 選択式(択一)
add(ITEM_TYPE_SELECT_MULTI); // 選択式(複数)
add(ITEM_TYPE_FILE); // ファイル
add(ITEM_TYPE_IMAGE); // 画像
add(ITEM_TYPE_MAIL); // メール
add(ITEM_TYPE_DATE); // 日付
}
});
/** 入力項目を表示する入力形式マップ */
@SuppressWarnings("serial")
public static final Map<String, List<String>> ITEM_FIELD = Collections
.unmodifiableMap(new TreeMap<String, List<String>>() {
{
put("select_kubun", DISP_FIELD_SELECT_ITEM); // 区分マスタ選択/選択肢入力
put("size_col", DISP_FIELD_SIZE_COL); // 表示サイズ(横)
put("size_row", DISP_FIELD_SIZE_ROW); // 表示サイズ(縦)
put("line", DISP_FIELD_LINE); // 表示行数
put("required", DISP_FIELD_REQUIRED); // 必須フラグ
}
});
/** フラグ:ON */
public static final String FLG_ON = "t";
/** フラグ:OFF */
public static final String FLG_OFF = "f";
/** サイズ(横)デフォルト値 */
public static final int SIZE_COL_DEFAULT = 300;
/** 区分値の区切り文字(データ保持用) */
public static final String KUBUN_VALUE_SEPARATOR = "|";
/** 区分値の区切り文字(画面表示用) */
public static final String KUBUN_VALUE_DISP_SEPARATOR = "、";
/** 添付ファイルを保管するディレクトリの指定 */
private static final String FOLDER_FILEDIR_GPDB = JetspeedResources
.getString("aipo.filedir", "");
/** 添付ファイルを保管するディレクトリのカテゴリキーの指定 */
protected static final String CATEGORY_KEY = JetspeedResources.getString(
"aipo.gpdb.categorykey",
"");;
/** デフォルトエンコーディングを表わすシステムプロパティのキー */
public static final String FILE_ENCODING = JetspeedResources.getString(
"content.defaultencoding",
"UTF-8");
/** ポートレット名 */
public static final String GPDB_PORTLET_NAME = "Gpdb";
// ---------------------------------------------------
// 入力形式
// ---------------------------------------------------
/**
* 入力形式名を返す
*
* @param type
* 入力形式
* @return 入力形式名
*/
public static String getItemTypeName(String type) {
return ITEM_TYPE.get(type);
}
// ---------------------------------------------------
// Webデータベース取得
// ---------------------------------------------------
/**
* Webデータベース オブジェクトモデルを取得します。
*
* @param rundata
* RunData
* @param context
* Context
* @return Webデータベースオブジェクトモデル
*/
public static EipTGpdb getEipTGpdb(RunData rundata, Context context) {
String gpdbid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
return getEipTGpdb(gpdbid);
}
/**
* Webデータベースオブジェクトモデルを取得します。
*
* @param gpdbId
* WebデータベースID
* @return Webデータベース オブジェクトモデル
*/
public static EipTGpdb getEipTGpdb(String gpdbId) {
try {
if (gpdbId == null || Integer.valueOf(gpdbId) == null) {
// Request IDが空の場合
logger.debug("[GpdbUtils] Empty ID...");
return null;
}
SelectQuery<EipTGpdb> query = Database.query(EipTGpdb.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdb.GPDB_ID_PK_COLUMN,
gpdbId));
List<EipTGpdb> gpdbList = query.fetchList();
if (gpdbList == null || gpdbList.isEmpty()) {
// 指定したWebデータベースIDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return gpdbList.get(0);
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* 全Webデータベースを返す
*
* @return Webデータベースオブジェクト全リスト
*/
public static List<GpdbResultData> getGpdbAllList() {
List<GpdbResultData> gpdbAllList = new ArrayList<GpdbResultData>();
try {
List<EipTGpdb> gpdbList =
Database.query(EipTGpdb.class).orderAscending(
EipTGpdb.GPDB_NAME_PROPERTY).fetchList();
for (EipTGpdb gpdb : gpdbList) {
GpdbResultData data = new GpdbResultData();
data.initField();
data.setGpdbId(gpdb.getGpdbId());
data.setGpdbName(gpdb.getGpdbName());
gpdbAllList.add(data);
}
} catch (Exception ex) {
logger.error("Exception", ex);
}
return gpdbAllList;
}
/**
* WebデータベースオブジェクトよりWebデータベースResult情報を返す
*
* @param model
* Webデータベースオブジェクト
* @return WebデータベースResult情報
*/
public static GpdbResultData getGpdbResultData(EipTGpdb model) {
// 登録者
TurbineUser user = model.getTurbineUser();
GpdbResultData data = new GpdbResultData();
data.initField();
data.setGpdbId(model.getGpdbId()); // WebデータベースID
data.setGpdbName(model.getGpdbName()); // Webデータベース名
data.setMailFlg(model.getMailFlg()); // メール配信フラグ
data.setCreateUserName(new StringBuffer()
.append(user.getLastName())
.append(" ")
.append(user.getFirstName())
.toString()); // 登録者名
data.setCreateUserId(user.getUserId());
data.setCreateDate(model.getCreateDate());// 作成日
data.setUpdateDate(model.getUpdateDate());// 更新日
data.setRecordCnt(getRecordCount("" + model.getGpdbId())); // 登録データ件数
return data;
}
// ---------------------------------------------------
// 項目定義取得
// ---------------------------------------------------
/**
* 項目定義 オブジェクトモデルを取得します。
*
* @param rundata
* RunData
* @param context
* Context
* @return 項目定義オブジェクトモデル
*/
public static EipTGpdbItem getEipTGpdbItem(RunData rundata, Context context) {
String gpdbItemId =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
return getEipTGpdbItem(gpdbItemId);
}
/**
* 項目定義 オブジェクトモデルを取得します。
*
* @param gpdbItemId
* 項目定義ID
* @return 項目定義オブジェクトモデル
*/
public static EipTGpdbItem getEipTGpdbItem(String gpdbItemId) {
try {
if (gpdbItemId == null) {
// Request IDが空の場合
logger.debug("[GpdbUtils] Empty ID...");
return null;
}
SelectQuery<EipTGpdbItem> query = Database.query(EipTGpdbItem.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdbItem.GPDB_ITEM_ID_PK_COLUMN,
gpdbItemId));
List<EipTGpdbItem> gpdbItemList = query.fetchList();
if (gpdbItemList == null || gpdbItemList.isEmpty()) {
// 指定した項目定義IDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return gpdbItemList.get(0);
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* 項目定義オブジェクトリストより項目定義Result情報リストを返す
*
* @param gpdbItemList
* 項目定義オブジェクトリスト
* @return 項目定義Result情報リスト
*/
public static List<GpdbItemResultData> getGpdbItemResultList(
List<EipTGpdbItem> gpdbItemList) {
List<GpdbItemResultData> resultList = new ArrayList<GpdbItemResultData>();
for (EipTGpdbItem gpdbItem : gpdbItemList) {
resultList.add(getGpdbItemResultData(gpdbItem));
}
return resultList;
}
/**
* 項目定義オブジェクトより項目定義Result情報を返す
*
* @param gpdbItem
* 項目定義オブジェクトリスト
* @return 項目定義Result情報
*/
public static GpdbItemResultData getGpdbItemResultData(EipTGpdbItem gpdbItem) {
GpdbItemResultData data = new GpdbItemResultData();
data.initField();
data.setGpdbItemId(gpdbItem.getGpdbItemId()); // 項目定義ID
data.setGpdbItemName(gpdbItem.getGpdbItemName()); // 項目定義名
data.setGpdbId(gpdbItem.getGpdb().getGpdbId()); // WebデータベースID
data.setGpdbName(gpdbItem.getGpdb().getGpdbName()); // Webデータベース名
data.setTitleFlg(gpdbItem.getTitleFlg()); // タイトルフラグ
data.setRequiredFlg(gpdbItem.getRequiredFlg()); // 必須フラグ
data.setType(gpdbItem.getType()); // 入力形式
data.setTypeName(ITEM_TYPE.get(gpdbItem.getType())); // 入力形式名
// 区分選択肢リスト
data.setListFlg(gpdbItem.getListFlg()); // 一覧画面表示フラグ
data.setDetailFlg(gpdbItem.getDetailFlg()); // 詳細画面表示フラグ
data.setDefaultSortFlg(gpdbItem.getDefaultSortFlg()); // デフォルトソートフラグ
data.setAscDesc(gpdbItem.getAscDesc()); // ソート順
// 区分マスタ
EipMGpdbKubun kubun = getEipMGpdbKubun(gpdbItem.getGpdbKubunId());
if (kubun != null) {
data.setGpdbKubunId(kubun.getGpdbKubunId());
data.setGpdbKubunName(kubun.getGpdbKubunName());
}
Integer sizeCol = gpdbItem.getSizeCol(); // 表示サイズ(横)
if (sizeCol != null) {
data.setSizeCol(sizeCol);
}
Integer sizeRow = gpdbItem.getSizeRow(); // 表示サイズ(縦)
if (sizeRow != null) {
data.setSizeRow(sizeRow);
}
Integer line = gpdbItem.getLine(); // 表示行数
if (line != null) {
data.setLine(line);
}
return data;
}
/**
* 項目定義Result情報リストを返す
*
* @param gpdbId
* WebデータベースID
* @return 項目定義Result情報リスト
*/
public static List<GpdbItemResultData> getGpdbItemResultList(String gpdbId) {
SelectQuery<EipTGpdbItem> query = Database.query(EipTGpdbItem.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdbItem.GPDB_PROPERTY,
gpdbId));
query.orderAscending(EipTGpdbItem.ORDER_NO_PROPERTY);
List<GpdbItemResultData> gpdbItemList =
getGpdbItemResultList(query.fetchList());
if (gpdbItemList.isEmpty()) {
// 指定した項目定義IDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return gpdbItemList;
}
// ---------------------------------------------------
// Webデータベースレコード取得
// ---------------------------------------------------
/**
* Webデータベースレコード オブジェクトリストを取得します。 <br/>
* 1レコード分のリストを取得します。
*
* @param gpdbId
* WebデータベースID
* @return レコードオブジェクトモデル
*/
public static List<EipTGpdbRecord> getEipTGpdbRecord(String gpdbId) {
return getEipTGpdbRecord(gpdbId, null);
}
/**
* Webデータベースレコード オブジェクトリストを取得します。 <br/>
* タイトル項目のリストを取得します。
*
* @param gpdbId
* WebデータベースID
* @return レコードオブジェクトモデル
*/
public static List<EipTGpdbRecord> getEipTGpdbRecordTitle(String gpdbId) {
return getEipTGpdbRecord(gpdbId, null, true);
}
/**
* Webデータベースレコード オブジェクトリストを取得します。 <br/>
* 1レコード分のリストを取得します。
*
* @param gpdbId
* WebデータベースID
* @param recordNo
* レコードNo
* @return レコードオブジェクトモデル
*/
public static List<EipTGpdbRecord> getEipTGpdbRecord(String gpdbId,
String recordNo) {
return getEipTGpdbRecord(gpdbId, recordNo, false);
}
/**
* Webデータベースレコード オブジェクトリストを取得します。 <br/>
* 1レコード分のリストを取得します。
*
* @param gpdbId
* WebデータベースID
* @param recordNo
* レコードNo
* @param titleOnly
* TRUE:タイトルの項目のみを取得する
* @return レコードオブジェクトモデル
*/
public static List<EipTGpdbRecord> getEipTGpdbRecord(String gpdbId,
String recordNo, boolean titleOnly) {
try {
if (gpdbId == null) {
// Request IDが空の場合
logger.debug("[GpdbUtils] Empty ID...");
return null;
}
SelectQuery<EipTGpdbRecord> query = Database.query(EipTGpdbRecord.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdbRecord.GPDB_PROPERTY,
gpdbId));
if (recordNo != null) {
query.andQualifier(ExpressionFactory.matchExp(
EipTGpdbRecord.RECORD_NO_PROPERTY,
recordNo));
}
if (titleOnly) {
SelectQuery<EipTGpdbItem> titleQuery =
Database.query(EipTGpdbItem.class);
titleQuery.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdbItem.GPDB_PROPERTY,
gpdbId));
titleQuery.andQualifier(ExpressionFactory.matchExp(
EipTGpdbItem.TITLE_FLG_PROPERTY,
FLG_ON));
query.andQualifier(ExpressionFactory.matchExp(
EipTGpdbRecord.GPDB_ITEM_PROPERTY,
titleQuery.fetchSingle()));
}
List<EipTGpdbRecord> gpdbRecordList = query.fetchList();
if (gpdbRecordList == null || gpdbRecordList.isEmpty()) {
// 指定したレコードNoのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return gpdbRecordList;
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* Webデータベースレコード オブジェクトリストを取得します。 <br/>
* 1レコード分のリストを取得します。
*
* @param gpdbId
* 項目定義ID
* @param recordNo
* レコードNo
* @param itemId
* 項目定義ID
* @return レコードオブジェクトモデル
*/
public static EipTGpdbRecord getEipTGpdbRecord(String gpdbId,
String recordNo, String itemId) {
try {
if (gpdbId == null || recordNo == null) {
// Request IDが空の場合
logger.debug("[GpdbUtils] Empty ID...");
return null;
}
SelectQuery<EipTGpdbRecord> query = Database.query(EipTGpdbRecord.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdbRecord.GPDB_PROPERTY,
gpdbId));
query.andQualifier(ExpressionFactory.matchExp(
EipTGpdbRecord.RECORD_NO_PROPERTY,
recordNo));
query.andQualifier(ExpressionFactory.matchExp(
EipTGpdbRecord.GPDB_ITEM_PROPERTY,
itemId));
EipTGpdbRecord gpdbRecord = query.fetchSingle();
if (gpdbRecord == null) {
// 指定した項目定義IDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return gpdbRecord;
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* WebデータベースレコードオブジェクトよりWebデータベースレコードResult情報を返す
*
* @param model
* Webデータベースレコードオブジェクト
* @return WebデータベースレコードResult情報
*/
public static GpdbRecordResultData getGpdbRecordResultData(
EipTGpdbRecord model) {
try {
String value = model.getValue();
Integer userid = null;
List<String> valueList = new ArrayList<String>();
if (value != null) {
EipTGpdbItem item = getEipTGpdbItem("" + model.getGpdbItemId());
String type = item.getType();
if (ITEM_TYPE_SELECT.equals(type)
|| ITEM_TYPE_SELECT_MULTI.equals(type)) {
// 選択式(複数)の場合、区分値IDを区分値に変換し、区切り文字で値を結合する
String[] list = value.split("\\" + KUBUN_VALUE_SEPARATOR);
StringBuilder sbVal = new StringBuilder();
for (int i = 0; i < list.length; i++) {
if (i > 0) {
sbVal.append(KUBUN_VALUE_DISP_SEPARATOR);
}
EipMGpdbKubunValue kubunValue = getEipMGpdbKubunValue(list[i]);
if (kubunValue != null) {
sbVal.append(kubunValue.getGpdbKubunValue());
}
valueList.add(list[i]);
}
value = String.valueOf(sbVal);
} else if (ITEM_TYPE_FILE.equals(type) || ITEM_TYPE_IMAGE.equals(type)) {
// ファイル、画像の場合、区切り文字で値を結合する
value =
value.replace(KUBUN_VALUE_SEPARATOR, KUBUN_VALUE_DISP_SEPARATOR);
} else if (ITEM_TYPE_CREATE_USER.equals(type)
|| ITEM_TYPE_UPDATE_USER.equals(type)) {
// 登録者、更新者の場合、名称・ユーザーIDをセットする
if (!"".equals(value.trim())) {
userid = Integer.valueOf(value);
value = ALEipUtils.getALEipUser(userid).getAliasName().getValue();
}
} else if (ITEM_TYPE_DATE.equals(type)) {
// 日付の場合、フォーマットを変換する。
SimpleDateFormat sdf_data =
new SimpleDateFormat(ALLocalizationUtils
.getl10n("GPDB_DATE_FORMAT_DATA"));
SimpleDateFormat sdf_show =
new SimpleDateFormat(ALLocalizationUtils
.getl10n("GPDB_DATE_FORMAT_SHOW"));
String tmpValue = value;
try {
Date date = sdf_data.parse(value);
value = sdf_show.format(date);
} catch (Exception e) {
value = tmpValue;
}
} else if (ITEM_TYPE_CREATE_DATE.equals(type)
|| ITEM_TYPE_UPDATE_DATE.equals(type)) {
// 作成日、更新日の場合、フォーマットを変換する。
SimpleDateFormat sdf_data =
new SimpleDateFormat(ALLocalizationUtils
.getl10n("GPDB_TIMESTAMP_FORMAT_DATA"));
SimpleDateFormat sdf_show =
new SimpleDateFormat(ALLocalizationUtils
.getl10n("GPDB_TIMESTAMP_FORMAT_SHOW"));
String tmpValue = value;
try {
Date date = sdf_data.parse(value);
value = sdf_show.format(date);
} catch (Exception e) {
value = tmpValue;
}
}
}
GpdbRecordResultData rd = new GpdbRecordResultData();
rd.initField();
rd.setGpdbItemId(model.getGpdbItemId());
rd.setGpdbRecordId(model.getGpdbRecordId());
rd.setRecordNo(model.getRecordNo());
rd.setValue(model.getValue());
rd.setDispValue(value);
rd.setValueList(valueList);
if (userid != null) {
rd.setUserId(userid);
}
return rd;
} catch (RuntimeException ex) {
logger.error("RuntimeException", ex);
return null;
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* Webデータベースレコードのマップを返す
*
* @param gpdbId
* WebデータベースID
* @param recordNo
* レコードNo
* @return Webデータベースレコードのマップ
* @throws ALPageNotFoundException
*/
public static Map<String, GpdbRecordResultData> getGpdbRecordMap(
String gpdbId, String recordNo) throws ALPageNotFoundException {
Map<String, GpdbRecordResultData> map =
new HashMap<String, GpdbRecordResultData>();
List<EipTGpdbRecord> recordList = getEipTGpdbRecord(gpdbId, recordNo);
// 指定したgpdbIDのレコードが見つからない場合
if (recordList == null || recordList.size() == 0) {
logger.error("[GpdbUtils] Not found record.");
throw new ALPageNotFoundException();
}
List<GpdbRecordResultData> list = new ArrayList<GpdbRecordResultData>();
for (EipTGpdbRecord rec : recordList) {
list.add(getGpdbRecordResultData(rec));
}
// 項目定義IDをキーにWebデータベースレコード情報を保持する
for (GpdbRecordResultData data : list) {
map.put("" + data.getGpdbItemId(), data);
}
return map;
}
/**
* Webデータベースレコードの登録件数を取得します
*
* @param gpdbId
* WebデータベースID
* @return レコード登録件数
*/
public static int getRecordCount(String gpdbId) {
int cnt = 0;
try {
String sql =
"SELECT COUNT(0) AS data_cnt"
+ " FROM ("
+ " SELECT record_no FROM eip_t_gpdb_record"
+ " WHERE gpdb_id = #bind($gpdb_id)"
+ " GROUP BY record_no) a";
SQLTemplate<EipTGpdbRecord> sqltemp =
Database.sql(EipTGpdbRecord.class, String.valueOf(sql));
sqltemp.param("gpdb_id", Integer.valueOf(gpdbId));
List<DataRow> result = sqltemp.fetchListAsDataRow();
if (result == null || result.isEmpty()) {
return 0;
}
cnt = Integer.valueOf(result.get(0).get("data_cnt").toString());
} catch (Exception ex) {
logger.error("Exception", ex);
return 0;
}
return cnt;
}
/**
* 指定の区分値を使用しているWebデータベースレコードの登録件数を取得します
*
* @param gpdbKubunValueId
* 区分値スID
* @return レコード登録件数
*/
public static int getRecordCountKubunUsed(String gpdbKubunValueId) {
int cnt = 0;
try {
String sql = "";
if (Database.isJdbcMySQL()) {
sql =
"SELECT COUNT(0) AS data_cnt"
+ " FROM eip_t_gpdb_record r"
+ " INNER JOIN eip_t_gpdb_item i"
+ " ON i.gpdb_item_id = r.gpdb_item_id"
+ " WHERE i.type IN (#bind($type1), #bind($type2))"
+ " AND r.value REGEXP #bind($gpdb_kubun_value_id)";
} else if (Database.isJdbcPostgreSQL()) {
sql =
"SELECT COUNT(0) AS data_cnt"
+ " FROM eip_t_gpdb_record r"
+ " INNER JOIN eip_t_gpdb_item i"
+ " ON i.gpdb_item_id = r.gpdb_item_id"
+ " WHERE i.type IN (#bind($type1), #bind($type2))"
+ " AND r.value ~ #bind($gpdb_kubun_value_id)";
}
SQLTemplate<EipTGpdbRecord> sqltemp =
Database.sql(EipTGpdbRecord.class, String.valueOf(sql));
sqltemp.param("type1", ITEM_TYPE_SELECT);
sqltemp.param("type2", ITEM_TYPE_SELECT_MULTI);
if (Database.isJdbcMySQL()) {
sqltemp.param("gpdb_kubun_value_id", "(^|\\|)"
+ gpdbKubunValueId
+ "(\\||$)");
} else if (Database.isJdbcPostgreSQL()) {
sqltemp.param("gpdb_kubun_value_id", "(?:^|\\||)"
+ gpdbKubunValueId
+ "(?:\\||$)");
}
List<DataRow> result = sqltemp.fetchListAsDataRow();
if (result == null || result.isEmpty()) {
return 0;
}
cnt = Integer.valueOf(result.get(0).get("data_cnt").toString());
} catch (Exception ex) {
logger.error("Exception", ex);
return 0;
}
return cnt;
}
// ---------------------------------------------------
// 区分取得
// ---------------------------------------------------
/**
* 区分マスタ オブジェクトモデルを取得します。
*
* @param rundata
* RunData
* @param context
* Context
* @return 区分マスタオブジェクトモデル
*/
public static EipMGpdbKubun getEipMGpdbKubun(RunData rundata, Context context) {
String gpdbKubunId =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (gpdbKubunId == null) {
// Request IDが空の場合
logger.debug("[GpdbUtils] Empty ID...");
return null;
}
SelectQuery<EipMGpdbKubun> query = Database.query(EipMGpdbKubun.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipMGpdbKubun.GPDB_KUBUN_ID_PK_COLUMN,
gpdbKubunId));
List<EipMGpdbKubun> kubunList = query.fetchList();
if (kubunList == null || kubunList.isEmpty()) {
// 指定した区分マスタIDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return kubunList.get(0);
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* 区分マスタ オブジェクトモデルを取得します。
*
* @param gpdbKubunId
* 区分マスタID
* @return 区分マスタオブジェクトモデル
*/
public static EipMGpdbKubun getEipMGpdbKubun(Integer gpdbKubunId) {
try {
if (gpdbKubunId == null) {
return null;
}
SelectQuery<EipMGpdbKubun> query = Database.query(EipMGpdbKubun.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipMGpdbKubun.GPDB_KUBUN_ID_PK_COLUMN,
gpdbKubunId));
List<EipMGpdbKubun> kubunList = query.fetchList();
if (kubunList == null || kubunList.isEmpty()) {
// 指定した区分マスタIDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return kubunList.get(0);
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* 区分値 オブジェクトモデルを取得します。
*
* @param rundata
* RunData
* @param context
* Context
* @return 区分値オブジェクトモデル
*/
public static EipMGpdbKubunValue getEipMGpdbKubunValue(RunData rundata,
Context context) {
String gpdbKubunValueId =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
return getEipMGpdbKubunValue(gpdbKubunValueId);
}
/**
* 区分値 オブジェクトモデルを取得します。
*
* @param gpdbKubunValueId
* 区分値ID
* @return 区分値オブジェクトモデル
*/
public static EipMGpdbKubunValue getEipMGpdbKubunValue(String gpdbKubunValueId) {
try {
if (gpdbKubunValueId == null || gpdbKubunValueId.isEmpty()) {
// Request IDが空の場合
logger.debug("[GpdbUtils] Empty ID...");
return null;
}
SelectQuery<EipMGpdbKubunValue> query =
Database.query(EipMGpdbKubunValue.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipMGpdbKubunValue.GPDB_KUBUN_VALUE_ID_PK_COLUMN,
gpdbKubunValueId));
List<EipMGpdbKubunValue> kubunValueList = query.fetchList();
if (kubunValueList == null || kubunValueList.isEmpty()) {
// 指定した区分値IDのレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
return null;
}
return kubunValueList.get(0);
} catch (Exception ex) {
logger.error("Exception", ex);
return null;
}
}
/**
* 全区分のリストを返す
*
* @return 全区分リスト
*/
public static List<GpdbKubunResultData> getGpdbKubunAllList() {
List<GpdbKubunResultData> kubunAllList =
new ArrayList<GpdbKubunResultData>();
try {
List<EipMGpdbKubun> kubunList =
Database.query(EipMGpdbKubun.class).orderAscending(
EipMGpdbKubun.GPDB_KUBUN_NAME_PROPERTY).fetchList();
for (EipMGpdbKubun kubun : kubunList) {
GpdbKubunResultData data = new GpdbKubunResultData();
data.initField();
data.setGpdbKubunId(kubun.getGpdbKubunId());
data.setGpdbKubunName(kubun.getGpdbKubunName());
kubunAllList.add(data);
}
} catch (Exception ex) {
logger.error("Exception", ex);
}
return kubunAllList;
}
/**
* 指定区分の区分値リストを返す
*
* @param gpdbKubunId
* 区分ID
* @return 全区分値リスト
*/
public static List<GpdbKubunValueResultData> getGpdbKubunValueList(
String gpdbKubunId) {
List<GpdbKubunValueResultData> kubunValueResultList =
new ArrayList<GpdbKubunValueResultData>();
try {
SelectQuery<EipMGpdbKubunValue> query =
Database.query(EipMGpdbKubunValue.class);
query.orderAscending(EipMGpdbKubunValue.GPDB_KUBUN_PROPERTY);
query.orderAscending(EipMGpdbKubunValue.ORDER_NO_PROPERTY);
if (gpdbKubunId != null) {
query.setQualifier(ExpressionFactory.matchDbExp(
EipMGpdbKubunValue.GPDB_KUBUN_PROPERTY,
gpdbKubunId));
}
List<EipMGpdbKubunValue> kubunValueList = query.fetchList();
for (EipMGpdbKubunValue kubunValue : kubunValueList) {
GpdbKubunValueResultData data = new GpdbKubunValueResultData();
data.initField();
data.setGpdbKubunValueId(kubunValue.getGpdbKubunValueId());
data.setGpdbKubunValue(kubunValue.getGpdbKubunValue());
data.setGpdbKubunId(kubunValue.getGpdbKubun().getGpdbKubunId());
data.setGpdbKubunName(kubunValue.getGpdbKubun().getGpdbKubunName());
kubunValueResultList.add(data);
}
} catch (Exception ex) {
logger.error("Exception", ex);
}
return kubunValueResultList;
}
/**
* 全区分値のリストを返す
*
* @return 全区分値リスト
*/
public static List<GpdbKubunValueResultData> getGpdbKubunValueAllList() {
return getGpdbKubunValueList(null);
}
/**
* 区分IDをキーとした全区分値のマップを返す
*
* @return 全区分値のマップ
*/
public static Map<String, List<GpdbKubunValueResultData>> getKubunMap() {
Map<String, List<GpdbKubunValueResultData>> map =
new HashMap<String, List<GpdbKubunValueResultData>>();
// 全区分値リストを取得
List<GpdbKubunValueResultData> allList = getGpdbKubunValueAllList();
// 区分ごとに格納する区分値リスト
List<GpdbKubunValueResultData> list = null;
// 比較用区分マスタID
String compareKubunId = null;
for (GpdbKubunValueResultData data : allList) {
String kubunId = data.getGpdbKubunId().toString();
if (!kubunId.equals(compareKubunId)) {
// 区分マスタIDごとにリストをマップに格納
list = new ArrayList<GpdbKubunValueResultData>();
map.put(kubunId, list);
}
list.add(data);
compareKubunId = kubunId;
}
return map;
}
/**
* 区分値オブジェクトリストより区分値Result情報リストを返す
*
* @param gpdbKubunValueList
* 区分値オブジェクトリスト
* @return 区分値Result情報リスト
*/
public static List<GpdbKubunValueResultData> getGpdbKubunValueResultList(
List<EipMGpdbKubunValue> gpdbKubunValueList) {
List<GpdbKubunValueResultData> resultList =
new ArrayList<GpdbKubunValueResultData>();
for (EipMGpdbKubunValue gpdbKubunValue : gpdbKubunValueList) {
resultList.add(getGpdbKubunValueResultData(gpdbKubunValue));
}
return resultList;
}
/**
* 区分値オブジェクトより区分値Result情報を返す
*
* @param model
* 区分値オブジェクト
* @return 区分値Result情報
*/
public static GpdbKubunValueResultData getGpdbKubunValueResultData(
EipMGpdbKubunValue model) {
GpdbKubunValueResultData data = new GpdbKubunValueResultData();
data.initField();
data.setGpdbKubunValueId(model.getGpdbKubunValueId());
data.setGpdbKubunName(model.getGpdbKubun().getGpdbKubunName());
data.setGpdbKubunValue(model.getGpdbKubunValue());
return data;
}
// ---------------------------------------------------
// データベース操作
// ---------------------------------------------------
/**
* Webデータベースに紐づく項目定義を削除する
*
* @param gpdb
* Webデータベースオブジェクト
* @return TRUE 成功 FALSE 失敗
*/
public static boolean removeGpdbItem(EipTGpdb gpdb) {
try {
// Webデータベースに紐づく項目定義
SelectQuery<EipTGpdbItem> query = Database.query(EipTGpdbItem.class);
query.setQualifier(ExpressionFactory.matchExp(
EipTGpdbItem.GPDB_PROPERTY,
gpdb.getGpdbId()));
List<EipTGpdbItem> gpdbItemList = query.fetchList();
if (gpdbItemList == null || gpdbItemList.isEmpty()) {
return true;
}
// Webデータベースに紐づく項目定義を削除
Database.deleteAll(gpdbItemList);
} catch (Exception ex) {
logger.error("Exception", ex);
return false;
}
return true;
}
/**
* 項目定義に紐づくレコードを削除する
*
* @param rundata
* RunData
* @param gpdbItem
* 項目定義オブジェクト
* @return TRUE 成功 FALSE 失敗
*/
public static boolean removeGpdbRecord(RunData rundata, EipTGpdbItem gpdbItem) {
try {
// 項目定義に紐づくレコード
SelectQuery<EipTGpdbRecord> query = Database.query(EipTGpdbRecord.class);
query.setQualifier(ExpressionFactory.matchExp(
EipTGpdbRecord.GPDB_ITEM_PROPERTY,
gpdbItem.getGpdbItemId()));
List<EipTGpdbRecord> gpdbRecordList = query.fetchList();
if (gpdbRecordList == null || gpdbRecordList.isEmpty()) {
return true;
}
// 項目定義に紐づくレコードを削除
Database.deleteAll(gpdbRecordList);
// 添付ファイルデータを削除
removeGpdbRecordFile(rundata, gpdbRecordList);
} catch (Exception ex) {
logger.error("Exception", ex);
return false;
}
return true;
}
/**
* 添付ファイルを削除する<br/>
* DBのデータとともに実際のファイルも削除
*
* @param rundata
* RunData
* @param gpdbRecordList
* Webデータベースレコードリスト
* @return TRUE 成功 FALSE 失敗
*/
public static boolean removeGpdbRecordFile(RunData rundata,
List<EipTGpdbRecord> gpdbRecordList) {
try {
// 添付ファイルデータを削除
List<String> fpaths = new ArrayList<String>();
List<Integer> fownerIds = new ArrayList<Integer>();
if (gpdbRecordList != null) {
for (EipTGpdbRecord record : gpdbRecordList) {
List<EipTGpdbRecordFile> fileList =
getEipTGpdbRecordFileList(record.getGpdbRecordId());
Database.deleteAll(fileList);
for (EipTGpdbRecordFile file : fileList) {
if (file.getFilePath() != null && file.getOwnerId() != null) {
fpaths.add(file.getFilePath());
fownerIds.add(file.getOwnerId());
}
}
}
}
if (!fpaths.isEmpty()) {
// 保存されている添付ファイルを削除する
int fsize = fpaths.size();
for (int i = 0; i < fsize; i++) {
ALStorageService.deleteFile(GpdbUtils
.getSaveDirPath(fownerIds.get(i))
+ fpaths.get(i));
}
}
} catch (Exception ex) {
logger.error("Exception", ex);
return false;
}
return true;
}
/**
* 区分値を持たない区分を削除する
*
* @return TRUE 成功 FALSE 失敗
*/
public static boolean removeGpdbKubunNoValue() {
try {
String sql =
"SELECT * FROM eip_m_gpdb_kubun a"
+ " WHERE NOT EXISTS("
+ " SELECT 0 FROM eip_m_gpdb_kubun_value b"
+ " WHERE a.gpdb_kubun_id = b.gpdb_kubun_id)";
List<EipMGpdbKubun> kubunList =
Database.sql(EipMGpdbKubun.class, sql).fetchList();
if (kubunList == null || kubunList.isEmpty()) {
return true;
}
for (EipMGpdbKubun kubun : kubunList) {
// 上記SQLで取得するとEipMGpdbKubunのステータスがTRANSIENTになり、
// 削除などができなくなるためCOMMITTEDを設定
DataContext.getThreadDataContext().registerNewObject(kubun);
kubun.setPersistenceState(PersistenceState.COMMITTED);
}
Database.deleteAll(kubunList);
} catch (Exception ex) {
logger.error("Exception", ex);
return false;
}
return true;
}
/**
* 項目定義でタイトル指定されているものをOFFにする
*
* @param gpdb
* Webデータベースオブジェクト
* @return TRUE 成功 FALSE 失敗
*/
public static boolean gpdbItemTitleOff(EipTGpdb gpdb) {
// 現在タイトル指定されているものをOFFにする
SelectQuery<EipTGpdbItem> query = Database.query(EipTGpdbItem.class);
query.setQualifier(ExpressionFactory.matchExp(
EipTGpdbItem.GPDB_PROPERTY,
gpdb));
query.andQualifier(ExpressionFactory.matchExp(
EipTGpdbItem.TITLE_FLG_PROPERTY,
FLG_ON));
EipTGpdbItem titleItem = query.fetchSingle();
if (titleItem == null) {
return true;
}
titleItem.setTitleFlg(FLG_OFF);
return true;
}
/**
* 項目定義でデフォルトソート指定されているものをOFFにする
*
* @param gpdb
* Webデータベースオブジェクト
* @return TRUE 成功 FALSE 失敗
*/
public static boolean gpdbItemDefaultSortOff(EipTGpdb gpdb) {
// 現在タイトル指定されているものをOFFにする
SelectQuery<EipTGpdbItem> query = Database.query(EipTGpdbItem.class);
query.setQualifier(ExpressionFactory.matchExp(
EipTGpdbItem.GPDB_PROPERTY,
gpdb));
query.andQualifier(ExpressionFactory.matchExp(
EipTGpdbItem.DEFAULT_SORT_FLG_PROPERTY,
FLG_ON));
EipTGpdbItem titleItem = query.fetchSingle();
if (titleItem == null) {
return true;
}
titleItem.setDefaultSortFlg(FLG_OFF);
titleItem.setAscDesc("");
return true;
}
// ---------------------------------------------------
// 変換系
// ---------------------------------------------------
/**
* rundata.getParameters().getStrings()などで取得した文字列のエンコードを行う
*
* @param str
* 変換前文字列
* @return 変換後文字列
*/
public static String convertEncording(String str) {
try {
String replace = new String(str.getBytes("8859_1"), "UTF-8");
if (replace != null && replace.matches("^\\?+$")) {
// 変換後文字列が全て?の場合は変換せずに返す
// firefoxの場合にrundata.getParameters().getStrings()で文字化けなしで取得できるため
// TODO 原因わかり次第対応
return str;
}
return replace;
} catch (Exception e) {
return null;
}
}
/**
* 選択肢の入力値から区分値の登録値を取得する。
*
* @param rundata
* RunData
* @param field
* フィールド
* @return 区分選択肢文字列
*/
public static String getParamValueString(RunData rundata, String field) {
String[] param = rundata.getParameters().getStrings(field);
if (param == null) {
return null;
}
List<String> list = new ArrayList<String>();
for (int i = 0; i < param.length; i++) {
param[i] = convertEncording(param[i]);
if (param[i] != null && !"".equals(param[i].trim())) {
list.add(param[i]);
}
}
return StringUtils.join(list.toArray(), KUBUN_VALUE_SEPARATOR);
}
// ---------------------------------------------------
// チェックメソッド
// ---------------------------------------------------
/**
* 入力項目が出力対象の入力形式かどうかを判定する
*
* @param field
* 入力項目フィールド名
* @param type
* 入力形式
* @return 出力する:TRUE 出力しない:FALSE
*/
public static boolean dipslayField(String field, String type) {
if (type == null || "".equals(type.trim())) {
type = ITEM_TYPE_TEXT;
}
if (!ITEM_FIELD.containsKey(field)) {
return false;
}
List<String> list = ITEM_FIELD.get(field);
return list.contains(type);
}
/**
* URL形式であるかを判定します。
*
* @param str
* チェック対象文字列
* @return URL形式であればtrue、それ以外はfalse。
*/
public static boolean isUrl(String str) {
Pattern mailPattern =
Pattern.compile(
"^(https?|ftp)(:\\/\\/[-_.!~*\\'()a-zA-Z0-9;\\/?:\\@&=+\\$,%#]+)$",
Pattern.CASE_INSENSITIVE);
Matcher objMch = mailPattern.matcher(str);
return objMch.matches();
}
// ---------------------------------------------------
// メール
// ---------------------------------------------------
/**
* メールを送信します
*
* @param rundata
* RunData
* @param destUser
* 送信先ユーザ
* @param gpdb
* メッセージ
* @param gpdbItemList
* @return 成功:TRUE 失敗:FALSE
* @throws Exception
* 例外
*/
public static boolean sendMail(RunData rundata, ALEipUser destUser,
EipTGpdb gpdb, String gpdbItemName, String dispValue) throws Exception {
String orgId = Database.getDomainName();
String subject = "[" + ALOrgUtilsService.getAlias() + "]Webデータベース";
try {
List<ALEipUser> memberList = new ArrayList<ALEipUser>();
memberList.add(destUser);
List<ALEipUserAddr> destMemberList =
ALMailUtils.getALEipUserAddrs(
memberList,
ALEipUtils.getUserId(rundata),
false);
List<ALAdminMailMessage> messageList =
new ArrayList<ALAdminMailMessage>();
for (ALEipUserAddr destMember : destMemberList) {
ALAdminMailMessage message = new ALAdminMailMessage(destMember);
message.setPcSubject(subject);
message.setCellularSubject(subject);
message.setPcBody(createMsgForPc(
rundata,
gpdb,
gpdbItemName,
dispValue,
true));
message.setCellularBody(createMsgForCellPhone(
rundata,
gpdb,
gpdbItemName,
dispValue,
true));
messageList.add(message);
}
ALMailService.sendAdminMailAsync(new ALAdminMailContext(orgId, ALEipUtils
.getUserId(rundata), messageList, ALMailUtils
.getSendDestType(ALMailUtils.KEY_MSGTYPE_WORKFLOW)));
} catch (Exception ex) {
logger.error("Exception", ex);
return false;
}
return true;
}
/**
* パソコンへ送信するメールの内容を作成する.
*
* @param gpdbItemList
*
* @return
*/
public static String createMsgForPc(RunData rundata, EipTGpdb gpdb,
String gpdbItemName, String dispValue, Boolean isNew)
throws ALDBErrorException {
VelocityContext context = new VelocityContext();
boolean enableAsp = JetspeedResources.getBoolean("aipo.asp", false);
ALEipUser loginUser = null;
ALBaseUser user = null;
try {
loginUser = ALEipUtils.getALEipUser(rundata);
user =
(ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(loginUser
.getUserId()
.toString()));
} catch (Exception e) {
return "";
}
context.put("loginUser", loginUser.getAliasName().toString());
context.put("hasEmail", !user.getEmail().equals(""));
context.put("email", user.getEmail());
context.put("isNew", isNew);
// タイトル
context.put("GpdbName", gpdb.getGpdbName());
// 件名
context.put("GpdbItemName", gpdbItemName);
context.put("DispValue", dispValue);
// サービス
context.put("serviceAlias", ALOrgUtilsService.getAlias());
// サービス(Aipo)へのアクセス
context.put("enableAsp", enableAsp);
context.put("globalurl", ALMailUtils.getGlobalurl());
context.put("localurl", ALMailUtils.getLocalurl());
CustomLocalizationService locService =
(CustomLocalizationService) ServiceUtil
.getServiceByName(LocalizationService.SERVICE_NAME);
String lang = locService.getLocale(rundata).getLanguage();
StringWriter writer = new StringWriter();
try {
if (lang != null && lang.equals("ja")) {
Template template =
Velocity.getTemplate("portlets/mail/"
+ lang
+ "/gpdb-notification-mail.vm", "utf-8");
template.merge(context, writer);
} else {
Template template =
Velocity.getTemplate(
"portlets/mail/gpdb-notification-mail.vm",
"utf-8");
template.merge(context, writer);
}
} catch (Exception e) {
e.printStackTrace();
}
writer.flush();
String ret = writer.getBuffer().toString();
return ret;
}
/**
* 携帯電話へ送信するメールの内容を作成する.
*
* @param gpdbItemList
*
* @return
*/
public static String createMsgForCellPhone(RunData rundata, EipTGpdb gpdb,
String gpdbItemName, String dispValue, Boolean isNew)
throws ALDBErrorException {
return createMsgForPc(rundata, gpdb, gpdbItemName, dispValue, isNew);
}
// ---------------------------------------------------
// ファイル操作
// ---------------------------------------------------
/**
* ファイルをアップロードする
*
* @param rundata
* RunData
* @param context
* Context
* @param record
* Webデータベースレコードオブジェクト
* @param fileuploadList
* アップロードファイルリスト
* @param folderName
* フォルダ名
* @param msgList
* エラーメッセージリスト
* @return 成功:TRUE 失敗:FALSE
*/
public static boolean insertFileDataDelegate(RunData rundata,
Context context, EipTGpdbRecord record,
List<FileuploadLiteBean> fileuploadList, String folderName,
List<String> msgList) {
if (fileuploadList == null || fileuploadList.size() <= 0) {
fileuploadList = new ArrayList<FileuploadLiteBean>();
}
int uid = ALEipUtils.getUserId(rundata);
String orgId = Database.getDomainName();
List<Integer> hadfileids = new ArrayList<Integer>();
for (FileuploadLiteBean file : fileuploadList) {
if (!file.isNewFile()) {
hadfileids.add(file.getFileId());
}
}
SelectQuery<EipTGpdbRecordFile> dbquery =
Database.query(EipTGpdbRecordFile.class);
dbquery.andQualifier(ExpressionFactory.matchDbExp(
EipTGpdbRecordFile.EIP_TGPDB_RECORD_PROPERTY,
record.getGpdbRecordId()));
List<EipTGpdbRecordFile> existsFiles = dbquery.fetchList();
List<EipTGpdbRecordFile> delFiles = new ArrayList<EipTGpdbRecordFile>();
for (EipTGpdbRecordFile file : existsFiles) {
if (!hadfileids.contains(file.getFileId())) {
delFiles.add(file);
}
}
// ローカルファイルに保存されているファイルを削除する.
if (delFiles.size() > 0) {
int delsize = delFiles.size();
for (int i = 0; i < delsize; i++) {
ALStorageService
.deleteFile(getSaveDirPath(delFiles.get(i).getOwnerId())
+ (delFiles.get(i)).getFilePath());
}
// データベースから添付ファイルのデータ削除
Database.deleteAll(delFiles);
}
// ファイル追加処理
try {
for (FileuploadLiteBean filebean : fileuploadList) {
if (!filebean.isNewFile()) {
continue;
}
// サムネイル処理
String[] acceptExts = ImageIO.getWriterFormatNames();
ShrinkImageSet shrinkImageSet =
FileuploadUtils.getBytesShrinkFilebean(
orgId,
folderName,
uid,
filebean,
acceptExts,
FileuploadUtils.DEF_THUMBNAIL_WIDTH,
FileuploadUtils.DEF_THUMBNAIL_HEIGHT,
msgList,
true);
String filename = "0_" + String.valueOf(System.nanoTime());
// 新規オブジェクトモデル
EipTGpdbRecordFile file = Database.create(EipTGpdbRecordFile.class);
// 所有者
file.setOwnerId(Integer.valueOf(uid));
// トピックID
file.setEipTGpdbRecord(record);
// ファイル名
file.setFileName(filebean.getFileName());
// ファイルパス
file.setFilePath(getRelativePath(filename));
// サムネイル画像
if (shrinkImageSet != null && shrinkImageSet.getShrinkImage() != null) {
file.setFileThumbnail(shrinkImageSet.getShrinkImage());
}
// 作成日
file.setCreateDate(Calendar.getInstance().getTime());
// 更新日
file.setUpdateDate(Calendar.getInstance().getTime());
if (shrinkImageSet != null && shrinkImageSet.getFixImage() != null) {
// ファイルの作成
ALStorageService.createNewFile(new ByteArrayInputStream(
shrinkImageSet.getFixImage()), FOLDER_FILEDIR_GPDB
+ ALStorageService.separator()
+ Database.getDomainName()
+ ALStorageService.separator()
+ CATEGORY_KEY
+ ALStorageService.separator()
+ uid
+ ALStorageService.separator()
+ filename);
} else {
// ファイルの移動
ALStorageService.copyTmpFile(uid, folderName, String.valueOf(filebean
.getFileId()), FOLDER_FILEDIR_GPDB, CATEGORY_KEY
+ ALStorageService.separator()
+ uid, filename);
}
}
// 添付ファイル保存先のフォルダを削除
if (folderName != null && !"".equals(folderName.trim())) {
ALStorageService.deleteTmpFolder(uid, folderName);
}
} catch (Exception e) {
Database.rollback();
logger.error("Exception", e);
return false;
}
return true;
}
/**
* ユーザ毎のルート保存先(絶対パス)を取得します。
*
* @param uid
* ユーザーID
* @return パス
*/
public static String getSaveDirPath(int uid) {
return ALStorageService.getDocumentPath(FOLDER_FILEDIR_GPDB, CATEGORY_KEY
+ ALStorageService.separator()
+ uid);
}
/**
* ユーザ毎の保存先(相対パス)を取得します。
*
* @param fileName
* ファイル名
* @return パス
*/
public static String getRelativePath(String fileName) {
return new StringBuffer().append("/").append(fileName).toString();
}
/**
* 添付ファイルを取得します。
*
* @param rundata
* RunData
* @param keyid
* キーとなるID
* @return ファイルリスト
*/
public static List<FileuploadLiteBean> getFileuploadList(RunData rundata,
String keyid) {
String[] fileids =
rundata.getParameters().getStrings(
FileuploadUtils.KEY_FILEUPLOAD_ID_LIST + "_" + keyid);
if (fileids == null) {
return null;
}
ArrayList<String> hadfileids = new ArrayList<String>();
ArrayList<String> newfileids = new ArrayList<String>();
for (int j = 0; j < fileids.length; j++) {
if (fileids[j].trim().startsWith("s")) {
hadfileids.add(fileids[j].trim().substring(1));
} else {
newfileids.add(fileids[j].trim());
}
}
ArrayList<FileuploadLiteBean> fileNameList =
new ArrayList<FileuploadLiteBean>();
FileuploadLiteBean filebean = null;
// 新規にアップロードされたファイルの処理
if (newfileids.size() > 0) {
String folderName =
rundata.getParameters().getString(
FileuploadUtils.KEY_FILEUPLOAD_FODLER_NAME + "_" + keyid);
if (folderName == null || folderName.equals("")) {
return null;
}
for (String newfileid : newfileids) {
if ("".equals(newfileid)) {
continue;
}
int fileid = 0;
try {
fileid = Integer.parseInt(newfileid);
} catch (Exception e) {
continue;
}
if (fileid == 0) {
filebean = new FileuploadLiteBean();
filebean.initField();
filebean.setFolderName("photo");
filebean.setFileName("以前の写真ファイル");
fileNameList.add(filebean);
} else {
BufferedReader reader = null;
try {
reader =
new BufferedReader(new InputStreamReader(ALStorageService
.getFile(
FileuploadUtils.FOLDER_TMP_FOR_ATTACHMENT_FILES,
ALEipUtils.getUserId(rundata)
+ ALStorageService.separator()
+ folderName,
fileid + FileuploadUtils.EXT_FILENAME), FILE_ENCODING));
String line = reader.readLine();
if (line == null || line.length() <= 0) {
continue;
}
filebean = new FileuploadLiteBean();
filebean.initField();
filebean.setFolderName(newfileid);
filebean.setFileId(fileid);
filebean.setFileName(line);
fileNameList.add(filebean);
} catch (Exception e) {
logger.error("Exception", e);
} finally {
try {
reader.close();
} catch (Exception e) {
logger.error("Exception", e);
}
}
}
}
}
// すでにあるファイルの処理
if (hadfileids.size() > 0) {
ArrayList<Integer> hadfileidsValue = new ArrayList<Integer>();
for (String hadfileid : hadfileids) {
int fileid = 0;
try {
fileid = Integer.parseInt(hadfileid);
hadfileidsValue.add(fileid);
} catch (Exception e) {
continue;
}
}
try {
SelectQuery<EipTGpdbRecordFile> reqquery =
Database.query(EipTGpdbRecordFile.class);
Expression reqexp1 =
ExpressionFactory.inDbExp(
EipTGpdbRecordFile.FILE_ID_PK_COLUMN,
hadfileidsValue);
reqquery.setQualifier(reqexp1);
List<EipTGpdbRecordFile> requests = reqquery.fetchList();
for (EipTGpdbRecordFile file : requests) {
filebean = new FileuploadBean();
filebean.initField();
filebean.setFileId(file.getFileId());
filebean.setFileName(file.getFileName());
filebean.setFlagNewFile(false);
fileNameList.add(filebean);
}
} catch (Exception ex) {
logger.error("[BlogUtils] Exception.", ex);
}
}
return fileNameList;
}
/**
* ファイルオブジェクトモデルを取得します。 <BR>
*
* @param rundata
* RunData
* @return ファイルオブジェクトモデル
* @exception ALPageNotFoundException
* ページ存在例外
* @exception ALDBErrorException
* DB例外
*/
public static EipTGpdbRecordFile getEipTGpdbRecordFile(RunData rundata)
throws ALPageNotFoundException, ALDBErrorException {
try {
int attachmentIndex =
rundata.getParameters().getInt("attachmentIndex", -1);
if (attachmentIndex < 0) {
// ID が空の場合
logger.debug("[GpdbUtils] Empty ID...");
throw new ALPageNotFoundException();
}
SelectQuery<EipTGpdbRecordFile> query =
Database.query(EipTGpdbRecordFile.class);
Expression exp =
ExpressionFactory.matchDbExp(
EipTGpdbRecordFile.FILE_ID_PK_COLUMN,
Integer.valueOf(attachmentIndex));
query.andQualifier(exp);
List<EipTGpdbRecordFile> files = query.fetchList();
if (files == null || files.size() == 0) {
// 指定した ID のレコードが見つからない場合
logger.debug("[GpdbUtils] Not found ID...");
throw new ALPageNotFoundException();
}
return files.get(0);
} catch (Exception ex) {
logger.error("[GpdbUtils]", ex);
throw new ALDBErrorException();
}
}
/**
* 添付ファイルリストを取得する
*
* @param gpdbRecordId
* WebデータベースレコードID
* @return 添付ファイルリスト
*/
public static List<EipTGpdbRecordFile> getEipTGpdbRecordFileList(
int gpdbRecordId) {
// SQL
SelectQuery<EipTGpdbRecordFile> query =
Database.query(EipTGpdbRecordFile.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTGpdbRecord.GPDB_RECORD_ID_PK_COLUMN,
gpdbRecordId));
return query.fetchList();
}
/**
* 添付ファイル一覧を取得する
*
* @param gpdbRecordId
* WebデータベースレコードID
* @return 添付ファイル一覧
*/
public static List<FileuploadBean> getAttachmentFiles(int gpdbRecordId) {
List<EipTGpdbRecordFile> fileList = getEipTGpdbRecordFileList(gpdbRecordId);
if (fileList != null && fileList.size() > 0) {
List<FileuploadBean> attachmentFileList = new ArrayList<FileuploadBean>();
FileuploadBean filebean = null;
EipTGpdbRecordFile file = null;
int size = fileList.size();
for (int i = 0; i < size; i++) {
file = fileList.get(i);
String realname = file.getFileName();
javax.activation.DataHandler hData =
new javax.activation.DataHandler(new javax.activation.FileDataSource(
realname));
filebean = new FileuploadBean();
filebean.setFileId(file.getFileId().intValue());
filebean.setFileName(realname);
if (hData != null) {
filebean.setContentType(hData.getContentType());
}
filebean.setIsImage(FileuploadUtils.isImage(realname));
attachmentFileList.add(filebean);
}
return attachmentFileList;
}
return new ArrayList<FileuploadBean>();
}
/**
*
* PSMLに設定されているデータと比較して valueが正しい値ならその値を新しくPSMLに保存。
*
*
* @param rundata
* @param context
* @param config
* @return
*/
public static String passPSML(RunData rundata, Context context, String key,
String value) {
VelocityPortlet portlet = ALEipUtils.getPortlet(rundata, context);
PortletConfig config = portlet.getPortletConfig();
if (value == null || "".equals(value)) {
value = config != null ? config.getInitParameter(key) : "";
} else {
ALEipUtils.setPsmlParameters(rundata, context, key, value);
}
return value;
}
/**
* 表示切り替えのリセットフラグがあるかを返す.
*
* @param rundata
* @param context
* @return
*/
public static boolean hasResetKeywordFlag(RunData rundata, Context context) {
String resetflag = rundata.getParameters().getString(RESET_KEYWORD_FLAG);
return resetflag != null;
}
/**
* フィルターを初期化する.
*
* @param rundata
* @param context
* @param className
*/
public static void resetKeyword(RunData rundata, Context context,
String className) {
ALEipUtils.setTemp(rundata, context, SEARCH_WORD, "");
}
/**
* 検索クエリ用のキーワードを取得します。
*
* @param rundata
* @param context
* @return
*/
public static String getSearchword(RunData rundata, Context context) {
String keyword = null;
String keywordParm = rundata.getParameters().getString(SEARCH_WORD);
keyword = ALEipUtils.getTemp(rundata, context, SEARCH_WORD);
if (keywordParm == null && (keyword == null)) {
ALEipUtils.setTemp(rundata, context, SEARCH_WORD, "");
keyword = "";
} else if (keywordParm != null) {
keywordParm = keywordParm.trim();
ALEipUtils.setTemp(rundata, context, SEARCH_WORD, keywordParm);
keyword = keywordParm;
}
return keyword;
}
}