/* * 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.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.StringReader; import java.text.Normalizer; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray; import org.apache.cayenne.DataRow; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.jetspeed.capability.CapabilityMap; import org.apache.jetspeed.capability.CapabilityMapFactory; import org.apache.jetspeed.om.profile.Entry; import org.apache.jetspeed.om.profile.Layout; import org.apache.jetspeed.om.profile.PSMLDocument; import org.apache.jetspeed.om.profile.Parameter; import org.apache.jetspeed.om.profile.Portlets; import org.apache.jetspeed.om.profile.Profile; import org.apache.jetspeed.om.profile.ProfileException; import org.apache.jetspeed.om.profile.ProfileLocator; import org.apache.jetspeed.om.profile.psml.PsmlLayout; import org.apache.jetspeed.om.profile.psml.PsmlParameter; import org.apache.jetspeed.om.registry.ClientEntry; import org.apache.jetspeed.om.registry.ClientRegistry; import org.apache.jetspeed.om.registry.MediaTypeEntry; import org.apache.jetspeed.om.security.Role; import org.apache.jetspeed.om.security.UserIdPrincipal; import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.portal.PortletConfig; import org.apache.jetspeed.portal.portlets.VelocityPortlet; import org.apache.jetspeed.portal.security.portlets.PortletWrapper; import org.apache.jetspeed.services.JetspeedSecurity; import org.apache.jetspeed.services.PortletFactory; import org.apache.jetspeed.services.Profiler; import org.apache.jetspeed.services.PsmlManager; import org.apache.jetspeed.services.Registry; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.services.rundata.JetspeedRunData; import org.apache.jetspeed.services.security.JetspeedSecurityException; import org.apache.jetspeed.util.MimeType; import org.apache.jetspeed.util.template.ContentTemplateLink; import org.apache.jetspeed.util.template.JetspeedLink; import org.apache.jetspeed.util.template.JetspeedLinkFactory; import org.apache.turbine.om.security.User; import org.apache.turbine.services.TurbineServices; import org.apache.turbine.util.DynamicURI; import org.apache.turbine.util.RunData; import org.apache.turbine.util.TurbineException; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.apache.velocity.context.Context; import org.apache.velocity.exception.ParseErrorException; import org.apache.velocity.exception.ResourceNotFoundException; import com.aimluck.commons.field.ALDateTimeField; import com.aimluck.commons.field.ALStringField; import com.aimluck.eip.cayenne.om.account.AipoLicense; import com.aimluck.eip.cayenne.om.account.EipMCompany; import com.aimluck.eip.cayenne.om.account.EipMUserPosition; import com.aimluck.eip.cayenne.om.portlet.EipMFacilityGroup; 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.ALEipGroup; import com.aimluck.eip.common.ALEipManager; import com.aimluck.eip.common.ALEipUser; import com.aimluck.eip.common.ALMyGroups; import com.aimluck.eip.common.ALPermissionException; import com.aimluck.eip.http.HttpServletRequestLocator; import com.aimluck.eip.modules.actions.controls.Restore; 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.accessctl.ALAccessControlConstants; import com.aimluck.eip.services.accessctl.ALAccessControlFactoryService; import com.aimluck.eip.services.accessctl.ALAccessControlHandler; import com.aimluck.eip.services.config.ALConfigHandler.Property; import com.aimluck.eip.services.config.ALConfigService; /** * */ public class ALEipUtils { public static final String dummy_user_head = "dummy_"; /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ALEipUtils.class.getName()); // iPhone メニューを表示させたい順番に並べる // TODO: 設定ファイルで管理して VM と統合する public static String[] IPHONE_APPS = { "Timeline", "Schedule", "ExtTimecard", "Activity", "Blog", "Msgboard", "ToDo", "Cabinet", "Workflow", "Note", "Report", "WebMail", "AddressBook", "UserList", "Memo" }; /** * セッション変数に値を格納します。 <br /> * セッション変数は各ポートレット毎に管理されます。 * * @param rundata * @param context * @param key * セッション変数名 * @param value * セッション変数の値 */ public static void setTemp(RunData rundata, Context context, String key, String value) { JetspeedRunData jdata = (JetspeedRunData) rundata; VelocityPortlet portlet = ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY)); if (portlet == null) { // Screen の場合 String js_peid = rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY); jdata.getUser().setTemp( new StringBuffer().append(js_peid).append(key).toString(), value); } else { // Action の場合 jdata.getUser().setTemp( new StringBuffer().append(portlet.getID()).append(key).toString(), value); } } /** * セッション変数を削除します。 <br /> * セッション変数は各ポートレット毎に管理されます。 * * @param rundata * @param context * @param key * セッション変数名 */ public static void removeTemp(RunData rundata, Context context, String key) { JetspeedRunData jdata = (JetspeedRunData) rundata; VelocityPortlet portlet = ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY)); if (portlet == null) { // Screen の場合 String js_peid = rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY); jdata.getUser().removeTemp( new StringBuffer().append(js_peid).append(key).toString()); } else { // Action の場合 jdata.getUser().removeTemp( new StringBuffer().append(portlet.getID()).append(key).toString()); } } public static void removeTemp(RunData rundata, Context context, List<String> list) { JetspeedRunData jdata = (JetspeedRunData) rundata; VelocityPortlet portlet = ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY)); int size = list.size(); if (portlet == null) { // Screen の場合 String js_peid = rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY); for (int i = 0; i < size; i++) { jdata.getUser().removeTemp( new StringBuffer() .append(js_peid) .append(list.get(i).toString()) .toString()); } } else { // Action の場合 String peid = portlet.getID(); for (int i = 0; i < size; i++) { jdata.getUser().removeTemp( new StringBuffer() .append(peid) .append(list.get(i).toString()) .toString()); } } } /** * セッション変数の値を取得します。 <br /> * セッション変数は各ポートレット毎に管理されます。 * * @param rundata * @param context * @param key * セッション変数名 * @return セッション変数の値 */ public static String getTemp(RunData rundata, Context context, String key) { JetspeedRunData jdata = (JetspeedRunData) rundata; Object obj = null; VelocityPortlet portlet = ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY)); if (portlet == null) { // Screen の場合 String js_peid = rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY); obj = jdata.getUser().getTemp( new StringBuffer().append(js_peid).append(key).toString()); } else { // Action の場合 obj = jdata.getUser().getTemp( new StringBuffer().append(portlet.getID()).append(key).toString()); } return (obj == null) ? null : obj.toString(); } /** * セッションに保存されているエンティティIDを整数値として返します。 * * @param rundata * @param context * @return */ public static int getEntityId(RunData rundata, Context context) { int entity_id = 0; String entity_id_str = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { entity_id = Integer.parseInt(entity_id_str); } catch (Exception e) { entity_id = 0; } return entity_id; } /** * ユーザーIDを返します。 * * @param rundata * @return ユーザーID */ public static int getUserId(RunData rundata) { JetspeedRunData jdata = (JetspeedRunData) rundata; String id = jdata.getJetspeedUser().getUserId(); return Integer.parseInt(id); } /** * ポートレットを返します。 * * @param rundata * @param context * @return 自ポートレット */ public static VelocityPortlet getPortlet(RunData rundata, Context context) { return ((VelocityPortlet) context.get(JetspeedResources.PATH_PORTLET_KEY)); } /** * 指定したポートレット ID を持つポートレットのオブジェクトを取得します。 * * @param rundata * @param portletId * @return 自ポートレット */ public static Portlet getPortlet(RunData rundata, String portletId) { try { Profile profile = ((JetspeedRunData) rundata).getProfile(); if (profile == null) { return null; } Portlets portlets = profile.getDocument().getPortlets(); if (portlets == null) { return null; } @SuppressWarnings("unchecked") Iterator<Entry> iterator = portlets.getEntriesIterator(); while (iterator.hasNext()) { Entry next = iterator.next(); if (portletId.equals(next.getId())) { PortletWrapper activityWrapper = (PortletWrapper) PortletFactory.getPortlet(next); if (activityWrapper != null) { return activityWrapper.getPortlet(); } } } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } int length = portletList.length; for (int i = 0; i < length; i++) { Entry[] entries = portletList[i].getEntriesArray(); if (entries == null || entries.length <= 0) { continue; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletId)) { PortletWrapper wrapper = (PortletWrapper) PortletFactory.getPortlet(entries[j]); if (wrapper != null) { return wrapper.getPortlet(); } else { return null; } } } } } catch (Exception ex) { logger.error("ALEipUtils.getPortlet", ex); return null; } return null; } /** * 指定したポートレット ID を持つポートレットのオブジェクトを取得します。 * * @param rundata * @param portletId * @return 自ポートレット */ public static HashMap<String, String> getPortletFromAppIdMap(RunData rundata) { HashMap<String, String> hash = new HashMap<String, String>(); try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return hash; } for (@SuppressWarnings("unchecked") Iterator<Entry> it = portlets.getEntriesIterator(); it.hasNext();) { Entry next = it.next(); if (!hash.containsKey(next.getParent())) { hash.put(next.getParent(), next.getId()); } } { Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return hash; } for (Portlets portlet : portletList) { Entry[] entries = portlet.getEntriesArray(); if (entries == null) { continue; } for (Entry entry : entries) { hash.put(entry.getParent(), entry.getId()); } } } } catch (Exception ex) { logger.error("ALEipUtils.getPortletFromAppIdMap", ex); return hash; } return hash; } /** * リクエストが自ポートレットに対するものであるかを返します。 <br /> * true となる場合、そのポートレットに対するフォーム送信となります。 * * @param rundata * @param context * @return */ public static boolean isMatch(RunData rundata, Context context) { VelocityPortlet portlet = getPortlet(rundata, context); if (portlet == null) { // Screen の場合 return true; } String peid1 = portlet.getID(); String peid2 = rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY); if (peid1 == null || peid2 == null) { return false; } return peid1.equals(peid2); } /** * 指定されたグループに所属するユーザーを取得します。<br/> * DISABLEDがNのユーザー(即ち無効化されたユーザー)は取得しないことに注意してください。 * * @param groupname * グループ名 * @return ALEipUser の List */ public static List<ALEipUser> getUsers(String groupname) { List<ALEipUser> list = new ArrayList<ALEipUser>(); // SQLの作成 StringBuffer statement = new StringBuffer(); statement.append("SELECT DISTINCT "); statement .append(" B.USER_ID, B.LOGIN_NAME, B.FIRST_NAME, B.LAST_NAME, D.POSITION "); statement.append("FROM turbine_user_group_role as A "); statement.append("LEFT JOIN turbine_user as B "); statement.append(" on A.USER_ID = B.USER_ID "); statement.append("LEFT JOIN turbine_group as C "); statement.append(" on A.GROUP_ID = C.GROUP_ID "); statement.append("LEFT JOIN eip_m_user_position as D "); statement.append(" on A.USER_ID = D.USER_ID "); statement.append("WHERE B.USER_ID > 3 AND B.DISABLED = 'F'"); statement.append(" AND C.GROUP_NAME = #bind($groupName) "); statement.append("ORDER BY D.POSITION"); String query = statement.toString(); try { List<TurbineUser> list2 = Database .sql(TurbineUser.class, query) .param("groupName", groupname) .fetchList(); for (TurbineUser tuser : list2) { list.add(getALEipUser(tuser)); } } catch (Throwable t) { logger.error("ALEipUtils.getUsers", t); } return list; } /** * 指定されたグループに所属するユーザーを取得します。<br/> * DISABLEDがNのユーザー(即ち無効化されたユーザー)も取得します。 * * @param groupname * グループ名 * @return ALEipUser の List */ public static List<ALEipUser> getUsersIncludingN(String groupname) { List<ALEipUser> list = new ArrayList<ALEipUser>(); // SQLの作成 StringBuffer statement = new StringBuffer(); statement.append("SELECT DISTINCT "); statement .append(" B.USER_ID, B.LOGIN_NAME, B.FIRST_NAME, B.LAST_NAME, D.POSITION "); statement.append("FROM turbine_user_group_role as A "); statement.append("LEFT JOIN turbine_user as B "); statement.append(" on A.USER_ID = B.USER_ID "); statement.append("LEFT JOIN turbine_group as C "); statement.append(" on A.GROUP_ID = C.GROUP_ID "); statement.append("LEFT JOIN eip_m_user_position as D "); statement.append(" on A.USER_ID = D.USER_ID "); statement.append("WHERE B.USER_ID > 3 AND B.DISABLED != 'T'"); statement.append(" AND C.GROUP_NAME = #bind($groupName) "); statement.append("ORDER BY D.POSITION"); String query = statement.toString(); try { List<TurbineUser> list2 = Database .sql(TurbineUser.class, query) .param("groupName", groupname) .fetchList(); for (TurbineUser tuser : list2) { list.add(getALEipUser(tuser)); } } catch (Throwable t) { logger.error("ALEipUtils.getUsersIncludingN", t); } return list; } /** * 指定されたグループに所属するユーザーのIDを取得します。 * * @param groupname * グループ名 * @return Integer の List */ public static List<Integer> getUserIds(String groupname) { List<Integer> list = new ArrayList<Integer>(); // SQLの作成 StringBuffer statement = new StringBuffer(); statement.append("SELECT DISTINCT "); statement.append(" B.USER_ID, D.POSITION "); statement.append("FROM turbine_user_group_role as A "); statement.append("LEFT JOIN turbine_user as B "); statement.append(" on A.USER_ID = B.USER_ID "); statement.append("LEFT JOIN turbine_group as C "); statement.append(" on A.GROUP_ID = C.GROUP_ID "); statement.append("LEFT JOIN eip_m_user_position as D "); statement.append(" on A.USER_ID = D.USER_ID "); statement.append("WHERE B.USER_ID > 3 AND B.DISABLED = 'F'"); statement.append(" AND C.GROUP_NAME = #bind($groupName) "); statement.append("ORDER BY D.POSITION"); String query = statement.toString(); try { List<TurbineUser> list2 = Database .sql(TurbineUser.class, query) .param("groupName", groupname) .fetchList(); for (TurbineUser tuser : list2) { list.add(tuser.getUserId()); } } catch (Throwable t) { logger.error("ALEipUtils.getUsersFromPost", t); } return list; } /** * 指定された部署に所属するユーザーを取得します。 * * @param postid * 部署ID * @return ALEipUser の List */ public static List<ALEipUser> getUsersFromPost(int postid) { List<ALEipUser> list = new ArrayList<ALEipUser>(); // SQLの作成 StringBuffer statement = new StringBuffer(); statement.append("SELECT DISTINCT "); statement .append(" B.USER_ID, B.LOGIN_NAME, B.FIRST_NAME, B.LAST_NAME, D.POSITION "); statement.append("FROM turbine_user_group_role as A "); statement.append("LEFT JOIN turbine_user as B "); statement.append(" on A.USER_ID = B.USER_ID "); statement.append("LEFT JOIN turbine_group as C "); statement.append(" on A.GROUP_ID = C.GROUP_ID "); statement.append("LEFT JOIN eip_m_user_position as D "); statement.append(" on A.USER_ID = D.USER_ID "); statement.append("WHERE B.USER_ID > 3 AND B.DISABLED = 'F'"); statement.append(" AND B.POST_ID = #bind($postId) "); statement.append("ORDER BY D.POSITION"); String query = statement.toString(); try { List<TurbineUser> list2 = Database .sql(TurbineUser.class, query) .param("postId", postid) .fetchList(); for (TurbineUser tuser : list2) { list.add(getALEipUser(tuser)); } } catch (Throwable t) { logger.error("ALEipUtils.getUsersFromPost", t); } return list; } /** * <code>SelectQuery</code> の条件に従ってユーザーを取得します。 * * @param crt * @return ALEipUser の List */ public static List<ALEipUser> getUsersFromSelectQuery( SelectQuery<TurbineUser> query) { List<ALEipUser> list = new ArrayList<ALEipUser>(); try { List<TurbineUser> ulist = query.orderAscending( TurbineUser.EIP_MUSER_POSITION_PROPERTY + "." + EipMUserPosition.POSITION_PROPERTY).fetchList(); for (TurbineUser tuser : ulist) { list.add(getALEipUser(tuser)); } } catch (Throwable t) { logger.error("ALEipUtils.getUsersFromSelectQuery", t); } return list; } /** * 自ユーザーの簡易オブジェクトを取得します。 * * @param crt * @return ALEipUser */ public static ALEipUser getALEipUser(RunData rundata) { JetspeedRunData jdata = (JetspeedRunData) rundata; ALBaseUser baseuser = (ALBaseUser) jdata.getJetspeedUser(); ALEipUser user = new ALEipUser(); user.initField(); user.setUserId(Integer.parseInt(baseuser.getUserId())); user.setName(baseuser.getUserName()); user.setAliasName(baseuser.getFirstName(), baseuser.getLastName()); user.setCreated(baseuser.getCreated()); return user; } /** * 指定したユーザーIDの簡易オブジェクトを取得します。 * * @param id * @return */ public static ALEipUser getALEipUser(int id) throws ALDBErrorException { TurbineUser tuser = getTurbineUser(id); return getALEipUser(tuser); } /** * 指定したユーザーIDの簡易オブジェクトを取得します。 * * @param id * @return */ public static ALEipUser getALEipUser(TurbineUser tuser) throws ALDBErrorException { if (tuser == null) { return null; } ALEipUser user = new ALEipUser(); user.initField(); user.setUserId(tuser.getUserId().intValue()); user.setName(tuser.getLoginName()); user.setAliasName(tuser.getFirstName(), tuser.getLastName()); user.setHasPhoto("T".equals(tuser.getHasPhoto()) || "N".equals(tuser.getHasPhoto())); user.setPhotoModified(tuser.getPhotoModified() != null ? tuser .getPhotoModified() .getTime() : 0); user.setCreated(tuser.getCreated()); return user; } /** * 指定したユーザーIDの簡易オブジェクトを取得します。 * * @param id * @return */ public static ALEipUser getALEipUser(String loginname) throws ALDBErrorException { TurbineUser tuser = getTurbineUser(loginname); if (tuser == null) { return null; } return getALEipUser(tuser); } /** * 指定したユーザーIDのオブジェクトを取得します。 * * @param userid * ユーザID * @return */ public static ALBaseUser getBaseUser(Integer userid) { if (userid == null) { logger.debug("Empty ID..."); return null; } String uid = String.valueOf(userid); try { return (ALBaseUser) JetspeedSecurity.getUser(new UserIdPrincipal(uid)); } catch (Exception ex) { logger.error("ALEipUtils.getBaseUser", ex); return null; } } /** * 指定したユーザーIDのユーザーオブジェクトを取得します。 * * @param id * @return */ public static TurbineUser getTurbineUser(int id) throws ALDBErrorException { Object obj = ALEipManager.getInstance().getTurbineUser(id); TurbineUser tuser = null; if (obj == null) { tuser = Database.get(TurbineUser.class, id); ALEipManager.getInstance().setTurbineUser(id, tuser); } else { tuser = (TurbineUser) obj; } return tuser; } /** * 指定したログイン名のユーザーオブジェクトを取得します。 * * @param login_name * @return */ public static TurbineUser getTurbineUser(String login_name) throws ALDBErrorException { Object obj = ALEipManager.getInstance().getTurbineUser(login_name); TurbineUser tuser = null; if (obj == null) { tuser = Database .query(TurbineUser.class) .where(Operations.eq(TurbineUser.LOGIN_NAME_PROPERTY, login_name)) .fetchSingle(); ALEipManager.getInstance().setTurbineUser(login_name, tuser); } else { tuser = (TurbineUser) obj; } return tuser; } /** * 指定したユーザーIDが有効か(無効化、削除されていないか)どうか調べます。 * * @param id * @return */ public static boolean isEnabledUser(int id) throws ALDBErrorException { TurbineUser tuser = getTurbineUser(id); if (tuser == null) { return false; } return "F".equals(tuser.getDisabled()); } /** * ユーザーのフルネームを取得します。 * * @param userid * ユーザID * @return */ public static String getUserFullName(int userid) { String userName = ""; ALBaseUser user = getBaseUser(userid); if (user != null) { userName = new StringBuffer().append(user.getLastName()).append(" ").append( user.getFirstName()).toString(); } return userName; } /** * 部署の変更を行います。 <br> * 部署に関連付けされているグループの更新も同時に行います。 * * @param rundata * @param username * ユーザー名 * @param postid * 部署ID * @return true 部署変更成功 false 部署変更失敗 */ public static boolean changePost(RunData rundata, String username, int postid) throws ALDBErrorException { try { ALBaseUser user = (ALBaseUser) JetspeedSecurity.getUser(username); // グループへ追加 JetspeedSecurity.joinGroup(username, (ALEipManager .getInstance() .getPostMap().get(Integer.valueOf(postid))).getGroupName().getValue()); // 部署を変更 user.setPostId(postid); // ユーザーを更新 JetspeedSecurity.saveUser(user); ALBaseUser currentUser = (ALBaseUser) rundata.getUser(); if (currentUser.getUserName().equals(user.getUserName())) { // 自ユーザーのセッション情報を更新する currentUser.setPostId(user.getPostId()); } } catch (JetspeedSecurityException ex) { logger.error("ALEipUtils.changePost", ex); throw new ALDBErrorException(); } return true; } /** * 自ユーザーのマイグループを再読み込みします。 <br> * 読み込まれたマイグループはセッションに保存されます。 <br> * マイグループの更新が行われた場合はこのメソッドを呼び出してください。 * * @param rundata */ public static void reloadMygroup(RunData rundata) throws ALDBErrorException { List<ALEipGroup> ulist = new ArrayList<ALEipGroup>(); try { Expression exp = ExpressionFactory.matchExp(TurbineGroup.OWNER_ID_PROPERTY, Integer .valueOf(getUserId(rundata))); List<TurbineGroup> list = Database.query(TurbineGroup.class, exp).fetchList(); for (TurbineGroup record : list) { ALEipGroup group = new ALEipGroup(); group.initField(); group.setName(record.getGroupName()); group.setAliasName(record.getGroupAliasName()); ulist.add(group); } } catch (Exception ex) { logger.error("ALEipUtils.reloadMygroup", ex); throw new ALDBErrorException(); } // ServletRequestのマイグループに保存 ALMyGroups mygroups = new ALMyGroups(); mygroups.addList(ulist); HttpServletRequest request = HttpServletRequestLocator.get(); if (request != null) { request.setAttribute(ALEipConstants.MYGROUP, mygroups); } } /** * 自ユーザーのマイグループを取得します。 * * @param rundata * @return ALEipGroup の List */ public static List<ALEipGroup> getMyGroups(RunData rundata) throws ALDBErrorException { // ServletRequestからマイグループのリストを読み込み Object obj = null; HttpServletRequest request = HttpServletRequestLocator.get(); if (request != null) { obj = request.getAttribute(ALEipConstants.MYGROUP); } if (obj == null || !(obj instanceof ALMyGroups)) { // まだMyGroupが読み込まれていない場合は reloadMygroup(rundata); if (request != null) { obj = request.getAttribute(ALEipConstants.MYGROUP); } } ALMyGroups mygroups = (ALMyGroups) obj; return mygroups.getList(); } public static List<ALEipGroup> getFacilityGroups() { List<ALEipGroup> facilityGroupAllList = new ArrayList<ALEipGroup>(); try { SelectQuery<EipMFacilityGroup> query = Database.query(EipMFacilityGroup.class); List<EipMFacilityGroup> facility_list = query.orderAscending(EipMFacilityGroup.SORT_PROPERTY).fetchList(); for (EipMFacilityGroup record : facility_list) { ALEipGroup bean = new ALEipGroup(); bean.initField(); bean.setAliasName(record.getGroupName()); bean.setName(record.getGroupId().toString()); facilityGroupAllList.add(bean); } } catch (Exception ex) { logger.error("ALEipUtils.getFacilityGroups", ex); } return facilityGroupAllList; } public static List<ALEipGroup> getALEipGroups() { List<ALEipGroup> facilityGroupAllList = new ArrayList<ALEipGroup>(); try { SelectQuery<EipMFacilityGroup> query = Database.query(EipMFacilityGroup.class); List<EipMFacilityGroup> facility_list = query.orderAscending(EipMFacilityGroup.SORT_PROPERTY).fetchList(); for (EipMFacilityGroup record : facility_list) { ALEipGroup bean = new ALEipGroup(); bean.initField(); bean.setAliasName(record.getGroupName()); bean.setName(record.getGroupId().toString()); facilityGroupAllList.add(bean); } } catch (Exception ex) { logger.error("ALEipUtils.getALEipGroups", ex); } return facilityGroupAllList; } /** * 会社名を取得します。 * * @param id * @return */ public static String getCompanyName(int id) { String companyName = null; try { Expression exp = ExpressionFactory.matchDbExp(EipMCompany.COMPANY_ID_PK_COLUMN, Integer .valueOf(id)); List<EipMCompany> list = Database.query(EipMCompany.class, exp).select( EipMCompany.COMPANY_NAME_COLUMN).fetchList(); if (list == null || list.size() == 0) { // 指定したCompany IDのレコードが見つからない場合 logger.debug("[ALEipUtils] Not found ComapnyID..."); return null; } EipMCompany record = list.get(0); companyName = record.getCompanyName(); } catch (Exception ex) { logger.error("ALEipUtils.getCompanyName", ex); companyName = null; } return companyName; } /** * 部署名を取得します。 * * @param id * @return */ public static String getPostName(int id) { if (ALEipManager .getInstance() .getPostMap() .containsKey(Integer.valueOf(id))) { return (ALEipManager.getInstance().getPostMap().get(Integer.valueOf(id))) .getPostName() .getValue(); } return null; } /** * 役職名を取得します。 * * @param id * @return */ public static String getPositionName(int id) { if (ALEipManager.getInstance().getPositionMap().containsKey( Integer.valueOf(id))) { return (ALEipManager.getInstance().getPositionMap().get(Integer .valueOf(id))).getPositionName().getValue(); } return null; } /** * ページが見つからない場合に、リダイレクト処理します。 * * @return */ public static boolean redirectPageNotFound(RunData rundata) { try { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getPage(); String template = rundata.getParameters().getString(JetspeedResources.PATH_TEMPLATE_KEY); if (template != null && !("".equals(template))) { if (template.endsWith("DetailScreen") || template.endsWith("FormScreen")) { VelocityContext context = new VelocityContext(); setupContext(rundata, context); try { ServletOutputStream out = null; HttpServletResponse response = rundata.getResponse(); out = response.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( out, ALEipConstants.DEF_CONTENT_ENCODING)); context .put("l10n", ALLocalizationUtils.createLocalization(rundata)); Template templete = Velocity.getTemplate("screens/html/AjaxPageNotFound.vm"); templete.merge(context, writer); writer.flush(); writer.close(); } catch (ResourceNotFoundException e) { logger.error("ALEipUtils.redirectPageNotFound", e); throw new RuntimeException(e); } catch (ParseErrorException e) { logger.error("ALEipUtils.redirectPageNotFound", e); throw new RuntimeException(e); } catch (Exception e) { logger.error("ALEipUtils.redirectPageNotFound", e); throw new RuntimeException(e); } return true; } } duri.addPathInfo("template", "PageNotFound"); rundata.setRedirectURI(duri.toString()); rundata.getResponse().sendRedirect(rundata.getRedirectURI()); JetspeedLinkFactory.putInstance(jsLink); jsLink = null; return true; } catch (TurbineException e) { logger.error("ALEipUtils.redirectPageNotFound", e); return false; } catch (IOException e) { logger.error("ALEipUtils.redirectPageNotFound", e); return false; } } /** * データベースエラーの場合に、リダイレクト処理します。 * * @return */ public static boolean redirectDBError(RunData rundata) { try { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getPage(); String template = rundata.getParameters().getString(JetspeedResources.PATH_TEMPLATE_KEY); if (template != null && !("".equals(template))) { if (template.endsWith("DetailScreen") || (template.endsWith("FormScreen"))) { Context context = org.apache.turbine.services.velocity.TurbineVelocity .getContext(rundata); if (null == context) { context = new VelocityContext(); setupContext(rundata, context); } try { ServletOutputStream out = null; HttpServletResponse response = rundata.getResponse(); out = response.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( out, ALEipConstants.DEF_CONTENT_ENCODING)); context .put("l10n", ALLocalizationUtils.createLocalization(rundata)); context.put("utils", new ALCommonUtils()); Template templete = Velocity.getTemplate("screens/html/AjaxDBError.vm"); templete.merge(context, writer); writer.flush(); writer.close(); } catch (ResourceNotFoundException e) { logger.error("ALEipUtils.redirectDBError", e); throw new RuntimeException(e); } catch (ParseErrorException e) { logger.error("ALEipUtils.redirectDBError", e); throw new RuntimeException(e); } catch (Exception e) { logger.error("ALEipUtils.redirectDBError", e); throw new RuntimeException(e); } return true; } } duri.addPathInfo(JetspeedResources.PATH_TEMPLATE_KEY, "DBError"); rundata.setRedirectURI(duri.toString()); rundata.getResponse().sendRedirect(rundata.getRedirectURI()); JetspeedLinkFactory.putInstance(jsLink); jsLink = null; return true; } catch (TurbineException e) { logger.error("ALEipUtils.redirectDBError", e); return false; } catch (IOException e) { logger.error("ALEipUtils.redirectDBError", e); return false; } } /** * パーミッションエラーの場合に、リダイレクト処理します。 * * @return */ public static boolean redirectPermissionError(RunData rundata) { try { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getPage(); String template = rundata.getParameters().getString(JetspeedResources.PATH_TEMPLATE_KEY); if (template != null && !("".equals(template))) { if (template.endsWith("JSONScreen")) { VelocityContext context = new VelocityContext(); setupContext(rundata, context); ServletOutputStream out = null; HttpServletResponse response = rundata.getResponse(); out = response.getOutputStream(); List<String> list = new ArrayList<String>(); list.add("PermissionError"); list.add(ALAccessControlConstants.DEF_PERMISSION_ERROR_STR); JSONArray json = JSONArray.fromObject(list); StringBuffer result = new StringBuffer().append("/* ").append(json.toString()).append( " */"); byte[] byteResult = result.toString().getBytes(ALEipConstants.DEF_CONTENT_ENCODING); out.write(byteResult); out.flush(); out.close(); return true; } else if (template.endsWith("FormScreen") || template.endsWith("DetailScreen")) { VelocityContext context = new VelocityContext(); setupContext(rundata, context); try { ServletOutputStream out = null; HttpServletResponse response = rundata.getResponse(); out = response.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( out, ALEipConstants.DEF_CONTENT_ENCODING)); context .put("l10n", ALLocalizationUtils.createLocalization(rundata)); Template templete = Velocity.getTemplate("screens/html/AjaxPermissionError.vm"); templete.merge(context, writer); writer.flush(); writer.close(); } catch (ResourceNotFoundException e) { logger.error("ALEipUtils.redirectPermissionError", e); throw new RuntimeException(e); } catch (ParseErrorException e) { logger.error("ALEipUtils.redirectPermissionError", e); throw new RuntimeException(e); } catch (Exception e) { logger.error("ALEipUtils.redirectPermissionError", e); throw new RuntimeException(e); } return true; } else if (template.endsWith("Screen")) { // 一覧表示の場合 VelocityContext context = new VelocityContext(); setupContext(rundata, context); try { ServletOutputStream out = null; HttpServletResponse response = rundata.getResponse(); out = response.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( out, ALEipConstants.DEF_CONTENT_ENCODING)); context .put("l10n", ALLocalizationUtils.createLocalization(rundata)); Template templete = Velocity.getTemplate("portlets/html/PermissionError.vm"); templete.merge(context, writer); writer.flush(); writer.close(); } catch (Exception e) { return false; } return true; } else if (template.equals("Customize") || template.equals("Home")) { // ポートレットカスタマイズ duri.addPathInfo( JetspeedResources.PATH_TEMPLATE_KEY, "PermissionError"); rundata.setRedirectURI(duri.toString()); rundata.getResponse().sendRedirect(rundata.getRedirectURI()); JetspeedLinkFactory.putInstance(jsLink); jsLink = null; return true; } else if (isCellularPhone(rundata)) { duri.addPathInfo( JetspeedResources.PATH_TEMPLATE_KEY, "CellPermissionError"); rundata.setRedirectURI(duri.toString()); rundata.getResponse().sendRedirect(rundata.getRedirectURI()); JetspeedLinkFactory.putInstance(jsLink); jsLink = null; Restore restore = new Restore(); try { restore.doPerform(rundata); } catch (Exception e) { } return true; } else if (isSmartPhone(rundata)) { duri.addPathInfo( JetspeedResources.PATH_TEMPLATE_KEY, "CellPermissionError"); rundata.setRedirectURI(duri.toString()); rundata.getResponse().sendRedirect(rundata.getRedirectURI()); JetspeedLinkFactory.putInstance(jsLink); jsLink = null; Restore restore = new Restore(); try { restore.doPerform(rundata); } catch (Exception e) { } return true; } } /*- try { Restore restore = new Restore(); restore.doPerform(rundata); } catch (Exception e) { } */ JetspeedRunData jdata = (JetspeedRunData) rundata; if (jdata.getMode() == JetspeedRunData.MAXIMIZE) { rundata.getRequest().setAttribute( "redirectTemplate", "permission-error-maximize"); /*- duri .addPathInfo(JetspeedResources.PATH_TEMPLATE_KEY, "PermissionError"); rundata.setRedirectURI(duri.toString()); rundata.getResponse().sendRedirect(rundata.getRedirectURI()); JetspeedLinkFactory.putInstance(jsLink); jsLink = null; */ } else { Context context = (Context) jdata.getTemplateInfo().getTemplateContext( "VelocityPortletContext"); context.put(JetspeedResources.PATH_TEMPLATE_KEY, "PermissionError"); } return true; } catch (TurbineException e) { logger.error("ALEipUtils.redirectPermissionError", e); return false; } catch (IOException e) { logger.error("ALEipUtils.redirectPermissionError", e); return false; } } /** * 改行コードを含む文字列を、複数行に分割します。 メソッドの統一 * * @return */ public static String getMessageList(String msgline) { return getMessageList(msgline, null); } /** * 左端の半角空文字を「 」に変換する。 * * @param str * @return */ public static String replaseLeftSpace(String str) { if (str == null || str.length() <= 0) { return str; } int len = str.length(); int st = 0; char[] val = str.toCharArray(); StringBuffer sb = new StringBuffer(); boolean left = true; while ((st < len)) { if (val[st] == ' ' && left) { sb.append(" "); } else { sb.append(val[st]); left = false; } st++; } return (sb.length() > 0) ? sb.toString() : str; } /** * アクセス元の端末が携帯電話であるかを判定します。 * * @param data * @return */ public static boolean isCellularPhone(RunData data) { boolean isCellularPhone = false; CapabilityMap cm = CapabilityMapFactory.getCapabilityMap(data.getRequest().getHeader( "User-Agent")); MimeType mime = cm.getPreferredType(); if (mime != null) { MediaTypeEntry media = (MediaTypeEntry) Registry.getEntry(Registry.MEDIA_TYPE, cm .getPreferredMediaType()); String mediatype = media.getName(); if ("docomo_imode".equals(mediatype) || "docomo_foma".equals(mediatype) || "au".equals(mediatype) || "vodafone".equals(mediatype)) { isCellularPhone = true; } } return isCellularPhone; } /** * アクセス元の端末がスマートフォンであるかを判定します。 * * @param data * @return */ public static boolean isSmartPhone(RunData data) { boolean isSmartPhone = false; CapabilityMap cm = CapabilityMapFactory.getCapabilityMap(data.getRequest().getHeader( "User-Agent")); MimeType mime = cm.getPreferredType(); if (mime != null) { MediaTypeEntry media = (MediaTypeEntry) Registry.getEntry(Registry.MEDIA_TYPE, cm .getPreferredMediaType()); String mediatype = media.getName(); if ("iphone".equals(mediatype) || "wm".equals(mediatype)) { isSmartPhone = true; } } return isSmartPhone; } /** * 指定した2つの日付を比較します。 * * @param date1 * @param date2 * @return 等しい場合、0。date1>date2の場合、1。date1 < date2の場合、2。 */ public static int compareToDate(Date date1, Date date2) { Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); int date1Year = cal1.get(Calendar.YEAR); int date1Month = cal1.get(Calendar.MONTH) + 1; int date1Day = cal1.get(Calendar.DATE); int date1Hour = cal1.get(Calendar.HOUR); int date1Minute = cal1.get(Calendar.MINUTE); int date1Second = cal1.get(Calendar.SECOND); int date2Year = cal2.get(Calendar.YEAR); int date2Month = cal2.get(Calendar.MONTH) + 1; int date2Day = cal2.get(Calendar.DATE); int date2Hour = cal2.get(Calendar.HOUR); int date2Minute = cal2.get(Calendar.MINUTE); int date2Second = cal2.get(Calendar.SECOND); if (date1Year == date2Year && date1Month == date2Month && date1Day == date2Day && date1Hour == date2Hour && date1Minute == date2Minute && date1Second == date2Second) { return 0; } if (cal1.after(cal2)) { return 2; } else { return 1; } } /** * データベースの検索結果から、指定したキーに対応する値を取得します。 * * @param dataRow * @param key * @return */ public static Object getObjFromDataRow(DataRow dataRow, String key) { String lowerKey = key.toLowerCase(Locale.ENGLISH); if (dataRow.containsKey(lowerKey)) { return dataRow.get(lowerKey); } else { return dataRow.get(key.toUpperCase(Locale.ENGLISH)); } } /** * 会社情報のオブジェクトを取得します。 * * @param id * @return */ public static EipMCompany getEipMCompany(String id) { 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 null; } return list.get(0); } /** * @see ALServletUtils#getAccessUrl(String, int, boolean) * @param ip * @param port * @param servername * @param isGlobal * @return * @deprecated */ @Deprecated public static String getUrl(String ip, int port, String servername, boolean isGlobal) { if (ip == null || ip.length() == 0 || port == -1) { return ""; } String protocol = isGlobal ? ALConfigService.get(Property.ACCESS_GLOBAL_URL_PROTOCOL) : ALConfigService.get(Property.ACCESS_LOCAL_URL_PROTOCOL); StringBuffer url = new StringBuffer(); if (port == 80 || port == 443) { url.append(protocol).append("://").append(ip).append("/").append( servername).append(servername.isEmpty() ? "" : "/"); } else { url .append(protocol) .append("://") .append(ip) .append(":") .append(port) .append("/") .append(servername) .append(servername.isEmpty() ? "" : "/"); } return url.toString(); } /** * * @param rundata * @param context */ public static void setupContext(RunData rundata, Context context) { String js_peid; if (!rundata.getParameters().containsKey( JetspeedResources.PATH_PORTLETID_KEY)) { return; } js_peid = rundata.getParameters().getString(JetspeedResources.PATH_PORTLETID_KEY); Portlet portlet = getPortlet(rundata, js_peid); context.put("portlet", portlet); context.put("jslink", new ALJetspeedLink(rundata)); context.put("clink", new ContentTemplateLink(rundata)); } public static void setupContext(String js_peid, RunData rundata, Context context) { Portlet portlet = getPortlet(rundata, js_peid); context.put("portlet", portlet); context.put("jslink", new ALJetspeedLink(rundata)); context.put("clink", new ContentTemplateLink(rundata)); } /** * * @param rundata * @param context * @param key * @return */ public static String getParameter(RunData rundata, Context context, String key) { String name = null; String idParam = rundata.getParameters().getString(key); name = ALEipUtils.getTemp(rundata, context, key); if (idParam == null && name == null) { ALEipUtils.removeTemp(rundata, context, key); name = null; } else if (idParam != null) { ALEipUtils.setTemp(rundata, context, key, idParam); name = idParam; } return name; } /** * 指定したエントリー名のポートレットへの URI を取得します。 * * @param rundata * @param portletEntryName * PSML ファイルに記述されているタグ entry の要素 parent * @return */ public static String getPortletURI(RunData rundata, String portletEntryId) { try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } int length = portletList.length; for (int i = 0; i < length; i++) { Entry[] entries = portletList[i].getEntriesArray(); if (entries == null || entries.length <= 0) { continue; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletEntryId)) { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getLink( JetspeedLink.CURRENT, null, null, JetspeedLink.CURRENT, null); duri = duri.addPathInfo( JetspeedResources.PATH_PANEID_KEY, portletList[i].getId()).addPathInfo( JetspeedResources.PATH_PORTLETID_KEY, entries[j].getId()).addQueryData( JetspeedResources.PATH_ACTION_KEY, "controls.Maximize"); return duri.toString(); } } } } catch (Exception ex) { logger.error("ALEipUtils.getPortletURI", ex); return null; } return null; } /** * * @param rundata * @param portletEntryId * @return */ public static String getPortletURItoTopPage(RunData rundata, String portletEntryId) { try { Portlets portlets = ((JetspeedRunData) rundata).getProfile().getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } int length = portletList.length; for (int i = 0; i < length; i++) { Entry[] entries = portletList[i].getEntriesArray(); if (entries == null || entries.length <= 0) { continue; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletEntryId)) { JetspeedLink jsLink = JetspeedLinkFactory.getInstance(rundata); DynamicURI duri = jsLink.getLink( JetspeedLink.CURRENT, null, null, JetspeedLink.CURRENT, null); duri = duri.addPathInfo( JetspeedResources.PATH_PANEID_KEY, portletList[i].getId()).addQueryData( JetspeedResources.PATH_ACTION_KEY, "controls.Restore"); return duri.toString(); } } } } catch (Exception ex) { logger.error("ALEipUtils.getPortletURItoTopPage", ex); return null; } return null; } /** * 文字列中の検索キーワードを<span class="searchKeyword">タグで囲います。 * * @param msg * @return */ public static String highlihgtKeywords(String msg, String keyword) { if (msg != null) { if (keyword != null && !("".equals(keyword))) { Boolean inTag = false; String regex = "((" + keyword + ")+)"; int len = msg.length(); int st = 0; char[] val = msg.toCharArray(); StringBuffer result = new StringBuffer(); StringBuffer temp = new StringBuffer(); while ((st < len)) { if (inTag == false) { temp.append(val[st]); if (val[st] == '<') { inTag = true; String highLighted = temp.toString().replaceAll( regex, "<span class=\"searchKeyword\">$1</span>"); result.append(highLighted); temp.delete(0, temp.length()); } } else if (inTag == true) { result.append(val[st]); if (val[st] == '>') { inTag = false; } } st++; } if (st == len && inTag == false) { result.append(temp.toString().replaceAll( regex, "<span class=\"searchKeyword\">$1</span>")); } return result.toString(); } else { return msg; } } else { return ""; } } /** * 文字列内のリンクにタグAを追加します。 メソッドの統一 * * @param msg * @return */ public static String replaceStrToLink(String msg) { return replaceStrToLink(msg, null); } public static String replaceStrToLink(String msg, String keyword) { if (msg != null) { String regex = "(https?|ftp|gopher|telnet|whois|news)\\:([\\w|\\:\\!\\#\\$\\%\\=\\&\\-\\^\\`\\\\|\\@\\~\\[\\{\\]\\}\\;\\+\\*\\,\\.\\?\\/]+)"; Pattern p = Pattern.compile(regex); boolean check = true; while (check) { check = false; Matcher m = p.matcher(msg); while (m.find()) { if (m.group(0).contains("@")) { String matchString = m.group(0); matchString = matchString.replaceAll("@", "%40"); String pre = msg.substring(0, m.start(0)); String post = msg.substring(m.end(0), msg.length()); msg = pre + matchString + post; check = true; } } } // 日本語(ひらがな、かたかな、漢字)が含まれていてもリンク化されるように正規表現を追加する。 // URL String newMsg = msg .replaceAll( "(https?|ftp|gopher|telnet|whois|news)\\:([\\w|\\p{InHiragana}\\p{InKatakana}\\p{InCJKUnifiedIdeographs}\\:\\!\\#\\$\\%\\=\\&\\-\\^\\`\\\\|\\@\\~\\[\\{\\]\\}\\;\\+\\*\\,\\.\\?\\/]+)", "<a href=\"$1\\:$2\" target=\"_blank\">$1\\:$2</a>"); // mail String newnewMsg = newMsg.replaceAll( "[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+", "<a href='mailto:$0'>$0</a>"); // highlight String highlightedMsg = highlihgtKeywords(newnewMsg, keyword); return highlightedMsg; } else { return ""; } } /** * フォルダを再帰的に消します。 * * @param parent_folder * 親フォルダ * @param cal * * @return フォルダの中身が全て消去されたときのみtrueを返します */ /** * ユーザーの所属する部署を取得します。 * * @param id * ユーザーID * @return 所属する部署リスト */ public static List<ALStringField> getPostNameList(int id) { SelectQuery<TurbineUserGroupRole> query = Database.query(TurbineUserGroupRole.class); Expression exp1 = ExpressionFactory.matchExp( TurbineUserGroupRole.TURBINE_USER_PROPERTY, Integer.valueOf(id)); 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(); ALStringField sf = null; List<ALStringField> postNames = new ArrayList<ALStringField>(); for (TurbineUserGroupRole role : list) { sf = new ALStringField(role.getTurbineGroup().getGroupAliasName()); postNames.add(sf); } return postNames; } /** * ユーザーの所属する部署のIDを取得します。 * * @param id * ユーザーID * @return 所属する部署リスト */ public static List<Integer> getPostIdList(int id) { SelectQuery<TurbineUserGroupRole> query = Database.query(TurbineUserGroupRole.class); Expression exp1 = ExpressionFactory.matchExp( TurbineUserGroupRole.TURBINE_USER_PROPERTY, Integer.valueOf(id)); 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(); List<Integer> postIds = new ArrayList<Integer>(); for (TurbineUserGroupRole role : list) { postIds.add(role.getTurbineGroup().getEipMPost().getPostId()); } return postIds; } /** * アクセス権限をチェックします(ポートレットカスタマイズ) * * @return */ public static boolean checkAclPermissionForCustomize(RunData rundata, Context context, int defineAclType) { try { if (defineAclType == 0) { return true; } boolean hasAuthority = getHasAuthority(rundata, context, defineAclType); if (!hasAuthority) { throw new ALPermissionException(); } return true; } catch (ALPermissionException e) { ALEipUtils.redirectPermissionError(rundata); return false; } } public static boolean getHasAuthority(RunData rundata, Context context, int defineAclType) { String pfeature = ALAccessControlConstants.POERTLET_FEATURE_PORTLET_CUSTOMIZE; if (pfeature == null || "".equals(pfeature)) { return true; } ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); return aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), pfeature, defineAclType); } public static int getLimitUsers() { try { List<AipoLicense> list = Database .query(AipoLicense.class) .select(AipoLicense.LIMIT_USERS_COLUMN) .fetchList(); if (list != null && list.size() > 0) { AipoLicense record = list.get(0); Integer result = record.getLimitUsers(); return result.intValue(); } } catch (Exception e) { logger.error("ALEipUtils.getLimitUsers", e); } return 0; } /** * 現在登録されている有効なユーザー数(システムユーザ、論理削除は除く)を取得します。 * * @return */ public static int getCurrentUserNumEnabledOnly(RunData rundata) { int registeredUserNum = -1; try { // 論理削除ユーザーを除く // ユーザーテーブルDISABLEDがTのものが論理削除 // システムユーザtemplateは論理削除されているため // RES_USER_NUMは3だが2として計算しないといけない。 Expression exp = ExpressionFactory.matchExp(TurbineUser.DISABLED_PROPERTY, "F"); List<TurbineUser> list = Database.query(TurbineUser.class, exp).fetchList(); if (list == null || list.size() <= 0) { return -1; } int size = list.size(); // admin,anonユーザが含まれるので2ユーザ分減算 registeredUserNum = size - 2; } catch (Exception ex) { logger.error("ユーザー情報をDBから取得できませんでした。"); logger.error("ALEipUtils.getCurrentUserNumEnabledOnly", ex); return -1; } return registeredUserNum; } /** * 現在登録されている有効なユーザー数(システムユーザ、論理削除、無効化は除く)を取得します。 * * @return */ public static int getCurrentUserNum(RunData rundata) { int registeredUserNum = -1; try { // 論理削除ユーザーを除く // ユーザーテーブルDISABLEDがTのものが論理削除 // システムユーザtemplateは論理削除されているため // RES_USER_NUMは3だが2として計算しないといけない。 Expression exp = ExpressionFactory.noMatchExp(TurbineUser.DISABLED_PROPERTY, "T"); List<TurbineUser> list = Database.query(TurbineUser.class, exp).fetchList(); if (list == null || list.size() <= 0) { return -1; } int size = list.size(); // admin,anonユーザが含まれるので2ユーザ分減算 registeredUserNum = size - 2; } catch (Exception ex) { logger.error("ユーザー情報をDBから取得できませんでした。"); logger.error("ALEipUtils.getCurrentUserNum", ex); return -1; } return registeredUserNum; } /** * 指定されたユーザが管理者権限を持っているかを返します。 * * @param uid * @return */ public static boolean isAdmin(int uid) { boolean res = false; try { Role adminrole = JetspeedSecurity.getRole("admin"); TurbineUserGroupRole role = Database .query(TurbineUserGroupRole.class) .where( Operations.eq(TurbineUserGroupRole.TURBINE_ROLE_PROPERTY, adminrole .getId()), Operations.eq(TurbineUserGroupRole.TURBINE_USER_PROPERTY, uid)) .fetchSingle(); res = role != null; } catch (JetspeedSecurityException e) { logger.error("管理者ロールが存在しません。"); logger.error("ALEipUtils.isAdmin", e); } return res; } /** * ログインユーザが管理者権限を持っているかを返します。 * * @param rundata * @return */ public static boolean isAdmin(RunData rundata) { JetspeedRunData jdata = (JetspeedRunData) rundata; return isAdmin(Integer.valueOf(jdata.getUserId())); } /** * is LoginUser Admin ? */ public static boolean isAdminUser(RunData runData) { int userId = getUserId(runData); return isAdminUser(userId); } public static boolean isAdminUser(int userId) { // admin user definition : user id equals 1 return userId == 1; } public static String getLoginName(RunData runData) { JetspeedRunData jdata = (JetspeedRunData) runData; return jdata.getJetspeedUser().getUserName(); } /** * Dateに対して整形されたALDateTimeFieldを返します。 * * @param date * @return 整形されたALDateTimeField */ public static ALDateTimeField getFormattedTime(Date date) { Calendar Now = new GregorianCalendar(); Now.setTime(new Date()); Calendar Time = new GregorianCalendar(); Time.setTime(date); ALDateTimeField rtn; rtn = (Now.get(Calendar.YEAR) == Time.get(Calendar.YEAR)) ? (Now .get(Calendar.MONTH) == Time.get(Calendar.MONTH) && Now.get(Calendar.DATE) == Time.get(Calendar.DATE) ? new ALDateTimeField("H:mm") : new ALDateTimeField("M月d日")) : new ALDateTimeField("yyyy年M月d日"); rtn.setValue(date); return rtn; } public static ALDateTimeField getFormattedTime(ALDateTimeField timeField) { if (!timeField.isNotNullValue()) { return null; } return getFormattedTime(timeField.getValue()); } public static ALDateTimeField getFormattedTimeDetail(Date date) { Calendar Now = new GregorianCalendar(); Now.setTime(new Date()); Calendar Time = new GregorianCalendar(); Time.setTime(date); ALDateTimeField rtn; rtn = (Now.get(Calendar.YEAR) == Time.get(Calendar.YEAR)) ? new ALDateTimeField("M月d日 H:mm") : new ALDateTimeField("yyyy年M月d日 H:mm"); rtn.setValue(date); return rtn; } public static ALDateTimeField getFormattedTimeDetail(ALDateTimeField timeField) { if (!timeField.isNotNullValue()) { return null; } return getFormattedTimeDetail(timeField.getValue()); } /** * 指定したユーザのPSMLにシステム管理のページを追加します。 * * @param user_name * @throws Exception */ public static void addAdminPage(String user_name) throws Exception { ProfileLocator locator = Profiler.createLocator(); locator.createFromPath(String.format("user/%s/media-type/html", user_name)); /** for request cache clear */ ALEipManager.getInstance().removeProfile(locator); Profile profile = Profiler.getProfile(locator); Portlets portlets = profile.getDocument().getPortlets(); if (portlets != null) { // 既に配置されているかどうかを確認 long max_position = 0; int portlet_size = portlets.getPortletsCount(); for (int i = 0; i < portlet_size; i++) { Portlets p = portlets.getPortlets(i); if (p.getSecurityRef().getParent().equals("admin-view")) { return; } if (p.getLayout().getPosition() > max_position) { max_position = p.getLayout().getPosition(); } } // レイアウトの作成 Layout newLayout = new PsmlLayout(); newLayout.setPosition(max_position + 1); newLayout.setSize(-1); ProfileLocator admin_locator = Profiler.createLocator(); admin_locator.createFromPath("user/admin/media-type/html"); Portlets admin_portlets = Profiler.createProfile(admin_locator).getDocument().getPortlets(); admin_portlets = admin_portlets.getPortlets(0); Entry[] entriesArray = admin_portlets.getEntriesArray(); int size = entriesArray.length; for (int i = 0; i < size; i++) { if (entriesArray[i].getParent().equals("DeleteSample")) { admin_portlets.removeEntry(i); break; } } admin_portlets.setLayout(newLayout); portlets.addPortlets(admin_portlets); PsmlManager.store(profile); } } public static String getFirstPortletId(String username) { try { ProfileLocator locator = Profiler.createLocator(); locator .createFromPath(String.format("user/%s/media-type/html", username)); Profile profile = Profiler.getProfile(locator); Portlets portlets = profile.getDocument().getPortlets(); if (portlets == null) { return null; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return null; } for (Portlets portlet : portletList) { Entry[] entries = portlet.getEntriesArray(); if (entries == null || entries.length == 0) { continue; } for (String name : IPHONE_APPS) { for (Entry entry : entries) { String portletName = entry.getParent(); if (portletName.equals("AjaxScheduleWeekly")) { portletName = "Schedule"; } if (name.equals(portletName)) { return entry.getId(); } } } } } catch (Exception ex) { logger.error("ALEipUtils.getFirstPortletId", ex); return null; } return null; } public static String getClient(RunData rundata) { if (Boolean.parseBoolean((String) rundata.getSession().getAttribute( "changeToPc"))) { // PC表示切り替え用 return "PCIPHONE"; } else { return getClient(rundata.getUserAgent().trim()); } } public static String getClient(String userAgent) { return getClientEntry(userAgent).getKey(); } /** * 期待するユーザーエージェントが含まれていればtrue * * @param expect * @param rundata * @return */ public static boolean isMatchUserAgent(String expect, RunData rundata) { // User-Agent の取得 String userAgent = rundata.getUserAgent().trim(); if (userAgent == null || "".equals(userAgent)) { return false; } return userAgent.indexOf(expect) > -1; } /** * アクセスしてきたユーザが利用するブラウザ名が Windows の MSIE であるかを判定する. * * @param rundata * @return MSIE の場合は,true. */ public static boolean isMsieBrowser(RunData rundata) { return isMatchUserAgent("Win", rundata) && (isMatchUserAgent("MSIE", rundata) || isMatchUserAgent( "Trident", rundata)); } /** * アクセスしてきたユーザが利用するブラウザ名が Windows の Edge であるかを判定する. * * @param rundata * @return MSIE の場合は,true. */ public static boolean isEdgeBrowser(RunData rundata) { return isMatchUserAgent("Win", rundata) && (isMatchUserAgent("Edge", rundata)); } /*** * アクセスしてきたユーザが利用するブラウザ名が Mozilla の Firefox であるかを判定する. * * @param rundata * @return */ public static boolean isFirefoxBrowser(RunData rundata) { return isMatchUserAgent("Firefox", rundata) && isMatchUserAgent("Mozilla", rundata); } /** * アクセスしてきたユーザが利用するブラウザ名が Android. * * @param rundata * @return MSIE の場合は,true. */ public static boolean isAndroidBrowser(RunData rundata) { return isMatchUserAgent("Android", rundata); } public static boolean isAndroid2Browser(RunData rundata) { int[] version = getAndroidVersion(rundata); return version != null && version[0] == 2; } public static int[] getAndroidVersion(RunData rundata) { final String userAgent = rundata.getUserAgent().trim(); if (userAgent == null || "".equals(userAgent)) { return null; } Pattern androidVersion = Pattern.compile( "Android ([\\d]+).([\\d]+).([\\d]+)", Pattern.CASE_INSENSITIVE); Matcher matcher = androidVersion.matcher(userAgent); if (matcher.find()) { return new int[] { Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), Integer.parseInt(matcher.group(3)) }; } else { return null; } } public static String getClientVersion(RunData rundata) { return getClientVersion(rundata.getUserAgent().trim()); } public static String getClientVersion(String userAgent) { return getClientEntry(userAgent).getValue(); } protected static Map.Entry<String, String> getClientEntry(String userAgent) { Map<String, String> map = new HashMap<String, String>(1); String key = "com.aimluck.eip.util.getClient.client"; String keyVer = "com.aimluck.eip.util.getClient.clientVer"; String client = null; String clientVer = "0"; HttpServletRequest request = HttpServletRequestLocator.get(); if (request != null) { client = (String) request.getAttribute(key); clientVer = (String) request.getAttribute(keyVer); if (client != null && client.length() > 0) { if (clientVer == null) { clientVer = ""; } map.put(client, clientVer); return map.entrySet().iterator().next(); } } ClientRegistry registry = (ClientRegistry) Registry.get(Registry.CLIENT); ClientEntry entry = registry.findEntry(userAgent); client = entry == null ? "OUTER" : entry.getManufacturer(); if ("IPAD".equals(client) || "IPHONE".equals(client)) { clientVer = String.valueOf(userAgent.charAt(userAgent.indexOf("OS") + 3)); } if (isIE(userAgent)) { client = "IE"; clientVer = getIEVersion(userAgent); } if (request != null) { request.setAttribute(key, client); request.setAttribute(keyVer, clientVer); } if (clientVer == null) { clientVer = ""; } map.put(client, clientVer); return map.entrySet().iterator().next(); } public static boolean isIE(String userAgent) { return (userAgent.matches(".*((MSIE)+ [0-9]\\.[0-9]).*") || userAgent .matches(".*(.*(Trident/)+[0-9]\\.[0-9]).*")); } /** * PSMLにデータを埋め込みます。 * * @param rundata * @param context * @param key * @param value * @return */ public static boolean setPsmlParameters(RunData rundata, Context context, String key, String value) { try { String portletEntryId = rundata.getParameters().getString("js_peid", null); if (value == null || "".equals(value)) {// nullで送信するとpsmlが破壊される return false; } Profile profile = ((JetspeedRunData) rundata).getProfile(); Portlets portlets = profile.getDocument().getPortlets(); if (portlets == null) { return false; } Portlets[] portletList = portlets.getPortletsArray(); if (portletList == null) { return false; } PsmlParameter param = null; int length = portletList.length; for (int i = 0; i < length; i++) { Entry[] entries = portletList[i].getEntriesArray(); if (entries == null || entries.length <= 0) { continue; } int ent_length = entries.length; for (int j = 0; j < ent_length; j++) { if (entries[j].getId().equals(portletEntryId)) { boolean hasParam = false; Parameter params[] = entries[j].getParameter(); int param_len = params.length; for (int k = 0; k < param_len; k++) { if (params[k].getName().equals(key)) { hasParam = true; params[k].setValue(value); entries[j].setParameter(k, params[k]); } } if (!hasParam) { param = new PsmlParameter(); param.setName(key); param.setValue(value); entries[j].addParameter(param); } break; } } } profile.store(); } catch (Exception ex) { logger.error("ALEipUtils.setPsmlParameters", ex); return false; } return true; } /** * * PSMLに設定されているデータと比較して valueが正しい値ならその値を新しくPSMLに保存。 * * * @param rundata * @param context * @param config * @return */ public static String passPSML(RunData rundata, Context context, String key, String value) { VelocityPortlet portlet = ALEipUtils.getPortlet(rundata, context); PortletConfig config = portlet.getPortletConfig(); if (value == null || "".equals(value)) { value = config != null ? config.getInitParameter(key) : ""; } else { ALEipUtils.setPsmlParameters(rundata, context, key, value); } return value; } public static boolean isFileUploadable(RunData rundata) { if (isMatchUserAgent("iPhone", rundata)) { String iOSver = getIOSVersion(rundata.getUserAgent().trim()); if (iOSver.length() > 1) { // Integer num = Integer.parseInt(iOSver.substring(0, 1)); Pattern p = Pattern.compile("^(\\d*)"); Matcher m = p.matcher(iOSver); if (m.find()) { Integer num = Integer.parseInt(m.group(0)); if (num.intValue() < 6) { return false; } } } } return true; } public static String getIOSVersion(String userAgent) { Pattern pattern = Pattern.compile("OS\\s[0-9_]+"); Matcher matcher = pattern.matcher(userAgent); if (matcher.find()) { String words = matcher.group(); return words.replaceAll("OS\\s", ""); } return ""; } public static String getIEVersion(String userAgent) { Pattern pattern = Pattern.compile("MSIE\\s[0-9_]+"); Matcher matcher = pattern.matcher(userAgent); Pattern pattern2 = Pattern.compile("rv:[0-9_]+"); Matcher matcher2 = pattern2.matcher(userAgent); if (matcher.find()) { String words = matcher.group(); return words.replaceAll("MSIE\\s", ""); } else if (matcher2.find()) { String words2 = matcher2.group(); return words2.replaceAll("rv:", ""); } return ""; } public static Map<String, Entry> getGlobalPortlets(RunData rundata) { Map<String, Entry> maps = new HashMap<String, Entry>(); Profile profile = ((JetspeedRunData) rundata).getProfile(); if (profile == null) { User user = rundata.getUser(); if (user != null) { ProfileLocator locator = Profiler.createLocator(); locator.createFromPath(String.format("user/%s/media-type/html", user .getUserName())); try { profile = Profiler.getProfile(locator); } catch (ProfileException ignore) { // ignore } } } if (profile != null) { PSMLDocument doc = profile.getDocument(); if (doc != null) { @SuppressWarnings("unchecked") Iterator<Entry> iterator = doc.getPortlets().getEntriesIterator(); while (iterator.hasNext()) { Entry next = iterator.next(); maps.put(next.getParent(), next); } } } return maps; } /** * @param msgline * @param keyword * @return */ public static String getMessageList(String msgline, String keyword) { StringBuffer sb = new StringBuffer(); ALStringField field = null; ALStringField key = null; if (msgline == null || msgline.equals("")) { return ""; } msgline = Normalizer.normalize(msgline, Normalizer.Form.NFC); if (msgline.indexOf("\r") < 0 && msgline.indexOf("\n") < 0 && msgline.indexOf("\r\n") < 0) { field = new ALStringField(); field.setTrim(false); field.setValue(msgline); if (!(keyword == null || "".equals(keyword))) { key = new ALStringField(); key.setTrim(true); key.setValue(keyword); return ALCommonUtils.replaceToAutoCR((replaceStrToLink( replaseLeftSpace(field.toString()), key.toString()))); } return ALCommonUtils .replaceToAutoCR((replaceStrToLink(replaseLeftSpace(field.toString())))); } String token = null; BufferedReader reader = null; try { reader = new BufferedReader(new StringReader(msgline)); while ((token = reader.readLine()) != null) { field = new ALStringField(); field.setTrim(false); field.setValue(token); sb.append( ALCommonUtils.replaceToAutoCR((replaceStrToLink( replaseLeftSpace(field.toString()), keyword)))).append("<br/>"); } reader.close(); } catch (IOException ioe) { try { reader.close(); } catch (IOException e) { } return ""; } int index = sb.lastIndexOf("<br/>"); if (index == -1) { return sb.toString(); } return sb.substring(0, index).replaceAll("<wbr/><br/>", "<br/>"); } }