/*
* 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.message;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.Attributes;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.commons.field.ALDateTimeField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.cayenne.om.portlet.EipTMessage;
import com.aimluck.eip.cayenne.om.portlet.EipTMessageFile;
import com.aimluck.eip.cayenne.om.portlet.EipTMessageRoom;
import com.aimluck.eip.common.ALAbstractSelectData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.fileupload.beans.FileuploadBean;
import com.aimluck.eip.fileupload.util.FileuploadUtils;
import com.aimluck.eip.message.util.MessageUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.Operations;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.util.ALEipUtils;
/**
*
*/
public class MessageListSelectData extends
ALAbstractSelectData<EipTMessage, EipTMessage> {
public static final int MESSAGE_LIMIT = 50;
private int cursor = 0;
private boolean latest = false;
private int targetUserId;
private int userId;
private int lastMessageId;
private boolean jump = false;
private EipTMessageRoom room;
private ALStringField keyword;
private boolean isSearch = false;
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
userId = ALEipUtils.getUserId(rundata);
}
@Override
public void initField() {
keyword = new ALStringField();
}
/**
* @param rundata
* @param context
* @return
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
protected ResultList<EipTMessage> selectList(RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
if (targetUserId > 0) {
return new ResultList<EipTMessage>(
new ArrayList<EipTMessage>(),
1,
MESSAGE_LIMIT,
0);
}
try {
cursor = rundata.getParameters().getInt("c");
} catch (Throwable ignore) {
// ignore
}
try {
int param = rundata.getParameters().getInt("latest");
latest = (param == 1);
} catch (Throwable ignore) {
// ignore
}
try {
int param = rundata.getParameters().getInt("jump");
jump = (param == 1);
} catch (Throwable ignore) {
// ignore
}
List<Integer> roomIds = new ArrayList<Integer>(1);
if (isSearch) {
List<Integer> roomIds2 = MessageUtils.getRoomIds(userId);
if (roomIds2 != null && roomIds2.size() > 0) {
roomIds.addAll(roomIds2);
} else {
roomIds.add(-1);
}
} else {
roomIds.add(room.getRoomId());
}
if (jump) {
return MessageUtils.getMessageJumpList(room.getRoomId(), cursor);
} else {
return MessageUtils.getMessageList(
roomIds,
keyword.getValue(),
cursor,
MESSAGE_LIMIT,
latest);
}
}
/**
* @param rundata
* @param context
* @return
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
protected EipTMessage selectDetail(RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
return null;
}
/**
* @param model
* @return
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
protected Object getResultData(EipTMessage model)
throws ALPageNotFoundException, ALDBErrorException {
MessageResultData rd = new MessageResultData();
rd.initField();
rd.setMessageId(model.getMessageId());
rd.setRoomId(model.getRoomId());
rd.setUserId(model.getUserId());
rd.setFirstName(model.getFirstName());
rd.setLastName(model.getLastName());
rd.setHasPhoto("T".equals(model.getHasPhoto())
|| "N".equals(model.getHasPhoto()));
rd.setPhotoModified(model.getPhotoModified());
rd.setMemberCount(model.getMemberCount());
rd.setUnreadCount(model.getUnreadCount());
rd.setMessage(model.getMessage());
rd.setKeyword(keyword.getValue());
rd.setCreateDate(model.getCreateDate());
rd.setOwner(model.getUserId().intValue() == userId);
if (model.getMessageId().intValue() > lastMessageId) {
lastMessageId = model.getMessageId().intValue();
}
return rd;
}
@Override
public boolean doViewList(ALAction action, RunData rundata, Context context) {
boolean res = super.doViewList(action, rundata, context);
List<Object> result = getList();
List<Integer> parentIds = new ArrayList<Integer>(result.size());
for (Object obj : result) {
MessageResultData rd = (MessageResultData) obj;
parentIds.add((int) rd.getMessageId().getValue());
}
Map<Integer, List<FileuploadBean>> filesMap = getFiles(parentIds);
for (Object obj : result) {
MessageResultData rd = (MessageResultData) obj;
List<FileuploadBean> list =
filesMap.get((int) rd.getMessageId().getValue());
if (list != null) {
rd.setAttachmentFileList(list);
}
}
return res;
}
protected Map<Integer, List<FileuploadBean>> getFiles(List<Integer> parentIds) {
if (parentIds == null || parentIds.size() == 0) {
return new HashMap<Integer, List<FileuploadBean>>();
}
SelectQuery<EipTMessageFile> query = Database.query(EipTMessageFile.class);
query.where(Operations.in(EipTMessageFile.MESSAGE_ID_PROPERTY, parentIds));
query.orderAscending(EipTMessageFile.UPDATE_DATE_PROPERTY);
query.orderAscending(EipTMessageFile.FILE_PATH_PROPERTY);
List<EipTMessageFile> list = query.fetchList();
Map<Integer, List<FileuploadBean>> result =
new HashMap<Integer, List<FileuploadBean>>(parentIds.size());
for (EipTMessageFile model : list) {
Integer id = model.getMessageId();
List<FileuploadBean> rdList = result.get(id);
if (rdList == null) {
rdList = new ArrayList<FileuploadBean>();
}
String realname = model.getFileName();
DataHandler hData = new DataHandler(new FileDataSource(realname));
FileuploadBean filebean = new FileuploadBean();
filebean.setFileId(model.getFileId().intValue());
filebean.setFileName(realname);
if (hData != null) {
filebean.setContentType(hData.getContentType());
}
filebean.setIsImage(FileuploadUtils.isImage(realname));
rdList.add(filebean);
result.put(id, rdList);
}
return result;
}
/**
* @param model
* @return
* @throws ALPageNotFoundException
* @throws ALDBErrorException
*/
@Override
protected Object getResultDataDetail(EipTMessage model)
throws ALPageNotFoundException, ALDBErrorException {
return null;
}
/**
* @return
*/
@Override
protected Attributes getColumnMap() {
return null;
}
/**
*
* @param room
*/
public void setRoom(EipTMessageRoom room) {
this.room = room;
}
public int getRoomId() {
return room.getRoomId();
}
public int getUserId() {
return userId;
}
/**
* @return lastMessageId
*/
public int getLastMessageId() {
return lastMessageId;
}
/**
* @param targetUserId
* セットする targetUserId
*/
public void setTargetUserId(int targetUserId) {
this.targetUserId = targetUserId;
}
/**
* @return targetUserId
*/
public int getTargetUserId() {
return targetUserId;
}
public boolean isFirstView() {
return cursor == 0 && !latest;
}
public boolean isMatch(int id1, long id2) {
return id1 == (int) id2;
}
/**
* @return isSearch
*/
public boolean isSearch() {
return isSearch;
}
/**
* @param isSearch
* セットする isSearch
*/
public void setSearch(boolean isSearch) {
this.isSearch = isSearch;
}
/**
* @param keyword
*/
public void setKeyword(String keyword) {
this.keyword.setValue(keyword);
}
public ALStringField getKeyword() {
return keyword;
}
public boolean isSameDate(ALDateTimeField a, ALDateTimeField b) {
return a.getYear().equals(b.getYear())
&& a.getMonth().equals(b.getMonth())
&& a.getDay().equals(b.getDay());
}
public boolean isAdmin() {
if (room == null) {
return false;
}
return MessageUtils.hasAuthorityRoom(room, userId);
}
public boolean isDirect() {
if (room == null) {
return false;
}
return "O".equals(room.getRoomType());
}
}