/*
* 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.webmail;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
import javax.mail.Message;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.commons.lang.StringUtils;
import org.apache.jetspeed.om.security.JetspeedUser;
import org.apache.jetspeed.portal.portlets.VelocityPortlet;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.rundata.JetspeedRunData;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.eip.cayenne.om.portlet.EipMMailAccount;
import com.aimluck.eip.cayenne.om.portlet.EipTMail;
import com.aimluck.eip.cayenne.om.portlet.EipTMailFolder;
import com.aimluck.eip.common.ALAbstractSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.mail.ALFolder;
import com.aimluck.eip.mail.ALLocalMailMessage;
import com.aimluck.eip.mail.ALMailFactoryService;
import com.aimluck.eip.mail.ALMailHandler;
import com.aimluck.eip.mail.ALMailMessage;
import com.aimluck.eip.mail.ALPop3MailReceiveThread;
import com.aimluck.eip.mail.util.ALMailUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.util.ALCommonUtils;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
import com.aimluck.eip.webmail.beans.WebmailAccountLiteBean;
import com.aimluck.eip.webmail.util.WebMailUtils;
import com.sk_jp.mail.MailUtility;
/**
* Webメール検索データを管理するためのクラスです。 <br />
*/
public class WebMailSelectData extends
ALAbstractSelectData<EipTMail, ALMailMessage> {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(WebMailSelectData.class.getName());
/** 現在選択されているタブ (=受信メール or 送信メール) */
private String currentTab = null;
JetspeedUser user = null;
/** ユーザーID */
private int userId = -1;
/** アカウントID */
private int accountId = -1;
/** フォルダID */
private int folderId = -1;
/** フォルダに対する未読メール数のマップ */
private Map<Integer, Integer> unreadMailSumMap;
/** 最終受信日 */
private final String finalAccessDateStr = null;
private String orgId;
/** メール受信スレッドの状態 */
private String mailReceiveThreadStatus;
/** 受信トレイと送信トレイ */
private ALFolder folder;
/** 選択されたフォルダ */
private WebMailFolderResultData selectedFolder;
/** メールアカウント一覧 */
private List<WebmailAccountLiteBean> mailAccountList =
new ArrayList<WebmailAccountLiteBean>();
/** メールフォルダ一覧 */
private List<WebMailFolderResultData> mailFolderList =
new ArrayList<WebMailFolderResultData>();
/**
*
* @param action
* @param rundata
* @param context
*/
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
String sort = ALEipUtils.getTemp(rundata, context, LIST_SORT_STR);
if (sort == null || sort.equals("")) {
ALEipUtils.setTemp(rundata, context, LIST_SORT_STR, ALEipUtils
.getPortlet(rundata, context)
.getPortletConfig()
.getInitParameter("p2a-sort"));
}
orgId = Database.getDomainName();
userId = ALEipUtils.getUserId(rundata);
user = (JetspeedUser) ((JetspeedRunData) rundata).getUser();
// メール受信スレッドの状態を取得
mailReceiveThreadStatus =
ALEipUtils.getTemp(rundata, context, "start_recieve");
ALEipUtils.removeTemp(rundata, context, "start_recieve");
String tabParam = rundata.getParameters().getString("tab");
currentTab = ALEipUtils.getTemp(rundata, context, "tab");
if (tabParam == null && currentTab == null) {
ALEipUtils.setTemp(rundata, context, "tab", WebMailUtils.TAB_RECEIVE);
currentTab = WebMailUtils.TAB_RECEIVE;
} else if (tabParam != null) {
ALEipUtils.setTemp(rundata, context, "tab", tabParam);
currentTab = tabParam;
}
// 自ポートレットからのリクエストであれば、パラメータを展開しセッションに保存する。
if (ALEipUtils.isMatch(rundata, context)) {
// アカウントID
if (rundata.getParameters().containsKey(WebMailUtils.ACCOUNT_ID)) {
ALEipUtils.setTemp(rundata, context, WebMailUtils.ACCOUNT_ID, rundata
.getParameters()
.getString(WebMailUtils.ACCOUNT_ID));
}
// フォルダID
if (rundata.getParameters().containsKey(WebMailUtils.FOLDER_ID)) {
ALEipUtils.setTemp(rundata, context, WebMailUtils.FOLDER_ID, rundata
.getParameters()
.getString(WebMailUtils.FOLDER_ID));
}
} else {
String _accountId =
ALEipUtils.getTemp(rundata, context, WebMailUtils.ACCOUNT_ID);
if (StringUtils.isEmpty(_accountId) || !StringUtils.isNumeric(_accountId)) {
ALEipUtils.setTemp(
rundata,
context,
WebMailUtils.ACCOUNT_ID,
ALEipUtils
.getPortlet(rundata, context)
.getPortletConfig()
.getInitParameter("p3a-accounts"));
}
}
try {
accountId =
Integer.parseInt(ALEipUtils.getTemp(
rundata,
context,
WebMailUtils.ACCOUNT_ID));
} catch (Exception ignore) {
accountId = 0;
}
try {
folderId =
Integer.parseInt(ALEipUtils.getTemp(
rundata,
context,
WebMailUtils.FOLDER_ID));
} catch (Exception e) {
folderId = 0;
}
// accountIdが消されてしまっていないかチェックする
if (!validateAccountId()) {
accountId = 0;
}
// アカウントIDが取得できなかったとき、デフォルトのアカウントIDを取得する
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, WebMailUtils.ACCOUNT_ID, Integer
.toString(accountId));
} else {
// アカウントが一つも見つからなかった
return;
}
} catch (Exception e) {
}
}
// アカウントを取得
EipMMailAccount account = ALMailUtils.getMailAccount(userId, accountId);
if (account == null) {
action.addErrorMessage(ALLocalizationUtils
.getl10nFormat("WEBMAIL_NO_ACCOUNT"));
return;
}
// 現在選択中のフォルダを取得
EipTMailFolder mailFolder =
WebMailUtils.getEipTMailFolder(account, String.valueOf(folderId));
// フォルダが取得できなかったとき、アカウントに紐付いたデフォルトのフォルダIDを取得する
if (mailFolder == null) {
folderId = account.getDefaultFolderId();
// セッションにセット
ALEipUtils.setTemp(rundata, context, WebMailUtils.FOLDER_ID, String
.valueOf(folderId));
// 再取得
mailFolder =
WebMailUtils.getEipTMailFolder(account, String.valueOf(folderId));
}
selectedFolder = new WebMailFolderResultData(mailFolder);
// フォルダリストを取得
mailFolderList = WebMailUtils.getMailFolderAll(account);
// 現在選択しているタブが受信トレイか送信トレイか
if (accountId > 0) {
int type_mail =
(WebMailUtils.TAB_RECEIVE.equals(currentTab))
? ALFolder.TYPE_RECEIVE
: ALFolder.TYPE_SEND;
ALMailHandler handler =
ALMailFactoryService.getInstance().getMailHandler();
folder =
handler.getALFolder(type_mail, orgId, userId, Integer
.valueOf(accountId));
folder.setRowsNum(super.getRowsNum());
}
loadUnreadMailSumMap(rundata, context);
super.init(action, rundata, context);
// ソート対象が日時だった場合、ソート順を逆にする.
if ("date".equals(ALEipUtils.getTemp(rundata, context, LIST_SORT_STR))) {
String sort_type =
ALEipUtils.getTemp(rundata, context, LIST_SORT_TYPE_STR);
if (sort_type == null || sort_type.equals("")) {
ALEipUtils.setTemp(
rundata,
context,
LIST_SORT_TYPE_STR,
ALEipConstants.LIST_SORT_TYPE_DESC);
}
}
}
private boolean validateAccountId() {
for (WebmailAccountLiteBean bean : mailAccountList) {
if (accountId == (int) bean.getAccountId().getValue()) {
return true;
}
}
return false;
}
/**
*
* @param rundata
* @param context
*/
public void loadMailAccountList(RunData rundata, Context context) {
mailAccountList = WebMailUtils.getMailAccountList(rundata, context);
}
/**
* メールの一覧を取得する.
*
* @param rundata
* @param context
* @return
*/
@Override
protected ResultList<EipTMail> selectList(RunData rundata, Context context) {
try {
if (folder == null) {
return null;
}
loadUnreadMailSumMap(rundata, context);
return folder.getIndexRows(rundata, context);
} catch (Exception ex) {
logger.error("webmail", ex);
return null;
}
}
/**
* フォルダごとの未読メール数を取得<br>
* ・フォルダの切り替え、受信送信タブの移動、ソート時には未読メール数をセッションから取得する<br>
* ・メールのフォルダ間移動、メール詳細画面を出した後は未読メール数をデータベースから取得する<br>
* ・セッションが空の場合は未読メール数をデータベースから取得する
*
* @param rundata
* @param context
*/
private void loadUnreadMailSumMap(RunData rundata, Context context) {
String unreadMailSumMapString =
ALEipUtils.getTemp(rundata, context, WebMailUtils.UNREAD_MAIL);
if ((rundata.getParameters().containsKey("noupdateunread")
|| rundata.getParameters().containsKey("sort") || rundata
.getParameters()
.containsKey("tab"))
&& unreadMailSumMapString != null
&& !rundata.getParameters().containsKey("updateunread")) {
// セッションから得た文字列をHashMapに再構成
unreadMailSumMap =
WebMailUtils.getUnreadMailSumMapFromString(unreadMailSumMapString);
} else {
// セッションが空か、パラメータが指定されていなければ取得しなおす
unreadMailSumMap =
WebMailUtils.getUnreadMailNumberMap(rundata, userId, accountId);
}
// セッションに保存
ALEipUtils.setTemp(
rundata,
context,
WebMailUtils.UNREAD_MAIL,
unreadMailSumMap.toString());
}
/**
*
* @param rundata
* @param context
* @return
*/
@Override
protected ALMailMessage selectDetail(RunData rundata, Context context) {
String mailid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
if (mailid == null || Integer.valueOf(mailid) == null) {
// Mail IDが空の場合
logger.debug("[Mail] Empty ID...");
return null;
}
return folder.getMail(Integer.valueOf(mailid));
}
/**
* ResultDataを取得する(メールの一覧) <BR>
*
*
*/
@Override
protected Object getResultData(EipTMail record) {
WebMailIndexRowResultData rd = new WebMailIndexRowResultData();
rd.initField();
rd.setMailId(record.getMailId().toString());
String isRead = record.getReadFlg();
if ("T".equals(isRead)) {
rd.setRead(true);
rd.setReadImage("themes/"
+ getTheme()
+ "/images/icon/webmail_readmail.gif");
rd.setReadImageDescription("既読");
rd.setRead(true);
} else {
rd.setRead(false);
rd.setReadImage("themes/"
+ getTheme()
+ "/images/icon/webmail_unreadmail.gif");
rd.setReadImageDescription("未読");
rd.setRead(false);
}
String subject = ALMailUtils.decodeSubject(record.getSubject());
rd.setSubject(ALCommonUtils.compressString(subject, getStrLength()));
rd.setPerson(MailUtility.decodeText(record.getPerson()));
rd.setDate(record.getEventDate());
rd.setFileVolume(record.getFileVolume().toString());
boolean hasAttachments = ("T".equals(record.getHasFiles()));
if (hasAttachments) {
rd.setWithFilesImage("images/webmail/webmail_withfiles.gif");
rd.setWithFilesImageDescription("添付有");
}
rd.hasAttachments(hasAttachments);
return rd;
}
/**
*
* @param obj
* @return
*/
@Override
protected Object getResultDataDetail(ALMailMessage obj) {
WebMailResultData rd = null;
try {
ALLocalMailMessage msg = (ALLocalMailMessage) obj;
String date = "";
Date sentDate = msg.getSentDate();
if (sentDate == null) {
date = "Unknown";
} else {
date = ALMailUtils.translateDate(sentDate);
}
rd = new WebMailResultData();
rd.initField();
rd.setHeaders(msg.getHeaderArray());
rd.setSubject(msg.getSubject());
rd.setFrom(ALMailUtils.getFromDelegate(msg));
rd.setTo(ALMailUtils.getAddressString(msg.getRecipients(
Message.RecipientType.TO,
false)));
rd.setDate(date);
rd.setBody(msg.getBodyText());
rd.setAttachmentFileNames(msg.getAttachmentFileNameArray());
} catch (Exception e) {
logger.error("webmail", e);
}
return rd;
}
/**
* 現在選択されているタブを取得します。 <BR>
*
* @return
*/
public String getCurrentTab() {
return currentTab;
}
/**
* 現在のアカウントが持つメールフォルダを取得します。
*
* @return
*/
public List<WebMailFolderResultData> getFolderList() {
return mailFolderList;
}
/**
* @return
*
*/
@Override
protected Attributes getColumnMap() {
return null;
}
/**
*
* @return
*/
public List<WebmailAccountLiteBean> getMailAccountList() {
return mailAccountList;
}
/**
* 現在選択中のアカウントIDを取得します。
*
* @return
*/
public int getAccountId() {
return accountId;
}
public boolean isTheMailAccountSelected(WebmailAccountLiteBean record) {
return accountId == record.getAccountId().getValue();
}
/**
* 現在選択中のフォルダIDを取得します。
*
* @return
*/
public int getFolderId() {
return folderId;
}
/**
* 現在選択中のフォルダを取得します。
*
* @return
*/
public WebMailFolderResultData getSelectedFolder() {
return selectedFolder;
}
/**
* フォルダ別未読メール数を取得する。
*
* @return
*/
public int getUnReadMailSumByFolderId(Integer folder_id) {
int result = 0;
try {
if (folder_id != null) {
if (unreadMailSumMap.containsKey(folder_id)) {
result = unreadMailSumMap.get(folder_id);
}
}
} catch (Exception e) {
logger.error("[WebMailSelectData]", e);
result = 0;
}
return result;
}
public String getFinalAccessDate() {
return finalAccessDateStr;
}
/**
* 表示する項目数を取得します。
*
* @return
*/
@Override
public int getRowsNum() {
return folder.getRowsNum();
}
/**
* 総件数を取得します。
*
* @return
*/
@Override
public int getCount() {
return folder.getCount();
}
/**
* 総ページ数を取得します。
*
* @return
*/
@Override
public int getPagesNum() {
return folder.getPagesNum();
}
/**
* 現在表示されているページを取得します。
*
* @return
*/
@Override
public int getCurrentPage() {
return folder.getCurrentPage();
}
/**
*
* @return
*/
@Override
public String getCurrentSort() {
return folder.getCurrentSort();
}
/**
*
* @return
*/
@Override
public String getCurrentSortType() {
return folder.getCurrentSortType();
}
/**
* @return
*/
@Override
public int getStart() {
return folder.getStart();
}
/**
*
* @param id
* @return
*/
public boolean isMatch(int id1, long id2) {
return id1 == (int) id2;
}
public String getStatStr() {
return ALPop3MailReceiveThread.getReceiveMailResultStr(
user,
accountId,
mailReceiveThreadStatus);
}
public void setFiltersPSML(VelocityPortlet portlet, Context context,
RunData rundata) {
ALEipUtils.setTemp(rundata, context, WebMailUtils.ACCOUNT_ID, portlet
.getPortletConfig()
.getInitParameter("p3a-accounts"));
}
}