/* * 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.addressbook.util; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.cayenne.DataRow; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.commons.field.ALStringField; import com.aimluck.eip.addressbook.AddressBookGroup; import com.aimluck.eip.addressbook.AddressBookGroupResultData; import com.aimluck.eip.addressbook.AddressBookResultData; import com.aimluck.eip.addressbookuser.beans.AddressBookUserGroupLiteBean; import com.aimluck.eip.cayenne.om.account.EipMPost; import com.aimluck.eip.cayenne.om.portlet.EipMAddressGroup; import com.aimluck.eip.cayenne.om.portlet.EipMAddressbook; import com.aimluck.eip.cayenne.om.portlet.EipMAddressbookCompany; import com.aimluck.eip.cayenne.om.portlet.EipTAddressbookGroupMap; 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.ALEipConstants; import com.aimluck.eip.orm.Database; import com.aimluck.eip.orm.query.SelectQuery; import com.aimluck.eip.util.ALCommonUtils; import com.aimluck.eip.util.ALEipUtils; /** * Addressbookのユーティリティクラスです。 * */ public class AddressBookUtils { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(AddressBookUtils.class.getName()); /** アドレスブックファイルを一時保管するディレクトリの指定 */ public static final String FOLDER_TMP_FOR_ADDRESSBOOK_FILES = JetspeedResources.getString("aipo.tmp.addressbook.directory", ""); public static final String EMPTY_COMPANY_NAME = ""; public static final String ADDRESSBOOK_PORTLET_NAME = "AddressBook"; public static EipMAddressGroup getEipMAddressGroup(RunData rundata, Context context) { String groupid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { if (groupid == null || Integer.valueOf(groupid) == null) { // グループIDが空の場合 logger.debug("[AddressBook] Group ID..."); return null; } SelectQuery<EipMAddressGroup> query = Database.query(EipMAddressGroup.class); Expression exp1 = ExpressionFactory.matchDbExp( EipMAddressGroup.GROUP_ID_PK_COLUMN, Integer.valueOf(groupid)); query.setQualifier(exp1); Expression exp2 = ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, Integer .valueOf(ALEipUtils.getUserId(rundata))); query.andQualifier(exp2); List<EipMAddressGroup> groups = query.fetchList(); if (groups == null || groups.size() == 0) { // 指定したカテゴリIDのレコードが見つからない場合 logger.debug("[AddressBook] Not found Group ID..."); return null; } return groups.get(0); } catch (Exception ex) { logger.error("AddressBookUtils.getEipMAddressGroup", ex); return null; } } /** * 指定した取引先情報の取得 * * @param rundata * @param context * @return */ public static EipMAddressbookCompany getEipMAddressbookCompany( RunData rundata, Context context) { // セッションから指定された 取引先ID を取得 String companyid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { if (companyid == null || Integer.valueOf(companyid) == null) { logger.debug("[AddressBook] Company ID..."); return null; } SelectQuery<EipMAddressbookCompany> query = Database.query(EipMAddressbookCompany.class); Expression exp = ExpressionFactory.matchDbExp( EipMAddressbookCompany.COMPANY_ID_PK_COLUMN, Integer.valueOf(companyid)); query.setQualifier(exp); List<EipMAddressbookCompany> companys = query.fetchList(); if (companys == null || companys.size() == 0) { logger.debug("[AddressBook] Not found Company ID..."); return null; } return companys.get(0); } catch (Exception ex) { logger.error("AddressBookUtils.getEipMAddressbookCompany", ex); return null; } } /** * @param id * @return */ public static List<String> getMyGroupNames(RunData rundata, int addressid, int userid) { try { SelectQuery<EipTAddressbookGroupMap> query = Database.query(EipTAddressbookGroupMap.class); Expression exp1 = ExpressionFactory.matchExp( EipTAddressbookGroupMap.ADDRESS_ID_PROPERTY, Integer.valueOf(addressid)); query.setQualifier(exp1); Expression exp2 = ExpressionFactory.matchExp( EipTAddressbookGroupMap.EIP_TADDRESS_GROUP_PROPERTY + "." + EipMAddressGroup.OWNER_ID_PROPERTY, Integer.valueOf(userid)); query.andQualifier(exp2); List<EipTAddressbookGroupMap> groups = query.fetchList(); List<String> aList = new ArrayList<String>(); int size = groups.size(); for (int i = 0; i < size; i++) { aList.add(groups.get(i).getEipTAddressGroup().getGroupName()); } return aList; } catch (Exception ex) { logger.error("AddressBookUtils.getMyGroupNames", ex); } return null; } public static String getMyGroupNamesAsString(RunData rundata, int addressid, int userid) { List<String> aList = getMyGroupNames(rundata, addressid, userid); int group_size = aList.size(); StringBuffer groupNames = new StringBuffer(); for (int i = 0; i < group_size; i++) { groupNames.append(aList.get(i)).append("、"); } if (groupNames.length() == 0) { return ""; } else { return groupNames.substring(0, groupNames.length() - 1); } } /** * セッションで指定されたアドレスIDを持つアドレス情報を取得する。 * * @param rundata * @param context * @return */ public static EipMAddressbook getEipMAddressbook(RunData rundata, Context context) { // セッションから指定された アドレスID を取得 String addressid = ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID); try { if (addressid == null || Integer.valueOf(addressid) == null) { logger.debug("[AddressBook] Address ID..."); return null; } SelectQuery<EipMAddressbook> query = Database.query(EipMAddressbook.class); Expression exp11 = ExpressionFactory.matchDbExp( EipMAddressbook.ADDRESS_ID_PK_COLUMN, Integer.valueOf(addressid)); query.setQualifier(exp11); Expression exp21 = ExpressionFactory.matchExp(EipMAddressbook.PUBLIC_FLAG_PROPERTY, "T"); Expression exp22 = ExpressionFactory.matchExp( EipMAddressbook.OWNER_ID_PROPERTY, ALEipUtils.getUserId(rundata)); Expression exp23 = ExpressionFactory.matchExp(EipMAddressbook.PUBLIC_FLAG_PROPERTY, "F"); query.andQualifier(exp21.orExp(exp22.andExp(exp23))); List<EipMAddressbook> addresses = query.fetchList(); if (addresses == null || addresses.size() == 0) { logger.debug("[AddressBook] Not found Address ID..."); return null; } return addresses.get(0); } catch (Exception ex) { logger.error("AddressBookUtils.getEipMAddressbook", ex); return null; } } /** * その他の会社情報を取得する。 * * @param rundata * @param context * @return */ public static EipMAddressbookCompany getDummyEipMAddressbookCompany( RunData rundata, Context context) { // default company definition : company_id value is integer 1 return Database.get(EipMAddressbookCompany.class, Integer.valueOf(1)); } /** * 自分がオーナのグループを取得しID/Objectのマップを返却する。 * * @param rundata * @param context * @return */ public static Map<Integer, AddressBookGroup> getGroupMap(RunData rundata, Context context) { try { Map<Integer, AddressBookGroup> groupMap = new LinkedHashMap<Integer, AddressBookGroup>(); SelectQuery<EipMAddressGroup> query = Database.query(EipMAddressGroup.class); Expression exp = ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, Integer .valueOf(ALEipUtils.getUserId(rundata))); query.setQualifier(exp); List<EipMAddressGroup> list = query.fetchList(); int size = list.size(); for (int i = 0; i < size; i++) { EipMAddressGroup record = list.get(i); AddressBookGroup group = new AddressBookGroup(); group.initField(); group.setGroupId(record.getGroupId().intValue()); group.setGroupName(record.getGroupName()); groupMap.put(record.getGroupId(), group); } return groupMap; } catch (Exception ex) { logger.error("AddressBookUtils.getGroupMap", ex); return null; } } public static List<EipMAddressGroup> getGroups(int uid) { logger.debug("AddressbookUtils getGroups in"); try { SelectQuery<EipMAddressGroup> query = Database.query(EipMAddressGroup.class); Expression exp = ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, Integer .valueOf(uid)); query.setQualifier(exp); List<EipMAddressGroup> groups = query.fetchList(); if (groups == null || groups.size() == 0) { logger.debug("[AddressBook] Not found group ID..."); return null; } logger.debug("AddressbookUtils getGroups out"); return groups; } catch (Exception ex) { logger.error("AddressBookUtils.getGroups", ex); return null; } } public static List<ALStringField> getGroupMember(String gid) { List<ALStringField> resultList = new ArrayList<ALStringField>(); StringBuffer statement = new StringBuffer(); statement.append("SELECT "); statement.append(" B.last_name, B.first_name, "); statement.append(" C.company_name "); statement.append("FROM eip_t_addressbook_group_map as A "); statement.append("LEFT JOIN eip_m_addressbook as B "); statement.append(" on A.ADDRESS_ID = B.ADDRESS_ID "); statement.append("LEFT JOIN eip_m_addressbook_company AS C "); statement.append(" on B.COMPANY_ID = C.COMPANY_ID "); statement.append("WHERE A.GROUP_ID = #bind($gid) "); statement .append("ORDER BY C.company_name_kana, C.company_name, B.last_name_kana"); String query = statement.toString(); try { List<DataRow> list = Database.sql(EipMAddressbook.class, query).param( "gid", Integer.parseInt(gid)).fetchListAsDataRow(); int recordNum = list.size(); DataRow dataRow; for (int i = 0; i < recordNum; i++) { dataRow = list.get(i); StringBuffer strBuf = new StringBuffer(); strBuf .append( Database.getFromDataRow(dataRow, EipMAddressbook.LAST_NAME_COLUMN)) .append( Database.getFromDataRow(dataRow, EipMAddressbook.FIRST_NAME_COLUMN)); String companyName = (String) Database.getFromDataRow( dataRow, EipMAddressbookCompany.COMPANY_NAME_COLUMN); if (companyName != null && companyName.trim().length() > 0) { strBuf.append(" (").append(companyName).append(")"); } ALStringField st = new ALStringField(strBuf.toString()); resultList.add(st); } } catch (Exception ex) { logger.error("AddressbookUtils.getGroupMember", ex); } return resultList; } /** * ユーザーの所属する部署の一覧を取得します。 * * @param uid * ユーザーID * @return 所属する部署リスト */ public static List<AddressBookUserGroupLiteBean> 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<AddressBookUserGroupLiteBean> resultList = new ArrayList<AddressBookUserGroupLiteBean>(); TurbineUserGroupRole ugr = null; TurbineGroup group = null; AddressBookUserGroupLiteBean bean = null; int size = list.size(); for (int i = 0; i < size; i++) { ugr = list.get(i); group = ugr.getTurbineGroup(); EipMPost post = group.getEipMPost(); bean = new AddressBookUserGroupLiteBean(); bean.initField(); bean.setGroupId(post.getPostId()); bean.setName(post.getPostName()); resultList.add(bean); } return resultList; } /** * 現在表示させているタブが「社外」であるかどうか調べます。 * * @param rundata * @param context * @return */ public static boolean isSyagai(RunData rundata, Context context) { String tabParam = rundata.getParameters().getString("tab"); String currentTab = ALEipUtils.getTemp(rundata, context, "tab"); if (tabParam == null) { if (currentTab == null || currentTab.trim().length() == 0 || "syagai".equals(currentTab)) { return true; } return false; } else { if ("syagai".equals(tabParam)) { return true; } return false; } } /** * TurbineUserクラスをもとに作った社内アドレスのResultDataを返します。 * * @param record * @param strLength * 表示文字数 * @return */ public static AddressBookResultData getCorpResultData(TurbineUser record, int strLength) { AddressBookResultData rd = new AddressBookResultData(); rd.initField(); rd.setAddressId(record.getUserId().intValue()); rd.setName(ALCommonUtils.compressString(new StringBuffer() .append(record.getLastName()) .append(" ") .append(record.getFirstName()) .toString(), strLength)); if (record.getCompanyId().intValue() > 0) { rd.setCompanyName(ALCommonUtils.compressString(ALEipUtils .getCompanyName(record.getCompanyId().intValue()), strLength)); } rd.setPostList(compressString(AddressBookUtils.getPostBeanList(record .getUserId() .intValue()), strLength)); if (record.getPositionId().intValue() > 0) { rd.setPositionName(ALCommonUtils.compressString(ALEipUtils .getPositionName(record.getPositionId()), strLength)); } rd.setEmail(ALCommonUtils.compressString(record.getEmail(), strLength)); rd.setTelephone(record.getOutTelephone()); rd.setCellularPhone(record.getCellularPhone()); rd.setCellularMail(record.getCellularMail()); rd.setInTelephone(record.getInTelephone()); return rd; } public static List<AddressBookUserGroupLiteBean> compressString( List<AddressBookUserGroupLiteBean> list, int length) { for (AddressBookUserGroupLiteBean bean : list) { bean.setName(ALCommonUtils.compressString(bean.getName(), length)); } return list; } public static Expression excludeDefaultCompanyCriteria() { Expression exp = ExpressionFactory.noMatchDbExp( EipMAddressbookCompany.COMPANY_ID_PK_COLUMN, Integer.valueOf(1)); return exp; } /** * 自分がオーナーのグループを取得します * * @param rundata * @return */ public static List<AddressBookGroupResultData> getMyGroups(RunData rundata) { List<AddressBookGroupResultData> res = new ArrayList<AddressBookGroupResultData>(); try { // 自分がオーナのグループ指定 SelectQuery<EipMAddressGroup> query = Database.query(EipMAddressGroup.class); Expression exp = ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, Integer .valueOf(ALEipUtils.getUserId(rundata))); query.orderAscending(EipMAddressGroup.GROUP_NAME_PROPERTY); query.setQualifier(exp); List<EipMAddressGroup> aList = query.fetchList(); for (EipMAddressGroup record : aList) { AddressBookGroupResultData rd = new AddressBookGroupResultData(); rd.initField(); rd.setGroupId(record.getGroupId().longValue()); rd.setGroupName(record.getGroupName()); res.add(rd); } } catch (Exception ex) { logger.error("AddressBookUtils.getMyGroups", ex); } return res; } }