/*
* 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;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.commons.field.ALDateField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.addressbook.util.AddressBookUtils;
import com.aimluck.eip.cayenne.om.portlet.EipMAddressGroup;
import com.aimluck.eip.cayenne.om.portlet.EipMAddressbook;
import com.aimluck.eip.cayenne.om.portlet.EipTAddressbookGroupMap;
import com.aimluck.eip.common.ALAbstractFormData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.services.eventlog.ALEventlogConstants;
import com.aimluck.eip.services.eventlog.ALEventlogFactoryService;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* アドレス帳グループの入力用フォームデータです。
*
*/
public class AddressBookGroupFormData extends ALAbstractFormData {
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(AddressBookGroupFormData.class.getName());
// グループオブジェクトのリスト
private List<EipMAddressGroup> groupList;
// アドレスオブジェクトのリスト(全体表示用)
private List<AddressBookFilterData> allAddressList;
// アドレスオブジェクトのリスト(グループ別表示用)
private List<Object> addressList;
// このグループへ登録されているアドレスのリスト
private List<AddressBookResultData> addresses;
private ALStringField group_name;
private ALStringField public_flag;
private ALDateField create_date;
private ALDateField update_date;
private Integer uid;
private Integer gid;
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
uid = Integer.valueOf(ALEipUtils.getUserId(rundata));
}
/**
*
*/
@Override
public void initField() {
groupList = new ArrayList<EipMAddressGroup>();
allAddressList = new ArrayList<AddressBookFilterData>();
addressList = new ArrayList<Object>();
addresses = new ArrayList<AddressBookResultData>();
group_name = new ALStringField();
group_name.setFieldName(ALLocalizationUtils
.getl10n("ADDRESSBOOK_GROUP_NAME"));
group_name.setTrim(true);
public_flag = new ALStringField();
public_flag.setFieldName(ALLocalizationUtils
.getl10n("ADDRESSBOOK_SETFIELDNAME_PUBLIC"));
create_date = new ALDateField();
create_date.setFieldName(ALLocalizationUtils
.getl10n("COMMON_CREATE_DATE"));
update_date = new ALDateField();
update_date.setFieldName(ALLocalizationUtils
.getl10n("ADDRESSBOOK_SETFIELDNAME_LAST_UPDATE_DATE"));
}
/**
*
*/
@Override
protected void setValidator() {
group_name.setNotNull(true);
group_name.limitMaxLength(50);
public_flag.setNotNull(true);
public_flag.limitMaxLength(1);
}
/**
*
* @param msgList
* @return
*/
@Override
protected boolean validate(List<String> msgList) {
try {
SelectQuery<EipMAddressGroup> query =
Database.query(EipMAddressGroup.class);
if (ALEipConstants.MODE_INSERT.equals(getMode())) {
Expression exp1 =
ExpressionFactory.matchExp(
EipMAddressGroup.GROUP_NAME_PROPERTY,
group_name.getValue());
query.setQualifier(exp1);
Expression exp2 =
ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, uid);
query.andQualifier(exp2);
} else {
Expression exp1 =
ExpressionFactory.matchExp(
EipMAddressGroup.GROUP_NAME_PROPERTY,
group_name.getValue());
query.setQualifier(exp1);
Expression exp2 =
ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, uid);
query.andQualifier(exp2);
Expression exp3 =
ExpressionFactory.noMatchDbExp(
EipMAddressGroup.GROUP_ID_PK_COLUMN,
gid);
query.andQualifier(exp3);
}
if (query.fetchList().size() != 0) {
msgList.add("社外グループ名『 <span class='em'>"
+ group_name
+ "</span> 』は既に登録されています。");
}
group_name.validate(msgList);
public_flag.validate(msgList);
} catch (Exception ex) {
logger.error("AddressBookGroupFormData.validate", ex);
return false;
}
return msgList.size() == 0;
}
/**
* フォームへデータをセットします。
*
* @param rundata
* @param context
* @param msgList
* @return
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
protected boolean setFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
// ユーザ登録グループの公開区分は常に非公開(F)とする
setPublicFlag(new ALStringField("F"));
boolean res = super.setFormData(rundata, context, msgList);
addressList = new ArrayList<Object>();
if (res) {
try {
if (ALEipConstants.MODE_UPDATE.equals(getMode())) {
gid =
Integer.valueOf(ALEipUtils.getTemp(
rundata,
context,
ALEipConstants.ENTITY_ID));
}
String str[] = rundata.getParameters().getStrings("address_to");
if (hasEmpty(str)) {
return res;
}
SelectQuery<EipMAddressbook> query =
Database.query(EipMAddressbook.class);
Expression exp =
ExpressionFactory.inDbExp(EipMAddressbook.ADDRESS_ID_PK_COLUMN, str);
query.setQualifier(exp);
List<EipMAddressbook> list = query.fetchList();
int size = list.size();
for (int i = 0; i < size; i++) {
EipMAddressbook address = list.get(i);
AddressBookResultData rd = new AddressBookResultData();
rd.initField();
rd.setAddressId(address.getAddressId().intValue());
rd.setName(address.getLastName() + " " + address.getFirstName());
addresses.add(rd);
}
} catch (Exception ex) {
logger.error("AddressBookGroupFormData.setFormData", ex);
throw new ALDBErrorException();
}
}
return res;
}
private boolean hasEmpty(String[] list) {
if (list == null || list.length == 0) {
return true;
}
String str = null;
int len = list.length;
for (int i = 0; i < len; i++) {
str = list[i];
if (str == null || "".equals(str)) {
return true;
}
}
return false;
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean loadFormData(RunData rundata, Context context,
List<String> msgList) {
try {
// オブジェクトモデルを取得
EipMAddressGroup group =
AddressBookUtils.getEipMAddressGroup(rundata, context);
if (group == null) {
return false;
}
// グループ名
group_name.setValue(group.getGroupName());
// 公開区分
public_flag.setValue(group.getPublicFlag());
} catch (Exception ex) {
logger.error("AddressBookGroupFormData.loadFormData", ex);
return false;
}
return true;
}
/**
* 指定社外グループに属するアドレスを取得する。
*
* @param rundata
* @param context
* @return
*/
public boolean loadAddresses(RunData rundata, Context context) {
try {
String gid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
if (gid != null) {
// この社外グループの所有者が現ユーザと異なる場合はエラー
SelectQuery<EipMAddressGroup> query =
Database.query(EipMAddressGroup.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipMAddressGroup.GROUP_ID_PK_COLUMN,
Integer.valueOf(gid));
query.setQualifier(exp1);
Expression exp2 =
ExpressionFactory.matchExp(
EipMAddressGroup.OWNER_ID_PROPERTY,
Integer.valueOf(ALEipUtils.getUserId(rundata)));
query.andQualifier(exp2);
List<EipMAddressGroup> list = query.fetchList();
if (list.size() == 0) {
return false;
}
} else {
return false;
}
// 指定社外グループに属するアドレスのリストを取得
SelectQuery<EipTAddressbookGroupMap> mapquery =
Database.query(EipTAddressbookGroupMap.class);
Expression mapexp =
ExpressionFactory.matchDbExp(
EipTAddressbookGroupMap.EIP_TADDRESS_GROUP_PROPERTY
+ "."
+ EipMAddressGroup.GROUP_ID_PK_COLUMN,
Integer.valueOf(gid));
mapquery.setQualifier(mapexp);
List<EipTAddressbookGroupMap> aList = mapquery.fetchList();
int size = aList.size();
for (int i = 0; i < size; i++) {
EipTAddressbookGroupMap record = aList.get(i);
EipMAddressbook addressbook =
Database.get(EipMAddressbook.class, record.getAddressId());
AddressBookResultData rd = new AddressBookResultData();
rd.initField();
rd.setAddressId(record.getAddressId().intValue());
rd
.setName(addressbook.getLastName() + " " + addressbook.getFirstName());
addresses.add(rd);
}
} catch (Exception ex) {
logger.error("AddressBookGroupFormData.loadAddresses", ex);
return false;
}
return true;
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean insertFormData(RunData rundata, Context context,
List<String> msgList) {
try {
EipMAddressGroup address = Database.create(EipMAddressGroup.class);
rundata.getParameters().setProperties(address);
address.setGroupName(group_name.getValue());
address.setPublicFlag(public_flag.getValue());
int uid = ALEipUtils.getUserId(rundata);
address.setOwnerId(Integer.valueOf(uid));
Date now = new Date();
address.setCreateDate(now);
address.setUpdateDate(now);
// Address-Groupマッピングテーブルへのデータ追加
for (int i = 0; i < addresses.size(); i++) {
EipTAddressbookGroupMap map =
Database.create(EipTAddressbookGroupMap.class);
int addressid =
Integer.valueOf((int) (addresses.get(i).getAddressId().getValue()));
map.setEipMAddressbook(Database.get(EipMAddressbook.class, Integer
.valueOf(addressid)));
map.setEipTAddressGroup(address);
}
Database.commit();
// イベントログに保存
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
address.getGroupId(),
ALEventlogConstants.PORTLET_TYPE_ADDRESSBOOK_GROUP,
group_name.getValue());
return true;
} catch (Exception ex) {
Database.rollback();
logger.error("AddressBookGroupFormData.insertFormData", ex);
return false;
}
}
/**
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean updateFormData(RunData rundata, Context context,
List<String> msgList) {
try {
// オブジェクトモデルを取得
EipMAddressGroup group =
AddressBookUtils.getEipMAddressGroup(rundata, context);
if (group == null) {
return false;
}
group.setGroupName(group_name.getValue());
group.setPublicFlag(public_flag.getValue());
group.setUpdateDate(new Date());
// Address-Groupマッピングテーブルへのデータ追加
String gid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
// Address-Group Mapテーブル情報を一旦削除
SelectQuery<EipTAddressbookGroupMap> query1 =
Database.query(EipTAddressbookGroupMap.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTAddressbookGroupMap.EIP_TADDRESS_GROUP_PROPERTY
+ "."
+ EipMAddressGroup.GROUP_ID_PK_COLUMN,
gid);
query1.setQualifier(exp1);
List<EipTAddressbookGroupMap> maps = query1.fetchList();
Database.deleteAll(maps);
// Address-Group Mapテーブルへ指定されたアドレスを追加
for (int i = 0; i < addresses.size(); i++) {
EipTAddressbookGroupMap map =
Database.create(EipTAddressbookGroupMap.class);
int addressid =
Integer.valueOf((int) (addresses.get(i).getAddressId().getValue()));
map.setEipMAddressbook(Database.get(EipMAddressbook.class, Integer
.valueOf(addressid)));
map.setEipTAddressGroup(group);
}
Database.commit();
// イベントログに保存
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
group.getGroupId(),
ALEventlogConstants.PORTLET_TYPE_ADDRESSBOOK_GROUP,
group_name.getValue());
} catch (Exception ex) {
Database.rollback();
logger.error("AddressBookGroupFormData.updateFormData", ex);
return false;
}
return true;
}
/**
* 社外アドレスの削除。
*
* @param rundata
* @param context
* @param msgList
* @return
*/
@Override
protected boolean deleteFormData(RunData rundata, Context context,
List<String> msgList) {
try {
String groupid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
if (groupid == null || Integer.valueOf(groupid) == null) {
logger.debug("[AddressBook] Cannot find Ext Group ID .");
return false;
}
// Eip_t_addressbook_group_Mapテーブルから削除
SelectQuery<EipTAddressbookGroupMap> query1 =
Database.query(EipTAddressbookGroupMap.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTAddressbookGroupMap.EIP_TADDRESS_GROUP_PROPERTY
+ "."
+ EipMAddressGroup.GROUP_ID_PK_COLUMN,
Integer.valueOf(groupid));
query1.setQualifier(exp1);
List<EipTAddressbookGroupMap> maps = query1.fetchList();
Database.deleteAll(maps);
// Eip_m_address_groupテーブルから削除
SelectQuery<EipMAddressGroup> query2 =
Database.query(EipMAddressGroup.class);
Expression exp2 =
ExpressionFactory.matchDbExp(
EipMAddressGroup.GROUP_ID_PK_COLUMN,
Integer.valueOf(groupid));
query2.setQualifier(exp2);
List<EipMAddressGroup> groups = query2.fetchList();
EipMAddressGroup delete_group = groups.get(0);
int entityId = delete_group.getGroupId();
String groupName = delete_group.getGroupName();
Database.deleteAll(groups);
Database.commit();
// イベントログに保存
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
entityId,
ALEventlogConstants.PORTLET_TYPE_ADDRESSBOOK_GROUP,
groupName);
// 検索画面用フィルタにて設定されているグループフィルタをセッションから削除する。
String filtername =
AddressBookFilterdSelectData.class.getName()
+ ALEipConstants.LIST_FILTER;
ALEipUtils.removeTemp(rundata, context, filtername);
} catch (Exception ex) {
Database.rollback();
logger.error("AddressBookGroupFormData.deleteFormData", ex);
return false;
}
return true;
}
public ALStringField getGroupName() {
return group_name;
}
public ALStringField getPublicFlag() {
return public_flag;
}
public void setPublicFlag(ALStringField field) {
public_flag = field;
}
/**
* @return
*/
public ALDateField getCreateDate() {
return create_date;
}
/**
* @return
*/
public ALDateField getUpdateDate() {
return update_date;
}
/**
* @param field
*/
public void setCreateDate(ALDateField field) {
create_date = field;
}
/**
* @param field
*/
public void setUpdateDate(ALDateField field) {
update_date = field;
}
public void loadFilter(RunData rundata, Context context) {
try {
// 自分がオーナのグループを取得
SelectQuery<EipMAddressGroup> query1 =
Database.query(EipMAddressGroup.class);
Expression exp1 =
ExpressionFactory.matchExp(EipMAddressGroup.OWNER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata)));
query1.setQualifier(exp1);
List<EipMAddressGroup> glist = query1.fetchList();
// Mapへ値をセット
for (int i = 0; i < glist.size(); i++) {
EipMAddressGroup group = glist.get(i);
groupList.add(group);
}
// アドレス一覧を取得(全体用)
SelectQuery<EipMAddressbook> query2 =
Database.query(EipMAddressbook.class);
Expression exp21 =
ExpressionFactory.matchExp(EipMAddressbook.PUBLIC_FLAG_PROPERTY, "T");
Expression exp22 =
ExpressionFactory.matchExp(EipMAddressbook.OWNER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata)));
query2.setQualifier(exp21.orExp(exp22));
List<EipMAddressbook> list = query2.fetchList();
int addressNum = list.size();
AddressBookFilterData address;
for (int i = 0; i < addressNum; i++) {
EipMAddressbook rec = list.get(i);
address = new AddressBookFilterData();
address.initField();
address.setAddressId(rec.getAddressId().intValue());
address.setFullName(rec.getLastName(), rec.getFirstName());
allAddressList.add(address);
}
} catch (Exception ex) {
logger.error("AddressBookGroupFormData.loadFilter", ex);
}
}
public List<EipMAddressGroup> getGroupList() {
return groupList;
}
public List<Object> getAddressList() {
return addressList;
}
public List<AddressBookFilterData> getAllAddressList() {
return allAddressList;
}
public List<AddressBookFilterData> getGroupAddressList(int gid) {
List<AddressBookFilterData> list = new ArrayList<AddressBookFilterData>();
for (int i = 0; i < addressList.size(); i++) {
AddressBookFilterData fData = (AddressBookFilterData) addressList.get(i);
if (fData.getGroupId().getValue() == gid) {
list.add(fData);
}
}
return list;
}
/**
* @return
*/
public List<AddressBookResultData> getAddresses() {
return addresses;
}
/**
* アクセス権限チェック用メソッド。 アクセス権限の機能名を返します。
*
* @return
*/
@Override
public String getAclPortletFeature() {
return ALAccessControlConstants.POERTLET_FEATURE_ADDRESSBOOK_COMPANY_GROUP;
}
}