/*
* 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.wiki.util;
import java.util.ArrayList;
import java.util.List;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.commons.lang.StringUtils;
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.eip.cayenne.om.portlet.EipTWiki;
import com.aimluck.eip.common.ALDBErrorException;
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;
import com.aimluck.eip.wiki.WikiResultData;
/**
* Wikiのユーティリティクラスです。 <BR>
*
*/
public class WikiUtils {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(WikiUtils.class.getName());
/** グループによる表示切り替え用変数の識別子 */
public static final String TARGET_GROUP_NAME = "target_group_name";
/** ユーザによる表示切り替え用変数の識別子 */
public static final String TARGET_USER_ID = "target_user_id";
/** 検索キーワード変数の識別子 */
public static final String TARGET_KEYWORD = "keyword";
/** パラメータリセットの識別子 */
private static final String RESET_KEYWORD_FLAG = "reset_keyword_params";
/** パラメータリセットの識別子 */
private static final String RESET_TARGET_FLAG = "reset_target_params";
/** パラメータリセットの識別子 */
private static final String RESET_FLAG = "reset_params";
/** 期限状態(期限前) */
public static final int LIMIT_STATE_BEFORE = -1;
/** 期限状態(期限当日) */
public static final int LIMIT_STATE_TODAY = 0;
/** 期限状態(期限後) */
public static final int LIMIT_STATE_AFTER = 1;
public static final String WIKI_PORTLET_NAME = "Wiki";
/** トップレベルwiki */
public static final int PARENT_WIKI = 0;
/**
* Wikiカテゴリ オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTWiki getEipTWikiCategory(RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
String categoryid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
if (categoryid == null || Integer.valueOf(categoryid) == null) {
// カテゴリIDが空の場合
logger.debug("[Wiki] Empty ID...");
throw new ALPageNotFoundException();
}
EipTWiki category = getEipTWikiCategory(Integer.parseInt(categoryid));
if (null == category) {
throw new ALPageNotFoundException();
}
return category;
}
/**
* Wikiカテゴリ オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTWiki getEipTWikiCategory(Integer integer) {
try {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
return query
.setQualifier(
ExpressionFactory.matchExp(EipTWiki.PARENT_ID_PROPERTY, integer))
.fetchSingle();
} catch (Exception ex) {
logger.error("wiki", ex);
return null;
}
}
/**
* parent_id:0のデータ一覧を取得する
*
* @param rundata
* @return
*/
public static List<WikiResultData> loadTopWikiList(RunData rundata) {
// カテゴリ一覧
List<WikiResultData> categoryList = new ArrayList<WikiResultData>();
try {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
query.setQualifier(ExpressionFactory.matchExp(
EipTWiki.PARENT_ID_PROPERTY,
PARENT_WIKI));
List<EipTWiki> aList =
query.orderAscending(EipTWiki.WIKI_NAME_PROPERTY).fetchList();
int size = aList.size();
for (int i = 0; i < size; i++) {
EipTWiki record = aList.get(i);
WikiResultData rd = new WikiResultData();
rd.initField();
rd.setId(record.getWikiId().longValue());
rd.setName(record.getWikiName());
rd.setUpdateUser(ALEipUtils
.getALEipUser(record.getUpdateUserId())
.getAliasName()
.getValue());
rd.setCreateDate(record.getCreateDate());
rd.setUpdateDate(record.getUpdateDate());
categoryList.add(rd);
}
} catch (Exception ex) {
logger.error("wiki", ex);
return null;
}
return categoryList;
}
/**
* 表示切り替えで指定したグループ ID を取得する.
*
* @param rundata
* @param context
* @return
*/
public static String getTargetGroupName(RunData rundata, Context context) {
String target_group_name = null;
String idParam = rundata.getParameters().getString(TARGET_GROUP_NAME);
target_group_name = ALEipUtils.getTemp(rundata, context, TARGET_GROUP_NAME);
if (idParam == null && target_group_name == null) {
ALEipUtils.setTemp(rundata, context, TARGET_GROUP_NAME, "all");
target_group_name = "all";
} else if (idParam != null) {
ALEipUtils.setTemp(rundata, context, TARGET_GROUP_NAME, idParam);
target_group_name = idParam;
}
return target_group_name;
}
/**
* 表示切り替えで指定したユーザ ID を取得する.
*
* @param rundata
* @param context
* @return
*/
public static String getTargetUserId(RunData rundata, Context context) {
String target_user_id = null;
String idParam = rundata.getParameters().getString(TARGET_USER_ID);
target_user_id = ALEipUtils.getTemp(rundata, context, TARGET_USER_ID);
if (idParam == null && (target_user_id == null)) {
ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, "all");
target_user_id = "all";
} else if (idParam != null) {
ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, idParam);
target_user_id = idParam;
}
return target_user_id;
}
/**
* 表示切り替えで指定した検索キーワードを取得する.
*
* @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, TARGET_KEYWORD);
if (keywordParam == null && (target_keyword == null)) {
ALEipUtils.setTemp(rundata, context, TARGET_KEYWORD, "");
target_keyword = "";
} else if (keywordParam != null) {
ALEipUtils.setTemp(rundata, context, TARGET_KEYWORD, keywordParam.trim());
target_keyword = keywordParam;
}
return target_keyword;
}
/**
* 表示切り替えのリセットフラグがあるかを返す.
*
* @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, TARGET_KEYWORD, "");
}
/**
* 表示切り替えのリセットフラグがあるかを返す.
*
* @param rundata
* @param context
* @return
*/
public static boolean hasResetTargetFlag(RunData rundata, Context context) {
String resetflag = rundata.getParameters().getString(RESET_TARGET_FLAG);
return resetflag != null;
}
/**
* フィルターを初期化する.
*
* @param rundata
* @param context
* @param className
*/
public static void resetTarget(RunData rundata, Context context,
String className) {
ALEipUtils.setTemp(rundata, context, TARGET_GROUP_NAME, "all");
ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, "all");
}
/**
* 表示切り替えのリセットフラグがあるかを返す.
*
* @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
* @param className
*/
public static void resetFilter(RunData rundata, Context context,
String className) {
ALEipUtils.removeTemp(rundata, context, new StringBuffer()
.append(className)
.append(ALEipConstants.LIST_FILTER)
.toString());
ALEipUtils.removeTemp(rundata, context, new StringBuffer()
.append(className)
.append(ALEipConstants.LIST_FILTER_TYPE)
.toString());
ALEipUtils.setTemp(rundata, context, TARGET_KEYWORD, "");
}
public static EipTWiki getEipTWiki(RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
String id = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (StringUtils.isEmpty(id)) {
return null;
}
return Database.get(EipTWiki.class, Integer.valueOf(id));
} catch (Exception e) {
logger.error("[WikiUtils]", e);
throw new ALDBErrorException();
}
}
public static EipTWiki getEipTWiki(Integer pk) {
return Database.get(EipTWiki.class, pk);
}
public static int getEipTWikiCategoryWikiCount(EipTWiki category) {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
query.setQualifier(ExpressionFactory.matchDbExp(
EipTWiki.PARENT_ID_PROPERTY,
category.getWikiId()));
return query.getCount();
}
public static boolean isTitleDuplicate(String title, Integer parentId) {
return isTitleDuplicate(title, parentId, null);
}
public static boolean isTitleDuplicate(String title, Integer parentId,
Integer pk) {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
Expression titleExp =
ExpressionFactory.likeIgnoreCaseExp(EipTWiki.WIKI_NAME_PROPERTY, title);
Expression parentExp =
ExpressionFactory.matchExp(EipTWiki.PARENT_ID_PROPERTY, parentId);
query.andQualifier(titleExp).andQualifier(parentExp);
if (pk != null) {
Expression pkExp =
ExpressionFactory.noMatchDbExp(EipTWiki.WIKI_ID_PK_COLUMN, pk);
query.andQualifier(pkExp);
}
int result = query.getCount();
return result != 0;
}
public static EipTWiki getEipTWiki(String name, String parentId) {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
Expression nameExp =
ExpressionFactory.likeIgnoreCaseExp(EipTWiki.WIKI_NAME_PROPERTY, name);
Expression parentExp =
ExpressionFactory.matchExp(EipTWiki.PARENT_ID_PROPERTY, parentId);
query.setQualifier(nameExp.andExp(parentExp));
query.orderAscending(EipTWiki.WIKI_NAME_PROPERTY);
return query.fetchSingle();
}
public static EipTWiki getEipTWikiOne() {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
Expression parentExp =
ExpressionFactory.matchExp(EipTWiki.PARENT_ID_PROPERTY, PARENT_WIKI);
query.setQualifier(parentExp);
query.orderAscending(EipTWiki.WIKI_NAME_PROPERTY);
return query.fetchSingle();
}
public static int getChildCount(Integer parentId) {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
Expression exp =
ExpressionFactory.matchExp(EipTWiki.PARENT_ID_PROPERTY, parentId);
return query.andQualifier(exp).getCount();
}
public static String getWikiIdFromSession(String filter, String filterType) {
String sesFilter = filter == null ? "" : filter;
String sesFilterType = filterType == null ? "" : filterType;
if ("category".equals(sesFilterType)) {
if (StringUtils.isNotEmpty(sesFilter) && StringUtils.isNumeric(sesFilter)) {
return sesFilter;
}
} else if ("post,category".equals(sesFilterType)) {
String[] splited = filter.split(",");
if (splited.length < 2) {
return "";
}
String id = filter.split(",")[1];
if (StringUtils.isNotEmpty(id) && StringUtils.isNumeric(id)) {
return id;
}
}
return "";
}
public static boolean existWiki(String wikiId,
List<WikiResultData> topWikiList) {
for (WikiResultData data : topWikiList) {
if (data.getId().toString().equals(wikiId)) {
return true;
}
}
return false;
}
}