/*************************************************************************** * Copyright (C) 2003-2007 eXo Platform SAS. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. ***************************************************************************/ package org.exoplatform.forum.service; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import org.exoplatform.ks.common.jcr.PropertyReader; import org.exoplatform.ks.common.jcr.SessionManager; /** * @author Hung Nguyen (hung.nguyen@exoplatform.com) * @since July 25, 2007 **/ public class ForumPageList extends JCRPageList { private boolean isQuery_ = false; private String value_; private SessionManager sessionManager; private NodeIterator iter_ = null; private List listValue_ = null; public ForumPageList(int pageSize, int size) { super(pageSize); setAvailablePage(size); }; public ForumPageList(NodeIterator iter, int pageSize, String value, boolean isQuery) throws Exception { super(pageSize); value_ = value; isQuery_ = isQuery; this.sessionManager = ForumServiceUtils.getSessionManager(); try { if (iter == null) { sessionManager.openSession(); iter = setQuery(isQuery_, value_); iter_ = iter; } if (iter != null) { setAvailablePage((int) iter.getSize()); } } finally { // sessionManager.closeSession(); } } /** * Set ForumPageList for search user. * @param listResult result which is returned from search proccessing. */ public ForumPageList(List listResult) { super(listResult.size()); isQuery_ = false; listValue_ = listResult; this.sessionManager = ForumServiceUtils.getSessionManager(); } @SuppressWarnings("unchecked") protected void populateCurrentPage(int page) throws Exception { if (iter_ == null) { iter_ = setQuery(isQuery_, value_); setAvailablePage((int) iter_.getSize()); if (page == 0) currentPage_ = 0; // nasty trick for getAll() else checkAndSetPage(page); page = currentPage_; } Node currentNode; long pageSize = 0; if (page > 0) { long position = 0; pageSize = getPageSize(); if (page == 1) position = 0; else { position = (page - 1) * pageSize; iter_.skip(position); } } else { pageSize = iter_.getSize(); } currentListPage_ = new ArrayList<Object>(); for (int i = 0; i < pageSize; i++) { if (iter_.hasNext()) { currentNode = iter_.nextNode(); if (currentNode.isNodeType("exo:post")) { currentListPage_.add(getPost(currentNode)); } else if (currentNode.isNodeType(Utils.TYPE_TOPIC)) { currentListPage_.add(getTopic(currentNode)); } else if (currentNode.isNodeType(Utils.USER_PROFILES_TYPE)) { currentListPage_.add(getUserProfile(currentNode)); } else if (currentNode.isNodeType("exo:privateMessage")) { currentListPage_.add(getPrivateMessage(currentNode)); } } else { break; } } iter_ = null; if (sessionManager.getCurrentSession() != null && sessionManager.getCurrentSession().isLive()) { sessionManager.closeSession(); } } @SuppressWarnings("unchecked") protected void populateCurrentPage(String valueString) throws Exception { NodeIterator nodeIterator = setQuery(isQuery_, value_); if (iter_ == null) { iter_ = setQuery(isQuery_, value_); } int pos = 0; for (int i = 0; i < nodeIterator.getSize(); i++) { if (getUserProfile(nodeIterator.nextNode()).getUserId().equals(valueString)) { pos = i + 1; break; } } int pageSize = getPageSize(); int page = 1; if (pos < pageSize) { page = 1; } else { page = pos / pageSize; if (pos % pageSize > 0) { page = page + 1; } } this.pageSelected = page; iter_.skip((page - 1) * pageSize); currentListPage_ = new ArrayList<Object>(); Node currentNode; for (int i = 0; i < pageSize; i++) { if (iter_.hasNext()) { currentNode = iter_.nextNode(); if (currentNode.isNodeType(Utils.USER_PROFILES_TYPE)) { currentListPage_.add(getUserProfile(currentNode)); } } else { break; } } iter_ = null; if (sessionManager.getCurrentSession() != null && sessionManager.getCurrentSession().isLive()) { sessionManager.closeSession(); } } @SuppressWarnings("unchecked") protected void populateCurrentPageSearch(int page, List list, boolean isWatch, boolean isSearchUser) throws Exception { int pageSize = getPageSize(); int position = 0; if (page == 1) position = 0; else { position = (page - 1) * pageSize; } int endIndex = pageSize * page; endIndex = (endIndex < list.size()) ? endIndex : list.size() - 1; if (!isSearchUser) { if (!isWatch) currentListPage_ = new ArrayList<ForumSearch>(); else currentListPage_ = new ArrayList<Watch>(); } else { currentListPage_ = new CopyOnWriteArrayList(); list = listValue_; } if (endIndex > position) { currentListPage_.addAll(list.subList(position, endIndex)); } } private NodeIterator setQuery(boolean isQuery, String value) throws Exception { NodeIterator iter; Session session = sessionManager.getCurrentSession(); if (session == null || !session.isLive()) { sessionManager.openSession(); session = sessionManager.getCurrentSession(); } if (isQuery) { QueryManager qm = session.getWorkspace().getQueryManager(); Query query = qm.createQuery(value, Query.XPATH); QueryResult result = query.execute(); iter = result.getNodes(); } else { Node node = (Node) session.getItem(value); iter = node.getNodes(); } return iter; } public Post getPost(Node postNode) throws Exception { Post postNew = new Post(); PropertyReader reader = new PropertyReader(postNode); postNew.setId(postNode.getName()); postNew.setPath(postNode.getPath()); postNew.setOwner(reader.string(ForumNodeTypes.EXO_OWNER)); postNew.setCreatedDate(reader.date(ForumNodeTypes.EXO_CREATED_DATE)); postNew.setModifiedBy(reader.string(ForumNodeTypes.EXO_MODIFIED_BY)); postNew.setModifiedDate(reader.date(ForumNodeTypes.EXO_MODIFIED_DATE)); postNew.setEditReason(reader.string(ForumNodeTypes.EXO_EDIT_REASON)); postNew.setName(reader.string(ForumNodeTypes.EXO_NAME)); postNew.setMessage(reader.string(ForumNodeTypes.EXO_MESSAGE)); postNew.setRemoteAddr(reader.string(ForumNodeTypes.EXO_REMOTE_ADDR)); postNew.setIcon(reader.string(ForumNodeTypes.EXO_ICON)); postNew.setLink(reader.string(ForumNodeTypes.EXO_LINK)); postNew.setIsApproved(reader.bool(ForumNodeTypes.EXO_IS_APPROVED)); postNew.setIsHidden(reader.bool(ForumNodeTypes.EXO_IS_HIDDEN)); postNew.setIsActiveByTopic(reader.bool(ForumNodeTypes.EXO_IS_ACTIVE_BY_TOPIC)); postNew.setUserPrivate(reader.strings(ForumNodeTypes.EXO_USER_PRIVATE)); postNew.setNumberAttach(reader.l(ForumNodeTypes.EXO_NUMBER_ATTACH)); if (postNew.getNumberAttach() > 0) { postNew.setAttachments(getAttachmentsByNode(postNode)); } return postNew; } private List<ForumAttachment> getAttachmentsByNode(Node node) throws Exception { List<ForumAttachment> attachments = new ArrayList<ForumAttachment>(); NodeIterator postAttachments = node.getNodes(); Node nodeFile; while (postAttachments.hasNext()) { Node nodeContent = postAttachments.nextNode(); if (nodeContent.isNodeType(ForumNodeTypes.EXO_FORUM_ATTACHMENT)) { JCRForumAttachment attachment = new JCRForumAttachment(); nodeFile = nodeContent.getNode(ForumNodeTypes.JCR_CONTENT); attachment.setId(nodeContent.getName()); attachment.setPathNode(nodeContent.getPath()); attachment.setMimeType(nodeFile.getProperty(ForumNodeTypes.JCR_MIME_TYPE).getString()); attachment.setName(nodeFile.getProperty(ForumNodeTypes.EXO_FILE_NAME).getString()); attachment.setSize(nodeFile.getProperty(ForumNodeTypes.JCR_DATA).getStream().available()); String workspace = nodeContent.getSession().getWorkspace().getName(); attachment.setWorkspace(workspace); attachment.setPath("/" + workspace + nodeContent.getPath()); attachments.add(attachment); } } return attachments; } private Topic getTopic(Node topicNode) throws Exception { if (topicNode == null) return null; Topic topicNew = new Topic(); PropertyReader reader = new PropertyReader(topicNode); topicNew.setId(topicNode.getName()); topicNew.setPath(topicNode.getPath()); topicNew.setIcon(reader.string(ForumNodeTypes.EXO_ICON)); topicNew.setTopicType(reader.string(ForumNodeTypes.EXO_TOPIC_TYPE, " ")); topicNew.setTopicName(reader.string(ForumNodeTypes.EXO_NAME)); topicNew.setOwner(reader.string(ForumNodeTypes.EXO_OWNER)); topicNew.setCreatedDate(reader.date(ForumNodeTypes.EXO_CREATED_DATE)); topicNew.setDescription(reader.string(ForumNodeTypes.EXO_DESCRIPTION)); topicNew.setLastPostBy(reader.string(ForumNodeTypes.EXO_LAST_POST_BY)); topicNew.setLastPostDate(reader.date(ForumNodeTypes.EXO_LAST_POST_DATE)); topicNew.setIsSticky(reader.bool(ForumNodeTypes.EXO_IS_STICKY)); if (topicNode.getParent().getProperty(ForumNodeTypes.EXO_IS_LOCK).getBoolean()) topicNew.setIsLock(true); else topicNew.setIsLock(topicNode.getProperty(ForumNodeTypes.EXO_IS_LOCK).getBoolean()); topicNew.setIsClosed(reader.bool(ForumNodeTypes.EXO_IS_CLOSED)); topicNew.setIsApproved(reader.bool(ForumNodeTypes.EXO_IS_APPROVED)); topicNew.setIsActive(reader.bool(ForumNodeTypes.EXO_IS_ACTIVE)); topicNew.setIsWaiting(reader.bool(ForumNodeTypes.EXO_IS_WAITING)); topicNew.setIsActiveByForum(reader.bool(ForumNodeTypes.EXO_IS_ACTIVE_BY_FORUM)); topicNew.setIsPoll(reader.bool(ForumNodeTypes.EXO_IS_POLL)); topicNew.setPostCount(reader.l(ForumNodeTypes.EXO_POST_COUNT)); topicNew.setViewCount(reader.l(ForumNodeTypes.EXO_VIEW_COUNT)); topicNew.setNumberAttachment(reader.l(ForumNodeTypes.EXO_NUMBER_ATTACHMENTS)); topicNew.setUserVoteRating(reader.strings(ForumNodeTypes.EXO_USER_VOTE_RATING)); topicNew.setVoteRating(reader.d(ForumNodeTypes.EXO_VOTE_RATING)); // update more properties for topicNew. topicNew.setModifiedBy(reader.string(ForumNodeTypes.EXO_MODIFIED_BY)); topicNew.setModifiedDate(reader.date(ForumNodeTypes.EXO_MODIFIED_DATE)); topicNew.setIsModeratePost(reader.bool(ForumNodeTypes.EXO_IS_MODERATE_POST)); topicNew.setIsNotifyWhenAddPost(reader.string(ForumNodeTypes.EXO_IS_NOTIFY_WHEN_ADD_POST, null)); topicNew.setLink(reader.string(ForumNodeTypes.EXO_LINK)); topicNew.setTagId(reader.strings(ForumNodeTypes.EXO_TAG_ID)); topicNew.setCanView(reader.strings(ForumNodeTypes.EXO_CAN_VIEW, new String[] {})); topicNew.setCanPost(reader.strings(ForumNodeTypes.EXO_CAN_POST, new String[] {})); if (topicNode.isNodeType(ForumNodeTypes.EXO_FORUM_WATCHING)) topicNew.setEmailNotification(reader.strings(ForumNodeTypes.EXO_EMAIL_WATCHING, new String[] {})); try { if (topicNew.getNumberAttachment() > 0) { // String idFirstPost = topicNode.getName().replaceFirst(Utils.TOPIC, Utils.POST); // Node FirstPostNode = topicNode.getNode(idFirstPost); // topicNew.setAttachments(getAttachmentsByNode(FirstPostNode)); } } catch (Exception e) { // log.debug("Failed to set attachments in topicNew.", e); } return topicNew; } private UserProfile getUserProfile(Node profileNode) throws Exception { UserProfile userProfile = new UserProfile(); userProfile.setUserId(profileNode.getName()); PropertyReader reader = new PropertyReader(profileNode); userProfile.setScreenName(reader.string(ForumNodeTypes.EXO_SCREEN_NAME, reader.string(ForumNodeTypes.EXO_FULL_NAME, profileNode.getName()))); userProfile.setFullName(reader.string(ForumNodeTypes.EXO_FULL_NAME)); userProfile.setFirstName(reader.string(ForumNodeTypes.EXO_FIRST_NAME)); userProfile.setLastName(reader.string(ForumNodeTypes.EXO_LAST_NAME)); userProfile.setEmail(reader.string(ForumNodeTypes.EXO_EMAIL)); userProfile.setUserRole(reader.l(ForumNodeTypes.EXO_USER_ROLE)); userProfile.setUserTitle(reader.string(ForumNodeTypes.EXO_USER_TITLE, "")); userProfile.setSignature(reader.string(ForumNodeTypes.EXO_SIGNATURE)); userProfile.setTotalPost(reader.l(ForumNodeTypes.EXO_TOTAL_POST)); userProfile.setTotalTopic(reader.l(ForumNodeTypes.EXO_TOTAL_TOPIC)); userProfile.setBookmark(reader.strings(ForumNodeTypes.EXO_BOOKMARK)); userProfile.setLastLoginDate(reader.date(ForumNodeTypes.EXO_LAST_LOGIN_DATE)); userProfile.setJoinedDate(reader.date(ForumNodeTypes.EXO_JOINED_DATE)); userProfile.setLastPostDate(reader.date(ForumNodeTypes.EXO_LAST_POST_DATE)); userProfile.setIsDisplaySignature(reader.bool(ForumNodeTypes.EXO_IS_DISPLAY_SIGNATURE)); userProfile.setIsDisplayAvatar(reader.bool(ForumNodeTypes.EXO_IS_DISPLAY_AVATAR)); userProfile.setShortDateFormat(reader.string(ForumNodeTypes.EXO_SHORT_DATEFORMAT, userProfile.getShortDateFormat())); userProfile.setLongDateFormat(reader.string(ForumNodeTypes.EXO_LONG_DATEFORMAT, userProfile.getLongDateFormat())); userProfile.setTimeFormat(reader.string(ForumNodeTypes.EXO_TIME_FORMAT, userProfile.getTimeFormat())); userProfile.setMaxPostInPage(reader.l(ForumNodeTypes.EXO_MAX_POST, 10)); userProfile.setMaxTopicInPage(reader.l(ForumNodeTypes.EXO_MAX_TOPIC, 10)); userProfile.setIsShowForumJump(reader.bool(ForumNodeTypes.EXO_IS_SHOW_FORUM_JUMP, true)); userProfile.setModerateForums(reader.strings(ForumNodeTypes.EXO_MODERATE_FORUMS, new String[] {})); userProfile.setModerateCategory(reader.strings(ForumNodeTypes.EXO_MODERATE_CATEGORY, new String[] {})); userProfile.setNewMessage(reader.l(ForumNodeTypes.EXO_NEW_MESSAGE)); userProfile.setTimeZone(reader.d(ForumNodeTypes.EXO_TIME_ZONE)); userProfile.setIsBanned(reader.bool(ForumNodeTypes.EXO_IS_BANNED)); userProfile.setBanUntil(reader.l(ForumNodeTypes.EXO_BAN_UNTIL)); userProfile.setBanReason(reader.string(ForumNodeTypes.EXO_BAN_REASON, "")); userProfile.setBanCounter(Integer.parseInt(reader.string(ForumNodeTypes.EXO_BAN_COUNTER, "0"))); userProfile.setBanReasonSummary(reader.strings(ForumNodeTypes.EXO_BAN_REASON_SUMMARY, new String[] {})); userProfile.setCreatedDateBan(reader.date(ForumNodeTypes.EXO_CREATED_DATE_BAN)); return userProfile; } private ForumPrivateMessage getPrivateMessage(Node messageNode) throws Exception { ForumPrivateMessage message = new ForumPrivateMessage(); message.setId(messageNode.getName()); PropertyReader reader = new PropertyReader(messageNode); message.setFrom(reader.string(ForumNodeTypes.EXO_FROM)); message.setSendTo(reader.string(ForumNodeTypes.EXO_SEND_TO)); message.setName(reader.string(ForumNodeTypes.EXO_NAME)); message.setMessage(reader.string(ForumNodeTypes.EXO_MESSAGE)); message.setReceivedDate(reader.date(ForumNodeTypes.EXO_RECEIVED_DATE)); message.setIsUnread(reader.bool(ForumNodeTypes.EXO_IS_UNREAD)); message.setType(reader.string(ForumNodeTypes.EXO_TYPE)); return message; } @Override protected void populateCurrentPageList(int page, List list) throws Exception { int pageSize = getPageSize(); int position = 0; if (page == 1) position = 0; else { position = (page - 1) * pageSize; } pageSize *= page; currentListPage_ = new ArrayList<String>(); for (int i = (int) position; i < pageSize && i < list.size(); i++) { currentListPage_.add(list.get(i)); } } @Override public List getAll() throws Exception { currentPage_ = 0; populateCurrentPage(currentPage_);// trick allowed by implementation of ForumPageList.populateCurrentPage() this.pageSelected = 0; return currentListPage_; } }