1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
38
39
40
41
42
43 public class LazyPageList<E> extends PageList{
44
45
46 private static final Log LOG = ExoLogger.getLogger(LazyPageList.class.getName());
47
48 private QueryData queryData_;
49
50 private SearchDataCreator<E> dataCreator_;
51
52 private int total_;
53
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
63 if (queryData.getQueryStatement() != null) {
64 try {
65 SessionProvider provider = WCMCoreUtils.getUserSessionProvider();
66 Session session = provider.getSession(queryData.getWorkSpace(), WCMCoreUtils.getRepository());
67
68
69
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 }