/* * 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.util; import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.cayenne.DataRow; 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.Portlets; import org.apache.jetspeed.om.security.UserIdPrincipal; import org.apache.jetspeed.services.JetspeedSecurity; 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.services.rundata.JetspeedRunData; import org.apache.jetspeed.util.template.JetspeedLink; import org.apache.jetspeed.util.template.JetspeedLinkFactory; import org.apache.turbine.services.TurbineServices; import org.apache.turbine.util.DynamicURI; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.commons.utils.ALDeleteFileUtil; import com.aimluck.eip.blog.BlogThemaResultData; import com.aimluck.eip.blog.BlogUserResultData; import com.aimluck.eip.cayenne.om.portlet.EipTBlog; import com.aimluck.eip.cayenne.om.portlet.EipTBlogComment; import com.aimluck.eip.cayenne.om.portlet.EipTBlogEntry; import com.aimluck.eip.cayenne.om.portlet.EipTBlogFile; import com.aimluck.eip.cayenne.om.portlet.EipTBlogThema; import com.aimluck.eip.cayenne.om.security.TurbineUser; import com.aimluck.eip.common.ALActivity; import com.aimluck.eip.common.ALBaseUser; import com.aimluck.eip.common.ALDBErrorException; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.common.ALFileNotRemovedException; 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.orm.Database; 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.services.social.ALActivityService; import com.aimluck.eip.services.social.model.ALActivityPutRequest; import com.aimluck.eip.services.storage.ALStorageService; import com.aimluck.eip.util.ALCommonUtils; import com.aimluck.eip.util.ALEipUtils; import com.aimluck.eip.util.ALLocalizationUtils; /** * ブログのユーティリティクラスです。 <BR> * */ public class BlogUtils { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(BlogUtils.class.getName()); public static final String DATE_TIME_FORMAT = ALDateTimeField.DEFAULT_DATE_TIME_FORMAT; public static final String TARGET_GROUP_NAME = "target_group_name"; /** 所有者の識別子 */ public static final String OWNER_ID = "ownerid"; /** 検索キーワードの識別子 */ public static final String SEARCH_WORD = "keyword"; /** グループの識別子 */ public static final String GROUP_ID = "groupid"; /** テーマの識別子 */ public static final String THEME_ID = "themeid"; /** 一時添付ファイル名 */ public static final String ATTACHMENT_TEMP_FILENAME = "file"; /** 一時添付ファイル名を記録するファイル名 */ public static final String ATTACHMENT_TEMP_FILENAME_REMAIND = "file.txt"; /** デフォルトエンコーディングを表わすシステムプロパティのキー */ public static final String FILE_ENCODING = JetspeedResources.getString( "content.defaultencoding", "UTF-8"); /** ブログの添付ファイルを保管するディレクトリの指定 */ public static final String FOLDER_FILEDIR_BLOG = JetspeedResources.getString( "aipo.filedir", ""); /** ブログの添付ファイルを保管するディレクトリのカテゴリキーの指定 */ public static final String CATEGORY_KEY = JetspeedResources.getString( "aipo.blog.categorykey", ""); /** データベースに登録されたファイルを表す識別子 */ public static final String PREFIX_DBFILE = "DBF"; public static final String BLOG_PORTLET_NAME = "Blog"; /** * エントリーオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param isJoin * テーマテーブルをJOINするかどうか * @return * @throws ALDBErrorException */ public static EipTBlogEntry getEipTBlogEntry(RunData rundata, Context context) throws ALDBErrorException { String entryid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); // rundata.getParameters().getString(ALEipConstants.ENTITY_ID); try { if (entryid == null || Integer.valueOf(entryid) == null) { // Todo IDが空の場合 logger.debug("[Blog Entry] Empty ID..."); return null; } SelectQuery<EipTBlogEntry> query = Database.query(EipTBlogEntry.class); Expression exp = ExpressionFactory.matchDbExp(EipTBlogEntry.ENTRY_ID_PK_COLUMN, Integer .valueOf(entryid)); query.setQualifier(exp); List<EipTBlogEntry> entrys = query.fetchList(); if (entrys == null || entrys.size() == 0) { // 指定したエントリーIDのレコードが見つからない場合 logger.debug("[Blog Entry] Not found ID..."); throw new ALPageNotFoundException(); } return entrys.get(0); } catch (ALPageNotFoundException ex) { ALEipUtils.redirectPageNotFound(rundata); return null; } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogEntry", ex); throw new ALDBErrorException(); } } /** * ブログカテゴリ オブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static EipTBlogThema getEipTBlogThema(RunData rundata, Context context) { String themaid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { if (themaid == null || Integer.valueOf(themaid) == null) { // カテゴリIDが空の場合 logger.debug("[Blog] Empty ID..."); return null; } SelectQuery<EipTBlogThema> query = Database.query(EipTBlogThema.class); Expression exp = ExpressionFactory.matchDbExp(EipTBlogThema.THEMA_ID_PK_COLUMN, Integer .valueOf(themaid)); query.setQualifier(exp); List<EipTBlogThema> themas = query.fetchList(); if (themas == null || themas.size() == 0) { // 指定したテーマIDのレコードが見つからない場合 logger.debug("[Blog] Not found ID..."); return null; } return themas.get(0); } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogThema", ex); return null; } } /** * ブログカテゴリ オブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static EipTBlogThema getEipTBlogThema(Long thema_id) { try { EipTBlogThema thema = Database.get(EipTBlogThema.class, thema_id); return thema; } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogThema", ex); return null; } } public static EipTBlog getEipTBlog(RunData rundata, Context context) { try { int uid = ALEipUtils.getUserId(rundata); SelectQuery<EipTBlog> query = Database.query(EipTBlog.class); Expression exp = ExpressionFactory.matchExp(EipTBlog.OWNER_ID_PROPERTY, Integer .valueOf(uid)); query.setQualifier(exp); List<EipTBlog> blogs = query.fetchList(); if (blogs == null || blogs.size() == 0) { // 指定したブログIDのレコードが見つからない場合 logger.debug("[Blog Entry] Not found ID..."); return null; } return blogs.get(0); } catch (Exception ex) { logger.error("BlogUtils.getEipTBlog", ex); return null; } } /** * コメントオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static EipTBlogComment getEipTBlogComment(RunData rundata, Context context, String commentid) throws ALPageNotFoundException, ALDBErrorException { try { if (commentid == null || Integer.valueOf(commentid) == null) { // トピック ID が空の場合 logger.debug("[BlogUtils] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTBlogComment> query = Database.query(EipTBlogComment.class); Expression exp1 = ExpressionFactory.matchDbExp( EipTBlogComment.COMMENT_ID_PK_COLUMN, Integer.valueOf(commentid)); query.setQualifier(exp1); List<EipTBlogComment> comments = query.fetchList(); if (comments == null || comments.size() == 0) { // 指定した トピック ID のレコードが見つからない場合 logger.debug("[BlogUtils] Not found ID..."); throw new ALPageNotFoundException(); } return comments.get(0); } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogComment", ex); throw new ALDBErrorException(); } } /** * ファイルオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static EipTBlogFile getEipTBlogFile(RunData rundata) throws ALPageNotFoundException, ALDBErrorException { try { int ownerid = rundata.getParameters().getInt(BlogUtils.OWNER_ID, -1); int entryid = rundata.getParameters().getInt(ALEipConstants.ENTITY_ID, -1); int fileid = rundata.getParameters().getInt("attachmentIndex", -1); if (ownerid <= 0 || entryid <= 0 || fileid <= 0) { // トピック ID が空の場合 logger.debug("[BlogUtils] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTBlogFile> query = Database.query(EipTBlogFile.class); Expression exp1 = ExpressionFactory.matchDbExp(EipTBlogFile.FILE_ID_PK_COLUMN, Integer .valueOf(fileid)); query.setQualifier(exp1); Expression exp2 = ExpressionFactory.matchExp(EipTBlogFile.OWNER_ID_PROPERTY, Integer .valueOf(ownerid)); query.andQualifier(exp2); Expression exp3 = ExpressionFactory.matchDbExp(EipTBlogEntry.ENTRY_ID_PK_COLUMN, Integer .valueOf(entryid)); query.andQualifier(exp3); List<EipTBlogFile> files = query.fetchList(); if (files == null || files.size() == 0) { // 指定した トピック ID のレコードが見つからない場合 logger.debug("[BlogUtils] Not found ID..."); throw new ALPageNotFoundException(); } return files.get(0); } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogFile", ex); throw new ALDBErrorException(); } } /** * トピックオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param isJoin * カテゴリテーブルをJOINするかどうか * @return */ public static EipTBlogEntry getEipTBlogParentEntry(RunData rundata, Context context) throws ALPageNotFoundException, ALDBErrorException { String entryid = // ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); // midorikawa // if (entryid == null) { // entryid = rundata.getParameters().getString(ALEipConstants.ENTITY_ID); // } // midorikawaend try { if (entryid == null || Integer.valueOf(entryid) == null) { // トピック ID が空の場合 logger.debug("[BlogUtil] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTBlogEntry> query = Database.query(EipTBlogEntry.class); Expression exp = ExpressionFactory.matchDbExp(EipTBlogEntry.ENTRY_ID_PK_COLUMN, Integer .valueOf(entryid)); query.setQualifier(exp); List<EipTBlogEntry> entrys = query.fetchList(); if (entrys == null || entrys.size() == 0) { // 指定した トピック ID のレコードが見つからない場合 logger.debug("[BlogUtils] Not found ID..."); throw new ALPageNotFoundException(); } EipTBlogEntry entry = entrys.get(0); return entry; } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogParentEntry", ex); throw new ALDBErrorException(); } } public static List<BlogThemaResultData> getThemaList(RunData rundata, Context context) { // カテゴリ一覧 ArrayList<BlogThemaResultData> themaList = new ArrayList<BlogThemaResultData>(); try { SelectQuery<EipTBlogThema> query = Database.query(EipTBlogThema.class); query.orderAscending(EipTBlogThema.THEMA_NAME_PROPERTY); List<EipTBlogThema> aList = query.fetchList(); int size = aList.size(); BlogThemaResultData lastRd = new BlogThemaResultData(); lastRd.initField(); for (int i = 0; i < size; i++) { EipTBlogThema record = aList.get(i); if (record.getThemaId() != 1) { BlogThemaResultData rd = new BlogThemaResultData(); rd.initField(); rd.setThemaId(record.getThemaId().longValue()); rd.setThemaName(record.getThemaName()); themaList.add(rd); } else { lastRd.setThemaId(record.getThemaId().longValue()); lastRd.setThemaName(record.getThemaName()); } } themaList.add(lastRd); } catch (Exception ex) { logger.error("BlogUtils.getThemaList", ex); return null; } return themaList; } 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; } /** * 顔写真の有無の情報をもつユーザオブジェクトの一覧を取得する. * * @param org_id * @param groupname * @return */ public static List<BlogUserResultData> getBlogUserResultDataList( String groupname) { List<BlogUserResultData> list = new ArrayList<BlogUserResultData>(); // SQLの作成 StringBuffer statement = new StringBuffer(); statement.append("SELECT DISTINCT "); statement .append(" B.USER_ID, B.LOGIN_NAME, B.FIRST_NAME, B.LAST_NAME, B.HAS_PHOTO, B.PHOTO_MODIFIED, D.POSITION "); statement.append("FROM turbine_user_group_role as A "); statement.append("LEFT JOIN turbine_user as B "); statement.append(" on A.USER_ID = B.USER_ID "); statement.append("LEFT JOIN turbine_group as C "); statement.append(" on A.GROUP_ID = C.GROUP_ID "); statement.append("LEFT JOIN eip_m_user_position as D "); statement.append(" on A.USER_ID = D.USER_ID "); statement.append("WHERE B.USER_ID > 3 AND B.DISABLED = 'F'"); statement.append(" AND C.GROUP_NAME = #bind($groupname) "); statement.append("ORDER BY D.POSITION"); String query = statement.toString(); try { // List ulist = BasePeer.executeQuery(query, org_id); List<DataRow> ulist = Database .sql(TurbineUser.class, query) .param("groupname", groupname) .fetchListAsDataRow(); int recNum = ulist.size(); DataRow dataRow; BlogUserResultData user; // ユーザデータを作成し、返却リストへ格納 for (int j = 0; j < recNum; j++) { dataRow = ulist.get(j); user = new BlogUserResultData(); user.initField(); user.setUserId((Integer) Database.getFromDataRow( dataRow, TurbineUser.USER_ID_PK_COLUMN)); user.setName((String) Database.getFromDataRow( dataRow, TurbineUser.LOGIN_NAME_COLUMN)); user.setAliasName((String) Database.getFromDataRow( dataRow, TurbineUser.FIRST_NAME_COLUMN), (String) Database.getFromDataRow( dataRow, TurbineUser.LAST_NAME_COLUMN)); user.setHasPhoto("T".equals(Database.getFromDataRow( dataRow, TurbineUser.HAS_PHOTO_COLUMN)) || "N".equals(Database.getFromDataRow( dataRow, TurbineUser.HAS_PHOTO_COLUMN))); Object photoModified = Database.getFromDataRow(dataRow, TurbineUser.PHOTO_MODIFIED_COLUMN); Date date = new Date(); try { date = (Date) photoModified; } catch (Throwable ignore) { } user.setPhotoModified(date.getTime()); list.add(user); } } catch (Exception ex) { logger.error("BlogUtils.getBlogUserResultDataList", ex); } return list; } /** * ユーザ情報の取得 * * @param userid * ユーザID * @return */ public static ALBaseUser getBaseUser(int userid) { String uid = String.valueOf(userid); try { if ("".equals(uid)) { logger.debug("Empty ID..."); return null; } return (ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(uid)); } catch (Exception ex) { logger.error("BlogUtils.getBaseUser", ex); return null; } } public static String getUserFullName(int userid) { String userName = ""; ALBaseUser user = getBaseUser(userid); if (user != null) { userName = new StringBuffer().append(user.getLastName()).append(" ").append( user.getFirstName()).toString(); } return userName; } /** * 保持されるタグは a、wbr の2種類。 brも保持したい場合はコメントアウトを外すこと。 * * @param src * 圧縮したい文字列 * @return 上記のタグを除いて100文字以下の文字列。有効なタグは保持される。 */ public static String compressString(String src) { final int ALLOWED_MAX_LENGTH = 100; if (src == null || src.length() <= ALLOWED_MAX_LENGTH) { return src; } String a = "<a .+?>"; String _a = "</a>"; String wbr = "<wbr/>|<wbr>|<wbr />"; // String br = "<br/>|<br>|<br />"; StringBuilder sb = new StringBuilder(); sb.append(a); sb.append("|"); sb.append(_a); sb.append("|"); sb.append(wbr); // sb.append("|"); // sb.append(br); String regex = sb.toString(); Matcher m = Pattern.compile(regex).matcher(src); int allowed_max_length_added_tags = ALLOWED_MAX_LENGTH; while (m.find() && m.start() < allowed_max_length_added_tags) { allowed_max_length_added_tags += m.group().length(); } if (src.length() > allowed_max_length_added_tags) { src = src.substring(0, allowed_max_length_added_tags); Matcher am = Pattern.compile(a).matcher(src); int stt_a = 0; while (am.find()) { stt_a++; } Matcher _am = Pattern.compile(_a).matcher(src); int end_a = 0; while (_am.find()) { end_a++; } for (int i = 0; i < stt_a - end_a; i++) { // aタグが入れ子でない限り、差は必ず0か1 src = src.concat("</a>"); } src = src.concat(ALLocalizationUtils.getl10n("WAR_LONG_ROUND")); } return src; } /** * 指定したエントリー名を持つ個人設定ページに含まれるポートレットへの URI を取得する. * * @param rundata * @param portletEntryName * PSML ファイルに記述されているタグ entry の要素 parent * @return */ public static String getPortletURIinPersonalConfigPane(RunData rundata, String portletEntryName) { try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return 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].getParent().equals(portletEntryName)) { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getLink( JetspeedLink.CURRENT, null, null, JetspeedLink.CURRENT, null); duri = duri .addPathInfo( JetspeedResources.PATH_PANEID_KEY, portletList[i].getId() + "," + entries[j].getId()) .addQueryData( JetspeedResources.PATH_ACTION_KEY, "controls.Restore"); return duri.toString(); } } } } catch (Exception ex) { logger.error("BlogUtils.getPortletURIinPersonalConfigPane", ex); return null; } return null; } public static void deleteFiles(int timelineId, String orgId, int uid, List<String> fpaths) throws ALFileNotRemovedException { ALDeleteFileUtil.deleteFiles( timelineId, EipTBlogFile.EIP_TBLOG_ENTRY_PROPERTY, getSaveDirPath(orgId, uid), fpaths, EipTBlogFile.class); } /** * ユーザ毎のルート保存先(絶対パス)を取得します。 * * @param uid * @return */ public static String getSaveDirPath(String orgId, int uid) { return ALStorageService.getDocumentPath(FOLDER_FILEDIR_BLOG, CATEGORY_KEY + ALStorageService.separator() + uid); } /** * ユーザ毎の保存先(相対パス)を取得します。 * * @param uid * @return */ public static String getRelativePath(String fileName) { return new StringBuffer().append("/").append(fileName).toString(); } /** * 添付ファイルを取得します。 * * @param uid * @return */ public static ArrayList<FileuploadLiteBean> getFileuploadList(RunData rundata) { String[] fileids = rundata .getParameters() .getStrings(FileuploadUtils.KEY_FILEUPLOAD_ID_LIST); 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; int fileid = 0; // 新規にアップロードされたファイルの処理 if (newfileids.size() > 0) { String folderName = rundata.getParameters().getString( FileuploadUtils.KEY_FILEUPLOAD_FODLER_NAME); if (folderName == null || folderName.equals("")) { return null; } int length = newfileids.size(); for (int i = 0; i < length; i++) { if (newfileids.get(i) == null || newfileids.get(i).equals("")) { continue; } try { fileid = Integer.parseInt(newfileids.get(i)); } 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 .getTmpFile(ALEipUtils.getUserId(rundata), 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(fileids[i]); filebean.setFileId(fileid); filebean.setFileName(line); fileNameList.add(filebean); } catch (Exception e) { logger.error("BlogUtils.getFileuploadList", e); } finally { try { reader.close(); } catch (Exception e) { logger.error("BlogUtils.getFileuploadList", e); } } } } } if (hadfileids.size() > 0) { // すでにあるファイルの処理 ArrayList<Integer> hadfileidsValue = new ArrayList<Integer>(); for (int k = 0; k < hadfileids.size(); k++) { try { fileid = Integer.parseInt(hadfileids.get(k)); hadfileidsValue.add(fileid); } catch (Exception e) { continue; } } try { SelectQuery<EipTBlogFile> reqquery = Database.query(EipTBlogFile.class); Expression reqexp1 = ExpressionFactory.inDbExp( EipTBlogFile.FILE_ID_PK_COLUMN, hadfileidsValue); reqquery.setQualifier(reqexp1); List<EipTBlogFile> requests = reqquery.fetchList(); int requestssize = requests.size(); for (int i = 0; i < requestssize; i++) { EipTBlogFile file = requests.get(i); filebean = new FileuploadBean(); filebean.initField(); filebean.setFileId(file.getFileId()); filebean.setFileName(file.getTitle()); filebean.setFlagNewFile(false); fileNameList.add(filebean); } } catch (Exception ex) { logger.error("BlogUtils.getFileuploadList", ex); } } return fileNameList; } /** * ファイルオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static List<EipTBlogFile> getEipTBlogFileList(int entryId) { try { SelectQuery<EipTBlogFile> query = Database.query(EipTBlogFile.class); Expression exp = ExpressionFactory.matchExp( EipTBlogFile.EIP_TBLOG_ENTRY_PROPERTY, Integer.valueOf(entryId)); query.setQualifier(exp); List<EipTBlogFile> files = query.fetchList(); if (files == null || files.size() == 0) { return null; } return files; } catch (Exception ex) { logger.error("BlogUtils.getEipTBlogFileList", ex); return null; } } public static boolean hasMinimumAuthority(RunData rundata) { ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); boolean hasAuthority = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), ALAccessControlConstants.POERTLET_FEATURE_BLOG_ENTRY_SELF, ALAccessControlConstants.VALUE_ACL_LIST); if (!hasAuthority) { ALEipUtils.redirectPermissionError(rundata); return false; } return true; } public static void createNewBlogActivity(EipTBlogEntry blog, String loginName, int loginId, boolean isNew) { ALActivity RecentActivity = ALActivity.getRecentActivity("Blog", blog.getEntryId(), 0f); boolean isDeletePrev = RecentActivity != null && RecentActivity.isReplace(loginName); String title = new StringBuilder("ブログ「").append(blog.getTitle()).append( isNew ? "」を書きました。" : "」を編集しました。").toString(); String portletParams = new StringBuilder("?template=BlogDetailScreen") .append("&entityid=") .append(blog.getEntryId()) .toString(); ALActivityService.create(new ALActivityPutRequest() .withAppId("Blog") .withLoginName(loginName) .withUserId(loginId) .withPortletParams(portletParams) .withTitle(title) .withPriority(0f) .withExternalId(String.valueOf(blog.getEntryId()))); if (isDeletePrev) { RecentActivity.delete(); } } // public static void createNewCommentActivity(EipTBlogEntry blog, // String loginName, List<String> recipients) { // recipients.remove(loginName); // // ALActivity RecentActivity = // ALActivity.getRecentActivity("Blog", blog.getEntryId(), 1f); // boolean isDeletePrev = // RecentActivity != null && RecentActivity.isReplace(loginName); // // String title = // new StringBuilder("ブログ「") // .append(ALCommonUtils.compressString(blog.getTitle(), 30)) // .append("」にコメントしました。") // .toString(); // String portletParams = // new StringBuilder("?template=BlogDetailScreen") // .append("&entityid=") // .append(blog.getEntryId()) // .toString(); // ALActivityService.create(new ALActivityPutRequest() // .withAppId("Blog") // .withUserId(blog.getOwnerId()) // .withLoginName(loginName) // .withPortletParams(portletParams) // .withRecipients(recipients) // .withTitle(title) // .withPriority(1f) // .withExternalId(String.valueOf(blog.getEntryId()))); // // if (isDeletePrev) { // RecentActivity.delete(); // } // } /** * アクティビティを通知先・社内参加者の「あなた宛のお知らせ」に表示させる(返信用) * * @param topic * @param loginName * @param recipients */ public static void createNewBlogTopicActivity(EipTBlogEntry blog, String loginName, List<String> recipient, EipTBlogComment blogcomment) { // recipient.remove(loginName); ALActivity RecentActivity = ALActivity.getRecentActivity("Blog", blog.getEntryId(), 1f); boolean isDeletePrev = RecentActivity != null && RecentActivity.isReplace(loginName); if (recipient != null) { StringBuilder b = new StringBuilder("ブログ「"); b .append(ALCommonUtils.compressString(blog.getTitle(), 30)) .append("」") .append("にコメントしました。"); String portletParams = new StringBuilder("?template=BlogDetailScreen") .append("&entityid=") .append(blog.getEntryId()) .toString(); ALActivityService.create(new ALActivityPutRequest() .withAppId("Blog") .withUserId(blogcomment.getOwnerId()) .withLoginName(loginName) .withPortletParams(portletParams) .withRecipients(recipient) .withTitle(b.toString()) .withPriority(1f) .withExternalId(String.valueOf(blog.getEntryId()))); } else { StringBuilder b = new StringBuilder("ブログ「"); b .append(ALCommonUtils.compressString(blog.getTitle(), 30)) .append("」") .append("にコメントしました。"); String portletParams = new StringBuilder("?template=MsgboardTopicDetailScreen").append( "&entityid=").append(blog.getEntryId()).toString(); ALActivityService.create(new ALActivityPutRequest() .withAppId("Blog") .withUserId(blogcomment.getOwnerId()) .withLoginName(loginName) .withPortletParams(portletParams) .withTitle(b.toString()) .withPriority(1f) .withExternalId(String.valueOf(blog.getEntryId()))); } if (isDeletePrev) { RecentActivity.delete(); } } public static void createNewCommentActivity(EipTBlogEntry blog, String loginName, EipTBlogComment blogcomment) { createNewCommentActivity(blog, loginName, null, blogcomment); } public static void createNewCommentActivity(EipTBlogEntry blog, String loginName, List<String> recipients, EipTBlogComment blogcomment) { String title = new StringBuilder("ブログ「").append( ALCommonUtils.compressString(blog.getTitle(), 30)).append("」に").append( "コメントしました。").toString(); String portletParams = new StringBuilder("?template=BlogDetailScreen") .append("&entityid=") .append(blog.getEntryId()) .toString(); if (recipients != null && recipients.size() > 0) { ALActivityService.create(new ALActivityPutRequest() .withAppId("Blog") .withUserId(blogcomment.getOwnerId()) .withLoginName(loginName) .withPortletParams(portletParams) .withRecipients(recipients) .withTitle(title) .withPriority(0f) .withExternalId(String.valueOf(blog.getEntryId()))); } else { ALActivityService.create(new ALActivityPutRequest() .withUserId(blogcomment.getOwnerId()) .withAppId("Blog") .withLoginName(loginName) .withPortletParams(portletParams) .withTitle(title) .withPriority(0f) .withExternalId(String.valueOf(blog.getEntryId()))); } } /** * 検索クエリ用の所有者IDを取得します。 * * @param rundata * @param context * @return */ public static String getOwnerId(RunData rundata, Context context) { String ownerId = null; String ownerIdParam = rundata.getParameters().getString(OWNER_ID); ownerId = ALEipUtils.getTemp(rundata, context, OWNER_ID); if (ownerIdParam == null && (ownerId == null)) { ALEipUtils.setTemp(rundata, context, OWNER_ID, "all"); ownerId = "all"; } else if (ownerIdParam != null) { ALEipUtils.setTemp(rundata, context, OWNER_ID, ownerIdParam); ownerId = ownerIdParam; // 検索キーワードをクリア ALEipUtils.setTemp(rundata, context, SEARCH_WORD, ""); } return ownerId; } /** * 検索クエリ用のキーワードを取得します。 * * @param rundata * @param context * @return */ public static String getKeyword(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; } /** * 検索クエリ用のテーマIDを取得します。 * * @param rundata * @param context * @return */ public static String getThemeId(RunData rundata, Context context) { String themeId = null; String themeIdParam = rundata.getParameters().getString(THEME_ID); themeId = ALEipUtils.getTemp(rundata, context, THEME_ID); if (themeIdParam == null && (themeId == null)) { ALEipUtils.setTemp(rundata, context, THEME_ID, "all"); themeId = "all"; } else if (themeIdParam != null) { themeIdParam = themeIdParam.trim(); ALEipUtils.setTemp(rundata, context, THEME_ID, themeIdParam); themeId = themeIdParam; // 検索キーワードをクリア ALEipUtils.setTemp(rundata, context, SEARCH_WORD, ""); } return themeId; } /** * 表示されているグループIDを取得します。 * * @param rundata * @param context * @return */ public static String getGroupId(RunData rundata, Context context) { String groupId = null; String groupIdParam = rundata.getParameters().getString(GROUP_ID); groupId = ALEipUtils.getTemp(rundata, context, GROUP_ID); if (groupIdParam == null && (groupId == null)) { ALEipUtils.setTemp(rundata, context, GROUP_ID, "LoginUser"); groupId = "LoginUser"; } else if (groupIdParam != null) { groupIdParam = groupIdParam.trim(); ALEipUtils.setTemp(rundata, context, GROUP_ID, groupIdParam); groupId = groupIdParam; } return groupId; } /** * ブログ固有のフィルタをクエリに適用します * * @param query * @param rundata * @param context * @return */ public static SelectQuery<EipTBlogEntry> buildSelectQueryForBlogFilter( SelectQuery<EipTBlogEntry> query, RunData rundata, Context context, boolean hasBlogOtherAclList) { // 所有者 String ownerId = BlogUtils.getOwnerId(rundata, context); if (!hasBlogOtherAclList) { Expression exp = ExpressionFactory.matchDbExp(EipTBlogEntry.OWNER_ID_COLUMN, ALEipUtils .getUserId(rundata)); query.andQualifier(exp); } else if (!ownerId.equals("all")) { Expression exp = ExpressionFactory.matchDbExp(EipTBlogEntry.OWNER_ID_COLUMN, ownerId); query.andQualifier(exp); } // テーマ String themeId = BlogUtils.getThemeId(rundata, context); if (!themeId.equals("all")) { Expression exp = ExpressionFactory.matchExp( EipTBlogEntry.EIP_TBLOG_THEMA_PROPERTY, themeId); query.andQualifier(exp); } // 検索キーワード String queryKeyword = BlogUtils.getKeyword(rundata, context); String[] keywords = queryKeyword.split("[  ]"); for (int i = 0; i < keywords.length; i++) { String keyword = keywords[i]; if (keyword.length() > 0) { String keywordExp = MessageFormat.format("%{0}%", keyword); Expression exp1 = ExpressionFactory.likeExp(EipTBlogEntry.TITLE_PROPERTY, keywordExp); Expression exp2 = ExpressionFactory.likeExp(EipTBlogEntry.NOTE_PROPERTY, keywordExp); Expression exp = exp1.orExp(exp2); query.andQualifier(exp); } } return query; } /** * アクセス権限をチェックします。 * * @return */ public static boolean checkPermission(RunData rundata, Context context, int defineAclType, String pfeature) { if (defineAclType == 0) { return true; } if (pfeature == null || "".equals(pfeature)) { return true; } ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); boolean hasAuthority = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), pfeature, defineAclType); return hasAuthority; } public static int getViewId(RunData rundata, Context context, int uid) throws ALDBErrorException { int view_uid = -1; EipTBlogEntry record = BlogUtils.getEipTBlogEntry(rundata, context); if (record != null) { view_uid = record.getOwnerId(); } else { if (rundata.getParameters().containsKey("view_uid")) { view_uid = Integer.parseInt(rundata.getParameters().getString("view_uid")); } else { view_uid = uid; } } ALEipUtils.setTemp(rundata, context, "view_uid", String.valueOf(view_uid)); return view_uid; } public static int getCommentViewId(RunData rundata, Context context, int uid, String commentid) throws ALDBErrorException, ALPageNotFoundException { int view_uid = -1; EipTBlogComment record = BlogUtils.getEipTBlogComment(rundata, context, commentid); if (record != null) { view_uid = record.getOwnerId(); } else { if (rundata.getParameters().containsKey("comment_view_uid")) { view_uid = Integer.parseInt(rundata .getParameters() .getString("comment_view_uid")); } else { view_uid = uid; } } ALEipUtils.setTemp(rundata, context, "comment_view_uid", String .valueOf(view_uid)); return view_uid; } }