/*
* 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.memo.util;
import java.util.List;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.jetspeed.om.profile.Entry;
import org.apache.jetspeed.om.profile.Parameter;
import org.apache.jetspeed.om.profile.Portlets;
import org.apache.jetspeed.om.profile.Profile;
import org.apache.jetspeed.om.profile.ProfileException;
import org.apache.jetspeed.om.profile.psml.PsmlParameter;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.rundata.JetspeedRunData;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.eip.cayenne.om.portlet.EipTMemo;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.util.ALEipUtils;
/**
* Memoのユーティリティクラスです。 <BR>
*
*/
public class MemoUtils {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(MemoUtils.class.getName());
public static final String MEMO_PORTLET_NAME = "Memo";
/** 検索キーワード変数の識別子 */
public static final String TARGET_KEYWORD = "keyword";
/** セッション内の検索キーワード名 */
public static final String SESSION_KEYWORD = "memo_keyword";
/** セッション内のメモの新規(追加,更新)キーワード名 */
public static final String NEW_FLAG = "new_flag";
/** パラメータリセットの識別子 */
private static final String RESET_FLAG = "reset_params";
private static boolean isMemoIDEmpty(String memoid) {
return memoid == null
|| "".equals(memoid)
|| Integer.valueOf(memoid) == null;
}
/**
* Memo オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTMemo getEipTMemo(RunData rundata, Context context)
throws ALPageNotFoundException {
try {
String memoid = ALEipUtils.getTemp(rundata, context, NEW_FLAG);
if (isMemoIDEmpty(memoid)
|| !"MemoScreen".equals(rundata.getScreenTemplate())) {
memoid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
if (isMemoIDEmpty(memoid)) {
memoid = rundata.getParameters().getString(ALEipConstants.ENTITY_ID);
if (isMemoIDEmpty(memoid)) {
// MemoIDが空の場合、更新日が最新のメモを返す
return getLatestEipTMemo(rundata, context);
}
}
} else {
// 新規作成されたメモがある場合、新規作成フラッグを解除
ALEipUtils.setTemp(rundata, context, NEW_FLAG, null);
}
EipTMemo memo = getEipTMemo(rundata, context, Integer.valueOf(memoid));
if (memo == null) {
// MemoIDで指定されたMemoが見つからない場合、更新日が最新のメモを返す
return getLatestEipTMemo(rundata, context);
}
return memo;
} catch (ALPageNotFoundException pageNotFound) {
throw pageNotFound;
} catch (Exception ex) {
logger.error("memo", ex);
return null;
}
}
/**
* 初期セレクトメモを設定します
*
* @param rundata
* @param index
* @return
*/
public static boolean saveMemoSelection(RunData rundata, String entityid) {
String portletEntryId = rundata.getParameters().getString("js_peid", null);
if (portletEntryId == null || "".equals(portletEntryId)) {
return false;
}
String MEMO_IDX = "p1a-memos";
try {
Profile profile = ((JetspeedRunData) rundata).getProfile();
Portlets portlets = profile.getDocument().getPortlets();
if (portlets == null) {
return false;
}
Portlets[] portletList = portlets.getPortletsArray();
if (portletList == null) {
return false;
}
PsmlParameter param = null;
int length = portletList.length;
for (int i = 0; i < length; i++) {
Entry[] entries = portletList[i].getEntriesArray();
if (entries == null || entries.length <= 0) {
continue;
}
int ent_length = entries.length;
for (int j = 0; j < ent_length; j++) {
if (entries[j].getId().equals(portletEntryId)) {
boolean hasParam = false;
Parameter params[] = entries[j].getParameter();
int param_len = params.length;
for (int k = 0; k < param_len; k++) {
if (params[k].getName().equals(MEMO_IDX)) {
params[k].setValue(entityid);
entries[j].setParameter(k, params[k]);
hasParam = true;
}
}
if (!hasParam) {
param = new PsmlParameter();
param.setName(MEMO_IDX);
param.setValue(entityid);
entries[j].addParameter(param);
}
break;
}
}
}
profile.store();
return true;
} catch (IndexOutOfBoundsException e) {
logger.error("[MemoUtils]", e);
} catch (ProfileException e) {
logger.error("[MemoUtils]", e);
}
return false;
}
/**
* 表示切り替えのリセットフラグがあるかを返す.
*
* @param rundata
* @param context
* @return
*/
public static boolean hasResetFlag(RunData rundata, Context context) {
String resetflag = rundata.getParameters().getString(RESET_FLAG);
return resetflag != null;
}
/**
* 表示切り替えで指定した検索キーワードを取得する.
*
* @param rundata
* @param context
* @return
*/
public static String getTargetKeyword(RunData rundata, Context context) {
String target_keyword = null;
String keywordParam = rundata.getParameters().getString(TARGET_KEYWORD);
target_keyword = ALEipUtils.getTemp(rundata, context, SESSION_KEYWORD);
if (keywordParam == null && (target_keyword == null)) {
ALEipUtils.setTemp(rundata, context, SESSION_KEYWORD, "");
target_keyword = "";
} else if (keywordParam != null) {
ALEipUtils
.setTemp(rundata, context, SESSION_KEYWORD, keywordParam.trim());
target_keyword = keywordParam;
}
return target_keyword;
}
/**
* フィルターを初期化する.
*
* @param rundata
* @param context
* @param className
*/
public static void resetFilter(RunData rundata, Context context,
String className) {
ALEipUtils.setTemp(rundata, context, SESSION_KEYWORD, "");
}
/**
* Memo オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTMemo getEipTMemo(RunData rundata, Context context,
Integer memoid) throws ALPageNotFoundException {
int uid = ALEipUtils.getUserId(rundata);
try {
if (memoid == null) {
// Memo IDが空の場合
logger.debug("[MemoUtils] Empty ID...");
return null;
}
SelectQuery<EipTMemo> query = Database.query(EipTMemo.class);
Expression exp =
ExpressionFactory.matchDbExp(EipTMemo.MEMO_ID_PK_COLUMN, memoid);
exp.andExp(ExpressionFactory.matchExp(EipTMemo.OWNER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata))));
query.setQualifier(exp);
List<EipTMemo> memos = query.fetchList();
if (memos == null || memos.size() == 0) {
// 指定したMemo IDのレコードが見つからない場合
logger.debug("[MemoUtils] Not found ID...");
return null;
}
// アクセス権の判定
EipTMemo memo = memos.get(0);
if (uid != memo.getOwnerId().intValue()) {
logger.debug("[MemoUtils] Invalid user access...");
throw new ALPageNotFoundException();
}
return memos.get(0);
} catch (ALPageNotFoundException pageNotFound) {
// logger.error(pageNotFound);
throw pageNotFound;
} catch (Exception ex) {
logger.error("memo", ex);
return null;
}
}
/**
* 更新日が最新の Memo オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTMemo getLatestEipTMemo(RunData rundata, Context context)
throws ALPageNotFoundException {
int uid = ALEipUtils.getUserId(rundata);
try {
SelectQuery<EipTMemo> query = Database.query(EipTMemo.class);
Expression exp =
ExpressionFactory.matchExp(EipTMemo.OWNER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata)));
query.setQualifier(exp);
List<EipTMemo> memos = query.fetchList();
if (memos == null || memos.size() == 0) {
// 指定したUser IDのレコードが見つからない場合
logger.debug("[MemoUtils] Not found records...");
return null;
}
EipTMemo latest_memo = memos.get(0);
// 最新のアップデートをもつmemoを選別
for (EipTMemo memo : memos) {
if (memo.getUpdateDate().after(latest_memo.getUpdateDate())) {
// アクセス権の判定
if (uid != memo.getOwnerId().intValue()) {
logger.debug("[MemoUtils] Invalid user access...");
throw new ALPageNotFoundException();
}
latest_memo = memo;
}
}
return latest_memo;
} catch (ALPageNotFoundException pageNotFound) {
// logger.error(pageNotFound);
throw pageNotFound;
} catch (Exception ex) {
logger.error("memo", ex);
return null;
}
}
}