/*
* 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.workflow.util;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TimeZone;
import javax.imageio.ImageIO;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.fulcrum.localization.LocalizationService;
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.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.EipTWorkflowCategory;
import com.aimluck.eip.cayenne.om.portlet.EipTWorkflowFile;
import com.aimluck.eip.cayenne.om.portlet.EipTWorkflowRequest;
import com.aimluck.eip.cayenne.om.portlet.EipTWorkflowRequestMap;
import com.aimluck.eip.cayenne.om.portlet.EipTWorkflowRoute;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.common.ALActivity;
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.ALAdminMailContext;
import com.aimluck.eip.mail.ALAdminMailMessage;
import com.aimluck.eip.mail.ALMailService;
import com.aimluck.eip.mail.util.ALEipUserAddr;
import com.aimluck.eip.mail.util.ALMailUtils;
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.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.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
import com.aimluck.eip.workflow.WorkflowCategoryResultData;
import com.aimluck.eip.workflow.WorkflowDecisionRecordData;
import com.aimluck.eip.workflow.WorkflowDetailResultData;
import com.aimluck.eip.workflow.WorkflowOldRequestResultData;
import com.aimluck.eip.workflow.WorkflowRouteResultData;
import com.aimluck.eip.workflow.beans.WorkflowMailBean;
/**
* ワークフローのユーティリティクラスです。 <BR>
*
*/
public class WorkflowUtils {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(WorkflowUtils.class.getName());
/** 申請 */
public static final String DB_STATUS_REQUEST = "R";
/** 確認中 */
public static final String DB_STATUS_CONFIRM = "C";
/** 確認前 */
public static final String DB_STATUS_WAIT = "W";
/** 承認 */
public static final String DB_STATUS_ACCEPT = "A";
/** 否認 */
public static final String DB_STATUS_DENIAL = "D";
/** 削除・無効化のため自動承認 */
public static final String DB_STATUS_THROUGH = "T";
/** すべて承認 */
public static final String DB_PROGRESS_ACCEPT = "A";
/** 確認中 */
public static final String DB_PROGRESS_WAIT = "W";
/** 申請者に差し戻し */
public static final String DB_PROGRESS_DENAIL = "D";
/** 差し戻し後、再申請済み */
public static final String DB_PROGRESS_REAPPLY = "R";
/** データベースに登録されたファイルを表す識別子 */
public static final String PREFIX_DBFILE = "DBF";
/** デフォルトエンコーディングを表わすシステムプロパティのキー */
public static final String FILE_ENCODING = JetspeedResources.getString(
"content.defaultencoding",
"UTF-8");
/** ワークフローの添付ファイルを保管するディレクトリの指定 */
private static final String FOLDER_FILEDIR_WORKFLOW = JetspeedResources
.getString("aipo.filedir", "");
/** ワークフローの添付ファイルを保管するディレクトリのカテゴリキーの指定 */
protected static final String CATEGORY_KEY = JetspeedResources.getString(
"aipo.workflow.categorykey",
"");
public enum Type {
REQUEST, DENAIL, ACCEPT
}
public static final String WORKFLOW_PORTLET_NAME = "Workflow";
public static final String WORKFLOW_CATEGORY_PORTLET_NAME =
"WorkflowCategory";
/** 検索キーワード変数の識別子 */
public static final String TARGET_KEYWORD = "keyword";
/** パラメータリセットの識別子 */
private static final String RESET_FLAG = "reset_params";
/**
* Request オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static EipTWorkflowRequest getEipTWorkflowRequest(RunData rundata,
Context context, boolean mode_update) throws ALPageNotFoundException {
int uid = ALEipUtils.getUserId(rundata);
String requestid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (requestid == null || Integer.valueOf(requestid) == null) {
// Request IDが空の場合
logger.debug("[WorkflowUtils] Empty ID...");
throw new ALPageNotFoundException();
}
SelectQuery<EipTWorkflowRequest> query =
Database.query(EipTWorkflowRequest.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
requestid);
query.setQualifier(exp1);
if (mode_update) {
Expression exp3 =
ExpressionFactory.matchExp(
EipTWorkflowRequest.EIP_TWORKFLOW_REQUEST_MAP_PROPERTY
+ "."
+ EipTWorkflowRequestMap.STATUS_PROPERTY,
DB_STATUS_CONFIRM);
query.andQualifier(exp3);
Expression exp4 =
ExpressionFactory.matchExp(
EipTWorkflowRequest.PROGRESS_PROPERTY,
DB_PROGRESS_WAIT);
query.andQualifier(exp4);
}
List<EipTWorkflowRequest> requests = query.fetchList();
if (requests == null || requests.size() == 0) {
// 指定した Request IDのレコードが見つからない場合
logger.debug("[WorkflowUtils] Not found ID...");
throw new ALPageNotFoundException();
}
// アクセス権の判定
Set<Integer> relatedUserIds = getRelatedUserIdList(requests.get(0));
if (!relatedUserIds.contains(uid)) {
// 指定したアカウントIDのレコードが見つからない場合
logger.debug("[WorkFlow] Invalid user access...");
throw new ALPageNotFoundException();
}
return requests.get(0);
} catch (ALPageNotFoundException pageNotFound) {
// logger.error("[WorkflowUtils]", pageNotFound);
throw pageNotFound;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* Request オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static List<EipTWorkflowRequest> getEipTWorkflowRequest(
EipTWorkflowRoute route) throws ALPageNotFoundException {
try {
SelectQuery<EipTWorkflowRequest> query =
Database.query(EipTWorkflowRequest.class);
Expression exp =
ExpressionFactory.matchExp(
EipTWorkflowRequest.EIP_TWORKFLOW_ROUTE_PROPERTY,
route);
query.setQualifier(exp);
return query.fetchList();
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* Category オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static List<EipTWorkflowCategory> getEipTworkflowCategory(
EipTWorkflowRoute route) throws ALPageNotFoundException {
try {
SelectQuery<EipTWorkflowCategory> query =
Database.query(EipTWorkflowCategory.class);
Expression exp =
ExpressionFactory.matchExp(
EipTWorkflowCategory.EIP_TWORKFLOW_ROUTE_PROPERTY,
route);
query.setQualifier(exp);
return query.fetchList();
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* Request オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static EipTWorkflowRequest getEipTWorkflowRequestAll(RunData rundata,
Context context) {
String requestid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (requestid == null || Integer.valueOf(requestid) == null) {
// Request IDが空の場合
logger.debug("[WorkflowUtils] Empty ID...");
return null;
}
SelectQuery<EipTWorkflowRequest> query =
Database.query(EipTWorkflowRequest.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
requestid);
query.setQualifier(exp1);
List<EipTWorkflowRequest> requests = query.fetchList();
if (requests == null || requests.size() == 0) {
// 指定した Request IDのレコードが見つからない場合
logger.debug("[WorkflowUtils] Not found ID...");
return null;
}
return requests.get(0);
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* Request オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static EipTWorkflowRequest getEipTWorkflowRequestForOwner(
RunData rundata, Context context) {
String requestid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (requestid == null || Integer.valueOf(requestid) == null) {
// Request IDが空の場合
logger.debug("[WorkflowUtils] Empty ID...");
return null;
}
SelectQuery<EipTWorkflowRequest> query =
Database.query(EipTWorkflowRequest.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
requestid);
query.setQualifier(exp1);
Expression exp2 =
ExpressionFactory.matchExp(
EipTWorkflowRequest.USER_ID_PROPERTY,
Integer.valueOf(ALEipUtils.getUserId(rundata)));
query.andQualifier(exp2);
List<EipTWorkflowRequest> requests = query.fetchList();
if (requests == null || requests.size() == 0) {
// 指定した Request IDのレコードが見つからない場合
logger.debug("[WorkflowUtils] Not found ID...");
return null;
}
return requests.get(0);
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* ファイルオブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTWorkflowFile getEipTWorkflowFile(RunData rundata)
throws ALPageNotFoundException, ALDBErrorException {
try {
int attachmentIndex =
rundata.getParameters().getInt("attachmentIndex", -1);
if (attachmentIndex < 0) {
// ID が空の場合
logger.debug("[WorkflowUtils] Empty ID...");
throw new ALPageNotFoundException();
}
SelectQuery<EipTWorkflowFile> query =
Database.query(EipTWorkflowFile.class);
Expression exp =
ExpressionFactory.matchDbExp(
EipTWorkflowFile.FILE_ID_PK_COLUMN,
Integer.valueOf(attachmentIndex));
query.andQualifier(exp);
List<EipTWorkflowFile> files = query.fetchList();
if (files == null || files.size() == 0) {
// 指定した ID のレコードが見つからない場合
logger.debug("[WorkflowUtils] Not found ID...");
throw new ALPageNotFoundException();
}
return files.get(0);
} catch (Exception ex) {
logger.error("[WorkflowUtils]", ex);
throw new ALDBErrorException();
}
}
public static void deleteFiles(int timelineId, String orgId, int uid,
List<String> fpaths) throws ALFileNotRemovedException {
ALDeleteFileUtil.deleteFiles(
timelineId,
EipTWorkflowFile.EIP_TWORKFLOW_REQUEST_PROPERTY,
getSaveDirPath(orgId, uid),
fpaths,
EipTWorkflowFile.class);
}
public static List<EipTWorkflowRequestMap> getEipTWorkflowRequestMap(
EipTWorkflowRequest request) {
try {
SelectQuery<EipTWorkflowRequestMap> query =
Database.query(EipTWorkflowRequestMap.class);
Expression exp =
ExpressionFactory.matchDbExp(
EipTWorkflowRequestMap.EIP_TWORKFLOW_REQUEST_PROPERTY
+ "."
+ EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
request.getRequestId());
query.setQualifier(exp);
query.orderAscending(EipTWorkflowRequestMap.ORDER_INDEX_PROPERTY);
List<EipTWorkflowRequestMap> maps = query.fetchList();
if (maps == null || maps.size() == 0) {
// 指定した Request IDのレコードが見つからない場合
logger.debug("[WorkflowSelectData] Not found ID...");
return null;
}
return maps;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* ワークフローカテゴリ オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static EipTWorkflowCategory getEipTWorkflowCategory(RunData rundata,
Context context) {
String categoryid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (categoryid == null || Integer.valueOf(categoryid) == null) {
// Request IDが空の場合
logger.debug("[WorkflowUtils] Empty ID...");
return null;
}
SelectQuery<EipTWorkflowCategory> query =
Database.query(EipTWorkflowCategory.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTWorkflowCategory.CATEGORY_ID_PK_COLUMN,
categoryid);
query.setQualifier(exp1);
List<EipTWorkflowCategory> categories = query.fetchList();
if (categories == null || categories.size() == 0) {
// 指定したカテゴリIDのレコードが見つからない場合
logger.debug("[WorkflowUtils] Not found ID...");
return null;
}
return categories.get(0);
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* ワークフローカテゴリ オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTWorkflowCategory getEipTWorkflowCategory(Long category_id) {
try {
EipTWorkflowCategory category =
Database.get(EipTWorkflowCategory.class, category_id);
return category;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* カテゴリの一覧を取得する。
*
* @param rundata
* @param context
*/
public static List<WorkflowCategoryResultData> loadCategoryList(
RunData rundata, Context context) {
try {
// カテゴリ一覧
List<WorkflowCategoryResultData> categoryList =
new ArrayList<WorkflowCategoryResultData>();
SelectQuery<EipTWorkflowCategory> query1 =
Database.query(EipTWorkflowCategory.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTWorkflowCategory.CATEGORY_ID_PK_COLUMN,
1);
query1.setQualifier(exp1);
List<EipTWorkflowCategory> aList1 = query1.fetchList();
for (EipTWorkflowCategory record : aList1) {
WorkflowCategoryResultData rd = new WorkflowCategoryResultData();
rd.initField();
rd.setCategoryId(record.getCategoryId().longValue());
rd.setCategoryName(record.getCategoryName());
rd.setOrderTemplate(record.getTemplate());
categoryList.add(rd);
}
SelectQuery<EipTWorkflowCategory> query =
Database.query(EipTWorkflowCategory.class);
Expression exp2 =
ExpressionFactory.noMatchDbExp(
EipTWorkflowCategory.CATEGORY_ID_PK_COLUMN,
1);
query.setQualifier(exp2);
query.orderAscending(EipTWorkflowCategory.CATEGORY_NAME_PROPERTY);
List<EipTWorkflowCategory> aList = query.fetchList();
for (EipTWorkflowCategory record : aList) {
WorkflowCategoryResultData rd = new WorkflowCategoryResultData();
rd.initField();
rd.setCategoryId(record.getCategoryId().longValue());
rd.setCategoryName(record.getCategoryName());
rd.setOrderTemplate(record.getTemplate());
categoryList.add(rd);
}
return categoryList;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* ワークフロー申請経路 オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param mode_update
* @return
*/
public static EipTWorkflowRoute getEipTWorkflowRoute(RunData rundata,
Context context) {
String routeid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (routeid == null || Integer.valueOf(routeid) == null) {
// Request IDが空の場合
logger.debug("[WorkflowUtils] Empty ID...");
return null;
}
SelectQuery<EipTWorkflowRoute> query =
Database.query(EipTWorkflowRoute.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTWorkflowRoute.ROUTE_ID_PK_COLUMN,
routeid);
query.setQualifier(exp1);
List<EipTWorkflowRoute> routes = query.fetchList();
if (routes == null || routes.size() == 0) {
// 指定したカテゴリIDのレコードが見つからない場合
logger.debug("[WorkflowUtils] Not found ID...");
return null;
}
return routes.get(0);
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* ワークフロー申請経路 オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @return
*/
public static EipTWorkflowRoute getEipTWorkflowRoute(Long route_id) {
try {
EipTWorkflowRoute route = Database.get(EipTWorkflowRoute.class, route_id);
return route;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* 申請経路の一覧を取得する。
*
* @param rundata
* @param context
*/
public static List<WorkflowRouteResultData> loadRouteList(RunData rundata,
Context context) {
try {
// 申請経路一覧
List<WorkflowRouteResultData> routeList =
new ArrayList<WorkflowRouteResultData>();
SelectQuery<EipTWorkflowRoute> query =
Database.query(EipTWorkflowRoute.class);
query.orderAscending(EipTWorkflowRoute.ROUTE_NAME_PROPERTY);
List<EipTWorkflowRoute> aList = query.fetchList();
for (EipTWorkflowRoute record : aList) {
WorkflowRouteResultData rd = new WorkflowRouteResultData();
rd.initField();
rd.setRouteId(record.getRouteId().longValue());
rd.setRouteName(record.getRouteName());
rd.setRoute(record.getRoute());
routeList.add(rd);
}
return routeList;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* 依頼の詳細情報を取得する。
*
* @param rundata
* @param context
*/
public static Object getResultDataDetail(Object obj, ALEipUser login_user) {
try {
EipTWorkflowRequest record = (EipTWorkflowRequest) obj;
WorkflowDetailResultData rd = new WorkflowDetailResultData();
rd.initField();
rd.setUserId(record.getUserId().longValue());
rd.setRequestName(record.getRequestName());
rd.setRequestId(record.getRequestId().longValue());
rd.setCategoryId(record
.getEipTWorkflowCategory()
.getCategoryId()
.longValue());
rd.setCategoryName(record.getEipTWorkflowCategory().getCategoryName());
rd.setPriorityString(WorkflowUtils.getPriorityString(record
.getPriority()
.intValue()));
rd.setNote(record.getNote());
rd.setPrice(record.getPrice().longValue());
rd.setProgress(record.getProgress());
rd.setCanRemandApplicant(true);
if (record.getEipTWorkflowRoute() != null) {
rd.setRouteName(record.getEipTWorkflowRoute().getRouteName());
}
List<WorkflowDecisionRecordData> drList =
new ArrayList<WorkflowDecisionRecordData>();
List<WorkflowDecisionRecordData> remandList =
new ArrayList<WorkflowDecisionRecordData>();
ALEipUser user = null;
EipTWorkflowRequestMap map = null;
WorkflowDecisionRecordData drd = null;
List<EipTWorkflowRequestMap> maps =
WorkflowUtils.getEipTWorkflowRequestMap(record);
int size = maps.size();
boolean is_past = true;
for (int i = 0; i < size; i++) {
map = maps.get(i);
drd = new WorkflowDecisionRecordData();
drd.initField();
// ログインユーザより後なら差し戻し先として選ばない
if (login_user.getUserId().getValue() == map.getUserId().longValue()) {
is_past = false;
}
user = ALEipUtils.getALEipUser(map.getUserId().intValue());
drd.setUserId(map.getUserId().intValue());
drd.setUserAliasName(user.getAliasName().getValue());
drd.setStatus(map.getStatus());
drd.setStatusString(WorkflowUtils.getStatusString(map.getStatus()));
drd.setOrder(map.getOrderIndex().intValue());
drd.setNote(map.getNote());
drd.setUpdateDate(WorkflowUtils.translateDate(
map.getUpdateDate(),
ALLocalizationUtils.getl10n("WORKFLOW_YEAR_MONTH_DAY_HOUR_MINIT")));
drList.add(drd);
// 無効化、もしくは削除されているユーザーは差し戻し先として選べないようにする
if (is_past && !isDisabledOrDeleted(map.getUserId().toString())) {
remandList.add(drd);
} else {
// 申請者に差し戻し不可能
if (i == 0) {
rd.setCanRemandApplicant(false);
}
}
}
rd.setDecisionRecords(drList);
rd.setRemandingRecords(remandList);
// 過去の申請内容
if (record.getParentId().intValue() != 0) {
List<EipTWorkflowRequest> oldReuqests = getOldRequests(record);
if (oldReuqests != null && oldReuqests.size() > 0) {
List<WorkflowOldRequestResultData> oldList =
new ArrayList<WorkflowOldRequestResultData>();
int osize = oldReuqests.size();
for (int i = 0; i < osize; i++) {
EipTWorkflowRequest request = oldReuqests.get(i);
WorkflowOldRequestResultData orrd =
new WorkflowOldRequestResultData();
orrd.initField();
orrd.setRequestId(request.getRequestId().intValue());
orrd.setRequestName(request.getRequestName());
orrd.setCategoryName(request
.getEipTWorkflowCategory()
.getCategoryName());
orrd.setUpdateDate(WorkflowUtils.translateDate(request
.getUpdateDate(), ALLocalizationUtils
.getl10n("WORKFLOW_YEAR_MONTH_DAY_HOUR_MINIT")));
oldList.add(orrd);
}
rd.setOldRequestLinks(oldList);
}
}
// ファイルリスト
List<EipTWorkflowFile> list =
getSelectQueryForFiles(record.getRequestId().intValue()).fetchList();
if (list != null && list.size() > 0) {
List<FileuploadBean> attachmentFileList =
new ArrayList<FileuploadBean>();
FileuploadBean filebean = null;
for (EipTWorkflowFile file : list) {
String realname = file.getFileName();
javax.activation.DataHandler hData =
new javax.activation.DataHandler(
new javax.activation.FileDataSource(realname));
filebean = new FileuploadBean();
filebean.setFileId(file.getFileId().intValue());
filebean.setFileName(realname);
if (hData != null) {
filebean.setContentType(hData.getContentType());
}
filebean.setIsImage(FileuploadUtils.isImage(realname));
attachmentFileList.add(filebean);
}
rd.setAttachmentFiles(attachmentFileList);
}
rd.setCreateDate(WorkflowUtils.translateDate(
record.getCreateDate(),
ALLocalizationUtils.getl10n("WORKFLOW_YEAR_MONTH_DAY_HOUR_MINIT")));
rd.setUpdateDate(WorkflowUtils.translateDate(
record.getUpdateDate(),
ALLocalizationUtils.getl10n("WORKFLOW_YEAR_MONTH_DAY_HOUR_MINIT")));
return rd;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
private static List<EipTWorkflowRequest> getOldRequests(
EipTWorkflowRequest request) {
try {
SelectQuery<EipTWorkflowRequest> query =
Database.query(EipTWorkflowRequest.class);
Expression exp11 =
ExpressionFactory.matchDbExp(
EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
request.getParentId());
Expression exp12 =
ExpressionFactory.matchExp(
EipTWorkflowRequest.PARENT_ID_PROPERTY,
request.getParentId());
query.setQualifier(exp11.orExp(exp12));
Expression exp2 =
ExpressionFactory.noMatchDbExp(
EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
request.getRequestId());
query.andQualifier(exp2);
query.orderAscending(EipTWorkflowRequest.UPDATE_DATE_PROPERTY);
List<EipTWorkflowRequest> requests = query.fetchList();
if (requests == null || requests.size() == 0) {
// 指定した Request IDのレコードが見つからない場合
logger.debug("[WorkflowSelectData] Not found ID...");
return null;
}
return requests;
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* 重要度を表す画像名を取得します。 <BR>
* 1 : 高い : priority_high.gif <BR>
* 2 : やや高い : priority_middle_high.gif <BR>
* 3 : 普通 : priority_middle.gif <BR>
* 4 : やや低い : priority_middle_low.gif <BR>
* 5 : 低い : priority_low.gif <BR>
*
* @param i
* @return
*/
public static String getPriorityImage(int i) {
String[] temp =
{
"priority_high.gif",
"priority_middle_high.gif",
"priority_middle.gif",
"priority_middle_low.gif",
"priority_low.gif" };
String image = null;
try {
image = temp[i - 1];
} catch (Exception ex) {
// logger.error("Exeption", ex);
}
return image;
}
/**
* 重要度を表す文字列を取得します。 <BR>
* 1 : 高い : priority_high.gif <BR>
* 2 : やや高い : priority_middle_high.gif <BR>
* 3 : 普通 : priority_middle.gif <BR>
* 4 : やや低い : priority_middle_low.gif <BR>
* 5 : 低い : priority_low.gif <BR>
*
* @param i
* @return
*/
public static String getPriorityString(int i) {
String[] temp =
{
ALLocalizationUtils.getl10n("WORKFLOW_HIGH"),
ALLocalizationUtils.getl10n("WORKFLOW_FEW_HIGH"),
ALLocalizationUtils.getl10n("WORKFLOW_USUALLY"),
ALLocalizationUtils.getl10n("WORKFLOW_FEW_LOW"),
ALLocalizationUtils.getl10n("WORKFLOW_LOW") };
String string = null;
try {
string = temp[i - 1];
} catch (Exception ex) {
// logger.error("Exeption", ex);
}
return string;
}
/**
* 状態を表す画像名を取得します。 <BR>
* 0 : 未着手 <BR>
* 10 : 10% <BR>
* 20 : 20% <BR>
* : :<BR>
* 90 : 90% <BR>
* 100 : 完了 <BR>
*
* @param i
* @return
*/
public static String getStateImage(int i) {
String[] temp =
{
"state_000.gif",
"state_010.gif",
"state_020.gif",
"state_030.gif",
"state_040.gif",
"state_050.gif",
"state_060.gif",
"state_070.gif",
"state_080.gif",
"state_090.gif",
"state_100.gif" };
String image = null;
try {
image = temp[i / 10];
} catch (Exception ex) {
// logger.error("Exeption", ex);
}
return image;
}
/**
* 状態を表す文字列を取得します。 <BR>
* 0 : 未着手 <BR>
* 10 : 10% <BR>
* 20 : 20% <BR>
* : :<BR>
* 90 : 90% <BR>
* 100 : 完了 <BR>
*
* @param i
* @return
*/
public static String getStateString(int i) {
if (i == 0) {
return ALLocalizationUtils.getl10n("TODO_NOT_START");
} else if (i == 100) {
return ALLocalizationUtils.getl10n("TODO_FINISHING");
} else {
return new StringBuffer().append(i).append("%").toString();
}
}
/**
*
* @param status
*/
public static String getStatusString(String status) {
String res = "";
if (DB_STATUS_REQUEST.equals(status)) {
res = ALLocalizationUtils.getl10n("WORKFLOW_APPLICATION");
} else if (DB_STATUS_CONFIRM.equals(status)) {
res = ALLocalizationUtils.getl10n("WORKFLOW_CHECKING");
} else if (DB_STATUS_WAIT.equals(status)) {
res = ALLocalizationUtils.getl10n("WORKFLOW_CHECKING_BEFORE");
} else if (DB_STATUS_ACCEPT.equals(status)) {
res = ALLocalizationUtils.getl10n("WORKFLOW_APPROVAL");
} else if (DB_STATUS_DENIAL.equals(status)) {
res = ALLocalizationUtils.getl10n("WORKFLOW_DENIAL");
} else if (DB_STATUS_THROUGH.equals(status)) {
res = ALLocalizationUtils.getl10n("WORKFLOW_APPROVAL_AUTO");
}
return res;
}
/**
* Date のオブジェクトを指定した形式の文字列に変換する.
*
* @param date
* @param dateFormat
* @return
*/
public static String translateDate(Date date, String dateFormat) {
if (date == null) {
return "Unknown";
}
if (dateFormat == null) {
dateFormat = ALDateTimeField.DEFAULT_DATE_TIME_FORMAT;
}
// 日付を表示形式に変換
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
sdf.setTimeZone(TimeZone.getDefault());
return sdf.format(date);
}
/**
* 3 桁でカンマ区切りした文字列を取得する.
*
* @param money
* @return
*/
public static String translateMoneyStr(String money) {
if (money == null || money.length() == 0) {
return money;
}
StringBuffer sb = new StringBuffer();
int len = money.length();
int count = len / 3;
int del = len % 3;
sb.append(money.substring(0, del));
if (count > 0) {
if (len > 3 && del != 0) {
sb.append(",");
}
for (int i = 0; i < count; i++) {
sb.append(money.substring(del + 3 * i, del + 3 * i + 3));
if (i != count - 1) {
sb.append(",");
}
}
}
return sb.toString();
}
/**
* メール送信
*/
public static boolean sendMail(RunData rundata, EipTWorkflowRequest request,
List<ALEipUser> destUsers, List<String> msgList) throws Exception {
String orgId = Database.getDomainName();
String subject =
"["
+ ALOrgUtilsService.getAlias()
+ "]"
+ ALLocalizationUtils.getl10n("WORKFLOW_WORKFLOW");
try {
List<ALEipUser> memberList = new ArrayList<ALEipUser>();
memberList.addAll(destUsers);
List<ALEipUserAddr> destMemberList =
ALMailUtils.getALEipUserAddrs(
memberList,
ALEipUtils.getUserId(rundata),
false);
List<ALAdminMailMessage> messageList =
new ArrayList<ALAdminMailMessage>();
for (ALEipUserAddr destMember : destMemberList) {
ALAdminMailMessage message = new ALAdminMailMessage(destMember);
message.setPcSubject(subject);
message.setCellularSubject(subject);
// 申請時はcommentは空
message.setPcBody(WorkflowUtils.createMsgForPc(rundata, request, ""));
message.setCellularBody(WorkflowUtils.createMsgForCellPhone(
rundata,
request));
messageList.add(message);
}
ALMailService.sendAdminMailAsync(new ALAdminMailContext(orgId, ALEipUtils
.getUserId(rundata), messageList, ALMailUtils
.getSendDestType(ALMailUtils.KEY_MSGTYPE_WORKFLOW)));
// msgList.addAll(errors);
} catch (Exception ex) {
logger.error("workflow", ex);
return false;
}
return true;
}
public static boolean sendMailForUpdate(RunData rundata,
List<EipTWorkflowRequestMap> sendMailMaps, EipTWorkflowRequest request,
String comment, Type flowStatus) {
String orgId = Database.getDomainName();
List<ALEipUserAddr> userAddressList = new ArrayList<ALEipUserAddr>();
WorkflowMailBean mailBean = new WorkflowMailBean();
mailBean.setOrgId(Database.getDomainName());
mailBean.setSubject("["
+ ALOrgUtilsService.getAlias()
+ "]"
+ ALLocalizationUtils.getl10n("WORKFLOW_WORKFLOW"));
mailBean.setLoginUserId(ALEipUtils.getUserId(rundata));
mailBean.setAipoAlias(ALOrgUtilsService.getAlias());
mailBean.setGlobalUrl(ALMailUtils.getGlobalurl());
mailBean.setLocalUrl(ALMailUtils.getLocalurl());
String msgForPcPrefix =
createMsgForPcAtUpdatePrefix(request, comment, flowStatus, mailBean);
String msgForCellPrefix =
createMsgForCellAtUpdatePrefix(request, comment, flowStatus, mailBean);
if ("".equals(msgForPcPrefix) || "".equals(msgForCellPrefix)) {
return false;
}
switch (flowStatus) {
case REQUEST:
for (EipTWorkflowRequestMap requestMap : sendMailMaps) {
userAddressList.add(ALMailUtils.getALEipUserAddrByUserId(requestMap
.getUserId()));
}
break;
case DENAIL:
for (EipTWorkflowRequestMap requestMap : sendMailMaps) {
userAddressList.add(ALMailUtils.getALEipUserAddrByUserId(requestMap
.getUserId()));
}
break;
case ACCEPT:
userAddressList.add(ALMailUtils.getALEipUserAddrByUserId(request
.getUserId()));
break;
default:
}
try {
List<ALAdminMailMessage> messageList =
new ArrayList<ALAdminMailMessage>();
for (ALEipUserAddr userAddr : userAddressList) {
ALAdminMailMessage message = new ALAdminMailMessage(userAddr);
message.setPcSubject(mailBean.getSubject());
message.setCellularSubject(mailBean.getSubject());
message.setPcBody(createMsgForPc(rundata, request, comment));
message.setCellularBody(createMsgForPc(rundata, request, comment));
messageList.add(message);
}
ALMailService.sendAdminMailAsync(new ALAdminMailContext(orgId, ALEipUtils
.getUserId(rundata), messageList, ALMailUtils
.getSendDestType(ALMailUtils.KEY_MSGTYPE_WORKFLOW)));
// msgList.addAll(errors);
} catch (Exception e) {
logger.error("[WorkflowUtils]", e);
return false;
}
return true;
}
@Deprecated
public static boolean sendMailForUpdateCore(
List<EipTWorkflowRequestMap> sendMailMaps, EipTWorkflowRequest request,
Type flowStatus, WorkflowMailBean mailBean) {
List<String> msgList = new ArrayList<String>();
List<ALEipUserAddr> userAddressList = new ArrayList<ALEipUserAddr>();
String msgForPcPrefix =
createMsgForPcAtUpdatePrefix(request, "", flowStatus, mailBean);
String msgForCellPrefix =
createMsgForCellAtUpdatePrefix(request, "", flowStatus, mailBean);
if ("".equals(msgForPcPrefix) || "".equals(msgForCellPrefix)) {
return false;
}
for (EipTWorkflowRequestMap requestMap : sendMailMaps) {
userAddressList.add(ALMailUtils.getALEipUserAddrByUserId(requestMap
.getUserId()));
}
try {
for (ALEipUserAddr userAddr : userAddressList) {
String msgForPc = msgForPcPrefix;
String msgForCell = msgForCellPrefix;
ALMailUtils.sendMailDelegateOne(mailBean.getOrgId(), mailBean
.getLoginUserId(), userAddr, mailBean.getSubject(), mailBean
.getSubject(), msgForPc, msgForCell, ALMailUtils
.getSendDestType(ALMailUtils.KEY_MSGTYPE_WORKFLOW), msgList);
}
} catch (Exception e) {
logger.error("[WorkflowUtils]", e);
return false;
}
return true;
}
public static String createMsgForPcAtUpdatePrefix(
EipTWorkflowRequest request, String comment, Type flowStatus,
WorkflowMailBean mailBean) {
ALEipUser user;
try {
user = ALEipUtils.getALEipUser(request.getUserId());
} catch (ALDBErrorException e) {
logger.error("[WorkflowUtils]", e);
user = new ALEipUser();
}
try {
StringBuilder body = new StringBuilder("");
body.append(user.getAliasName().toString());
body.append(getMessageHead(flowStatus, ALMailUtils.CR));
body.append(getMessageContent(
request,
comment,
ALMailUtils.CR,
false,
mailBean));
return body.toString();
} catch (Exception e) {
logger.error("[WorkflowUtils]", e);
return "";
}
}
public static String createMsgForCellAtUpdatePrefix(
EipTWorkflowRequest request, String comment, Type flowStatus,
WorkflowMailBean mailBean) {
ALEipUser user;
try {
user = ALEipUtils.getALEipUser(request.getUserId());
} catch (ALDBErrorException e) {
logger.error("[WorkflowUtils]", e);
user = new ALEipUser();
}
try {
StringBuilder body = new StringBuilder("");
body.append(user.getAliasName().toString());
body.append(getMessageHead(flowStatus, ALMailUtils.CR));
body.append(getMessageContent(
request,
comment,
ALMailUtils.CR,
true,
mailBean));
return body.toString();
} catch (Exception e) {
logger.error("[WorkflowUtils]", e);
return "";
}
}
public static String getMessageHead(Type flowStatus, String CR)
throws Exception {
StringBuilder body = new StringBuilder("");
switch (flowStatus) {
case REQUEST:
body
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_REQUEST_MSG"))
.append(CR)
.append(CR);
body
.append("[")
.append(ALLocalizationUtils.getl10n("WORKFLOW_FLOW_STATUS"))
.append("]")
.append(CR);
body
.append(ALLocalizationUtils.getl10n("WORKFLOW_WAITING_DECISION"))
.append(CR);
break;
case DENAIL:
body
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_DENIAL_MSG"))
.append(CR)
.append(CR);
body
.append("[")
.append(ALLocalizationUtils.getl10n("WORKFLOW_FLOW_STATUS"))
.append("]")
.append(CR);
body
.append(
ALLocalizationUtils.getl10n("WORKFLOW_NEED_TO_CHECK_PASSBACK"))
.append(CR);
break;
case ACCEPT:
body
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_ACCEPT_MSG"))
.append(CR)
.append(CR);
body
.append("[")
.append(ALLocalizationUtils.getl10n("WORKFLOW_FLOW_STATUS"))
.append("]")
.append(CR);
body.append(ALLocalizationUtils.getl10n("WORKFLOW_CONFIRMED")).append(
CR);
break;
default:
}
return body.toString();
}
// [タイトル][申請日][申請内容][コメント]
public static String getMessageContent(EipTWorkflowRequest request,
String comment, String CR, boolean isCell, WorkflowMailBean mailBean) {
StringBuilder body = new StringBuilder("");
body.append("[").append(
ALLocalizationUtils.getl10n("WORKFLOW_REQUEST_NAME")).append("]").append(
CR);
body.append(request.getEipTWorkflowCategory().getCategoryName()).append(CR);
if (request.getRequestName() != null
&& (!"".equals(request.getRequestName()))) {
body.append(request.getRequestName()).append(CR);
}
body
.append("[")
.append(ALLocalizationUtils.getl10n("WORKFLOW_CREATEDATE"))
.append("]")
.append(CR)
.append(
WorkflowUtils.translateDate(
request.getCreateDate(),
ALLocalizationUtils.getl10n("WORKFLOW_YEAR_MONTH_DAY_HOUR_MINIT")))
.append(CR);
body
.append("[")
.append(ALLocalizationUtils.getl10n("WORKFLOW_PRIORITY_VALUE"))
.append("]")
.append(CR)
.append(WorkflowUtils.getPriorityString(request.getPriority().intValue()))
.append(CR);
if (!isCell) {
body
.append("[")
.append(ALLocalizationUtils.getl10n("WORKFLOW_ACCESS_TO"))
.append("]")
.append(CR)
.append(request.getNote());
if (comment != null && !"".equals(comment)) {
body.append(CR).append("[").append(
ALLocalizationUtils.getl10n("WORKFLOW_COMMENT")).append("]").append(
CR).append(comment);
}
}
return body.toString();
}
/**
* パソコンへ送信するメールの内容を作成する.
*
* @return
*/
public static String createMsgForPc(RunData rundata,
EipTWorkflowRequest request, String comment) {
VelocityContext context = new VelocityContext();
boolean enableAsp = JetspeedResources.getBoolean("aipo.asp", false);
String CR = ALMailUtils.CR;
WorkflowMailBean mailBean = new WorkflowMailBean();
mailBean.setOrgId(Database.getDomainName());
mailBean.setSubject("["
+ ALOrgUtilsService.getAlias()
+ "]"
+ ALLocalizationUtils.getl10n("WORKFLOW_WORKFLOW"));
mailBean.setLoginUserId(ALEipUtils.getUserId(rundata));
mailBean.setAipoAlias(ALOrgUtilsService.getAlias());
mailBean.setGlobalUrl(ALMailUtils.getGlobalurl());
mailBean.setLocalUrl(ALMailUtils.getLocalurl());
TurbineUser tuser = null;
ALEipUser auser = null;
try {
tuser = request.getTurbineUser();
auser = ALEipUtils.getALEipUser(tuser);
} catch (ALDBErrorException e) {
logger.error("[WorkflowUtils]", e);
return "";
}
// 依頼者とemail
StringBuffer user_email = new StringBuffer("");
user_email.append(auser.getAliasName().toString());
if (!tuser.getEmail().equals("")) {
user_email.append("(").append(tuser.getEmail()).append(")");
}
context.put("user_email", user_email);
// (さんの申請は承認されました。など)
StringBuffer message = new StringBuffer("");
if ("D".equals(request.getProgress())) {
message
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_DENIAL_MSG"));
} else if ("A".equals(request.getProgress())) {
message
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_ACCEPT_MSG"));
} else {
message.append(ALLocalizationUtils
.getl10n("WORKFLOW_RECEIVE_REQUEST_MSG"));
}
context.put("message", message);
// 決裁状況
StringBuffer progress = new StringBuffer("");
if ("D".equals(request.getProgress())) {
progress.append(ALLocalizationUtils
.getl10n("WORKFLOW_NEED_TO_CHECK_PASSBACK"));
} else if ("A".equals(request.getProgress())) {
progress.append(ALLocalizationUtils.getl10n("WORKFLOW_CONFIRMED"));
} else {
progress.append(ALLocalizationUtils.getl10n("WORKFLOW_WAITING_DECISION"));
}
context.put("progress", progress);
// タイトル,申請日,重要度,申請内容,コメント
context.put("content", getMessageContent(
request,
comment,
CR,
false,
mailBean));
// サービス
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
+ "/workflow-notification-mail.vm", "utf-8");
template.merge(context, writer);
} else {
Template template =
Velocity.getTemplate(
"portlets/mail/workflow-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,
EipTWorkflowRequest request) {
VelocityContext context = new VelocityContext();
boolean enableAsp = JetspeedResources.getBoolean("aipo.asp", false);
String CR = ALMailUtils.CR;
WorkflowMailBean mailBean = new WorkflowMailBean();
mailBean.setOrgId(Database.getDomainName());
mailBean.setSubject("["
+ ALOrgUtilsService.getAlias()
+ "]"
+ ALLocalizationUtils.getl10n("WORKFLOW_WORKFLOW"));
mailBean.setLoginUserId(ALEipUtils.getUserId(rundata));
mailBean.setAipoAlias(ALOrgUtilsService.getAlias());
mailBean.setGlobalUrl(ALMailUtils.getGlobalurl());
mailBean.setLocalUrl(ALMailUtils.getLocalurl());
TurbineUser tuser = null;
ALEipUser auser = null;
try {
tuser = request.getTurbineUser();
auser = ALEipUtils.getALEipUser(tuser);
} catch (ALDBErrorException e) {
logger.error("[WorkflowUtils]", e);
return "";
}
// 依頼者とemail
StringBuffer user_email = new StringBuffer("");
user_email.append(auser.getAliasName().toString());
if (!tuser.getEmail().equals("")) {
user_email.append("(").append(tuser.getEmail()).append(")");
}
context.put("user_email", user_email);
// (さんの申請は承認されました。など)
StringBuffer message = new StringBuffer("");
if ("D".equals(request.getProgress())) {
message
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_DENIAL_MSG"));
} else if ("A".equals(request.getProgress())) {
message
.append(ALLocalizationUtils.getl10n("WORKFLOW_RECEIVE_ACCEPT_MSG"));
} else {
message.append(ALLocalizationUtils
.getl10n("WORKFLOW_RECEIVE_REQUEST_MSG"));
}
context.put("message", message);
// 決裁状況
StringBuffer progress = new StringBuffer("");
if ("D".equals(request.getProgress())) {
progress.append(ALLocalizationUtils
.getl10n("WORKFLOW_NEED_TO_CHECK_PASSBACK"));
} else if ("A".equals(request.getProgress())) {
progress.append(ALLocalizationUtils.getl10n("WORKFLOW_CONFIRMED"));
} else {
progress.append(ALLocalizationUtils.getl10n("WORKFLOW_WAITING_DECISION"));
}
context.put("progress", progress);
// タイトル,申請日,重要度,申請内容
context.put("content", getMessageContent(request, "", CR, false, mailBean));
// サービス
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
+ "/workflow-notification-mail.vm", "utf-8");
template.merge(context, writer);
} else {
Template template =
Velocity.getTemplate(
"portlets/mail/workflow-notification-mail.vm",
"utf-8");
template.merge(context, writer);
}
} catch (Exception e) {
e.printStackTrace();
}
writer.flush();
String ret = writer.getBuffer().toString();
return ret;
}
public static boolean insertFileDataDelegate(RunData rundata,
Context context, EipTWorkflowRequest request,
EipTWorkflowRequest oldrequest, List<FileuploadLiteBean> fileuploadList,
String folderName, List<String> msgList) {
int uid = ALEipUtils.getUserId(rundata);
String orgId = Database.getDomainName();
String[] fileids = rundata.getParameters().getStrings("attachments");
// fileidsがnullなら、ファイルがアップロードされていないので、trueを返して終了
if (fileids == null) {
return true;
}
int fileIDsize;
if (fileids[0].equals("")) {
fileIDsize = 0;
} else {
fileIDsize = fileids.length;
}
// 送られてきたFileIDの個数とDB上の当該RequestID中の添付ファイル検索を行った結果の個数が一致したら、
// 変更が無かったとみなし、trueを返して終了。
SelectQuery<EipTWorkflowFile> dbquery =
Database.query(EipTWorkflowFile.class);
dbquery.andQualifier(ExpressionFactory.matchDbExp(
EipTWorkflowFile.EIP_TWORKFLOW_REQUEST_PROPERTY,
request.getRequestId()));
for (int i = 0; i < fileIDsize; i++) {
dbquery.orQualifier(ExpressionFactory.matchDbExp(
EipTWorkflowFile.FILE_ID_PK_COLUMN,
fileids[i]));
}
List<EipTWorkflowFile> files = dbquery.fetchList();
;
if (files.size() == fileIDsize
&& (fileuploadList == null || fileuploadList.size() <= 0)) {
return true;
}
SelectQuery<EipTWorkflowFile> query =
Database.query(EipTWorkflowFile.class);
query.andQualifier(ExpressionFactory.matchDbExp(
EipTWorkflowFile.EIP_TWORKFLOW_REQUEST_PROPERTY,
request.getRequestId()));
for (int i = 0; i < fileIDsize; i++) {
Expression exp =
ExpressionFactory.matchDbExp(
EipTWorkflowFile.FILE_ID_PK_COLUMN,
Integer.parseInt(fileids[i]));
query.andQualifier(exp.notExp());
}
// DB上でトピックに属すが、送られてきたFileIDにIDが含まれていないファイルのリスト(削除されたファイルのリスト)
List<EipTWorkflowFile> delFiles = query.fetchList();
if (delFiles.size() > 0) {
// ローカルファイルに保存されているファイルを削除する.
int delsize = delFiles.size();
for (int i = 0; i < delsize; i++) {
ALStorageService.deleteFile(WorkflowUtils.getSaveDirPath(orgId, uid)
+ (delFiles.get(i)).getFilePath());
}
// データベースから添付ファイルのデータ削除
Database.deleteAll(delFiles);
}
// 追加ファイルが無ければtrueを返して終了
if (fileuploadList == null || fileuploadList.size() <= 0) {
return true;
}
// ファイル追加処理
try {
FileuploadLiteBean filebean = null;
int size = fileuploadList.size();
for (int i = 0; i < size; i++) {
filebean = fileuploadList.get(i);
// サムネイル処理
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 = i + "_" + String.valueOf(System.nanoTime());
// 新規オブジェクトモデル
EipTWorkflowFile file = Database.create(EipTWorkflowFile.class);
// 所有者
file.setOwnerId(Integer.valueOf(uid));
// リクエストID
file.setEipTWorkflowRequest(request);
// ファイル名
file.setFileName(filebean.getFileName());
// ファイルパス
file.setFilePath(WorkflowUtils.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_WORKFLOW, CATEGORY_KEY
+ ALStorageService.separator()
+ uid, filename);
}
// 添付ファイル保存先のフォルダを削除
ALStorageService.deleteTmpFolder(uid, folderName);
} catch (Exception e) {
logger.error("workflow", e);
return false;
}
return true;
}
/**
* ユーザ毎のルート保存先(絶対パス)を取得します。
*
* @param uid
* @return
*/
public static String getSaveDirPath(String orgId, int uid) {
return ALStorageService.getDocumentPath(
FOLDER_FILEDIR_WORKFLOW,
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_WORKFLOW_REQUEST_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 requestid
* ファイルを検索するリクエストのid
* @return query
*/
private static SelectQuery<EipTWorkflowFile> getSelectQueryForFiles(
int requestid) {
SelectQuery<EipTWorkflowFile> query =
Database.query(EipTWorkflowFile.class);
Expression exp =
ExpressionFactory.matchDbExp(
EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
Integer.valueOf(requestid));
query.setQualifier(exp);
query.orderAscending(EipTWorkflowFile.UPDATE_DATE_PROPERTY);
query.orderAscending(EipTWorkflowFile.FILE_PATH_PROPERTY);
return query;
}
/**
* 指定した ID に対するユーザの名前を取得する.
*
* @param userId
* @return
*/
public static String getName(String userId) {
if (userId == null || userId.equals("")) {
return null;
}
String firstName = null;
String lastName = null;
StringBuffer buffer = new StringBuffer();
try {
SelectQuery<TurbineUser> query = Database.query(TurbineUser.class);
Expression exp =
ExpressionFactory.matchDbExp(TurbineUser.USER_ID_PK_COLUMN, Integer
.valueOf(userId));
query.setQualifier(exp);
List<TurbineUser> destUserList = query.fetchList();
if (destUserList == null || destUserList.size() <= 0) {
return null;
}
firstName = (destUserList.get(0)).getFirstName();
lastName = (destUserList.get(0)).getLastName();
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
return buffer.append(lastName).append(" ").append(firstName).toString();
}
/**
* 指定した ID に対するユーザのログイン名を取得する.
*
* @param userId
* @return
*/
public static String getUserName(String userId) {
if (userId == null || userId.equals("")) {
return null;
}
String userName = null;
try {
SelectQuery<TurbineUser> query = Database.query(TurbineUser.class);
Expression exp =
ExpressionFactory.matchDbExp(TurbineUser.USER_ID_PK_COLUMN, Integer
.valueOf(userId));
query.setQualifier(exp);
List<TurbineUser> destUserList = query.fetchList();
if (destUserList == null || destUserList.size() <= 0) {
return null;
}
userName = (destUserList.get(0)).getLoginName();
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
return userName;
}
public static Integer getRouteIdFromCategoryId(Integer categoryId) {
if (categoryId == null || categoryId <= 0) {
return null;
}
Integer routeId = null;
try {
SelectQuery<EipTWorkflowCategory> query =
Database.query(EipTWorkflowCategory.class);
Expression exp =
ExpressionFactory.matchDbExp(
EipTWorkflowCategory.CATEGORY_ID_PK_COLUMN,
Integer.valueOf(categoryId));
query.setQualifier(exp);
List<EipTWorkflowCategory> list = query.fetchList();
if (list == null || list.size() <= 0) {
return null;
}
routeId = (list.get(0)).getEipTWorkflowRoute().getRouteId();
} catch (Exception ex) {
return null;
}
return routeId;
}
/**
* 指定した ID のユーザを取得する
*
* @param userId
* @return
*/
public static TurbineUser getTurbineUser(String userId) {
if (userId == null || userId.equals("")) {
return null;
}
try {
SelectQuery<TurbineUser> query = Database.query(TurbineUser.class);
Expression exp =
ExpressionFactory.matchDbExp(TurbineUser.USER_ID_PK_COLUMN, Integer
.valueOf(userId));
query.setQualifier(exp);
List<TurbineUser> destUserList = query.fetchList();
if (destUserList == null || destUserList.size() <= 0) {
return null;
}
return destUserList.get(0);
} catch (Exception ex) {
logger.error("workflow", ex);
return null;
}
}
/**
* 指定した ID のユーザが削除済みかどうかを調べる。
*
* @param userId
* @return
*/
public static boolean isDisabledOrDeleted(String userId) {
if (null == userId || "".equals(userId)) {
return true;
}
int _userId = Integer.parseInt(userId);
return isDisabledOrDeleted(_userId);
}
public static boolean isDisabledOrDeleted(int userId) {
try {
TurbineUser user = ALEipUtils.getTurbineUser(userId);
if (user == null) {
return true;
}
String disabled = user.getDisabled();
return ("T".equals(disabled) || "N".equals(disabled));
} catch (ALDBErrorException e) {
logger.error("workflow", e);
return true;
}
}
public static void createWorkflowRequestActivity(EipTWorkflowRequest request,
String loginName, List<String> recipients, Type type) {
if (recipients != null && recipients.size() > 0) {
ALActivity RecentActivity =
ALActivity.getRecentActivity("Workflow", request.getRequestId(), 1f);
boolean isDeletePrev =
RecentActivity != null && RecentActivity.isReplace(loginName);
EipTWorkflowCategory category = request.getEipTWorkflowCategory();
String name = request.getRequestName();
StringBuilder b =
new StringBuilder(ALLocalizationUtils
.getl10n("WORKFLOW_APPLICATION_ETC"));
if (category != null) {
b.append(category.getCategoryName());
if (name != null && name.length() > 0) {
b.append(":");
}
}
b.append(request.getRequestName()).append("」");
switch (type) {
case REQUEST:
b.append(ALLocalizationUtils.getl10n("WORKFLOW_REQUEST_MSG"));
break;
case DENAIL:
b.append(ALLocalizationUtils.getl10n("WORKFLOW_DENIAL_MSG"));
break;
case ACCEPT:
b.append(ALLocalizationUtils.getl10n("WORKFLOW_ACCEPT_MSG"));
recipients.clear();
recipients.add(getUserName(request.getUserId().toString()));
break;
default:
}
String portletParams =
new StringBuilder("?template=WorkflowDetailScreen")
.append("&entityid=")
.append(request.getRequestId())
.toString();
ALActivityService.create(new ALActivityPutRequest()
.withAppId("Workflow")
.withLoginName(loginName)
.withUserId(
request.getUserId() == null ? request
.getTurbineUser()
.getUpdatedUserId() : request.getUserId())
.withPortletParams(portletParams)
.withRecipients(recipients)
.withTitle(b.toString())
.withPriority(1f)
.withExternalId(String.valueOf(request.getRequestId())));
if (isDeletePrev) {
RecentActivity.delete();
}
}
}
/**
* 一連のワークフローに関連するユーザのIdを列挙します
*
* @param request
* @return
*/
public static Set<Integer> getRelatedUserIdList(EipTWorkflowRequest request) {
Set<Integer> ids = new HashSet<Integer>();
SelectQuery<EipTWorkflowRequestMap> query =
Database.query(EipTWorkflowRequestMap.class);
Expression exp11 =
ExpressionFactory.matchDbExp(
EipTWorkflowRequestMap.EIP_TWORKFLOW_REQUEST_PROPERTY
+ "."
+ EipTWorkflowRequest.REQUEST_ID_PK_COLUMN,
request.getParentId());
Expression exp12 =
ExpressionFactory.matchExp(
EipTWorkflowRequestMap.EIP_TWORKFLOW_REQUEST_PROPERTY
+ "."
+ EipTWorkflowRequest.PARENT_ID_PROPERTY,
request.getParentId());
Expression exp13 =
ExpressionFactory.matchExp(
EipTWorkflowRequestMap.EIP_TWORKFLOW_REQUEST_PROPERTY
+ "."
+ EipTWorkflowRequest.PARENT_ID_PROPERTY,
request.getRequestId());
query.setQualifier(exp11.orExp(exp12).orExp(exp13));
ResultList<EipTWorkflowRequestMap> mapList = query.getResultList();
for (EipTWorkflowRequestMap map : mapList) {
ids.add(map.getUserId());
}
return ids;
}
/**
* 表示切り替えで指定した検索キーワードを取得する.
*
* @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 hasResetFlag(RunData rundata, Context context) {
String resetflag = rundata.getParameters().getString(RESET_FLAG);
return resetflag != null;
}
/**
* フィルターを初期化する.
*
* @param rundata
* @param context
* @param className
*/
public static void resetFilter(RunData rundata, Context context,
String className) {
ALEipUtils.setTemp(rundata, context, TARGET_KEYWORD, "");
}
}