View Javadoc
1   /*
2    * Copyright (C) 2003-2013 eXo Platform SAS.
3    *
4    * This program is free software: you can redistribute it and/or modify
5    * it under the terms of the GNU Affero General Public License as published by
6    * the Free Software Foundation, either version 3 of the License, or
7    * (at your option) any later version.
8    *
9    * This program is distributed in the hope that it will be useful,
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   * GNU Affero General Public License for more details.
13   *
14   * You should have received a copy of the GNU Affero General Public License
15   * along with this program. If not, see <http://www.gnu.org/licenses/>.
16   */
17  package org.exoplatform.services.wcm.search.base;
18  
19  import java.util.ArrayList;
20  import java.util.List;
21  
22  import javax.jcr.NodeIterator;
23  import javax.jcr.Session;
24  import javax.jcr.query.Query;
25  import javax.jcr.query.QueryResult;
26  import javax.jcr.query.RowIterator;
27  
28  import org.exoplatform.commons.utils.PageList;
29  import org.exoplatform.services.jcr.ext.common.SessionProvider;
30  import org.exoplatform.services.jcr.impl.core.query.QueryImpl;
31  import org.exoplatform.services.jcr.impl.core.query.lucene.QueryResultImpl;
32  import org.exoplatform.services.log.ExoLogger;
33  import org.exoplatform.services.log.Log;
34  import org.exoplatform.services.wcm.utils.WCMCoreUtils;
35  
36  /**
37   * This class works as a page list but only load 1 page data at a time.
38   * Created by The eXo Platform SAS
39   * Author : eXoPlatform
40   *          exo@exoplatform.com
41   * Oct 4, 2013  
42   */
43  public class LazyPageList<E> extends PageList{
44    
45    /** the log */
46    private static final Log LOG  = ExoLogger.getLogger(LazyPageList.class.getName());
47    /** the query data */
48    private QueryData queryData_;
49    /** the data creator that creates data from search result */
50    private SearchDataCreator<E> dataCreator_;
51    /** total size */
52    private int total_;
53    /** item per page */
54    private int pageSize_;
55    
56    public LazyPageList(QueryData queryData, int pageSize, SearchDataCreator<E> dataCreator) {
57      super(pageSize);
58      queryData_ = queryData.clone();
59      dataCreator_ = dataCreator;
60      pageSize_ = pageSize;
61      total_ = 0;
62      //get total amount
63      if (queryData.getQueryStatement() != null) {
64        try {
65          SessionProvider provider = WCMCoreUtils.getUserSessionProvider();
66          Session session = provider.getSession(queryData.getWorkSpace(), WCMCoreUtils.getRepository());
67          //In JCR, For performances reason, the permissions are not checked when
68          // the order is set in the query. In order to take the permissions in consideration,
69          // We need to suppress the orderBy from the Query statement
70          String querySizeStatement = queryData.getQueryStatement();
71          if (querySizeStatement.indexOf("ORDER BY") > 0) {
72            querySizeStatement = querySizeStatement.substring(0,querySizeStatement.indexOf("ORDER BY"));
73          }
74          total_ = (int)session.getWorkspace().getQueryManager().
75          createQuery(querySizeStatement, queryData.getLanguage_()).execute().getRows().getSize();
76        } catch (Exception e) {
77          if (LOG.isErrorEnabled()) {
78            LOG.error("Can not execute the query: " + queryData.getQueryStatement(), e);
79          }
80        }
81      }
82      setAvailablePage(total_);
83    }
84  
85    @Override
86    protected void populateCurrentPage(int page) throws Exception {
87      currentListPage_ = new ArrayList<E>();
88      if (queryData_.getQueryStatement() != null) {
89        try {
90          SessionProvider provider = WCMCoreUtils.getSystemSessionProvider();
91          Session session = provider.getSession(queryData_.getWorkSpace(), WCMCoreUtils.getRepository());
92          Query query = session.getWorkspace().getQueryManager().
93          createQuery(queryData_.getQueryStatement(), queryData_.getLanguage_());
94          ((QueryImpl)query).setOffset((page-1)*pageSize_);
95          ((QueryImpl)query).setLimit(pageSize_);
96          ((QueryImpl)query).setCaseInsensitiveOrder(true);
97          QueryResult ret = query.execute();
98          
99          NodeIterator iter = ret.getNodes();
100         RowIterator rowIter = ret.getRows();
101         while (iter.hasNext()) {
102           currentListPage_.add(dataCreator_.createData(iter.nextNode(), rowIter.nextRow(), null));
103         }
104       } catch (Exception e) {
105         if (LOG.isErrorEnabled()) {
106           LOG.error("Can not execute the query: " + queryData_.getQueryStatement(), e);
107         }
108       }
109     }
110   }
111 
112   @Override
113   public List<E> getAll() throws Exception {
114     return new ArrayList<E>();
115   }
116 
117 }