/* * Copyright (C) 2003-2009 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 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.forum.common.jcr.JCRListAccess; import org.exoplatform.forum.common.jcr.PropertyReader; import org.exoplatform.forum.common.jcr.SessionManager; import org.exoplatform.services.jcr.impl.core.query.QueryImpl; import org.exoplatform.services.jcr.impl.core.query.lucene.QueryResultImpl; /** * List access for topics. * * @author <a href="mailto:patrice.lamarque@exoplatform.com">Patrice Lamarque</a> * @version $Revision$ */ public class TopicListAccess extends JCRListAccess<Topic> { String topicQuery; private int size = -1; /** * * @param topicQuery the JCR xpath query that will match topic nodes */ public TopicListAccess(SessionManager sessionManager, String topicQuery) { super(sessionManager); this.topicQuery = topicQuery; } @Override protected int getSize(Session session) throws Exception { if (size == -1) { QueryManager qm = session.getWorkspace().getQueryManager(); QueryImpl query = (QueryImpl) qm.createQuery(topicQuery, Query.XPATH); QueryResultImpl result = (QueryResultImpl) query.execute(); size = result.getTotalSize(); } return this.size; } @Override protected Topic[] load(Session session, int index, int length) throws Exception, IllegalArgumentException { QueryManager qm = session.getWorkspace().getQueryManager(); QueryImpl query = (QueryImpl) qm.createQuery(topicQuery, Query.XPATH); query.setCaseInsensitiveOrder(true); query.setOffset(index); query.setLimit(length); QueryResult result = query.execute(); List<Topic> topicList = new ArrayList<Topic>(); NodeIterator iter = result.getNodes(); while (iter.hasNext()) { topicList.add(getTopic(iter.nextNode())); } Topic[] topics = topicList.toArray(new Topic[topicList.size()]); return topics; } private Topic getTopic(Node topicNode) throws Exception { if (topicNode == null) return null; PropertyReader reader = new PropertyReader(topicNode); Topic topicNew = new Topic(); topicNew.setId(topicNode.getName()); topicNew.setPath(topicNode.getPath()); topicNew.setLastPostDate(reader.date("exo:lastPostDate")); topicNew.setLastPostBy(reader.string("exo:lastPostBy")); topicNew.setOwner(reader.string("exo:owner")); topicNew.setTopicName(reader.string("exo:name")); topicNew.setDescription(reader.string("exo:description")); topicNew.setPostCount(reader.l("exo:postCount")); topicNew.setViewCount(reader.l("exo:viewCount")); topicNew.setIsPoll(reader.bool("exo:isPoll")); topicNew.setIsSticky(reader.bool("exo:isSticky")); if (topicNode.getParent().getProperty("exo:isLock").getBoolean()) topicNew.setIsLock(true); else topicNew.setIsLock(reader.bool("exo:isLock")); topicNew.setIsApproved(reader.bool("exo:isApproved")); topicNew.setNumberAttachment(reader.l("exo:numberAttachments")); topicNew.setIcon(reader.string("exo:icon")); topicNew.setIsModeratePost(reader.bool("exo:isModeratePost")); topicNew.setIsClosed(reader.bool("exo:isClosed")); topicNew.setIsWaiting(reader.bool("exo:isWaiting")); topicNew.setIsActive(reader.bool("exo:isActive")); topicNew.setVoteRating(reader.d("exo:voteRating")); topicNew.setUserVoteRating(reader.strings("exo:userVoteRating")); return topicNew; } }