/*
* 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.system;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
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.eip.cayenne.om.portlet.EipMMailAccount;
import com.aimluck.eip.common.ALAbstractSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.mail.ALMailFactoryService;
import com.aimluck.eip.mail.ALMailHandler;
import com.aimluck.eip.mail.ALMailReceiverContext;
import com.aimluck.eip.mail.util.ALMailUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.modules.actions.system.SystemManagerAction;
import com.aimluck.eip.modules.screens.SystemWebMailAdminFormScreen;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.system.util.SystemWebMailUtils;
import com.aimluck.eip.util.ALEipUtils;
/**
* Webメールアカウントの検索データを管理するためのクラスです。 <br />
*/
public class SystemWebMailAccountSelectData extends
ALAbstractSelectData<EipMMailAccount, EipMMailAccount> {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(SystemWebMailAccountSelectData.class.getName());
private String orgId;
private boolean isAdmin;
/** アカウントID */
private int accountId = -1;
/** フォルダに対する未読メール数のマップ */
private Map<Integer, Integer> unreadMailSumMap;
/** メールフォルダ一覧 */
private List<SystemWebMailFolderResultData> mailFolderList;
/**
*
* @param action
* @param rundata
* @param context
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
orgId = Database.getDomainName();
try {
accountId =
Integer.parseInt(ALEipUtils.getTemp(
rundata,
context,
SystemWebMailUtils.ACCOUNT_ID));
} catch (Exception e) {
accountId = 0;
}
// アカウントIDが取得できなかったとき、デフォルトのアカウントIDを取得する
int userId = ALEipUtils.getUserId(rundata);
if (accountId == 0) {
try {
Expression exp =
ExpressionFactory.matchExp(EipMMailAccount.USER_ID_PROPERTY, userId);
SelectQuery<EipMMailAccount> query =
Database.query(EipMMailAccount.class, exp);
query.select(EipMMailAccount.ACCOUNT_ID_PK_COLUMN);
List<EipMMailAccount> accounts = query.fetchList();
if (accounts != null && accounts.size() > 0) {
EipMMailAccount account = accounts.get(0);
accountId = account.getAccountId();
ALEipUtils.setTemp(
rundata,
context,
SystemWebMailUtils.ACCOUNT_ID,
Integer.toString(accountId));
} else {
// アカウントが一つも見つからなかった
return;
}
} catch (Exception e) {
}
}
isAdmin =
rundata.getScreen().equals(
SystemWebMailAdminFormScreen.class.getSimpleName())
|| action.getClass().getName().equals(
SystemManagerAction.class.getName());
unreadMailSumMap =
SystemWebMailUtils.getUnreadMailNumberMap(rundata, userId, accountId);
mailFolderList =
SystemWebMailUtils.getMailFolderAll(ALMailUtils.getMailAccount(
userId,
accountId));
super.init(action, rundata, context);
}
/**
*
* @param rundata
* @param context
* @return
*/
@Override
protected ResultList<EipMMailAccount> selectList(RunData rundata,
Context context) {
try {
SelectQuery<EipMMailAccount> query = getSelectQuery(rundata, context);
buildSelectQueryForListView(query);
buildSelectQueryForListViewSort(query, rundata, context);
return query.getResultList();
} catch (Exception ex) {
logger.error("system", ex);
return null;
}
}
/**
* 検索条件を設定した SelectQuery を返します。 <BR>
*
* @param rundata
* @param context
* @return
*/
private SelectQuery<EipMMailAccount> getSelectQuery(RunData rundata,
Context context) {
SelectQuery<EipMMailAccount> query = Database.query(EipMMailAccount.class);
Expression exp1 =
ExpressionFactory.matchExp(EipMMailAccount.USER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata)));
Expression exp2 =
ExpressionFactory.noMatchExp(
EipMMailAccount.ACCOUNT_TYPE_PROPERTY,
Integer.valueOf(ALMailUtils.ACCOUNT_TYPE_INIT));
return query.setQualifier(exp1.andExp(exp2));
}
/**
*
* @param rundata
* @param context
* @return
*/
@Override
protected EipMMailAccount selectDetail(RunData rundata, Context context) {
int userId = ALEipUtils.getUserId(rundata);
EipMMailAccount account = null;
if (isAdmin) {
// 管理者用のメールアカウントを表示する場合
account = ALMailUtils.getEipMMailAccountForAdmin();
} else {
int accountId =
rundata.getParameters().getInt(SystemWebMailUtils.ACCOUNT_ID, -1);
account = ALMailUtils.getMailAccount(userId, accountId);
}
return account;
}
/**
*
*/
@Override
protected Object getResultData(EipMMailAccount record) {
try {
SystemWebMailAccountResultData rd = new SystemWebMailAccountResultData();
rd.initField();
rd.setAccountId(record.getAccountId().intValue());
rd.setAccountName(record.getAccountName());
rd.setMailAddress(record.getMailAddress());
// 未読メール数を取得し,セットする.
ALMailHandler handler =
ALMailFactoryService.getInstance().getMailHandler();
ALMailReceiverContext rcontext =
ALMailUtils.getALPop3MailReceiverContext(orgId, record);
rd.setCountUnRead(handler.getUnReadMailSum(rcontext));
// 最終更新日を取得し,セットする.
Date finalAccessDate = record.getLastReceivedDate();
rd.setFinalAccessDate(ALMailUtils.translateDate(finalAccessDate));
return rd;
} catch (Exception ex) {
logger.error("system", ex);
return null;
}
}
/**
*
* @param record
* @return
*/
@Override
protected Object getResultDataDetail(EipMMailAccount record) {
try {
SystemWebMailAccountDetailResultData rd =
new SystemWebMailAccountDetailResultData();
rd.initField();
rd.setAccountId(record.getAccountId().intValue());
rd.setAccountName(record.getAccountName());
rd.setSmtpserverName(record.getSmtpserverName());
rd.setPop3serverName(record.getPop3serverName());
rd.setPop3userName(record.getPop3userName());
rd.setPop3Password("******");
rd.setMailUserName(record.getMailUserName());
rd.setMailAddress(record.getMailAddress());
rd.setSmtpPort(Integer.parseInt(record.getSmtpPort()));
rd.setPop3Port(Integer.parseInt(record.getPop3Port()));
rd.setAuthSendFlg(Short.valueOf(record.getAuthSendFlg()));
rd.setAuthSendUserId(record.getAuthSendUserId());
rd.setAuthSendUserPassword("******");
rd.setSignature(record.getSignature());
rd.setPop3EncryptionFlag(record.getPop3EncryptionFlg());
rd.setSmtpEncryptionFlag(record.getSmtpEncryptionFlg());
return rd;
} catch (Exception ex) {
logger.error("system", ex);
return null;
}
}
/**
* @return
*
*/
@Override
protected Attributes getColumnMap() {
Attributes map = new Attributes();
map.putValue("account_name", EipMMailAccount.ACCOUNT_NAME_PROPERTY);
return map;
}
/**
* フォルダ別未読メール数を取得する。
*
* @return
*/
public int getUnReadMailSumByFolderId(int folder_id) {
return unreadMailSumMap.get(folder_id);
}
/**
* @return mailFolderList
*/
public List<SystemWebMailFolderResultData> getFolderList() {
return mailFolderList;
}
/**
* @return accountId
*/
public int getAccountId() {
return accountId;
}
/**
*
* @param id
* @return
*/
public boolean isMatch(int id1, long id2) {
return id1 == (int) id2;
}
}