/*
* 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.common;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.jetspeed.om.profile.ProfileLocator;
import org.apache.jetspeed.om.security.JetspeedUser;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
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.EipTAclPortletFeature;
import com.aimluck.eip.cayenne.om.account.EipTAclRole;
import com.aimluck.eip.cayenne.om.account.EipTAclUserRoleMap;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.cayenne.om.security.VTurbineUserLite;
import com.aimluck.eip.http.HttpServletRequestLocator;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SQLTemplate;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.customlocalization.ALLocalizationTool;
/**
* ユーザー情報、会社情報、部署情報、役職情報をメモリ上に保持するクラスです。 <br />
*
*/
public class ALEipManager {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ALEipManager.class.getName());
/** Singleton */
private static ALEipManager manager = new ALEipManager();
/** ユーザーキー */
private static String USERS_KEY = "com.aimluck.eip.common.ALEipManager.users";
/** 会社キー */
private static String COMPANIES_KEY =
"com.aimluck.eip.common.ALEipManager.companies";
/** 部署キー */
private static String POSTS_KEY = "com.aimluck.eip.common.ALEipManager.posts";
/** 役職キー */
private static String POSITIONS_KEY =
"com.aimluck.eip.common.ALEipManager.positions";
/** ACLキー */
private static String ACL_KEY = "com.aimluck.eip.common.ALEipManager.acls";
/** eip_m_config prefix key */
private static String CONFIG_PREFIX = "config_";
/** container_config prefix key */
private static String CONTAINER_PREFIX = "container_";
/** turbineUser prefix key */
private static String USER_PREFIX = "turbineUser_";
/** psml prefix key */
private static String PSML_PREFIX = "psml";
/** LocalizationTool */
private static String LOCALIZATION_PREFIX = "Localization";
/**
*
* @return
*/
public static ALEipManager getInstance() {
return manager;
}
/**
* 会社情報を更新します。
*/
public void reloadCompany() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(COMPANIES_KEY, null);
}
}
/**
* 部署情報を更新します。
*/
public void reloadPost() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(POSTS_KEY, null);
}
}
/**
* 役職情報を更新します。
*/
public void reloadPosition() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(POSITIONS_KEY, null);
}
}
public ALEipUser getUser(Integer userId) {
Map<Integer, ALEipUser> users = getUsers(Arrays.asList(userId));
return users.get(userId);
}
@SuppressWarnings("unchecked")
public Map<Integer, ALEipUser> getUsers(List<Integer> users) {
Map<Integer, ALEipUser> results =
new HashMap<Integer, ALEipUser>(users.size());
Map<Integer, ALEipUser> map = new HashMap<Integer, ALEipUser>(users.size());
List<Integer> fetchUsers = new ArrayList<Integer>(users.size());
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
map = (Map<Integer, ALEipUser>) request.getAttribute(USERS_KEY);
if (map != null) {
for (Integer userId : users) {
ALEipUser user = map.get(userId);
if (user != null) {
results.put(userId, user);
} else {
fetchUsers.add(userId);
}
}
} else {
map = new HashMap<Integer, ALEipUser>(users.size());
fetchUsers.addAll(users);
}
} else {
fetchUsers.addAll(users);
}
if (fetchUsers.size() > 0) {
StringBuilder select = new StringBuilder();
select.append("SELECT");
select.append(" turbine_user.user_id,");
select.append(" turbine_user.last_name,");
select.append(" turbine_user.first_name,");
select.append(" turbine_user.login_name,");
select.append(" turbine_user.has_photo,");
select.append(" turbine_user.photo_modified");
StringBuilder body = new StringBuilder();
body.append(" FROM turbine_user WHERE ");
body.append(" turbine_user.user_id IN (");
boolean isFirst = true;
for (Integer num : fetchUsers) {
if (!isFirst) {
body.append(",");
}
body.append(num.intValue());
isFirst = false;
}
body.append(")");
SQLTemplate<VTurbineUserLite> query =
Database.sql(VTurbineUserLite.class, select.toString()
+ body.toString());
List<VTurbineUserLite> list = query.fetchList();
for (VTurbineUserLite model : list) {
ALEipUser eipUser = new ALEipUser();
eipUser.initField();
eipUser.setAliasName(model.getFirstName(), model.getLastName());
eipUser.setName(model.getLoginName());
eipUser.setUserId(model.getUserId());
eipUser.setHasPhoto("T".equals(model.getHasPhoto())
|| "N".equals(model.getHasPhoto()));
eipUser.setPhotoModified(model.getPhotoModified() != null ? model
.getPhotoModified()
.getTime() : 0);
results.put(model.getUserId(), eipUser);
map.put(model.getUserId(), eipUser);
}
}
// requestに登録
if (request != null) {
request.setAttribute(USERS_KEY, map);
}
return results;
}
/**
* 会社情報を返します。
*
* @return
*/
public Map<Integer, ALEipCompany> getCompanyMap() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
// requestから取得
@SuppressWarnings("unchecked")
Map<Integer, ALEipCompany> map =
(Map<Integer, ALEipCompany>) request.getAttribute(COMPANIES_KEY);
if (map != null) {
return map;
}
}
// データベースから新規取得
Map<Integer, ALEipCompany> companyMap =
new LinkedHashMap<Integer, ALEipCompany>();
try {
List<EipMCompany> list = Database.query(EipMCompany.class).fetchList();
for (EipMCompany record : list) {
ALEipCompany company = new ALEipCompany();
company.initField();
company.setCompanyId(record.getCompanyId().intValue());
company.setCompanyName(record.getCompanyName());
companyMap.put(record.getCompanyId(), company);
}
} catch (Exception e) {
logger.error("[" + Database.getDomainName() + ":ALEipManager]", e);
}
// requestに登録
if (request != null) {
request.setAttribute(COMPANIES_KEY, companyMap);
}
return companyMap;
}
/**
* 部署情報を返します。
*
* @return
*/
public Map<Integer, ALEipPost> getPostMap() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
// requestから取得
@SuppressWarnings("unchecked")
Map<Integer, ALEipPost> map =
(Map<Integer, ALEipPost>) request.getAttribute(POSTS_KEY);
if (map != null) {
return map;
}
}
// データベースから新規取得
Map<Integer, ALEipPost> postMap = new LinkedHashMap<Integer, ALEipPost>();
try {
SelectQuery<EipMPost> query = Database.query(EipMPost.class);
query.orderAscending(EipMPost.SORT_PROPERTY);
List<EipMPost> list = query.fetchList();
for (EipMPost record : list) {
ALEipPost post = new ALEipPost();
post.initField();
post.setPostId(record.getPostId().intValue());
post.setPostName(record.getPostName());
post.setGroupName(record.getGroupName());
postMap.put(record.getPostId(), post);
}
} catch (Exception e) {
logger.error("[" + Database.getDomainName() + ":ALEipManager]", e);
}
// requestに登録
if (request != null) {
request.setAttribute(POSTS_KEY, postMap);
}
return postMap;
}
/**
* 役職情報を返します。
*
* @return
*/
public Map<Integer, ALEipPosition> getPositionMap() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
// requestから取得
@SuppressWarnings("unchecked")
Map<Integer, ALEipPosition> map =
(Map<Integer, ALEipPosition>) request.getAttribute(POSITIONS_KEY);
if (map != null) {
return map;
}
}
// データベースから新規取得
Map<Integer, ALEipPosition> positionMap =
new LinkedHashMap<Integer, ALEipPosition>();
try {
List<EipMPosition> list =
Database.query(EipMPosition.class).orderAscending(
EipMPosition.SORT_PROPERTY).fetchList();
for (EipMPosition record : list) {
ALEipPosition position = new ALEipPosition();
position.initField();
position.setPositionId(record.getPositionId().intValue());
position.setPositionName(record.getPositionName());
positionMap.put(record.getPositionId(), position);
}
} catch (Exception e) {
logger.error("[" + Database.getDomainName() + ":ALEipManager]", e);
}
// requestに登録
if (request != null) {
request.setAttribute(POSITIONS_KEY, positionMap);
}
return positionMap;
}
public Map<String, EipTAclRole> getAclRoleMap(int userId) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
// requestから取得
@SuppressWarnings("unchecked")
Map<String, EipTAclRole> map =
(Map<String, EipTAclRole>) request.getAttribute(ACL_KEY);
if (map != null) {
return map;
}
}
// データベースから新規取得
Map<String, EipTAclRole> roleMap = new HashMap<String, EipTAclRole>();
Expression exp =
ExpressionFactory.matchDbExp(EipTAclRole.EIP_TACL_USER_ROLE_MAPS_PROPERTY
+ "."
+ EipTAclUserRoleMap.TURBINE_USER_PROPERTY
+ "."
+ TurbineUser.USER_ID_PK_COLUMN, userId);
List<EipTAclRole> roleList =
Database.query(EipTAclRole.class, exp).fetchList();
List<EipTAclPortletFeature> featureList =
Database.query(EipTAclPortletFeature.class).fetchList();
Map<Integer, String> _map = new HashMap<Integer, String>();
for (EipTAclPortletFeature feature : featureList) {
_map.put(feature.getFeatureId(), feature.getFeatureName());
}
String _featureName;
for (EipTAclRole _role : roleList) {
_featureName = _map.get(_role.getFeatureId());
roleMap.put(_featureName, _role);
}
// requestに登録
if (request != null) {
request.setAttribute(ACL_KEY, roleMap);
}
return roleMap;
}
public Object getConfig(String name) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
return request.getAttribute(CONFIG_PREFIX + name);
} else {
return null;
}
}
public void setConfig(String name, Object obj) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(CONFIG_PREFIX + name, obj);
}
}
public Object getContainerConfig(String name) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
return request.getAttribute(CONTAINER_PREFIX + name);
} else {
return null;
}
}
public void setContainerConfig(String name, Object obj) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(CONTAINER_PREFIX + name, obj);
}
}
public Object getTurbineUser(int userId) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
return request.getAttribute(USER_PREFIX + String.valueOf(userId));
} else {
return null;
}
}
public void setTurbineUser(int userId, Object obj) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(USER_PREFIX + String.valueOf(userId), obj);
}
}
public Object getTurbineUser(String loginName) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
return request.getAttribute(USER_PREFIX + loginName);
} else {
return null;
}
}
public void setTurbineUser(String loginName, Object obj) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(USER_PREFIX + loginName, obj);
}
}
public Object getUserProfile(ProfileLocator locator) {
HttpServletRequest request = HttpServletRequestLocator.get();
String key = getUserProfileKey(locator);
if (request != null && key != null) {
return request.getAttribute(key);
} else {
return null;
}
}
public void setUserProfile(ProfileLocator locator, Object obj) {
HttpServletRequest request = HttpServletRequestLocator.get();
String key = getUserProfileKey(locator);
if (request != null && key != null) {
request.setAttribute(key, obj);
}
}
public void removeProfile(ProfileLocator locator) {
HttpServletRequest request = HttpServletRequestLocator.get();
String key = getUserProfileKey(locator);
if (request != null && key != null) {
request.removeAttribute(key);
}
}
private String getUserProfileKey(ProfileLocator locator) {
StringBuffer buffer = new StringBuffer(PSML_PREFIX);
String userName = null;
JetspeedUser user = locator.getUser();
if (user != null) {
userName = user.getUserName();
} else {
return null;
}
addKey(userName, buffer);
addKey(locator.getMediaType(), buffer);
addKey(locator.getLanguage(), buffer);
addKey(locator.getCountry(), buffer);
addKey(locator.getName(), buffer);
return buffer.toString();
}
private void addKey(String key, StringBuffer buffer) {
if (key != null && key.length() > 0) {
buffer.append("_").append(key);
}
}
public ALLocalizationTool getLocalizationTool() {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
Object obj = request.getAttribute(LOCALIZATION_PREFIX);
if (obj != null) {
return (ALLocalizationTool) obj;
} else {
return null;
}
} else {
return null;
}
}
public void setLocalizationTool(ALLocalizationTool tool) {
HttpServletRequest request = HttpServletRequestLocator.get();
if (request != null) {
request.setAttribute(LOCALIZATION_PREFIX, tool);
}
}
}