/* * 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.report.util; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.TimeZone; import javax.imageio.ImageIO; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.jetspeed.om.security.UserIdPrincipal; import org.apache.jetspeed.services.JetspeedSecurity; import org.apache.jetspeed.services.customlocalization.CustomLocalizationService; 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.util.ServiceUtil; import org.apache.turbine.services.InstantiationException; import org.apache.turbine.services.TurbineServices; import org.apache.turbine.services.localization.LocalizationService; import org.apache.turbine.util.RunData; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.context.Context; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.commons.utils.ALDeleteFileUtil; import com.aimluck.eip.cayenne.om.portlet.EipTBlogFile; import com.aimluck.eip.cayenne.om.portlet.EipTReport; import com.aimluck.eip.cayenne.om.portlet.EipTReportFile; import com.aimluck.eip.cayenne.om.portlet.EipTReportMap; import com.aimluck.eip.cayenne.om.portlet.EipTReportMemberMap; 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.ALEipUser; 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.fileupload.util.FileuploadUtils.ShrinkImageSet; import com.aimluck.eip.mail.util.ALMailUtils; 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.orgutils.ALOrgUtilsService; 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.user.beans.UserLiteBean; import com.aimluck.eip.util.ALCellularUtils; import com.aimluck.eip.util.ALEipUtils; import com.aimluck.eip.util.ALLocalizationUtils; /** * 報告書のユーティリティクラスです。 <BR> * */ public class ReportUtils { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ReportUtils.class.getName()); /** 未読 */ public static final String DB_STATUS_UNREAD = "U"; /** 既読 */ public static final String DB_STATUS_READ = "R"; public static final String DATE_TIME_FORMAT = ALDateTimeField.DEFAULT_DATE_TIME_FORMAT; public static final String REPORT_PORTLET_NAME = "Report"; /** 報告書の添付ファイルを保管するディレクトリの指定 */ public static final String FOLDER_FILEDIR_REPORT = JetspeedResources .getString("aipo.filedir", ""); /** 報告書の添付ファイルを保管するディレクトリのカテゴリキーの指定 */ public static final String CATEGORY_KEY = JetspeedResources.getString( "aipo.report.categorykey", ""); /** デフォルトエンコーディングを表わすシステムプロパティのキー */ public static final String FILE_ENCODING = JetspeedResources.getString( "content.defaultencoding", "UTF-8"); /** データベースに登録されたファイルを表す識別子 */ public static final String PREFIX_DBFILE = "DBF"; /** パラメータリセットの識別子 */ private static final String RESET_FLAG = "reset_params"; /** 検索キーワード変数の識別子 */ public static final String TARGET_KEYWORD = "keyword"; /** * トピックオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param isJoin * カテゴリテーブルをJOINするかどうか * @return */ public static EipTReport getEipTReportParentReply(RunData rundata, Context context, boolean isJoin) throws ALPageNotFoundException, ALDBErrorException { String reportid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { if (reportid == null || Integer.valueOf(reportid) == null) { // トピック ID が空の場合 logger.debug("[EipTReport] Empty ID..."); throw new ALPageNotFoundException(); } int userid = ALEipUtils.getUserId(rundata); SelectQuery<EipTReport> query = Database.query(EipTReport.class); Expression exp1 = ExpressionFactory.matchDbExp(EipTReport.REPORT_ID_PK_COLUMN, Integer .valueOf(reportid)); query.setQualifier(exp1); query.distinct(true); List<EipTReport> reports = query.fetchList(); if (reports == null || reports.size() == 0) { // 指定した トピック ID のレコードが見つからない場合 logger.debug("[ReportTopic] Not found ID..."); throw new ALPageNotFoundException(); } EipTReport report = reports.get(0); // アクセス権限チェック return report; } catch (ALPageNotFoundException pageNotFound) { // logger.error(pageNotFound); throw pageNotFound; } catch (Exception ex) { logger.error("[ReportUtils]", ex); throw new ALDBErrorException(); } } /** * 返信記事オブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param isSuperUser * カテゴリテーブルをJOINするかどうか * @return */ public static EipTReport getEipTReportParentReply(RunData rundata, Context context, String reportid, boolean isSuperUser) throws ALPageNotFoundException, ALDBErrorException { try { if (reportid == null || Integer.valueOf(reportid) == null) { // トピック ID が空の場合 logger.debug("[ReportTopic] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTReport> query = Database.query(EipTReport.class); Expression exp1 = ExpressionFactory.matchDbExp(EipTReport.REPORT_ID_PK_COLUMN, Integer .valueOf(reportid)); query.setQualifier(exp1); if (!isSuperUser) { Expression exp2 = ExpressionFactory.matchExp(EipTReport.USER_ID_PROPERTY, Integer .valueOf(ALEipUtils.getUserId(rundata))); query.andQualifier(exp2); } List<EipTReport> reports = query.fetchList(); if (reports == null || reports.size() == 0) { // 指定した トピック ID のレコードが見つからない場合 logger.debug("[EipTReport] Not found ID..."); throw new ALPageNotFoundException(); } return reports.get(0); } catch (Exception ex) { logger.error("[EipUtils]", ex); throw new ALDBErrorException(); } } public static void deleteFiles(int timelineId, String orgId, int uid, List<String> fpaths) throws ALFileNotRemovedException { ALDeleteFileUtil.deleteFiles( timelineId, EipTReportFile.EIP_TREPORT_PROPERTY, getSaveDirPath(orgId, uid), fpaths, EipTReportFile.class); } public static boolean insertFileDataDelegate(RunData rundata, Context context, EipTReport report, List<FileuploadLiteBean> fileuploadList, String folderName, List<String> msgList) { try { if (fileuploadList == null || fileuploadList.size() <= 0) { fileuploadList = new ArrayList<FileuploadLiteBean>(); } int uid = ALEipUtils.getUserId(rundata); String orgId = Database.getDomainName(); List<Integer> hadfileids = new ArrayList<Integer>(); for (FileuploadLiteBean file : fileuploadList) { if (!file.isNewFile()) { hadfileids.add(file.getFileId()); } } SelectQuery<EipTReportFile> dbquery = Database.query(EipTReportFile.class); dbquery.andQualifier(ExpressionFactory.matchDbExp( EipTReportFile.EIP_TREPORT_PROPERTY, report.getReportId())); List<EipTReportFile> existsFiles = dbquery.fetchList(); List<EipTReportFile> delFiles = new ArrayList<EipTReportFile>(); List<String> fpaths = new ArrayList<String>(); for (EipTReportFile file : existsFiles) { if (!hadfileids.contains(file.getFileId())) { delFiles.add(file); fpaths.add(file.getFilePath()); } } deleteFiles(report.getReportId(), orgId, report.getUserId(), fpaths); // ファイル追加処理 for (FileuploadLiteBean filebean : fileuploadList) { if (!filebean.isNewFile()) { continue; } // サムネイル処理 String[] acceptExts = ImageIO.getWriterFormatNames(); byte[] fileThumbnail = null; ShrinkImageSet bytesShrinkFilebean = FileuploadUtils.getBytesShrinkFilebean( orgId, folderName, uid, filebean, acceptExts, FileuploadUtils.DEF_THUMBNAIL_WIDTH, FileuploadUtils.DEF_THUMBNAIL_HEIGHT, msgList, false); if (bytesShrinkFilebean != null) { fileThumbnail = bytesShrinkFilebean.getShrinkImage(); } String filename = "0_" + String.valueOf(System.nanoTime()); // 新規オブジェクトモデル EipTReportFile file = Database.create(EipTReportFile.class); // 所有者 file.setOwnerId(Integer.valueOf(uid)); // トピックID file.setEipTReport(report); // ファイル名 file.setFileName(filebean.getFileName()); // ファイルパス file.setFilePath(ReportUtils.getRelativePath(filename)); // サムネイル画像 if (fileThumbnail != null) { file.setFileThumbnail(fileThumbnail); } // 作成日 file.setCreateDate(Calendar.getInstance().getTime()); // 更新日 file.setUpdateDate(Calendar.getInstance().getTime()); // ファイルの移動 ALStorageService.copyTmpFile(uid, folderName, String.valueOf(filebean .getFileId()), FOLDER_FILEDIR_REPORT, CATEGORY_KEY + ALStorageService.separator() + uid, filename); } // 添付ファイル保存先のフォルダを削除 ALStorageService.deleteTmpFolder(uid, folderName); } catch (ALFileNotRemovedException fe) { Database.rollback(); logger.error("BlogEntryFormData.deleteFormData", fe); msgList.add(ALLocalizationUtils.getl10n("ERROR_FILE_DETELE_FAILURE")); return false; } catch (Exception e) { Database.rollback(); logger.error("report", e); return false; } return true; } /** * Report オブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param mode_update * @return */ public static EipTReport getEipTReport(RunData rundata, Context context) throws ALDBErrorException { String requestid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { if (requestid == null || Integer.valueOf(requestid) == null) { // Request IDが空の場合 logger.debug("[ReportUtils] Empty ID..."); return null; } SelectQuery<EipTReport> query = Database.query(EipTReport.class); Expression exp1 = ExpressionFactory.matchDbExp(EipTReport.REPORT_ID_PK_COLUMN, requestid); query.setQualifier(exp1); List<EipTReport> requests = query.fetchList(); if (requests == null || requests.size() == 0) { // 指定した Report IDのレコードが見つからない場合 logger.debug("[ReportUtils] Not found ID..."); throw new ALPageNotFoundException(); } return requests.get(0); } catch (ALPageNotFoundException ex) { ALEipUtils.redirectPageNotFound(rundata); return null; } catch (Exception ex) { logger.error("report", ex); throw new ALDBErrorException(); } } /** * Report オブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param mode_update * @return */ public static List<EipTReport> getEipTReport(EipTReport report) throws ALPageNotFoundException { try { SelectQuery<EipTReport> query = Database.query(EipTReport.class); Expression exp = ExpressionFactory.matchExp(EipTReport.REPORT_ID_PK_COLUMN, report); query.setQualifier(exp); return query.fetchList(); } catch (Exception ex) { logger.error("report", ex); return null; } } /** * ファイルオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static EipTReportFile getEipTReportFile(RunData rundata) throws ALPageNotFoundException, ALDBErrorException { try { int attachmentIndex = rundata.getParameters().getInt("attachmentIndex", -1); if (attachmentIndex < 0) { // ID が空の場合 logger.debug("[ReportUtils] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTReportFile> query = Database.query(EipTReportFile.class); Expression exp = ExpressionFactory.matchDbExp(EipTReportFile.FILE_ID_PK_COLUMN, Integer .valueOf(attachmentIndex)); query.andQualifier(exp); List<EipTReportFile> files = query.fetchList(); if (files == null || files.size() == 0) { // 指定した ID のレコードが見つからない場合 logger.debug("[ReportUtils] Not found ID..."); throw new ALPageNotFoundException(); } return files.get(0); } catch (Exception ex) { logger.error("[ReportUtils]", ex); throw new ALDBErrorException(); } } /** * マップオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static List<EipTReportFile> getEipTReportFile(EipTReport report) { try { SelectQuery<EipTReportFile> query = Database.query(EipTReportFile.class); Expression exp = ExpressionFactory.matchDbExp(EipTReportFile.EIP_TREPORT_PROPERTY + "." + EipTReport.REPORT_ID_PK_COLUMN, report.getReportId()); query.setQualifier(exp); List<EipTReportFile> maps = query.fetchList(); if (maps == null || maps.size() == 0) { // 指定した Report IDのレコードが見つからない場合 logger.debug("[ReportSelectData] Not found ID..."); return null; } return maps; } catch (Exception ex) { logger.error("report", ex); return null; } } /** * マップオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static List<EipTReportMap> getEipTReportMap(EipTReport report) { try { SelectQuery<EipTReportMap> query = Database.query(EipTReportMap.class); Expression exp = ExpressionFactory.matchDbExp(EipTReportMap.EIP_TREPORT_PROPERTY + "." + EipTReport.REPORT_ID_PK_COLUMN, report.getReportId()); query.setQualifier(exp); List<EipTReportMap> maps = query.fetchList(); if (maps == null || maps.size() == 0) { // 指定した Report IDのレコードが見つからない場合 logger.debug("[ReportSelectData] Not found ID..."); return null; } return maps; } catch (Exception ex) { logger.error("report", ex); return null; } } /** * マップオブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @return */ public static List<EipTReportMemberMap> getEipTReportMemberMap( EipTReport report) { try { SelectQuery<EipTReportMemberMap> query = Database.query(EipTReportMemberMap.class); Expression exp = ExpressionFactory.matchDbExp(EipTReportMemberMap.EIP_TREPORT_PROPERTY + "." + EipTReport.REPORT_ID_PK_COLUMN, report.getReportId()); query.setQualifier(exp); List<EipTReportMemberMap> members = query.fetchList(); if (members == null || members.size() == 0) { // 指定した Report IDのレコードが見つからない場合 logger.debug("[ReportSelectData] Not found ID..."); return null; } return members; } catch (Exception ex) { logger.error("report", ex); return null; } } /** * ユーザ毎のルート保存先(絶対パス)を取得します。 * * @param uid * @return */ public static String getSaveDirPath(String orgId, int uid) { return ALStorageService.getDocumentPath(FOLDER_FILEDIR_REPORT, CATEGORY_KEY + ALStorageService.separator() + uid); } /** * ユーザ毎の保存先(相対パス)を取得します。 * * @param uid * @return */ public static String getRelativePath(String fileName) { return new StringBuffer().append("/").append(fileName).toString(); } public static List<UserLiteBean> getAuthorityUsers(RunData rundata, String groupname, boolean includeLoginuser) { try { // アクセス権限 ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()) .getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); List<TurbineUser> ulist = aclhandler.getAuthorityUsersFromGroup( rundata, ALAccessControlConstants.POERTLET_FEATURE_REPORT_SELF, groupname, includeLoginuser); List<UserLiteBean> list = new ArrayList<UserLiteBean>(); UserLiteBean user; // ユーザデータを作成し、返却リストへ格納 for (TurbineUser tuser : ulist) { user = new UserLiteBean(); user.initField(); user.setUserId(tuser.getUserId()); user.setName(tuser.getLoginName()); user.setAliasName(tuser.getFirstName(), tuser.getLastName()); list.add(user); } return list; } catch (InstantiationException e) { return null; } } /** * 表示切り替えのリセットフラグがあるかを返す. * * @param rundata * @param context * @return */ public static boolean hasResetFlag(RunData rundata, Context context) { String resetflag = rundata.getParameters().getString(RESET_FLAG); return resetflag != null; } public static void clearReportSession(RunData rundata, Context context) { List<String> list = new ArrayList<String>(); list.add("entityid"); list.add("submenu"); list.add("ReportSelectDatasort"); list.add("ReportSelectDatasorttype"); list.add("ReportSelectDatafiltertype"); list.add("ReportSelectDatafilter"); list.add(TARGET_KEYWORD); ALEipUtils.removeTemp(rundata, context, list); } public static int getViewId(RunData rundata, Context context, int uid) throws ALDBErrorException { int view_uid = -1; EipTReport record = ReportUtils.getEipTReport(rundata, context); if (record != null) { view_uid = record.getUserId(); } 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; } /** * ファイル検索のクエリを返します * * @param requestid * ファイルを検索するリクエストのid * @return query */ public static SelectQuery<EipTReportFile> getSelectQueryForFiles(int requestid) { SelectQuery<EipTReportFile> query = Database.query(EipTReportFile.class); Expression exp = ExpressionFactory.matchDbExp(EipTReport.REPORT_ID_PK_COLUMN, Integer .valueOf(requestid)); query.setQualifier(exp); query.orderAscending(EipTReportFile.UPDATE_DATE_PROPERTY); query.orderAscending(EipTReportFile.FILE_PATH_PROPERTY); return query; } /** * 子のレポート検索のクエリを返します * * @param requestid * レポートを検索するリクエストのid * @return query */ public static SelectQuery<EipTReport> getSelectQueryForCoReports(int requestid) { SelectQuery<EipTReport> query = Database.query(EipTReport.class); Expression exp = ExpressionFactory.matchDbExp(EipTReport.PARENT_ID_PROPERTY, Integer .valueOf(requestid)); query.setQualifier(exp); return query; } /** * 添付ファイルを取得します。 * * @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(ALLocalizationUtils .getl10n("REPORT_PREVIOUS_PICTURE_FILE")); 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("report", e); } finally { try { reader.close(); } catch (Exception e) { logger.error("report", 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<EipTReportFile> reqquery = Database.query(EipTReportFile.class); Expression reqexp1 = ExpressionFactory.inDbExp( EipTBlogFile.FILE_ID_PK_COLUMN, hadfileidsValue); reqquery.setQualifier(reqexp1); List<EipTReportFile> requests = reqquery.fetchList(); int requestssize = requests.size(); for (int i = 0; i < requestssize; i++) { EipTReportFile file = requests.get(i); filebean = new FileuploadBean(); filebean.initField(); filebean.setFileId(file.getFileId()); filebean.setFileName(file.getFileName()); filebean.setFlagNewFile(false); fileNameList.add(filebean); } } catch (Exception ex) { logger.error("[BlogUtils] Exception.", ex); } } return fileNameList; } /** * Date のオブジェクトを指定した形式の文字列に変換する. * * @param date * @param dateFormat * @return */ public static String translateDate(Date date, String dateFormat) { if (date == null) { return "Unknown"; } // 日付を表示形式に変換 SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); sdf.setTimeZone(TimeZone.getDefault()); return sdf.format(date); } /** * 返信記事オブジェクトモデルを取得します。 <BR> * * @param rundata * @param context * @param isSuperUser * カテゴリテーブルをJOINするかどうか * @return */ public static EipTReport getEipTReportReply(RunData rundata, Context context, String reportid, boolean isSuperUser) throws ALPageNotFoundException, ALDBErrorException { try { if (reportid == null || Integer.valueOf(reportid) == null) { // トピック ID が空の場合 logger.debug("[ReportTopic] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTReport> query = Database.query(EipTReport.class); Expression exp1 = ExpressionFactory.matchDbExp(EipTReport.REPORT_ID_PK_COLUMN, Integer .valueOf(reportid)); query.setQualifier(exp1); if (!isSuperUser) { Expression exp2 = ExpressionFactory.matchExp(EipTReport.USER_ID_PROPERTY, Integer .valueOf(ALEipUtils.getUserId(rundata))); query.andQualifier(exp2); } List<EipTReport> reports = query.fetchList(); if (reports == null || reports.size() == 0) { // 指定した トピック ID のレコードが見つからない場合 logger.debug("[Report] Not found ID..."); throw new ALPageNotFoundException(); } return reports.get(0); } catch (Exception ex) { logger.error("[ReportUtils]", ex); throw new ALDBErrorException(); } } /** * アクティビティを通知先・社内参加者の「あなた宛のお知らせ」に表示させる * * @param report * @param loginName * @param recipients * @param type */ public static void createReportActivity(EipTReport report, String loginName, List<String> recipients, Boolean type) { if (recipients != null && recipients.size() > 0) { ALActivity RecentActivity = ALActivity.getRecentActivity("Report", report.getReportId(), 1f); boolean isDeletePrev = RecentActivity != null && RecentActivity.isReplace(loginName); StringBuilder b = new StringBuilder(ALLocalizationUtils.getl10n("REPORT_REPORT") + "「"); b.append(report.getReportName()).append("」").append( type ? ALLocalizationUtils.getl10n("REPORT_SEND_REQUEST_MSG") : ALLocalizationUtils.getl10n("REPORT_UPDATED_MSG")); String portletParams = new StringBuilder("?template=ReportDetailScreen") .append("&entityid=") .append(report.getReportId()) .toString(); ALActivityService.create(new ALActivityPutRequest() .withAppId("Report") .withUserId(report.getUserId()) .withLoginName(loginName) .withPortletParams(portletParams) .withRecipients(recipients) .withTitle(b.toString()) .withPriority(1f) .withExternalId(String.valueOf(report.getReportId()))); if (isDeletePrev) { RecentActivity.delete(); } } } /** * アクティビティを通知先・社内参加者の「あなた宛のお知らせ」に表示させる(返信用) * * @param report * @param loginName * @param recipients * @param type */ public static void createReportReplyActivity(EipTReport report, String loginName, List<String> recipient) { if (recipient != null) { recipient.remove(loginName); ALActivity RecentActivity = ALActivity.getRecentActivity("Report", report.getReportId(), 1f); boolean isDeletePrev = RecentActivity != null && RecentActivity.isReplace(loginName); StringBuilder b = new StringBuilder(ALLocalizationUtils.getl10n("REPORT_REPORT") + "「"); b.append(report.getReportName()).append("」").append( ALLocalizationUtils.getl10n("REPORT_REPLY_MSG")); String portletParams = new StringBuilder("?template=ReportDetailScreen") .append("&entityid=") .append(report.getReportId()) .toString(); ALActivityService.create(new ALActivityPutRequest() .withAppId("Report") .withUserId(report.getUserId()) .withLoginName(loginName) .withPortletParams(portletParams) .withRecipients(recipient) .withTitle(b.toString()) .withPriority(1f) .withExternalId(String.valueOf(report.getReportId()))); if (isDeletePrev) { RecentActivity.delete(); } } } /** * パソコンへ送信するメールの内容を作成する. * * @return */ public static String createMsgForPc(RunData rundata, EipTReport report, List<ALEipUser> memberList, List<ALEipUser> mapList, Boolean isNew) throws ALDBErrorException { VelocityContext context = new VelocityContext(); boolean enableAsp = JetspeedResources.getBoolean("aipo.asp", false); ALEipUser loginUser = null; ALBaseUser user = null; try { loginUser = ALEipUtils.getALEipUser(rundata); user = (ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(loginUser .getUserId() .toString())); } catch (Exception e) { return ""; } context.put("loginUser", loginUser.getAliasName().toString()); context.put("hasEmail", !user.getEmail().equals("")); context.put("email", user.getEmail()); context.put("isNew", isNew); // タイトル context.put("getReportName", report.getReportName()); // 日時(年月日分秒) ALDateTimeField alDateTimeField = new ALDateTimeField(); alDateTimeField.setValue(report.getCreateDate()); StringBuffer createDate = new StringBuffer(); createDate.append(alDateTimeField.getYear()).append( ALLocalizationUtils.getl10nFormat("NOTE_YEAR")).append( alDateTimeField.getMonth()).append( ALLocalizationUtils.getl10nFormat("NOTE_MONTH")).append( alDateTimeField.getDay()).append( ALLocalizationUtils.getl10nFormat("NOTE_DAY")).append( alDateTimeField.getHour()).append( ALLocalizationUtils.getl10nFormat("NOTE_HOUR")).append( alDateTimeField.getMinute()).append( ALLocalizationUtils.getl10nFormat("NOTE_MINUTE")); context.put("createDate", createDate); // 内容 context.put("getNote", report.getNote()); // 社内参加者 StringBuffer reportName = new StringBuffer(); if (memberList != null) { int size = memberList.size(); int i; for (i = 0; i < size; i++) { if (i != 0) { reportName.append(", "); } ALEipUser member = memberList.get(i); reportName.append(member.getAliasName()); } } context.put("reportName", reportName); // 通知先 StringBuffer eipTReportMemberMap = new StringBuffer(); if (mapList != null) { int size = mapList.size(); int i; for (i = 0; i < size; i++) { if (i != 0) { eipTReportMemberMap.append(", "); } ALEipUser member = mapList.get(i); eipTReportMemberMap.append(member.getAliasName()); } } context.put("eipTReportMemberMap", eipTReportMemberMap); // サービス context.put("serviceAlias", ALOrgUtilsService.getAlias()); // サービス(Aipo)へのアクセス context.put("enableAsp", enableAsp); context.put("globalurl", ALMailUtils.getGlobalurl()); context.put("localurl", ALMailUtils.getLocalurl()); CustomLocalizationService locService = (CustomLocalizationService) ServiceUtil .getServiceByName(LocalizationService.SERVICE_NAME); String lang = locService.getLocale(rundata).getLanguage(); StringWriter writer = new StringWriter(); try { if (lang != null && lang.equals("ja")) { Template template = Velocity.getTemplate("portlets/mail/" + lang + "/report-notification-mail.vm", "utf-8"); template.merge(context, writer); } else { Template template = Velocity.getTemplate( "portlets/mail/report-notification-mail.vm", "utf-8"); template.merge(context, writer); } } catch (Exception e) { e.printStackTrace(); } writer.flush(); String ret = writer.getBuffer().toString(); return ret; } /** * 携帯電話へ送信するメールの内容を作成する. * * @return */ public static String createMsgForCellPhone(RunData rundata, EipTReport report, List<ALEipUser> memberList, List<ALEipUser> mapList, Boolean isNew) throws ALDBErrorException { VelocityContext context = new VelocityContext(); boolean enableAsp = JetspeedResources.getBoolean("aipo.asp", false); ALEipUser loginUser = null; ALBaseUser user = null; try { loginUser = ALEipUtils.getALEipUser(rundata); user = (ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(loginUser .getUserId() .toString())); } catch (Exception e) { return ""; } context.put("loginUser", loginUser.getAliasName().toString()); context.put("hasEmail", !user.getEmail().equals("")); context.put("email", user.getEmail()); context.put("isNew", isNew); // タイトル context.put("getReportName", report.getReportName()); // 日時 ALDateTimeField alDateTimeField = new ALDateTimeField(); alDateTimeField.setValue(report.getCreateDate()); StringBuffer createDate = new StringBuffer(); createDate.append(alDateTimeField.getYear()).append( ALLocalizationUtils.getl10nFormat("NOTE_YEAR")).append( alDateTimeField.getMonth()).append( ALLocalizationUtils.getl10nFormat("NOTE_MONTH")).append( alDateTimeField.getDay()).append( ALLocalizationUtils.getl10nFormat("NOTE_DAY")).append( alDateTimeField.getHour()).append( ALLocalizationUtils.getl10nFormat("NOTE_HOUR")).append( alDateTimeField.getMinute()).append( ALLocalizationUtils.getl10nFormat("NOTE_MINUTE")); context.put("createDate", createDate); // 内容 context.put("getNote", report.getNote()); // 社内参加者 StringBuffer reportName = new StringBuffer(); if (memberList != null) { int size = memberList.size(); int i; for (i = 0; i < size; i++) { if (i != 0) { reportName.append(", "); } ALEipUser member = memberList.get(i); reportName.append(member.getAliasName()); } } context.put("reportName", reportName); // 通知先 StringBuffer eipTReportMemberMap = new StringBuffer(); if (mapList != null) { int size = mapList.size(); int i; for (i = 0; i < size; i++) { if (i != 0) { eipTReportMemberMap.append(", "); } ALEipUser member = mapList.get(i); eipTReportMemberMap.append(member.getAliasName()); } } context.put("eipTReportMemberMap", eipTReportMemberMap); // サービス context.put("serviceAlias", ALOrgUtilsService.getAlias()); // サービス(Aipo)へのアクセス context.put("enableAsp", enableAsp); context.put("globalurl", ALMailUtils.getGlobalurl()); context.put("localurl", ALMailUtils.getLocalurl()); CustomLocalizationService locService = (CustomLocalizationService) ServiceUtil .getServiceByName(LocalizationService.SERVICE_NAME); String lang = locService.getLocale(rundata).getLanguage(); StringWriter writer = new StringWriter(); try { if (lang != null && lang.equals("ja")) { Template template = Velocity.getTemplate("portlets/mail/" + lang + "/report-notification-mail.vm", "utf-8"); template.merge(context, writer); } else { Template template = Velocity.getTemplate( "portlets/mail/report-notification-mail.vm", "utf-8"); template.merge(context, writer); } } catch (Exception e) { e.printStackTrace(); } writer.flush(); String ret = writer.getBuffer().toString(); return ret; } /** * パソコンへ送信するメールの内容を作成する(返信用). * * @return */ public static String createReplyMsgForPc(RunData rundata, EipTReport report, EipTReport reportparentreport) { boolean enableAsp = JetspeedResources.getBoolean("aipo.asp", false); ALEipUser loginUser = null; ALBaseUser user = null; try { loginUser = ALEipUtils.getALEipUser(rundata); user = (ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(loginUser .getUserId() .toString())); } catch (Exception e) { return ""; } String CR = System.getProperty("line.separator"); StringBuffer body = new StringBuffer(""); body.append(loginUser.getAliasName().toString()); if (!"".equals(user.getEmail())) { body.append("(").append(user.getEmail()).append(")"); } body.append(ALLocalizationUtils.getl10n("REPORT_REPORT_MSG")).append( ALLocalizationUtils.getl10n("REPORT_REPLY_MSG")).append(CR).append(CR); body .append( "[" + ALLocalizationUtils.getl10n("REPORT_SETFIELDNAME_REPORT_NAME") + "]") .append(CR) .append(reportparentreport.getReportName().toString()) .append(CR); body.append( "[" + ALLocalizationUtils.getl10n("REPORT_RETURN_REPORT_CREATEDATE") + "]").append(CR).append( translateDate(report.getCreateDate(), ALLocalizationUtils .getl10n("REPORT_TIME"))).append(CR); if (report.getNote().toString().length() > 0) { body .append( "[" + ALLocalizationUtils.getl10n("REPORT_RETURN_REPORT_NOTE") + "]") .append(CR) .append(report.getNote().toString()) .append(CR); } body.append(CR); body.append("[").append(ALOrgUtilsService.getAlias()).append( ALLocalizationUtils.getl10n("REPORT_ACCESS") + "]").append(CR); if (enableAsp) { body.append(" ").append(ALMailUtils.getGlobalurl()).append(CR); } else { body .append("・" + ALLocalizationUtils.getl10n("REPORT_OUTSIDE_OFFICE")) .append(CR); body.append(" ").append(ALMailUtils.getGlobalurl()).append(CR); body .append("・" + ALLocalizationUtils.getl10n("REPORT_IN_OFFICE")) .append(CR); body.append(" ").append(ALMailUtils.getLocalurl()).append(CR).append(CR); } body.append("---------------------").append(CR); body.append(ALOrgUtilsService.getAlias()).append(CR); return body.toString(); } /** * 携帯電話へ送信するメールの内容を作成する(返信用). * * @return */ public static String createReplyMsgForCellPhone(RunData rundata, EipTReport report, EipTReport reportparentreport, int destUserID) { ALEipUser loginUser = null; ALBaseUser user = null; try { loginUser = ALEipUtils.getALEipUser(rundata); user = (ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(loginUser .getUserId() .toString())); } catch (Exception e) { return ""; } String CR = System.getProperty("line.separator"); StringBuffer body = new StringBuffer(""); body.append(loginUser.getAliasName().toString()); if (!"".equals(user.getEmail())) { body.append("(").append(user.getEmail()).append(")"); } body.append(ALLocalizationUtils.getl10n("REPORT_REPORT_MSG")).append( ALLocalizationUtils.getl10n("REPORT_REPLY_MSG")).append(CR).append(CR); body .append( "[" + ALLocalizationUtils.getl10n("REPORT_SETFIELDNAME_REPORT_NAME") + "]") .append(CR) .append(reportparentreport.getReportName().toString()) .append(CR); body.append( "[" + ALLocalizationUtils.getl10n("REPORT_RETURN_REPORT_CREATEDATE") + "]").append(CR).append( translateDate(report.getCreateDate(), ALLocalizationUtils .getl10n("REPORT_TIME"))).append(CR); body.append(CR); ALEipUser destUser; try { destUser = ALEipUtils.getALEipUser(destUserID); } catch (ALDBErrorException ex) { logger.error("report", ex); return ""; } body.append("[").append(ALOrgUtilsService.getAlias()).append( ALLocalizationUtils.getl10n("REPORT_ACCESS") + "]").append(CR); body.append(" ").append(ALMailUtils.getGlobalurl()).append("?key=").append( ALCellularUtils.getCellularKey(destUser)).append(CR); body.append("---------------------").append(CR); body.append(ALOrgUtilsService.getAlias()).append(CR); return body.toString(); } /** * フィルターを初期化する. * * @param rundata * @param context * @param className */ public static void resetFilter(RunData rundata, Context context, String className) { ALEipUtils.setTemp(rundata, context, TARGET_KEYWORD, ""); } /** * 表示切り替えで指定した検索キーワードを取得する. * * @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 isSelf(RunData rundata, Context context) { boolean isSelf = false; if (rundata.getParameters().getStringKey("entityid") != null) { SelectQuery<EipTReportMap> q = Database.query(EipTReportMap.class); Expression exp1 = ExpressionFactory.matchExp(EipTReportMap.REPORT_ID_PROPERTY, rundata .getParameters() .getStringKey("entityid") .toString()); q.andQualifier(exp1); List<EipTReportMap> queryList = q.fetchList(); for (EipTReportMap repo : queryList) { if (repo.getUserId() == ALEipUtils.getUserId(rundata)) { isSelf = true; } } } return isSelf; } public static List<EipTReport> getChildReports(Integer reportId) { SelectQuery<EipTReport> rquery = Database.query(EipTReport.class); rquery.andQualifier(ExpressionFactory.matchExp( EipTReport.PARENT_ID_PROPERTY, reportId)); return rquery.fetchList(); } public static List<EipTReportFile> getFiles(Integer reportId) { SelectQuery<EipTReportFile> fquery = Database.query(EipTReportFile.class); fquery.andQualifier(ExpressionFactory.matchExp( EipTReportFile.EIP_TREPORT_PROPERTY, reportId)); return fquery.fetchList(); } }