/*
* 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;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.jar.Attributes;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
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.jetspeed.util.template.JetspeedLink;
import org.apache.jetspeed.util.template.JetspeedLinkFactory;
import org.apache.turbine.util.RunData;
import org.apache.turbine.util.TurbineException;
import org.apache.velocity.context.Context;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.cayenne.om.portlet.EipTWiki;
import com.aimluck.eip.common.ALAbstractMultiFilterSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALData;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALEipGroup;
import com.aimluck.eip.common.ALEipManager;
import com.aimluck.eip.common.ALEipPost;
import com.aimluck.eip.common.ALEipUser;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.common.ALPermissionException;
import com.aimluck.eip.fileupload.beans.FileuploadBean;
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.SelectQuery;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.wiki.util.WikiFileUtils;
import com.aimluck.eip.wiki.util.WikiUtils;
/**
* Wiki検索データを管理するクラスです。 <BR>
*
*/
public class WikiSelectData extends
ALAbstractMultiFilterSelectData<EipTWiki, EipTWiki> implements ALData {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(WikiSelectData.class.getName());
private List<WikiResultData> topWikiList;
/** 部署一覧 */
private List<ALEipGroup> postList;
/** 初期表示 */
private int table_colum_num = 2;
/** カテゴリの初期値を取得する */
private String filterType = "";
/** グループID */
private String postId = "";
/** グループ名 */
private String postName = "";
/** カテゴリ ID */
private String categoryId = "";
/** カテゴリ名 */
private String categoryName = "";
/** ターゲット */
private ALStringField target_keyword;
private String baseInternalLink = null;
private String baseImageLink = null;
private String baseImageRawLink = null;
private String entityId = null;
private String tempNote = null;
private String tempWikiNote = null;
private boolean isTop = false;
private long tempOwnerId;
/**
*
* @param action
* @param rundata
* @param context
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
String sort = ALEipUtils.getTemp(rundata, context, LIST_SORT_STR);
if (sort == null || sort.equals("")) {
// default sort
String sortStr = "update_date";
ALEipUtils.setTemp(rundata, context, LIST_SORT_STR, sortStr);
if ("update_date".equals(sortStr)) {
ALEipUtils.setTemp(rundata, context, LIST_SORT_TYPE_STR, "desc");
}
}
entityId = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
target_keyword = new ALStringField();
super.init(action, rundata, context);
postList = ALEipUtils.getMyGroups(rundata);
try {
JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata);
VelocityPortlet portlet = ALEipUtils.getPortlet(rundata, context);
baseInternalLink =
jsLink
.getPortletById(portlet.getID())
.addQueryData("template", "WikiInternalLinkScreen")
.addQueryData("portletid", portlet.getID())
.addQueryData("existWidgets", "marking_widgets_" + portlet.getID())
.addQueryData("callback", "aipo.wiki.onLoadWikiDetail")
.toString();
String baseLink = jsLink.getPortletById(portlet.getID()).toString();
baseImageLink = baseLink + "/template/WikiFileThumbnailScreen";
baseImageRawLink =
baseLink + "/template/FileuploadViewScreen/screen/WikiFileRawScreen";
} catch (TurbineException e) {
logger.error("init", e);
}
}
/**
*
* @param rundata
* @param context
*/
public void loadTopWikiList(RunData rundata, Context context) {
topWikiList = WikiUtils.loadTopWikiList(rundata);
setCategory(rundata, context);
}
public boolean validateCategory() {
if (StringUtils.isEmpty(categoryId)) {
return true;
}
for (WikiResultData data : topWikiList) {
if (data.getParentId().toString().equals(categoryId)) {
return true;
}
}
return false;
}
private void updateCategoryName() {
categoryName = "";
if (topWikiList == null) {
return;
}
for (WikiResultData data : topWikiList) {
if (data.getId().toString().equals(categoryId)) {
categoryName = data.getName();
return;
}
}
}
private void updatePostName() {
postName = "";
for (int i = 0; i < postList.size(); i++) {
String pid = postList.get(i).getName().toString();
if (pid.equals(postId.toString())) {
postName = postList.get(i).getAliasName().toString();
return;
}
}
Map<Integer, ALEipPost> map = ALEipManager.getInstance().getPostMap();
for (Map.Entry<Integer, ALEipPost> item : map.entrySet()) {
String pid = item.getValue().getGroupName().toString();
if (pid.equals(postId.toString())) {
postName = item.getValue().getPostName().toString();
return;
}
}
}
/**
*
* @param rundata
* @param context
*/
public void setCategory(RunData rundata, Context context) {
// validate categoryId and filterType, categoryId set
String filter = rundata.getParameters().getString("filter", "");
String filterType = rundata.getParameters().getString("filtertype", "");
String sesFilter = ALEipUtils.getTemp(rundata, context, LIST_FILTER_STR);
String sesFilterType =
ALEipUtils.getTemp(rundata, context, LIST_FILTER_TYPE_STR);
sesFilter = sesFilter == null ? "" : sesFilter;
sesFilterType = sesFilterType == null ? "" : sesFilterType;
if (filterType.isEmpty()) {
filter = sesFilter;
filterType = sesFilterType;
}
if (filterType.equals("category")) {
filter = "0," + filter;
filterType = "post,category";
} else if (filterType.equals("post,category")) {
// do nothing
} else {
filter = "";
filterType = "";
}
if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(filterType)) {
this.filterType = "";
categoryId = "";
return;
}
String[] splited = filter.split(",");
if (splited.length < 2) {
this.filterType = "";
categoryId = "";
return;
}
categoryId = filter.split(",")[1];
this.filterType = filterType;
boolean existCategory = false;
for (WikiResultData data : topWikiList) {
if (categoryId.equals(data.getId().toString())) {
existCategory = true;
break;
}
}
if (!existCategory) {
categoryId = "0";
ALEipUtils.setTemp(
rundata,
context,
LIST_FILTER_STR,
filter.split(",")[0] + "," + categoryId);
ALEipUtils.setTemp(
rundata,
context,
LIST_FILTER_TYPE_STR,
"post,category");
}
}
/**
* 一覧データを取得します。 <BR>
*
* @param rundata
* @param context
* @return
* @throws ALDBErrorException
*/
@Override
public ResultList<EipTWiki> selectList(RunData rundata, Context context) {
try {
if (WikiUtils.hasResetFlag(rundata, context)) {
WikiUtils.resetFilter(rundata, context, this.getClass().getName());
target_keyword.setValue("");
} else {
target_keyword.setValue(WikiUtils.getTargetKeyword(rundata, context));
}
SelectQuery<EipTWiki> query = getSelectQuery(rundata, context);
buildSelectQueryForListView(query);
buildSelectQueryForListViewSort(query, rundata, context);
ResultList<EipTWiki> list = query.getResultList();
setPageParam(list.getTotalCount());
return list;
} catch (Exception e) {
logger.error("WikiSelectData.selectList", e);
return null;
}
}
private SelectQuery<EipTWiki> getSelectQuery(RunData rundata, Context context) {
SelectQuery<EipTWiki> query = Database.query(EipTWiki.class);
if ((target_keyword != null) && (!target_keyword.getValue().equals(""))) {
// 選択したキーワードを指定する.
String keyword = "%" + target_keyword.getValue() + "%";
Expression exp =
ExpressionFactory.likeExp(EipTWiki.WIKI_NAME_PROPERTY, keyword);
Expression exp2 =
ExpressionFactory.likeExp(EipTWiki.NOTE_PROPERTY, keyword);
query.andQualifier(exp.orExp(exp2));
}
return buildSelectQueryForFilter(query, rundata, context);
}
@Override
protected void parseFilterMap(String key, String val) {
super.parseFilterMap(key, val);
Set<String> unUse = new HashSet<String>();
for (Entry<String, List<String>> pair : current_filterMap.entrySet()) {
if (pair.getValue().contains("0")) {
unUse.add(pair.getKey());
}
}
for (String unusekey : unUse) {
current_filterMap.remove(unusekey);
}
}
@Override
protected SelectQuery<EipTWiki> buildSelectQueryForFilter(
SelectQuery<EipTWiki> query, RunData rundata, Context context) {
if (current_filterMap.containsKey("category")) {
// カテゴリを含んでいる場合デフォルトとは別にフィルタを用意
List<String> categoryIds = current_filterMap.get("category");
categoryId = categoryIds.get(0).toString();
if (null == topWikiList) {
topWikiList = WikiUtils.loadTopWikiList(rundata);
}
boolean existCategory = false;
if (topWikiList != null && topWikiList.size() > 0) {
for (WikiResultData category : topWikiList) {
if (categoryId.equals(category.getId().toString())) {
existCategory = true;
break;
}
}
}
if (!existCategory) {
categoryId = "";
current_filterMap.remove("category");
} else {
Expression exp =
ExpressionFactory.matchExp(EipTWiki.PARENT_ID_PROPERTY, categoryId);
Expression exp2 =
ExpressionFactory.matchDbExp(EipTWiki.WIKI_ID_PK_COLUMN, categoryId);
query.andQualifier(exp.orExp(exp2));
}
updateCategoryName();
}
super.buildSelectQueryForFilter(query, rundata, context);
if (current_filterMap.containsKey("post")) {
// 部署を含んでいる場合デフォルトとは別にフィルタを用意
List<String> postIds = current_filterMap.get("post");
HashSet<Integer> userIds = new HashSet<Integer>();
for (String post : postIds) {
List<Integer> userId = ALEipUtils.getUserIds(post);
userIds.addAll(userId);
}
if (userIds.isEmpty()) {
userIds.add(-1);
}
Expression exp =
ExpressionFactory.inExp(EipTWiki.UPDATE_USER_ID_PROPERTY, userIds);
query.andQualifier(exp);
postId = postIds.get(0).toString();
updatePostName();
}
String search = ALEipUtils.getTemp(rundata, context, LIST_SEARCH_STR);
if (search != null && !"".equals(search)) {
current_search = search;
Expression ex1 =
ExpressionFactory.likeExp(EipTWiki.NOTE_PROPERTY, "%" + search + "%");
Expression ex2 =
ExpressionFactory.likeExp(EipTWiki.WIKI_NAME_PROPERTY, "%"
+ search
+ "%");
SelectQuery<EipTWiki> q = Database.query(EipTWiki.class);
q.andQualifier(ex1.orExp(ex2));
List<EipTWiki> queryList = q.fetchList();
List<Integer> resultid = new ArrayList<Integer>();
for (EipTWiki item : queryList) {
resultid.add(item.getWikiId());
}
if (resultid.size() == 0) {
// 検索結果がないことを示すために-1を代入
resultid.add(-1);
}
Expression ex =
ExpressionFactory.inDbExp(EipTWiki.WIKI_ID_PK_COLUMN, resultid);
query.andQualifier(ex);
}
return query;
}
/**
* ResultData に値を格納して返します。(一覧データ) <BR>
*
* @param obj
* @return
*/
@Override
protected Object getResultData(EipTWiki record) {
try {
WikiResultData rd = new WikiResultData();
rd.initField();
rd.setId(record.getWikiId().longValue());
rd.setName(record.getWikiName());
// rd.setCategoryId(record.getCategoryId().longValue());
rd.setParentId(record.getParentId());
if (record.getParentId() != 0) {
rd.setParentName(WikiUtils
.getEipTWiki(record.getParentId())
.getWikiName());
}
rd.setUpdateUser(ALEipUtils
.getALEipUser(record.getUpdateUserId())
.getAliasName()
.getValue());
rd.setCreateDate(record.getCreateDate());
rd.setUpdateDate(record.getUpdateDate());
rd.setUpdateUserId(record.getUpdateUserId());
return rd;
} catch (Exception e) {
logger.error("WikiSelectData.getResultData", e);
return null;
}
}
/**
* 詳細データを取得します。 <BR>
*
* @param rundata
* @param context
* @return
* @throws ALDBErrorException
*/
@Override
public EipTWiki selectDetail(RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
try {
EipTWiki wiki = WikiUtils.getEipTWiki(rundata, context);
return wiki;
} catch (ALPageNotFoundException pageNotFound) {
throw pageNotFound;
}
}
/**
* ResultData に値を格納して返します。(詳細データ) <BR>
*
* @param obj
* @return
*/
@Override
protected Object getResultDataDetail(EipTWiki record) {
try {
WikiResultData rd = new WikiResultData();
rd.initField();
String link =
baseInternalLink
+ "&name=${title}&parentId="
+ String.valueOf(record.getParentId().intValue() == 0 ? record
.getWikiId() : record.getParentId());
rd.initalizeWikiModel(baseImageLink, link);
// 登録ユーザ名の設定
ALEipUser createdUser =
ALEipUtils.getALEipUser(record.getCreateUserId().intValue());
String createdUserName = createdUser.getAliasName().getValue();
rd.setCreateUser(createdUserName);
// 更新ユーザ名の設定
String updatedUserName;
if (record.getCreateUserId().equals(record.getUpdateUserId())) {
updatedUserName = createdUserName;
} else {
ALEipUser updatedUser =
ALEipUtils.getALEipUser(record.getUpdateUserId().intValue());
updatedUserName = updatedUser.getAliasName().getValue();
}
rd.setUpdateUser(updatedUserName);
rd.setId(record.getWikiId().longValue());
rd.setName(record.getWikiName());
// rd.setCategoryId(record.getCategoryId().longValue());
// rd.setCategoryName(WikiUtils
// .getEipTWikiCategory(record.getCategoryId())
// .getCategoryName());
rd.setNote(record.getNote());
rd.setOwnerId(record.getCreateUserId());
rd.setCreateUser(ALEipUtils
.getALEipUser(record.getCreateUserId())
.getAliasName()
.getValue());
rd.setUpdateUser(ALEipUtils
.getALEipUser(record.getUpdateUserId())
.getAliasName()
.getValue());
rd.setCreateDate(record.getCreateDate());
rd.setUpdateDate(record.getUpdateDate());
rd.setBaseInternalLink(baseImageLink);
rd.setBaseImageRawLink(baseImageRawLink);
rd.setAttachmentFiles(WikiFileUtils
.getAttachmentFiles(record.getWikiId()));
rd.setParentId(record.getParentId());
if (record.getParentId().intValue() != 0) {
EipTWiki parentWiki = WikiUtils.getEipTWiki(record.getParentId());
rd.setParentName(parentWiki.getWikiName());
}
tempOwnerId = rd.getOwnerId().getValue();
return rd;
} catch (Exception e) {
logger.error("WikiSelectData.getResultDataDetail", e);
return null;
}
}
/**
* @return
*
*/
@Override
protected Attributes getColumnMap() {
Attributes map = new Attributes();
map.putValue("wiki_name", EipTWiki.WIKI_NAME_PROPERTY);
map.putValue("parent_name", EipTWiki.PARENT_ID_PROPERTY);
map.putValue("update_user", EipTWiki.UPDATE_USER_ID_PROPERTY);
map.putValue("update_date", EipTWiki.UPDATE_DATE_PROPERTY);
return map;
}
public String getCategoryId() {
return categoryId;
}
public String getCategoryName() {
return categoryName;
}
public List<WikiResultData> getTopWikiList() {
return topWikiList;
}
/**
* @return target_keyword
*/
public ALStringField getTargetKeyword() {
return target_keyword;
}
public List<ALEipGroup> getPostList() {
return postList;
}
public Map<Integer, ALEipPost> getPostMap() {
return ALEipManager.getInstance().getPostMap();
}
public void setTableColumNum(int table_colum_num) {
this.table_colum_num = table_colum_num;
}
public int getTableColumNum() {
return table_colum_num;
}
public String getPostName() {
return postName;
}
public void setFiltersFromPSML(VelocityPortlet portlet, Context context,
RunData rundata) {
ALEipUtils.setTemp(rundata, context, LIST_FILTER_STR, portlet
.getPortletConfig()
.getInitParameter("p12f-filters"));
ALEipUtils.setTemp(rundata, context, LIST_FILTER_TYPE_STR, portlet
.getPortletConfig()
.getInitParameter("p12g-filtertypes"));
}
public void doViewDetailOne(ALAction action, RunData rundata, Context context) {
try {
init(action, rundata, context);
doCheckAclPermission(
rundata,
context,
ALAccessControlConstants.VALUE_ACL_DETAIL);
action.setMode(ALEipConstants.MODE_DETAIL);
String sesFilter = ALEipUtils.getTemp(rundata, context, LIST_FILTER_STR);
String sesFilterType =
ALEipUtils.getTemp(rundata, context, LIST_FILTER_TYPE_STR);
String wikiId = WikiUtils.getWikiIdFromSession(sesFilter, sesFilterType);
EipTWiki obj = null;
String entityId = rundata.getParameters().getString("entityId", "");
if (!StringUtils.isEmpty(entityId)) {
try {
// 子ページ表示
EipTWiki eipTWiki = WikiUtils.getEipTWiki(Integer.parseInt(entityId));
if (eipTWiki != null) {
obj = eipTWiki;
}
} catch (Exception e) {
logger.error("doViewDetailOne", e);
}
} else {
if (WikiUtils.existWiki(wikiId, topWikiList)) {
obj = WikiUtils.getEipTWiki(Integer.parseInt(wikiId));
}
}
if (obj == null) {
obj = WikiUtils.getEipTWikiOne();
}
if (obj != null) {
data = getResultDataDetail(obj);
}
action.setResultData(this);
action.putData(rundata, context);
if (null != data) {
Integer categoryId = 0;
if (obj.getParentId() == 0) {
categoryId = obj.getWikiId();
} else {
categoryId = obj.getParentId();
}
ALEipUtils.setTemp(rundata, context, LIST_FILTER_TYPE_STR, "category");
ALEipUtils.setTemp(rundata, context, LIST_FILTER_STR, String
.valueOf(categoryId));
rundata.getParameters().setString("filtertype", "category");
rundata.getParameters().setString("filter", String.valueOf(categoryId));
setCategory(rundata, context);
parseFilterMap(rundata, context);
}
} catch (ALPageNotFoundException ignore) {
} catch (ALDBErrorException e) {
logger.error("doViewDetailOne", e);
} catch (ALPermissionException e) {
logger.error("doViewDetailOne", e);
}
}
public void setIsTop(boolean isTop) {
this.isTop = isTop;
}
public boolean isTop() {
return isTop;
}
public void setTempNote(String tn, RunData rundata, Context context) {
WikiResultData result = new WikiResultData();
result.initField();
result.setNote(tn);
tempNote = tn;
// 新規作成でなければ、既にアップロードされている添付ファイルを取得する
if (entityId != null) {
result.setId(Long.parseLong(entityId));
result.setOwnerId(tempOwnerId);
result.setBaseImageRawLink(baseImageRawLink);
result.setBaseInternalLink(baseImageLink);
List<FileuploadBean> tempFileuploadList =
WikiFileUtils.getAttachmentFiles(Integer.parseInt(entityId));
result.setAttachmentFiles(tempFileuploadList);
}
tempWikiNote = result.getNote();
}
public String getTempNote() {
return tempNote;
}
public String getTempWikiNote() {
return tempWikiNote;
}
}