/*
* 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.account.util;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.jetspeed.om.security.Group;
import org.apache.jetspeed.om.security.JetspeedUser;
import org.apache.jetspeed.om.security.Role;
import org.apache.jetspeed.om.security.UserNamePrincipal;
import org.apache.jetspeed.services.JetspeedSecurity;
import org.apache.jetspeed.services.PsmlManager;
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.security.JetspeedSecurityException;
import org.apache.jetspeed.services.security.UnknownUserException;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.commons.utils.ALDeleteFileUtil;
import com.aimluck.commons.utils.ALStringUtil;
import com.aimluck.eip.account.AccountPositionResultData;
import com.aimluck.eip.account.AccountPostResultData;
import com.aimluck.eip.cayenne.om.account.EipMCompany;
import com.aimluck.eip.cayenne.om.account.EipMPosition;
import com.aimluck.eip.cayenne.om.account.EipMPost;
import com.aimluck.eip.cayenne.om.account.EipMUserPosition;
import com.aimluck.eip.cayenne.om.portlet.EipMMailAccount;
import com.aimluck.eip.cayenne.om.portlet.EipTBlog;
import com.aimluck.eip.cayenne.om.portlet.EipTBlogEntry;
import com.aimluck.eip.cayenne.om.portlet.EipTBlogFile;
import com.aimluck.eip.cayenne.om.portlet.EipTBlogFootmarkMap;
import com.aimluck.eip.cayenne.om.portlet.EipTMessage;
import com.aimluck.eip.cayenne.om.portlet.EipTMessageFile;
import com.aimluck.eip.cayenne.om.portlet.EipTMessageRoom;
import com.aimluck.eip.cayenne.om.portlet.EipTMessageRoomMember;
import com.aimluck.eip.cayenne.om.portlet.EipTTimeline;
import com.aimluck.eip.cayenne.om.portlet.EipTTimelineFile;
import com.aimluck.eip.cayenne.om.portlet.EipTTimelineLike;
import com.aimluck.eip.cayenne.om.portlet.EipTTodo;
import com.aimluck.eip.cayenne.om.portlet.EipTTodoCategory;
import com.aimluck.eip.cayenne.om.portlet.EipTWorkflowRequestMap;
import com.aimluck.eip.cayenne.om.security.TurbineGroup;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.cayenne.om.security.TurbineUserGroupRole;
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.mail.ALMailFactoryService;
import com.aimluck.eip.mail.ALMailHandler;
import com.aimluck.eip.mail.util.ALMailUtils;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.Operations;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.config.ALConfigHandler.Property;
import com.aimluck.eip.services.config.ALConfigService;
import com.aimluck.eip.services.datasync.ALDataSyncFactoryService;
import com.aimluck.eip.services.eventlog.ALEventlogConstants;
import com.aimluck.eip.services.eventlog.ALEventlogFactoryService;
import com.aimluck.eip.services.social.ALApplicationService;
import com.aimluck.eip.services.storage.ALStorageService;
import com.aimluck.eip.user.beans.UserGroupLiteBean;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* ユーザーアカウントのユーティリティクラスです
*/
public class AccountUtils {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(AccountUtils.class.getName());
/** CSVファイル名 */
public static final String FOLDER_TMP_FOR_USERINFO_CSV_FILENAME =
"user_info.csv";
public static final int CSV_FILE_COL_COUNT = 11;
/** ユーザー名として使用可能な記号群 */
public static final String[] USER_NAME_SYMBOLS = { ".", "-", "_" };
public static final String ACCOUNT_PORTLET_NAME = "Account";
public static final String COMPANY_PORTLET_NAME = "Company";
public static final String ACCOUNT_PERSON_PORTLET_NAME = "AccountPerson";
public static final String ACCOUNT_LOGIN_PORTLET_NAME = "AccountLogin";
public static final String ACCOUNT_POSITION_PORTLET_NAME = "AccountPosition";
/** ユーザーの絞り込みに使用する項目 */
private static final Map<Integer, FilterRole> roleMap =
new HashMap<Integer, FilterRole>();
public static final Integer ROLE_ADMIN = 1;
public static final Integer ROLE_ACTIVE = 2;
public static final Integer ROLE_IN_ACTIVE = 3;
public static final Integer ROLE_INVITE = 4;
/** 検索キーワード変数の識別子 */
public static final String TARGET_KEYWORD = "keyword";
/** 添付ファイルを保管するディレクトリの指定 */
public static final String FOLDER_FILEDIR_ACCOUNT = JetspeedResources
.getString("aipo.filedir", "");
/** メッセージの添付ファイルを保管するディレクトリの指定 */
public static final String FOLDER_FILEDIR_MESSAGE = JetspeedResources
.getString("aipo.filedir", "");
public static final String CATEGORY_KEY_MESSAGE = JetspeedResources
.getString("aipo.message.categorykey", "");
/**
* セッション中のエンティティIDで示されるユーザ情報を取得する。 論理削除されたユーザを取得した場合はnullを返す。
*
* @param rundata
* @param context
* @return
*/
public static ALBaseUser getBaseUser(RunData rundata, Context context) {
String userid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (userid == null) {
userid = rundata.getUser().getUserName();
}
if (userid == null) {
logger.debug("Empty ID...");
return null;
}
ALBaseUser user = (ALBaseUser) JetspeedSecurity.getUser(userid);
if (user == null) {
return null;
}
// 削除済みユーザの取得は行わない。
// By Haruo Kaneko
if ("T".equals(user.getDisabled())) {
return null;
} else {
return (ALBaseUser) JetspeedSecurity.getUser(userid);
}
} catch (UnknownUserException uex) {
logger.error("UnknownUserException : UserID = " + userid);
return null;
} catch (Exception ex) {
logger.error("AccountUtils.getBaseUser", ex);
return null;
}
}
/**
*
* @param rundata
* @param context
* @return
*/
public static EipMCompany getEipMCompany(RunData rundata, Context context) {
return getEipMCompany(ALEipUtils.getTemp(
rundata,
context,
ALEipConstants.ENTITY_ID));
}
public static EipMCompany getEipMCompany(String id) {
EipMCompany result = null;
try {
if (id == null || Integer.valueOf(id) == null) {
logger.debug("Empty ID...");
return result;
}
Expression exp =
ExpressionFactory.matchDbExp(EipMCompany.COMPANY_ID_PK_COLUMN, Integer
.valueOf(id));
List<EipMCompany> list =
Database.query(EipMCompany.class, exp).fetchList();
if (list == null || list.size() == 0) {
logger.debug("Not found ID...");
return result;
}
result = list.get(0);
} catch (Exception ex) {
logger.error("AccountUtils.getEipMCompany", ex);
}
return result;
}
/**
* セッションに格納されているIDを用いて、部署情報を取得します。
*
* @param rundata
* @param context
* @return
*/
public static EipMPost getEipMPost(RunData rundata, Context context) {
return getEipMPost(ALEipUtils.getTemp(
rundata,
context,
ALEipConstants.ENTITY_ID));
}
public static EipMPost getEipMPost(String id) {
EipMPost result = null;
try {
if (id == null || Integer.valueOf(id) == null) {
logger.debug("Empty ID...");
return result;
}
Expression exp =
ExpressionFactory.matchDbExp(EipMPost.POST_ID_PK_COLUMN, Integer
.valueOf(id));
List<EipMPost> list =
Database.query(EipMPost.class, exp).orderAscending(
EipMPost.SORT_PROPERTY).fetchList();
if (list == null || list.size() == 0) {
logger.debug("Not found ID...");
return result;
}
result = list.get(0);
} catch (Exception ex) {
logger.error("AccountUtils.getEipMPost", ex);
}
return result;
}
/**
*
* @param rundata
* @param context
* @return
*/
public static EipMPosition getEipMPosition(RunData rundata, Context context) {
EipMPosition result = null;
String id = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (id == null || Integer.valueOf(id) == null) {
logger.debug("Empty ID...");
return result;
}
Expression exp =
ExpressionFactory.matchDbExp(
EipMPosition.POSITION_ID_PK_COLUMN,
Integer.valueOf(id));
List<EipMPosition> list =
Database.query(EipMPosition.class, exp).fetchList();
if (list == null || list.size() == 0) {
logger.debug("Not found ID...");
return result;
}
result = list.get(0);
} catch (Exception ex) {
logger.error("AccountUtils.getEipMPosition", ex);
}
return result;
}
public static String[] getCsvSplitStrings(String line) {
if (line == null || line.equals("")) {
return null;
}
try {
List<String> list = new ArrayList<String>();
int count_comma = 0;
char c;
StringBuffer token = new StringBuffer("");
int len = line.length();
for (int i = 0; i < len; i++) {
c = line.charAt(i);
if (c != ',' && i == len - 1) {
token.append(c);
list.add(token.toString());
} else if (c == ',') {
list.add(token.toString());
token = new StringBuffer("");
count_comma++;
continue;
} else {
token.append(c);
}
if (count_comma > AccountUtils.CSV_FILE_COL_COUNT) {
break;
}
}
if (line.endsWith(",")) {
list.add("");
}
String[] strings = new String[list.size()];
strings = list.toArray(strings);
return strings;
} catch (Exception e) {
return null;
}
}
/**
* ユーザーの所属する部署の一覧を取得します。
*
* @param uid
* ユーザーID
* @return 所属する部署リスト
*/
public static List<UserGroupLiteBean> getPostBeanList(int uid) {
SelectQuery<TurbineUserGroupRole> query =
Database.query(TurbineUserGroupRole.class);
Expression exp1 =
ExpressionFactory.matchExp(
TurbineUserGroupRole.TURBINE_USER_PROPERTY,
Integer.valueOf(uid));
Expression exp2 =
ExpressionFactory.greaterExp(
TurbineUserGroupRole.TURBINE_GROUP_PROPERTY,
Integer.valueOf(3));
Expression exp3 =
ExpressionFactory.matchExp(TurbineUserGroupRole.TURBINE_GROUP_PROPERTY
+ "."
+ TurbineGroup.OWNER_ID_PROPERTY, Integer.valueOf(1));
query.setQualifier(exp1);
query.andQualifier(exp2);
query.andQualifier(exp3);
List<TurbineUserGroupRole> list = query.fetchList();
if (list == null || list.size() < 0) {
return null;
}
List<UserGroupLiteBean> resultList = new ArrayList<UserGroupLiteBean>();
TurbineGroup group = null;
UserGroupLiteBean bean = null;
for (TurbineUserGroupRole ugr : list) {
group = ugr.getTurbineGroup();
bean = new UserGroupLiteBean();
bean.initField();
bean.setGroupId(group.getName());
bean.setName(group.getGroupAliasName());
resultList.add(bean);
}
return resultList;
}
public static List<AccountPositionResultData> getAccountPositionAllList() {
List<AccountPositionResultData> AccountPositionAllList =
new ArrayList<AccountPositionResultData>();
try {
List<EipMPosition> aList =
Database.query(EipMPosition.class).orderAscending(
EipMPosition.SORT_PROPERTY).fetchList();
for (EipMPosition record : aList) {
AccountPositionResultData rd = new AccountPositionResultData();
rd.initField();
rd.setPositionId(record.getPositionId());
rd.setPositionName(record.getPositionName());
AccountPositionAllList.add(rd);
}
} catch (Exception ex) {
logger.error("accountposition", ex);
}
return AccountPositionAllList;
}
public static List<AccountPositionResultData> getAccountPositionResultList(
List<EipMPosition> result) {
List<AccountPositionResultData> list =
new ArrayList<AccountPositionResultData>();
for (EipMPosition model : result) {
list.add(getAccountPositionResultData(model));
}
return list;
}
public static AccountPositionResultData getAccountPositionResultData(
EipMPosition model) {
AccountPositionResultData data = new AccountPositionResultData();
data.initField();
data.setPositionId(model.getPositionId());
data.setPositionName(model.getPositionName());
data.setUpdate_date(model.getUpdateDate());
data.setCreateDate(model.getCreateDate());
return data;
}
/**
* 指定した ID のユーザが削除済みかどうかを調べる。
*
* @param userId
* @return
*/
public static boolean getUserIsDisabledOrDeleted(String userId) {
if (userId == null || userId.equals("")) {
return true;
}
String disabled;
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 true;
}
disabled = (destUserList.get(0)).getDisabled();
return ("T".equals(disabled) || "N".equals(disabled));
} catch (Exception ex) {
logger.error("AccountUtils.getUserIsDisabledOrDeleted", ex);
return true;
}
}
/**
* 指定されたユーザーが削除/無効化されたとき、申請が来ているワークフローを全て承認します。
*
* @param uid
*/
public static boolean acceptWorkflow(int uid) {
try {
String userId = Integer.toString(uid);
// 申請が来ているワークフローを取得する
SelectQuery<EipTWorkflowRequestMap> workflow_request_map_query =
Database.query(EipTWorkflowRequestMap.class);
Expression workflow_exp =
ExpressionFactory.matchExp(
EipTWorkflowRequestMap.USER_ID_PROPERTY,
userId);
Expression workflow_exp2 =
ExpressionFactory.matchExp(EipTWorkflowRequestMap.STATUS_PROPERTY, "C");
workflow_request_map_query.setQualifier(workflow_exp
.andExp(workflow_exp2));
List<EipTWorkflowRequestMap> workflow_request_map_list =
workflow_request_map_query.fetchList();
EipTWorkflowRequestMap workflow_request_map = null;
int list_size = workflow_request_map_list.size();
// 申請が来ているワークフローの数だけ繰り返す
for (int j = 0; j < list_size; j++) {
workflow_request_map = workflow_request_map_list.get(j);
// ワークフローを最後の人まで見ていく
int request_number = workflow_request_map.getOrderIndex();
while (true) {
// 次の人がいるかどうか
SelectQuery<EipTWorkflowRequestMap> workflow_request_map_query2 =
Database.query(EipTWorkflowRequestMap.class);
Expression workflow_exp3 =
ExpressionFactory.matchExp(
EipTWorkflowRequestMap.EIP_TWORKFLOW_REQUEST_PROPERTY,
workflow_request_map.getEipTWorkflowRequest());
Expression workflow_exp4 =
ExpressionFactory.matchExp(
EipTWorkflowRequestMap.ORDER_INDEX_PROPERTY,
Integer.valueOf(request_number + 1));
workflow_request_map_query2.setQualifier(workflow_exp3
.andExp(workflow_exp4));
List<EipTWorkflowRequestMap> workflow_request_map_list2 =
workflow_request_map_query2.fetchList();
// 自身を自動承認状態にする
workflow_request_map.setStatus("T");
if (workflow_request_map_list2.size() == 1) {
// 次の人が見つかった
EipTWorkflowRequestMap workflow_request_map2 =
workflow_request_map_list2.get(0);
if (getUserIsDisabledOrDeleted(workflow_request_map2
.getUserId()
.toString())) {
// 次の人が削除済み、もしくは無効化されていたら自動承認した上で次の人に回す
workflow_request_map2.setStatus("T");
request_number += 1;
} else {
// 次の人を確認状態にして終了
workflow_request_map2.setStatus("C");
break;
}
} else {
// 次の人が見つからなければ、最後まで行ったことになるので終了
if (workflow_request_map.getEipTWorkflowRequest() != null) {
workflow_request_map.getEipTWorkflowRequest().setProgress("A");
}
break;
}
}
}
return true;
} catch (Exception e) {
logger.error("AccountUtils.acceptWorkflow", e);
return false;
}
}
/**
* @param rundata
* @param userlist
* @param msgList
* @return
* @throws ALDBErrorException
* @throws ALFileNotRemovedException
* @throws JetspeedSecurityException
*/
public static boolean deleteUserList(RunData rundata,
List<TurbineUser> userlist, List<String> msgList)
throws ALDBErrorException, ALFileNotRemovedException,
JetspeedSecurityException {
// WebAPIのDBへ接続できるか確認
if (!ALDataSyncFactoryService
.getInstance()
.getDataSyncHandler()
.checkConnect()) {
msgList.add(ALLocalizationUtils
.getl10nFormat("ACCOUNT_ALERT_CONNECT_DB_FAILED"));
return false;
}
int size = userlist.size();
String[] user_name_list = new String[size];
// 予めバリデーション
int admin_count = 0;
for (TurbineUser user : userlist) {
if (user.getLoginName().equals(rundata.getUser().getUserName())) {
msgList.add(ALLocalizationUtils
.getl10nFormat("ACCOUNT_ALERT_DELETE_LOGINUSER"));
return false;
}
if (ALEipUtils.isAdmin(user.getUserId())
&& ALEipUtils.isEnabledUser(user.getUserId())) {
admin_count++;
}
}
if (!AccountUtils.isAdminDeletable(admin_count)) {
msgList.add(ALLocalizationUtils.getl10nFormat(
"ACCOUNT_ALERT_NUMOFADMINS_LIMIT",
Integer.valueOf(ALConfigService
.get(Property.MINIMUM_ADMINISTRATOR_USER_COUNT))));
return false;
}
for (int i = 0; i < size; i++) {
TurbineUser record = userlist.get(i);
String user_name = record.getLoginName();
user_name_list[i] = user_name;
if (user_name == null) {
return false;
}
TurbineUser user =
Database.get(
TurbineUser.class,
TurbineUser.LOGIN_NAME_COLUMN,
user_name);
// ユーザーを論理削除
user.setPositionId(Integer.valueOf(0));
user.setDisabled("T");
// ユーザーIDを取得する
String userId = user.getUserId().toString();
// 対象ユーザのユーザーグループロールをすべて削除する
SelectQuery<TurbineUserGroupRole> ugr_query =
Database.query(TurbineUserGroupRole.class);
Expression exp2 =
ExpressionFactory.matchExp(
TurbineUserGroupRole.TURBINE_USER_PROPERTY,
userId);
ugr_query.setQualifier(exp2);
List<TurbineUserGroupRole> list4 = ugr_query.fetchList();
TurbineUserGroupRole ugr = null;
for (int j = 0; j < list4.size(); j++) {
ugr = list4.get(j);
Database.delete(ugr);
}
// TODOの削除
Database.query(EipTTodo.class).where(
Operations.in(EipTTodo.USER_ID_PROPERTY, userId)).deleteAll();
Database.query(EipTTodoCategory.class).where(
Operations.in(EipTTodoCategory.USER_ID_PROPERTY, userId)).deleteAll();
String orgId = Database.getDomainName();
// ブログの削除
SelectQuery<EipTBlog> EipBlogSQL =
Database.query(EipTBlog.class).where(
Operations.in(EipTBlog.OWNER_ID_PROPERTY, userId));
List<EipTBlog> EipBlogList = EipBlogSQL.fetchList();
if (EipBlogList != null && EipBlogList.size() > 0) {
List<EipTBlogEntry> EipTBlogEntryList =
Database
.query(EipTBlogEntry.class)
.where(Operations.in(EipTBlogEntry.EIP_TBLOG_PROPERTY, EipBlogList))
.fetchList();
for (EipTBlogEntry entry : EipTBlogEntryList) {
List<String> fpaths = new ArrayList<String>();
List<?> files = entry.getEipTBlogFiles();
if (files != null && files.size() > 0) {
int fileSize = files.size();
for (int j = 0; j < fileSize; j++) {
fpaths.add(((EipTBlogFile) files.get(j)).getFilePath());
}
ALDeleteFileUtil.deleteFiles(
entry.getEntryId(),
EipTBlogFile.EIP_TBLOG_ENTRY_PROPERTY,
AccountUtils.getSaveDirPath(orgId, entry.getOwnerId(), "blog"),
fpaths,
EipTBlogFile.class);
}
}
Database
.query(EipTBlogEntry.class)
.where(Operations.in(EipTBlogEntry.EIP_TBLOG_PROPERTY, EipBlogList))
.deleteAll();
EipBlogSQL.deleteAll();
}
// ブログの足跡を削除する
Database
.query(EipTBlogFootmarkMap.class)
.where(Operations.in(EipTBlogFootmarkMap.USER_ID_PROPERTY, userId))
.deleteAll();
// ソーシャルアプリ関連データ削除
ALApplicationService.deleteUserData(user_name);
// ワークフロー自動承認
AccountUtils.acceptWorkflow(user.getUserId());
// タイムライン削除
Expression exp01 =
ExpressionFactory.matchDbExp(EipTTimeline.OWNER_ID_COLUMN, user
.getUserId());
Expression exp02 =
ExpressionFactory.matchDbExp(EipTTimeline.PARENT_ID_COLUMN, 0);
Expression exp03 =
ExpressionFactory.matchDbExp(
"TIMELINE_TYPE",
EipTTimeline.TIMELINE_TYPE_TIMELINE);
SelectQuery<EipTTimeline> EipTTimelineSQL =
Database.query(EipTTimeline.class).andQualifier(
exp01.andExp(exp02.andExp(exp03)));
List<EipTTimeline> timelineList = EipTTimelineSQL.fetchList();
if (!timelineList.isEmpty()) {
List<Integer> timelineIdList = new ArrayList<Integer>();
for (EipTTimeline timeline : timelineList) {
timelineIdList.add(timeline.getTimelineId());
}
if (!timelineIdList.isEmpty()) {
SelectQuery<EipTTimeline> EipTTimelineSQL2 =
Database.query(EipTTimeline.class).andQualifier(
ExpressionFactory.inDbExp(
EipTTimeline.PARENT_ID_COLUMN,
timelineIdList));
List<EipTTimeline> timelineCommentList = EipTTimelineSQL2.fetchList();
List<Integer> timelineAllIdList =
new ArrayList<Integer>(timelineIdList);
if (timelineCommentList != null && !timelineCommentList.isEmpty()) {
timelineList.addAll(timelineCommentList);
for (EipTTimeline timeline : timelineCommentList) {
timelineAllIdList.add(timeline.getTimelineId());
}
}
SelectQuery<EipTTimelineLike> EipTTimelineLikeSQL =
Database.query(EipTTimelineLike.class);
EipTTimelineLikeSQL.andQualifier(ExpressionFactory.inDbExp(
EipTTimelineLike.EIP_TTIMELINE_PROPERTY,
timelineAllIdList));
for (EipTTimeline entry : timelineList) {
List<String> fpaths = new ArrayList<String>();
List<?> files = entry.getEipTTimelineFile();
if (files != null && files.size() > 0) {
int fileSize = files.size();
for (int j = 0; j < fileSize; j++) {
fpaths.add(((EipTTimelineFile) files.get(j)).getFilePath());
}
ALDeleteFileUtil.deleteFiles(
entry.getTimelineId(),
EipTTimelineFile.EIP_TTIMELINE_PROPERTY,
AccountUtils.getSaveDirPath(
orgId,
entry.getOwnerId(),
"timeline"),
fpaths,
EipTTimelineFile.class);
}
}
EipTTimelineLikeSQL.deleteAll();
EipTTimelineSQL2.deleteAll();
EipTTimelineSQL.deleteAll();
}
}
Expression exp011 =
ExpressionFactory.matchDbExp(EipTTimeline.OWNER_ID_COLUMN, user
.getUserId());
Expression exp021 =
ExpressionFactory.noMatchDbExp(EipTTimeline.PARENT_ID_COLUMN, 0);
Expression exp031 =
ExpressionFactory.matchDbExp(
"TIMELINE_TYPE",
EipTTimeline.TIMELINE_TYPE_TIMELINE);
SelectQuery<EipTTimeline> EipTTimelineSQL1 =
Database.query(EipTTimeline.class).andQualifier(
exp011.andExp(exp021.andExp(exp031)));
List<EipTTimeline> timelineList1 = EipTTimelineSQL1.fetchList();
if (!timelineList1.isEmpty()) {
SelectQuery<EipTTimelineLike> EipTTimelineLikeSQL2 =
Database.query(EipTTimelineLike.class);
EipTTimelineLikeSQL2.andQualifier(ExpressionFactory.inDbExp(
EipTTimelineLike.EIP_TTIMELINE_PROPERTY,
timelineList1));
EipTTimelineLikeSQL2.deleteAll();
EipTTimelineSQL1.deleteAll();
}
SelectQuery<EipTTimelineLike> EipTTimelineLikeSQL3 =
Database.query(EipTTimelineLike.class);
EipTTimelineLikeSQL3.andQualifier(ExpressionFactory.matchDbExp(
EipTTimelineLike.OWNER_ID_COLUMN,
user.getUserId()));
EipTTimelineLikeSQL3.deleteAll();
// メッセージルームの管理者権限移行
AccountUtils.shiftMessageroomAdmin(user.getUserId());
// メッセージ
List<EipTMessageFile> messageFileList =
Database
.query(EipTMessageFile.class)
.where(
Operations.eq(EipTMessageFile.OWNER_ID_PROPERTY, user.getUserId()))
.fetchList();
ALDeleteFileUtil.deleteFiles(AccountUtils.getSaveDirPath(orgId, user
.getUserId(), "message"), messageFileList);
Database.query(EipTMessage.class).where(
Operations.in(EipTMessage.USER_ID_PROPERTY, userId)).deleteAll();
Database
.query(EipTMessageRoomMember.class)
.where(Operations.in(EipTMessageRoomMember.USER_ID_PROPERTY, userId))
.deleteAll();
// 削除対象ユーザー以外にメンバーのいないメッセージルームを削除
StringBuilder sql = new StringBuilder();
sql.append("select * from eip_t_message_room ");
sql.append("where room_id in ");
sql.append("( ");
sql.append("select room_id from eip_t_message_room_member ");
sql.append("where room_id in ");
sql.append("( ");
sql.append("select room_id from eip_t_message_room_member ");
sql.append("group by room_id ");
sql.append("having COUNT(*) = 1 ");
sql.append(") ");
sql.append("and user_id = #bind($userId) ");
sql.append(")");
List<EipTMessageRoom> deleteRoomList =
Database.sql(EipTMessageRoom.class, sql.toString()).param(
"userId",
Integer.parseInt(userId)).fetchList();
List<Integer> deleteRoomIdList = new ArrayList<Integer>();
for (EipTMessageRoom room : deleteRoomList) {
deleteRoomIdList.add(room.getRoomId());
}
// 削除対象ユーザー以外にメンバーのいないメッセージルームの添付ファイルを削除
for (Integer roomId : deleteRoomIdList) {
List<EipTMessageFile> messageRoomfiles =
Database
.query(EipTMessageFile.class)
.where(Operations.eq(EipTMessageFile.ROOM_ID_PROPERTY, roomId))
.fetchList();
ALDeleteFileUtil.deleteFiles(
AccountUtils.FOLDER_FILEDIR_MESSAGE,
AccountUtils.CATEGORY_KEY_MESSAGE,
messageRoomfiles);
}
if (deleteRoomIdList.size() > 0) {
Database.query(EipTMessageRoom.class).andQualifier(
ExpressionFactory.inDbExp(
EipTMessageRoom.ROOM_ID_PK_COLUMN,
deleteRoomIdList)).deleteAll();
}
Database.commit();
// イベントログに保存
String name = "";
if (user.getLastName() != null
&& !" ".equals(user.getLastName())
&& user.getFirstName() != null
&& !" ".equals(user.getFirstName())) {
name =
new StringBuffer().append(user.getLastName()).append(" ").append(
user.getFirstName()).toString();
} else {
name = user.getEmail();
}
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
user.getUserId(),
ALEventlogConstants.PORTLET_TYPE_ACCOUNT,
"ユーザー「" + name + "」を削除");
// PSMLを削除
JetspeedUser juser =
JetspeedSecurity.getUser(new UserNamePrincipal(user_name));
PsmlManager.removeUserDocuments(juser);
// ユーザー名の先頭に"dummy_userid_"を追加
String dummy_user_name =
ALEipUtils.dummy_user_head + userId + "_" + user_name;
user.setLoginName(dummy_user_name);
}
// 他のユーザの順番を変更する.
SelectQuery<EipMUserPosition> p_query =
Database.query(EipMUserPosition.class);
p_query.orderAscending(EipMUserPosition.POSITION_PROPERTY);
List<EipMUserPosition> userPositions = p_query.fetchList();
if (userPositions != null && userPositions.size() > 0) {
EipMUserPosition userPosition = null;
int possize = userPositions.size();
for (int i = 0; i < possize; i++) {
userPosition = userPositions.get(i);
if (userPosition.getPosition().intValue() != (i + 1)) {
userPosition.setPosition(Integer.valueOf(i + 1));
}
}
}
Database.commit();
// WebAPIとのDB同期
if (!ALDataSyncFactoryService
.getInstance()
.getDataSyncHandler()
.multiDeleteUser(user_name_list, size)) {
return false;
}
return msgList.size() == 0;
}
/**
* 管理者権限を持ったユーザを一人、管理者権限剥奪・無効化・削除しても<br/>
* 最低限必要な管理者権限を持ったユーザ数を割らないかどうかを返します。
*
* @return
*/
public static boolean isAdminDeletable() {
return isAdminDeletable(1);
}
/**
* 管理者権限を持ったユーザを指定人数、管理者権限剥奪・無効化・削除しても<br/>
* 最低限必要な管理者権限を持ったユーザ数を割らないかどうかを返します。
*
* @param admin_count
* @return
*/
public static boolean isAdminDeletable(int admin_count) {
try {
int minimum_admin =
Integer.valueOf(ALConfigService
.get(Property.MINIMUM_ADMINISTRATOR_USER_COUNT));
Group group = JetspeedSecurity.getGroup("LoginUser");
Role adminrole = JetspeedSecurity.getRole("admin");
int current_admin_count =
Database.query(TurbineUserGroupRole.class).where(
Operations.eq(TurbineUserGroupRole.TURBINE_ROLE_PROPERTY, adminrole
.getId()),
Operations.eq(TurbineUserGroupRole.TURBINE_GROUP_PROPERTY, group
.getId()),
Operations.ne(TurbineUserGroupRole.TURBINE_USER_PROPERTY, 1),
Operations.eq(TurbineUserGroupRole.TURBINE_USER_PROPERTY
+ "."
+ TurbineUser.DISABLED_PROPERTY, "F")).distinct(true).getCount();
int admin_count_will = current_admin_count - admin_count;
if (admin_count_will < 0) {
admin_count_will = 0;
}
return minimum_admin <= admin_count_will;
} catch (JetspeedSecurityException e) {
logger.error("AccountUtils.isAdminDeletable", e);
return false;
}
}
/**
* 与えられたユーザー名に使われている記号が、使用できるものかを確認します。
*
* @return
*/
public static boolean isValidSymbolUserName(String name) {
List<String> symbols = Arrays.asList(USER_NAME_SYMBOLS);
for (char c : name.toCharArray()) {
if (ALStringUtil.isSymbol(c) && !symbols.contains(String.valueOf(c))) {
return false;
}
}
return true;
}
/**
* 指定されたuserIdが使用しているメールの総容量を返します。 <BR>
*
* @param userId
* @return メールの容量
*/
public static long getStorageSizeOfUserMail(Integer userId) {
long totalSize = 0;
try {
// ユーザーが持っているアカウントを取得。
List<EipMMailAccount> accounts = ALMailUtils.getMailAccountList(userId);
String orgId = Database.getDomainName();
// 全アカウントに対してフォルダの容量を取得していく。
if (accounts != null) {
for (EipMMailAccount account : accounts) {
Integer accountId = account.getAccountId();
ALMailHandler handler =
ALMailFactoryService.getInstance().getMailHandler();
totalSize += handler.getFolderSize(orgId, userId, accountId);
}
}
} catch (Throwable t) {
}
return totalSize;
}
/**
* データ容量を単位つきで返します。 <BR>
*
* @param size
* @return 文字列
*/
public static String getSizeStr(long size) {
if (1024 > size) {
return size + " Byte";
} else if (1024 * 1024 > size) {
double dsize = size;
dsize = dsize / 1024;
BigDecimal bi = new BigDecimal(String.valueOf(dsize));
double value = bi.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
return value + " KByte";
} else {
double dsize = size;
dsize = dsize / 1024 / 1024;
BigDecimal bi = new BigDecimal(String.valueOf(dsize));
double value = bi.setScale(1, BigDecimal.ROUND_HALF_UP).doubleValue();
return value + " MB";
}
}
/**
* ユーザーのRole一覧を返します。
*
* @return
*/
public static Map<Integer, FilterRole> getRoleMap() {
if (roleMap.size() == 0) {
roleMap.put(ROLE_ADMIN, new FilterRole(ROLE_ADMIN, ALLocalizationUtils
.getl10nFormat("ACCOUNT_ROLE_ADMIN")));
roleMap.put(ROLE_ACTIVE, new FilterRole(ROLE_ACTIVE, ALLocalizationUtils
.getl10nFormat("ACCOUNT_ROLE_ACTIVE")));
roleMap.put(ROLE_IN_ACTIVE, new FilterRole(
ROLE_IN_ACTIVE,
ALLocalizationUtils.getl10nFormat("ACCOUNT_ROLE_IN_ACTIVE")));
// roleMap.put(ROLE_INVITE, new FilterRole(ROLE_INVITE,
// ALLocalizationUtils
// .getl10nFormat("ACCOUNT_ROLE_INVITE")));
}
return roleMap;
}
public static class FilterRole {
private Integer roleId;
private String roleName;
public FilterRole(Integer id, String name) {
this.setRoleId(id);
this.setRoleName(name);
}
/**
* @return roleId
*/
public Integer getRoleId() {
return roleId;
}
/**
* @param roleId
* セットする roleId
*/
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
/**
* @return roleName
*/
public String getRoleName() {
return roleName;
}
/**
* @param roleName
* セットする roleName
*/
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
/**
* 表示切り替えで指定した検索キーワードを取得する.
*
* @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;
}
public static String getSaveDirPath(String orgId, int uid, String portletName) {
return ALStorageService.getDocumentPath(
FOLDER_FILEDIR_ACCOUNT,
getCategoryKey(portletName) + ALStorageService.separator() + uid);
}
public static String getCategoryKey(String portletName) {
return JetspeedResources.getString(
"aipo." + portletName + ".categorykey",
"");
}
public static String getPortletId(RunData rundata) {
HashMap<String, String> map = ALEipUtils.getPortletFromAppIdMap(rundata);
Iterator<java.util.Map.Entry<String, String>> iterator =
map.entrySet().iterator();
while (iterator.hasNext()) {
java.util.Map.Entry<String, String> next = iterator.next();
if (next.getKey().endsWith("AccountPerson")) {
return next.getValue();
}
}
return null;
}
public static List<AccountPostResultData> getAccountPostResultList(
List<EipMPost> result) {
List<AccountPostResultData> list = new ArrayList<AccountPostResultData>();
for (EipMPost model : result) {
list.add(getAccountPostResultData(model));
}
return list;
}
public static AccountPostResultData getAccountPostResultData(EipMPost model) {
AccountPostResultData data = new AccountPostResultData();
data.initField();
data.setPostId(model.getPostId());
data.setCompanyId(model.getCompanyId());
data.setPostName(model.getPostName());
data.setZipcode(model.getZipcode());
data.setAddress(model.getAddress());
data.setInTelephone(model.getInTelephone());
data.setOutTelephone(model.getOutTelephone());
data.setFaxNumber(model.getFaxNumber());
data.setCreateDate(model.getCreateDate().toString());
data.setUpdateDate(model.getUpdateDate().toString());
data.setGroupName(model.getGroupName());
return data;
}
/**
* 指定されたユーザーが削除/無効化されたとき、メッセージルームの管理者権限を他のユーザーに移します。
*
* @param uid
*/
public static boolean shiftMessageroomAdmin(int uid) {
try {
String userId = Integer.toString(uid);
// user_idが自分で、管理者であるデータを取得する(チェックする必要があるルームを取得)
SelectQuery<EipTMessageRoomMember> message_room_query =
Database.query(EipTMessageRoomMember.class);
Expression msgroom_exp =
ExpressionFactory.matchExp(
EipTMessageRoomMember.USER_ID_PROPERTY,
userId);
Expression msgroom_exp2 =
ExpressionFactory.matchExp(
EipTMessageRoomMember.AUTHORITY_PROPERTY,
"A");
message_room_query.setQualifier(msgroom_exp.andExp(msgroom_exp2));
List<EipTMessageRoomMember> message_room_list =
message_room_query.fetchList();
// ルーム一つずつについて、自分の他のメンバーを取り出す
for (EipTMessageRoomMember message_room : message_room_list) {
SelectQuery<EipTMessageRoomMember> message_room_query2 =
Database.query(EipTMessageRoomMember.class);
Expression msgroom_exp3 =
ExpressionFactory.matchExp(
EipTMessageRoomMember.EIP_TMESSAGE_ROOM_PROPERTY,
message_room.getEipTMessageRoom().getRoomId());
Expression msgroom_exp4 =
ExpressionFactory.noMatchExp(
EipTMessageRoomMember.USER_ID_PROPERTY,
message_room.getUserId());
message_room_query2.setQualifier(msgroom_exp3.andExp(msgroom_exp4));
List<EipTMessageRoomMember> message_room_member_list =
message_room_query2.fetchList();
boolean flag = false;
// 管理者権限を持つメンバーがいたら抜ける。一人もいなかったらflagをtrueにする
for (Iterator<EipTMessageRoomMember> iterator =
message_room_member_list.iterator(); iterator.hasNext();) {
EipTMessageRoomMember member = iterator.next();
if (member.getAuthority().equals("A")) {
break;
}
if (!iterator.hasNext()) {
flag = true;
}
}
// flagがtrueなら全員を管理者に設定する
if (flag) {
for (EipTMessageRoomMember member : message_room_member_list) {
member.setAuthority("A");
}
}
}
return true;
} catch (Exception e) {
logger.error(e.getMessage(), e);
return false;
}
}
}