/* * 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.blog; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.jar.Attributes; import org.apache.cayenne.DataRow; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.turbine.services.TurbineServices; 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.EipTBlogComment; import com.aimluck.eip.cayenne.om.portlet.EipTBlogEntry; import com.aimluck.eip.common.ALAbstractSelectData; import com.aimluck.eip.common.ALDBErrorException; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.common.ALEipManager; import com.aimluck.eip.common.ALPageNotFoundException; 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.services.accessctl.ALAccessControlFactoryService; import com.aimluck.eip.services.accessctl.ALAccessControlHandler; import com.aimluck.eip.util.ALCommonUtils; import com.aimluck.eip.util.ALEipUtils; /** * ブログエントリー検索ボックス用データです。 * */ public class BlogWordSelectData extends ALAbstractSelectData<DataRow, DataRow> { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(BlogWordSelectData.class.getName()); /** 検索ワード */ private ALStringField searchWord; private final List<Integer> users = new ArrayList<Integer>(); /** * * @param action * @param rundata * @param context * @throws ALPageNotFoundException * @throws ALDBErrorException */ @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 || sort.equals("")) { ALEipUtils.setTemp(rundata, context, LIST_SORT_STR, "name_kana"); } super.init(action, rundata, context); } /** * 自分がオーナーのアドレスを取得 * * @param rundata * @param context * @return */ @Override protected ResultList<DataRow> selectList(RunData rundata, Context context) { List<DataRow> list; // ページャからきた場合に検索ワードをセッションへ格納する if (!rundata.getParameters().containsKey(ALEipConstants.LIST_START) && !rundata.getParameters().containsKey(ALEipConstants.LIST_SORT)) { ALEipUtils.setTemp(rundata, context, "Blogsword", rundata .getParameters() .getString("sword")); } // 検索ワードの設定 searchWord = new ALStringField(); searchWord.setTrim(true); // セッションから値を取得する。 // 検索ワード未指定時は空文字が入力される searchWord.setValue(ALEipUtils.getTemp(rundata, context, "Blogsword")); try { list = searchList(rundata, context); if (list == null) { list = new ArrayList<DataRow>(); } } catch (Exception ex) { logger.error("blog", ex); return null; } int totalSize = list.size(); list = buildPaginatedList(list); return new ResultList<DataRow>(list, current_page, getRowsNum(), totalSize); } /** * * @param rundata * @param context * @return */ @Override protected DataRow selectDetail(RunData rundata, Context context) { return null; } /** * */ @Override protected Object getResultData(DataRow obj) { try { DataRow dataRow = obj; Integer entry_id = (Integer) Database.getFromDataRow( dataRow, EipTBlogEntry.ENTRY_ID_PK_COLUMN); Integer ower_id = (Integer) Database.getFromDataRow( dataRow, EipTBlogEntry.OWNER_ID_COLUMN); BlogEntryResultData rd = new BlogEntryResultData(); rd.initField(); rd.setEntryId(entry_id.longValue()); rd.setOwnerId(ower_id); rd.setTitle(ALCommonUtils.compressString((String) Database .getFromDataRow(dataRow, EipTBlogEntry.TITLE_COLUMN), getStrLength())); rd.setNote(((String) Database.getFromDataRow( dataRow, EipTBlogEntry.NOTE_COLUMN)).replaceAll("\\r\\n", " ").replaceAll( "\\n", " ").replaceAll("\\r", " ")); rd.setTitleDate((Date) Database.getFromDataRow( dataRow, EipTBlogEntry.CREATE_DATE_COLUMN)); SelectQuery<EipTBlogComment> query = Database.query(EipTBlogComment.class); Expression exp = ExpressionFactory.matchDbExp(EipTBlogComment.EIP_TBLOG_ENTRY_PROPERTY + "." + EipTBlogEntry.ENTRY_ID_PK_COLUMN, entry_id); query.setQualifier(exp); List<EipTBlogComment> list = query.fetchList(); if (list != null && list.size() > 0) { rd.setCommentsNum(list.size()); } if (!users.contains(ower_id)) { users.add(ower_id); } return rd; } catch (Exception ex) { logger.error("blog", ex); return null; } } /** * * @param obj * @return */ @Override protected Object getResultDataDetail(DataRow obj) { return null; } /** * */ @Override protected Attributes getColumnMap() { Attributes map = new Attributes(); return map; } private List<DataRow> searchList(RunData rundata, Context context) { List<DataRow> list = null; try { int uid = ALEipUtils.getUserId(rundata); ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()) .getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); boolean hasAuthority = aclhandler.hasAuthority( uid, ALAccessControlConstants.POERTLET_FEATURE_BLOG_ENTRY_OTHER, ALAccessControlConstants.VALUE_ACL_LIST); String word = searchWord.getValue(); if (word == null || word.length() == 0) { return new ArrayList<DataRow>(); } word = '%' + word + '%'; // SQLの作成 StringBuffer statement = new StringBuffer(); statement .append("SELECT DISTINCT t0.entry_id, t0.owner_id, t0.title, t0.note, "); statement.append("t0.thema_id, t0.update_date, t0.create_date "); statement .append("FROM eip_t_blog_entry as t0 left join eip_t_blog_comment as t1 on t1.entry_id = t0.entry_id "); statement.append("WHERE ((t0.title LIKE #bind($word))"); statement.append(" OR (t0.note LIKE #bind($word))"); statement .append(" OR (t0.entry_id = t1.entry_id AND (t1.comment LIKE #bind($word)))) "); if (!hasAuthority) { statement.append(" AND (t0.owner_id = " + uid + ") "); } statement.append("ORDER BY t0.create_date DESC"); String query = statement.toString(); list = Database .sql(EipTBlogEntry.class, query) .param("word", word) .fetchListAsDataRow(); } catch (Exception e) { logger.error(e); return new ArrayList<DataRow>(); } return list; } /** * 検索ワードを取得します。 * * @return */ public ALStringField getSearchWord() { return searchWord; } @Override public boolean doViewList(ALAction action, RunData rundata, Context context) { boolean result = super.doViewList(action, rundata, context); loadAggregateUsers(); return result; } protected void loadAggregateUsers() { ALEipManager.getInstance().getUsers(users); } }