001
014
015 package com.liferay.portlet.wiki.util;
016
017 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
018 import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil;
019 import com.liferay.portal.kernel.dao.orm.Projection;
020 import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
021 import com.liferay.portal.kernel.dao.orm.ProjectionList;
022 import com.liferay.portal.kernel.dao.orm.Property;
023 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
024 import com.liferay.portal.kernel.search.BaseIndexer;
025 import com.liferay.portal.kernel.search.Document;
026 import com.liferay.portal.kernel.search.DocumentImpl;
027 import com.liferay.portal.kernel.search.Field;
028 import com.liferay.portal.kernel.search.SearchContext;
029 import com.liferay.portal.kernel.search.SearchEngineUtil;
030 import com.liferay.portal.kernel.search.Summary;
031 import com.liferay.portal.kernel.util.GetterUtil;
032 import com.liferay.portal.kernel.workflow.WorkflowConstants;
033 import com.liferay.portal.security.pacl.PACLClassLoaderUtil;
034 import com.liferay.portal.security.permission.ActionKeys;
035 import com.liferay.portal.security.permission.PermissionChecker;
036 import com.liferay.portal.util.PortletKeys;
037 import com.liferay.portlet.wiki.model.WikiNode;
038 import com.liferay.portlet.wiki.service.WikiNodeLocalServiceUtil;
039 import com.liferay.portlet.wiki.service.permission.WikiNodePermission;
040
041 import java.util.ArrayList;
042 import java.util.Collection;
043 import java.util.List;
044 import java.util.Locale;
045
046 import javax.portlet.PortletURL;
047
048
051 public class WikiNodeIndexer extends BaseIndexer {
052
053 public static final String[] CLASS_NAMES = {WikiNode.class.getName()};
054
055 public static final String PORTLET_ID = PortletKeys.WIKI;
056
057 public WikiNodeIndexer() {
058 setFilterSearch(false);
059 setPermissionAware(false);
060 }
061
062 public String[] getClassNames() {
063 return CLASS_NAMES;
064 }
065
066 public String getPortletId() {
067 return PORTLET_ID;
068 }
069
070 @Override
071 public boolean hasPermission(
072 PermissionChecker permissionChecker, String entryClassName,
073 long entryClassPK, String actionId)
074 throws Exception {
075
076 WikiNode node = WikiNodeLocalServiceUtil.getNode(entryClassPK);
077
078 return WikiNodePermission.contains(
079 permissionChecker, node, ActionKeys.VIEW);
080 }
081
082 protected void addReindexCriteria(
083 DynamicQuery dynamicQuery, long companyId) {
084
085 Property companyIdProperty = PropertyFactoryUtil.forName("companyId");
086
087 dynamicQuery.add(companyIdProperty.eq(companyId));
088
089 Property statusProperty = PropertyFactoryUtil.forName("status");
090
091 dynamicQuery.add(statusProperty.eq(WorkflowConstants.STATUS_IN_TRASH));
092 }
093
094 @Override
095 protected void doDelete(Object obj) throws Exception {
096 WikiNode node = (WikiNode)obj;
097
098 Document document = new DocumentImpl();
099
100 document.addUID(PORTLET_ID, node.getNodeId(), node.getName());
101
102 SearchEngineUtil.deleteDocument(
103 getSearchEngineId(), node.getCompanyId(), document.get(Field.UID));
104 }
105
106 @Override
107 protected Document doGetDocument(Object obj) throws Exception {
108 WikiNode node = (WikiNode)obj;
109
110 Document document = getBaseModelDocument(PORTLET_ID, node);
111
112 document.addUID(PORTLET_ID, node.getNodeId(), node.getName());
113
114 document.addText(Field.DESCRIPTION, node.getDescription());
115 document.addText(Field.TITLE, node.getName());
116
117 return document;
118 }
119
120 @Override
121 protected Summary doGetSummary(
122 Document document, Locale locale, String snippet,
123 PortletURL portletURL)
124 throws Exception {
125
126 return null;
127 }
128
129 @Override
130 protected void doReindex(Object obj) throws Exception {
131 WikiNode node = (WikiNode)obj;
132
133 Document document = getDocument(obj);
134
135 SearchEngineUtil.updateDocument(
136 getSearchEngineId(), node.getCompanyId(), document);
137 }
138
139 @Override
140 protected void doReindex(String className, long classPK) throws Exception {
141 WikiNode node = WikiNodeLocalServiceUtil.getNode(classPK);
142
143 doReindex(node);
144 }
145
146 @Override
147 protected void doReindex(String[] ids) throws Exception {
148 long companyId = GetterUtil.getLong(ids[0]);
149
150 reindexEntries(companyId);
151 }
152
153 @Override
154 protected String getPortletId(SearchContext searchContext) {
155 return PORTLET_ID;
156 }
157
158 protected void reindexEntries(long companyId) throws Exception {
159 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
160 WikiNode.class, PACLClassLoaderUtil.getPortalClassLoader());
161
162 Projection minEntryIdProjection = ProjectionFactoryUtil.min("nodeId");
163 Projection maxEntryIdProjection = ProjectionFactoryUtil.max("nodeId");
164
165 ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
166
167 projectionList.add(minEntryIdProjection);
168 projectionList.add(maxEntryIdProjection);
169
170 dynamicQuery.setProjection(projectionList);
171
172 addReindexCriteria(dynamicQuery, companyId);
173
174 List<Object[]> results = WikiNodeLocalServiceUtil.dynamicQuery(
175 dynamicQuery);
176
177 Object[] minAndMaxNodeIds = results.get(0);
178
179 if ((minAndMaxNodeIds[0] == null) || (minAndMaxNodeIds[1] == null)) {
180 return;
181 }
182
183 long minNodeId = (Long)minAndMaxNodeIds[0];
184 long maxNodeId = (Long)minAndMaxNodeIds[1];
185
186 long startNodeId = minNodeId;
187 long endNodeId = startNodeId + DEFAULT_INTERVAL;
188
189 while (startNodeId <= maxNodeId) {
190 reindexEntries(companyId, startNodeId, endNodeId);
191
192 startNodeId = endNodeId;
193 endNodeId += DEFAULT_INTERVAL;
194 }
195 }
196
197 protected void reindexEntries(
198 long companyId, long startNodeId, long endNodeId)
199 throws Exception {
200
201 DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(
202 WikiNode.class, PACLClassLoaderUtil.getPortalClassLoader());
203
204 Property property = PropertyFactoryUtil.forName("nodeId");
205
206 dynamicQuery.add(property.ge(startNodeId));
207 dynamicQuery.add(property.lt(endNodeId));
208
209 addReindexCriteria(dynamicQuery, companyId);
210
211 List<WikiNode> nodes = WikiNodeLocalServiceUtil.dynamicQuery(
212 dynamicQuery);
213
214 if (nodes.isEmpty()) {
215 return;
216 }
217
218 Collection<Document> documents = new ArrayList<Document>(nodes.size());
219
220 for (WikiNode node : nodes) {
221 Document document = getDocument(node);
222
223 documents.add(document);
224 }
225
226 SearchEngineUtil.updateDocuments(
227 getSearchEngineId(), companyId, documents);
228 }
229
230 }