/* * 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.util; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.cayenne.DataRow; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.jetspeed.portal.Portlet; import org.apache.jetspeed.services.logging.JetspeedLogFactoryService; import org.apache.jetspeed.services.logging.JetspeedLogger; import org.apache.jetspeed.services.resources.JetspeedResources; import org.apache.jetspeed.util.template.ContentTemplateLink; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.commons.utils.ALStringUtil; import com.aimluck.eip.cayenne.om.portlet.EipTMessage; import com.aimluck.eip.cayenne.om.portlet.EipTMessageFile; import com.aimluck.eip.cayenne.om.portlet.EipTMessageRead; import com.aimluck.eip.cayenne.om.portlet.EipTMessageRoom; import com.aimluck.eip.cayenne.om.portlet.EipTMessageRoomMember; import com.aimluck.eip.cayenne.om.security.TurbineUser; import com.aimluck.eip.common.ALDBErrorException; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.common.ALPageNotFoundException; import com.aimluck.eip.fileupload.beans.FileuploadBean; import com.aimluck.eip.fileupload.beans.FileuploadLiteBean; import com.aimluck.eip.fileupload.util.FileuploadUtils; import com.aimluck.eip.message.MessageListSelectData; import com.aimluck.eip.message.MessageMockPortlet; 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.SQLTemplate; import com.aimluck.eip.orm.query.SelectQuery; import com.aimluck.eip.services.orgutils.ALOrgUtilsService; import com.aimluck.eip.services.push.ALPushService; import com.aimluck.eip.services.storage.ALStorageService; import com.aimluck.eip.util.ALEipUtils; import com.aimluck.eip.util.ALJetspeedLink; /** * */ public class MessageUtils { public static final String MESSAGE_PORTLET_NAME = "Message"; private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(MessageUtils.class.getName()); public static final String FOLDER_FILEDIR_MESSAGE = JetspeedResources .getString("aipo.filedir", ""); public static final String CATEGORY_KEY = JetspeedResources.getString( "aipo.message.categorykey", ""); public static final String FILE_ENCODING = JetspeedResources.getString( "content.defaultencoding", "UTF-8"); public static void setupContext(RunData rundata, Context context) { Portlet portlet = new MessageMockPortlet(); context.put("portlet", portlet); context.put("jslink", new ALJetspeedLink(rundata)); context.put("clink", new ContentTemplateLink(rundata)); } public static void setupContext(RunData rundata, Context context, String portletId) { Portlet portlet = new MessageMockPortlet(portletId); context.put("portlet", portlet); context.put("jslink", new ALJetspeedLink(rundata)); context.put("clink", new ContentTemplateLink(rundata)); } public static EipTMessage getMessage(int messageId) { return Database.get(EipTMessage.class, messageId); } public static EipTMessageRoom getRoom(int roomId) { return Database.get(EipTMessageRoom.class, roomId); } public static EipTMessageRoom getRoom(int userId, int targetUserId) { EipTMessageRoomMember model = Database.query(EipTMessageRoomMember.class).where( Operations.eq(EipTMessageRoomMember.USER_ID_PROPERTY, userId)).where( Operations.eq( EipTMessageRoomMember.TARGET_USER_ID_PROPERTY, targetUserId)).fetchSingle(); if (model != null) { return model.getEipTMessageRoom(); } else { return null; } } public static EipTMessageRoomMember getRoomMember(int roomId, int userId) { EipTMessageRoomMember model = Database .query(EipTMessageRoomMember.class) .where(Operations.eq(EipTMessageRoomMember.USER_ID_PROPERTY, userId)) .where( Operations.eq( EipTMessageRoomMember.EIP_TMESSAGE_ROOM_PROPERTY, roomId)) .fetchSingle(); return model; } public static EipTMessageRoom getRoom(RunData rundata, Context context) throws ALPageNotFoundException { Integer roomId = null; try { try { roomId = rundata.getParameters().getInteger(ALEipConstants.ENTITY_ID); } catch (Throwable ignore) { // } if (roomId == null) { throw new ALPageNotFoundException(); } return Database.get(EipTMessageRoom.class, roomId); } catch (ALPageNotFoundException e) { throw e; } catch (Throwable t) { logger.error("MessageUtils.getRoom", t); return null; } } public static boolean isJoinRoom(int roomId, int userId) { EipTMessageRoom room = getRoom(roomId); if (room == null) { return false; } return isJoinRoom(room, userId); } public static boolean isJoinRoom(EipTMessageRoom room, int userId) { @SuppressWarnings("unchecked") List<EipTMessageRoomMember> list = room.getEipTMessageRoomMember(); for (EipTMessageRoomMember member : list) { if (member.getUserId().intValue() == userId) { return true; } } return false; } public static boolean isJoinRoom(EipTMessageFile file, int userId) { return isJoinRoom(file.getRoomId(), userId); } public static boolean isJoinRoom(EipTMessage message, int userId) { EipTMessageRoom room = message.getEipTMessageRoom(); if (room == null) { return false; } return isJoinRoom(room, userId); } public static boolean hasAuthorityRoom(EipTMessageRoom room, int userId) { @SuppressWarnings("unchecked") List<EipTMessageRoomMember> list = room.getEipTMessageRoomMember(); for (EipTMessageRoomMember member : list) { if (member.getUserId().intValue() == userId) { return "A".equals(member.getAuthority()); } } return false; } public static boolean isDesktopNotification(EipTMessageRoom room, int userId) { EipTMessageRoomMember model = getRoomMember(room.getRoomId(), userId); if (model != null) { return "A".equals(model.getDesktopNotification()); } return false; } public static boolean isMobileNotification(EipTMessageRoom room, int userId) { EipTMessageRoomMember model = getRoomMember(room.getRoomId(), userId); if (model != null) { return "A".equals(model.getMobileNotification()); } return false; } public static ResultList<EipTMessage> getMessageList(int roomId, int cursor, int limit, boolean isLatest) { StringBuilder select = new StringBuilder(); select.append("select"); select.append(" t1.message_id, "); select.append(" t1.room_id, "); select.append(" t1.user_id, "); select.append(" t1.message, "); select.append(" t1.create_date, "); select.append(" t1.member_count, "); select.append(" t2.last_name, "); select.append(" t2.first_name, "); select.append(" t2.has_photo, "); select.append(" t2.photo_modified, "); select .append(" (select count(*) from eip_t_message_read t3 where t3.message_id = t1.message_id and t3.room_id = t1.room_id and t3.is_read = 'F') as unread "); StringBuilder count = new StringBuilder(); count.append("select count(t1.message_id) AS c "); StringBuilder body = new StringBuilder(); body .append(" from eip_t_message t1, turbine_user t2 where t1.user_id = t2.user_id and t1.room_id = #bind($room_id) "); if (cursor > 0) { if (isLatest) { body.append(" and t1.message_id > #bind($cursor) "); } else { body.append(" and t1.message_id < #bind($cursor) "); } } StringBuilder last = new StringBuilder(); last.append(" order by t1.create_date desc "); if (limit > 0) { last.append(" limit "); last.append(limit); } SQLTemplate<EipTMessage> query = Database.sql( EipTMessage.class, select.toString() + body.toString() + last.toString()).param( "room_id", Integer.valueOf(roomId)); if (cursor > 0) { query.param("cursor", cursor); } List<DataRow> fetchList = query.fetchListAsDataRow(); List<EipTMessage> list = new ArrayList<EipTMessage>(); for (DataRow row : fetchList) { Long unread = (Long) row.get("unread"); String lastName = (String) row.get("last_name"); String firstName = (String) row.get("first_name"); String hasPhoto = (String) row.get("has_photo"); Date photoModified = (Date) row.get("photo_modified"); EipTMessage object = Database.objectFromRowData(row, EipTMessage.class); object.setUnreadCount(unread.intValue()); object.setFirstName(firstName); object.setLastName(lastName); object.setHasPhoto(hasPhoto); if (photoModified != null) { object.setPhotoModified(photoModified.getTime()); } list.add(object); } return new ResultList<EipTMessage>(list, -1, -1, list.size()); } public static ResultList<EipTMessage> getMessageJumpList(Integer roomId, int cursor) { List<Integer> roomList = new ArrayList<Integer>(); roomList.add(roomId); ResultList<EipTMessage> resultListTop = getMessageList( roomList, null, cursor, MessageListSelectData.MESSAGE_LIMIT / 2, true, true, true); ResultList<EipTMessage> resultListBottom = getMessageList( roomList, null, cursor, MessageListSelectData.MESSAGE_LIMIT / 2, false, false, false); resultListTop.addAll(resultListBottom); return new ResultList<EipTMessage>(resultListTop, -1, -1, resultListTop .size()); } public static ResultList<EipTMessage> getMessageList(List<Integer> roomList, String keyword, int cursor, int limit, boolean isLatest) { return getMessageList( roomList, keyword, cursor, limit, isLatest, false, false); } public static ResultList<EipTMessage> getMessageList(List<Integer> roomList, String keyword, int cursor, int limit, boolean isLatest, boolean isReverse, boolean isEquals) { StringBuilder select = new StringBuilder(); boolean isSearch = (keyword != null && keyword.length() > 0); select.append("select"); select.append(" t1.message_id, "); select.append(" t1.room_id, "); select.append(" t1.user_id, "); select.append(" t1.message, "); select.append(" t1.create_date, "); select.append(" t1.member_count, "); select.append(" t2.last_name, "); select.append(" t2.first_name, "); select.append(" t2.has_photo, "); select.append(" t2.photo_modified, "); select .append(" (select count(*) from eip_t_message_read t3 where t3.message_id = t1.message_id and t3.room_id = t1.room_id and t3.is_read = 'F') as unread "); StringBuilder count = new StringBuilder(); count.append("select count(t1.message_id) AS c "); StringBuilder body = new StringBuilder(); body .append(" from eip_t_message t1, turbine_user t2 where t1.user_id = t2.user_id and t1.room_id IN("); boolean isFirst = true; for (Integer roomId : roomList) { if (!isFirst) { body.append(","); } isFirst = false; body.append(roomId); } body.append(") "); if (cursor > 0) { if (isLatest) { if (isEquals) { body.append(" and t1.message_id >= #bind($cursor) "); } else { body.append(" and t1.message_id > #bind($cursor) "); } } else { if (isEquals) { body.append(" and t1.message_id <= #bind($cursor) "); } else { body.append(" and t1.message_id < #bind($cursor) "); } } } if (isSearch) { body.append(" and t1.message like #bind($keyword) "); } StringBuilder last = new StringBuilder(); if (isReverse) { last.append(" order by t1.create_date asc "); } else { last.append(" order by t1.create_date desc "); } if (limit > 0) { last.append(" limit "); last.append(limit); } SQLTemplate<EipTMessage> query = Database.sql(EipTMessage.class, select.toString() + body.toString() + last.toString()); if (cursor > 0) { query.param("cursor", cursor); } if (isSearch) { query.param("keyword", "%" + keyword + "%"); } List<DataRow> fetchList = query.fetchListAsDataRow(); List<EipTMessage> list = new ArrayList<EipTMessage>(); for (DataRow row : fetchList) { Long unread = (Long) row.get("unread"); String lastName = (String) row.get("last_name"); String firstName = (String) row.get("first_name"); String hasPhoto = (String) row.get("has_photo"); Date photoModified = (Date) row.get("photo_modified"); Integer roomId = (Integer) row.get("room_id"); EipTMessage object = Database.objectFromRowData(row, EipTMessage.class); object.setUnreadCount(unread.intValue()); object.setFirstName(firstName); object.setLastName(lastName); object.setHasPhoto(hasPhoto); if (photoModified != null) { object.setPhotoModified(photoModified.getTime()); } object.setRoomId(roomId); list.add(object); } if (isReverse) { Collections.reverse(list); } return new ResultList<EipTMessage>(list, -1, -1, list.size()); } public static EipTMessage getLastMessage(int roomId) { List<Integer> tmpRoomIdList = new ArrayList<Integer>(); tmpRoomIdList.add(roomId); ResultList<EipTMessage> lastMessage = MessageUtils.getMessageList(tmpRoomIdList, null, 0, 1, true, false, true); if (lastMessage.size() == 0) { return null; } return lastMessage.get(0); } public static ResultList<EipTMessage> getLast2Messages(int roomId) { List<Integer> tmpRoomIdList = new ArrayList<Integer>(); tmpRoomIdList.add(roomId); ResultList<EipTMessage> lastMessage = MessageUtils.getMessageList(tmpRoomIdList, null, 0, 2, true, false, true); return lastMessage; } public static List<Integer> getRoomIds(int userId) { StringBuilder select = new StringBuilder(); select.append("select"); select.append(" t2.room_id "); StringBuilder count = new StringBuilder(); count.append("select count(t2.room_id) AS c "); StringBuilder body = new StringBuilder(); body .append(" from eip_t_message_room_member t1, eip_t_message_room t2, turbine_user t4 where t1.user_id = #bind($user_id) and t1.room_id = t2.room_id and t1.target_user_id = t4.user_id "); StringBuilder last = new StringBuilder(); SQLTemplate<EipTMessageRoom> query = Database.sql( EipTMessageRoom.class, select.toString() + body.toString() + last.toString()).param( "user_id", Integer.valueOf(userId)); List<DataRow> fetchList = query.fetchListAsDataRow(); List<Integer> list = new ArrayList<Integer>(fetchList.size()); for (DataRow row : fetchList) { Integer roomId = (Integer) row.get("room_id"); list.add(roomId); } return list; } public static ResultList<EipTMessageRoom> getRoomList(int userId, String keyword) { return getRoomList(userId, keyword, -1, -1); } public static ResultList<EipTMessageRoom> getRoomList(int userId) { return getRoomList(userId, null, -1, -1); } protected static ResultList<EipTMessageRoom> getRoomList(int userId, String keyword, int page, int limit) { StringBuilder select = new StringBuilder(); boolean isMySQL = Database.isJdbcMySQL(); boolean isSearch = (keyword != null && keyword.length() > 0); select.append("select"); select.append(" t2.room_id, "); select.append(" t2.name, "); select.append(" t2.has_photo, "); select.append(" t2.photo_modified, "); select.append(" t4.user_id, "); select.append(" t4.last_name, "); select.append(" t4.first_name, "); select.append(" t4.has_photo as user_has_photo, "); select.append(" t4.photo_modified as user_photo_modified, "); select.append(" t2.auto_name, "); select.append(" t2.room_type, "); select.append(" t2.last_message, "); select.append(" last_update_date, "); select .append(" (select count(*) from eip_t_message_read t3 where t3.room_id = t2.room_id and t3.user_id = #bind($user_id) and t3.is_read ='F') as unread "); StringBuilder count = new StringBuilder(); count.append("select count(t2.room_id) AS c "); StringBuilder body = new StringBuilder(); body .append(" from eip_t_message_room_member t1, eip_t_message_room t2, turbine_user t4 where t1.user_id = #bind($user_id) and t1.room_id = t2.room_id and t1.target_user_id = t4.user_id "); if (isSearch) { if (isMySQL) { body .append(" and ((t2.room_type='G' and t2.name like #bind($keyword)) or (t2.room_type='O' and CONCAT( (case when t4.login_name='admin' then #bind($alias) else t4.last_name end) ,t4.first_name) like #bind($keyword))) "); } else { body .append(" and ((t2.room_type='G' and t2.name like #bind($keyword)) or (t2.room_type='O' and ( (case when t4.login_name='admin' then #bind($alias) else t4.last_name end) || t4.first_name) like #bind($keyword))) "); } } StringBuilder last = new StringBuilder(); last.append(" order by t2.last_update_date desc "); SQLTemplate<EipTMessageRoom> countQuery = Database .sql(EipTMessageRoom.class, count.toString() + body.toString()) .param("user_id", Integer.valueOf(userId)); if (isSearch) { countQuery.param("keyword", "%" + keyword + "%"); countQuery.param("alias", ALOrgUtilsService.getAlias()); } int countValue = 0; if (page > 0 && limit > 0) { List<DataRow> fetchCount = countQuery.fetchListAsDataRow(); for (DataRow row : fetchCount) { countValue = ((Long) row.get("c")).intValue(); } int offset = 0; if (limit > 0) { int num = ((int) (Math.ceil(countValue / (double) limit))); if ((num > 0) && (num < page)) { page = num; } offset = limit * (page - 1); } else { page = 1; } last.append(" LIMIT "); last.append(limit); last.append(" OFFSET "); last.append(offset); } SQLTemplate<EipTMessageRoom> query = Database.sql( EipTMessageRoom.class, select.toString() + body.toString() + last.toString()).param( "user_id", Integer.valueOf(userId)); if (isSearch) { query.param("keyword", "%" + keyword + "%"); query.param("alias", ALOrgUtilsService.getAlias()); } List<DataRow> fetchList = query.fetchListAsDataRow(); List<EipTMessageRoom> list = new ArrayList<EipTMessageRoom>(); for (DataRow row : fetchList) { Long unread = (Long) row.get("unread"); Integer tUserId = (Integer) row.get("user_id"); String lastName = (String) row.get("last_name"); String firstName = (String) row.get("first_name"); String hasPhoto = (String) row.get("user_has_photo"); Date photoModified = (Date) row.get("user_photo_modified"); EipTMessageRoom object = Database.objectFromRowData(row, EipTMessageRoom.class); object.setUnreadCount(unread.intValue()); object.setUserId(tUserId); object.setFirstName(firstName); object.setLastName(lastName); object.setUserHasPhoto(hasPhoto); if (photoModified != null) { object.setUserPhotoModified(photoModified.getTime()); } list.add(object); } if (page > 0 && limit > 0) { return new ResultList<EipTMessageRoom>(list, page, limit, countValue); } else { return new ResultList<EipTMessageRoom>(list, -1, -1, list.size()); } } public static ResultList<TurbineUser> getUserList(String groupName) { return getUserList(groupName, null, -1, -1); } public static ResultList<TurbineUser> getUserList(String groupName, String keyword) { return getUserList(groupName, keyword, -1, -1); } public static ResultList<TurbineUser> getUserList(String groupName, String keyword, int page, int limit) { StringBuilder select = new StringBuilder(); boolean isMySQL = Database.isJdbcMySQL(); boolean isSearch = (keyword != null && keyword.length() > 0); String keywordKana = ""; select .append("select distinct t2.user_id, t2.login_name, t2.last_name, t2.first_name, t2.last_name_kana, t2.first_name_kana, t2.has_photo, t2.photo_modified, (t2.last_name_kana = '') "); StringBuilder count = new StringBuilder(); count.append("select count(distinct t2.user_id) AS c "); StringBuilder body = new StringBuilder(); body .append(" from turbine_user_group_role t1, turbine_user t2, turbine_group t3 where t1.user_id = t2.user_id and t1.group_id = t3.group_id and t2.user_id > 3 and t2.disabled = 'F' and t3.group_name = #bind($group_name)"); if (isSearch) { keywordKana = ALStringUtil.convertHiragana2Katakana(keyword); if (isMySQL) { body .append(" and ( (CONCAT(t2.last_name,t2.first_name) like #bind($keyword)) or (CONCAT(t2.last_name_kana,t2.first_name_kana) like #bind($keywordKana)) ) "); } else { body .append(" and ( ((t2.last_name || t2.first_name) like #bind($keyword)) or ((t2.last_name_kana || t2.first_name_kana) like #bind($keywordKana)) ) "); } } StringBuilder last = new StringBuilder(); last .append(" order by (t2.last_name_kana = ''), t2.last_name_kana, t2.first_name_kana "); SQLTemplate<TurbineUser> countQuery = Database .sql(TurbineUser.class, count.toString() + body.toString()) .param("group_name", groupName); if (isSearch) { countQuery.param("keyword", "%" + keyword + "%"); countQuery.param("keywordKana", "%" + keywordKana + "%"); } int countValue = 0; if (page > 0 && limit > 0) { List<DataRow> fetchCount = countQuery.fetchListAsDataRow(); for (DataRow row : fetchCount) { countValue = ((Long) row.get("c")).intValue(); } int offset = 0; if (limit > 0) { int num = ((int) (Math.ceil(countValue / (double) limit))); if ((num > 0) && (num < page)) { page = num; } offset = limit * (page - 1); } else { page = 1; } last.append(" limit "); last.append(limit); last.append(" offset "); last.append(offset); } SQLTemplate<TurbineUser> query = Database.sql( TurbineUser.class, select.toString() + body.toString() + last.toString()).param( "group_name", groupName); if (isSearch) { query.param("keyword", "%" + keyword + "%"); query.param("keywordKana", "%" + keywordKana + "%"); } List<TurbineUser> list = query.fetchList(); if (page > 0 && limit > 0) { return new ResultList<TurbineUser>(list, page, limit, countValue); } else { return new ResultList<TurbineUser>(list, -1, -1, list.size()); } } public static ResultList<TurbineUser> getReadUserList(int messageId) { StringBuilder sql = new StringBuilder(); sql .append("select t1.user_id, t1.last_name, t1.first_name, t1.has_photo, t1.photo_modified from turbine_user t1, eip_t_message_read t2 where t1.user_id = t2.user_id and t2.message_id = #bind($message_id) and t2.is_read = 'T';"); SQLTemplate<TurbineUser> query = Database.sql(TurbineUser.class, sql.toString()).param( "message_id", messageId); List<TurbineUser> list = query.fetchList(); return new ResultList<TurbineUser>(list, -1, -1, list.size()); } public static void read(EipTMessageRoom room, int userId, int lastMessageId) { SQLTemplate<EipTMessageRead> countQuery = Database .sql( EipTMessageRead.class, "select count(*) as c from eip_t_message_read where room_id = #bind($room_id) and user_id = #bind($user_id) and is_read = 'F' and message_id <= #bind($message_id)") .param("room_id", Integer.valueOf(room.getRoomId())) .param("user_id", Integer.valueOf(userId)) .param("message_id", Integer.valueOf(lastMessageId)); int countValue = 0; List<DataRow> fetchCount = countQuery.fetchListAsDataRow(); for (DataRow row : fetchCount) { countValue = ((Long) row.get("c")).intValue(); } if (countValue > 0) { String sql = "update eip_t_message_read set is_read = 'T' where room_id = #bind($room_id) and user_id = #bind($user_id) and is_read = 'F' and message_id <= #bind($message_id)"; Database.sql(EipTMessageRead.class, sql).param( "room_id", Integer.valueOf(room.getRoomId())).param( "user_id", Integer.valueOf(userId)).param( "message_id", Integer.valueOf(lastMessageId)).execute(); List<String> recipients = new ArrayList<String>(); @SuppressWarnings("unchecked") List<EipTMessageRoomMember> members = room.getEipTMessageRoomMember(); for (EipTMessageRoomMember member : members) { if (member.getUserId().intValue() != userId) { recipients.add(member.getLoginName()); } } Map<String, String> params = new HashMap<String, String>(); params.put("roomId", String.valueOf(room.getRoomId())); ALPushService.pushAsync("messagev2_read", params, recipients); } } public static List<EipTMessageFile> getEipTMessageFilesByRoom(int roomId) { return Database.query(EipTMessageFile.class).where( Operations.eq(EipTMessageFile.ROOM_ID_PROPERTY, roomId)).fetchList(); } public static List<EipTMessageFile> getEipTMessageFilesByOwner(int userId) { return Database.query(EipTMessageFile.class).where( Operations.eq(EipTMessageFile.OWNER_ID_PROPERTY, userId)).fetchList(); } public static List<EipTMessageFile> getEipTMessageFilesByMessage(int messageId) { return Database .query(EipTMessageFile.class) .where(Operations.eq(EipTMessageFile.MESSAGE_ID_PROPERTY, messageId)) .fetchList(); } public static EipTMessageFile getEipTMessageFile(RunData rundata) throws ALPageNotFoundException, ALDBErrorException { try { int attachmentIndex = rundata.getParameters().getInt("attachmentIndex", -1); if (attachmentIndex < 0) { logger.debug("[MessageUtils] Empty ID..."); throw new ALPageNotFoundException(); } SelectQuery<EipTMessageFile> query = Database.query(EipTMessageFile.class); Expression exp = ExpressionFactory.matchDbExp(EipTMessageFile.FILE_ID_PK_COLUMN, Integer .valueOf(attachmentIndex)); query.andQualifier(exp); List<EipTMessageFile> files = query.fetchList(); if (files == null || files.size() == 0) { logger.debug("[MessageUtils] Not found ID..."); throw new ALPageNotFoundException(); } return files.get(0); } catch (Exception ex) { logger.error("[MessageUtils]", ex); throw new ALDBErrorException(); } } public static String getRelativePath(String fileName) { return new StringBuffer().append("/").append(fileName).toString(); } public static String getSaveDirPath(String orgId, int uid) { return ALStorageService.getDocumentPath( FOLDER_FILEDIR_MESSAGE, CATEGORY_KEY + ALStorageService.separator() + uid); } public static List<FileuploadLiteBean> getFileuploadList(RunData rundata) { String[] fileids = rundata .getParameters() .getStrings(FileuploadUtils.KEY_FILEUPLOAD_ID_LIST); if (fileids == null) { return null; } List<String> hadfileids = new ArrayList<String>(); List<String> newfileids = new ArrayList<String>(); for (int j = 0; j < fileids.length; j++) { if (fileids[j].trim().startsWith("s")) { hadfileids.add(fileids[j].trim().substring(1)); } else { newfileids.add(fileids[j].trim()); } } List<FileuploadLiteBean> fileNameList = new ArrayList<FileuploadLiteBean>(); FileuploadLiteBean filebean = null; int fileid = 0; if (newfileids.size() > 0) { String folderName = rundata.getParameters().getString( FileuploadUtils.KEY_FILEUPLOAD_FODLER_NAME); if (folderName == null || folderName.equals("")) { return null; } int length = newfileids.size(); for (int i = 0; i < length; i++) { if (newfileids.get(i) == null || newfileids.get(i).equals("")) { continue; } try { fileid = Integer.parseInt(newfileids.get(i)); } catch (Exception e) { continue; } if (fileid == 0) { filebean = new FileuploadLiteBean(); filebean.initField(); filebean.setFolderName("photo"); filebean.setFileName(""); fileNameList.add(filebean); } else { BufferedReader reader = null; try { reader = new BufferedReader(new InputStreamReader(ALStorageService .getTmpFile(ALEipUtils.getUserId(rundata), folderName, fileid + FileuploadUtils.EXT_FILENAME), FILE_ENCODING)); String line = reader.readLine(); if (line == null || line.length() <= 0) { continue; } filebean = new FileuploadLiteBean(); filebean.initField(); filebean.setFolderName(fileids[i]); filebean.setFileId(fileid); filebean.setFileName(line); fileNameList.add(filebean); } catch (Exception e) { logger.error("message", e); } finally { try { reader.close(); } catch (Exception e) { logger.error("message", e); } } } } } if (hadfileids.size() > 0) { ArrayList<Integer> hadfileidsValue = new ArrayList<Integer>(); for (int k = 0; k < hadfileids.size(); k++) { try { fileid = Integer.parseInt(hadfileids.get(k)); hadfileidsValue.add(fileid); } catch (Exception e) { continue; } } try { SelectQuery<EipTMessageFile> reqquery = Database.query(EipTMessageFile.class); Expression reqexp1 = ExpressionFactory.inDbExp( EipTMessageFile.FILE_ID_PK_COLUMN, hadfileidsValue); reqquery.setQualifier(reqexp1); List<EipTMessageFile> requests = reqquery.fetchList(); int requestssize = requests.size(); for (int i = 0; i < requestssize; i++) { EipTMessageFile file = requests.get(i); filebean = new FileuploadBean(); filebean.initField(); filebean.setFileId(file.getFileId()); filebean.setFileName(file.getFileName()); filebean.setFlagNewFile(false); fileNameList.add(filebean); } } catch (Exception ex) { logger.error("[MessageUtils] Exception.", ex); } } return fileNameList; } public static Map<Integer, Long> getReadCountList(int roomId, int userId, int minMessageId, int maxMessageId) { SQLTemplate<EipTMessageRead> query = Database .sql( EipTMessageRead.class, "select message_id, is_read, count(*) as c from eip_t_message_read where room_id = #bind($room_id) and user_id <> #bind($user_id) and message_id >= #bind($min_message_id) and message_id <= #bind($max_message_id) group by message_id, is_read order by message_id desc") .param("room_id", Integer.valueOf(roomId)) .param("user_id", Integer.valueOf(userId)) .param("min_message_id", Integer.valueOf(minMessageId)) .param("max_message_id", Integer.valueOf(maxMessageId)); List<DataRow> fetchList = query.fetchListAsDataRow(); Map<Integer, MessageReadEntry> maps = new HashMap<Integer, MessageReadEntry>(); Map<Integer, Long> result = new HashMap<Integer, Long>(); for (DataRow row : fetchList) { Long count = (Long) row.get("c"); Integer messageId = (Integer) row.get("message_id"); String isRead = (String) row.get("is_read"); MessageReadEntry read = maps.get(messageId); if (read == null) { read = new MessageReadEntry(); } if ("T".equals(isRead)) { read.setRead(count); } else { read.setUnread(count); } maps.put(messageId, read); } Iterator<Entry<Integer, MessageReadEntry>> iterator = maps.entrySet().iterator(); while (iterator.hasNext()) { Entry<Integer, MessageReadEntry> next = iterator.next(); MessageReadEntry value = next.getValue(); if (value.getUnread() == null) { result.put(next.getKey(), Long.valueOf(-1)); } else { result.put(next.getKey(), (value.getRead() == null ? Long.valueOf(0) : value.getRead())); } } return result; } public static class MessageReadEntry { private Long read; private Long unread; public Long getRead() { return read; } public void setRead(Long read) { this.read = read; } public Long getUnread() { return unread; } public void setUnread(Long unread) { this.unread = unread; } } }