001
014
015 package com.liferay.portlet.wiki.util;
016
017 import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018 import com.liferay.portal.kernel.dao.orm.DynamicQuery;
019 import com.liferay.portal.kernel.dao.orm.Property;
020 import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
021 import com.liferay.portal.kernel.dao.orm.QueryUtil;
022 import com.liferay.portal.kernel.exception.PortalException;
023 import com.liferay.portal.kernel.exception.SystemException;
024 import com.liferay.portal.kernel.search.BaseIndexer;
025 import com.liferay.portal.kernel.search.BooleanClauseOccur;
026 import com.liferay.portal.kernel.search.BooleanQuery;
027 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
028 import com.liferay.portal.kernel.search.Document;
029 import com.liferay.portal.kernel.search.DocumentImpl;
030 import com.liferay.portal.kernel.search.Field;
031 import com.liferay.portal.kernel.search.Hits;
032 import com.liferay.portal.kernel.search.SearchContext;
033 import com.liferay.portal.kernel.search.SearchEngineUtil;
034 import com.liferay.portal.kernel.search.Summary;
035 import com.liferay.portal.kernel.util.GetterUtil;
036 import com.liferay.portal.kernel.util.HtmlUtil;
037 import com.liferay.portal.kernel.util.Validator;
038 import com.liferay.portal.kernel.workflow.WorkflowConstants;
039 import com.liferay.portal.security.permission.ActionKeys;
040 import com.liferay.portal.security.permission.PermissionChecker;
041 import com.liferay.portal.util.PortalUtil;
042 import com.liferay.portal.util.PortletKeys;
043 import com.liferay.portlet.documentlibrary.model.DLFileEntry;
044 import com.liferay.portlet.messageboards.model.MBMessage;
045 import com.liferay.portlet.wiki.asset.WikiPageAssetRendererFactory;
046 import com.liferay.portlet.wiki.model.WikiNode;
047 import com.liferay.portlet.wiki.model.WikiPage;
048 import com.liferay.portlet.wiki.service.WikiNodeServiceUtil;
049 import com.liferay.portlet.wiki.service.WikiPageLocalServiceUtil;
050 import com.liferay.portlet.wiki.service.permission.WikiPagePermission;
051 import com.liferay.portlet.wiki.service.persistence.WikiNodeActionableDynamicQuery;
052 import com.liferay.portlet.wiki.service.persistence.WikiPageActionableDynamicQuery;
053
054 import java.util.ArrayList;
055 import java.util.Collection;
056 import java.util.Locale;
057
058 import javax.portlet.PortletURL;
059
060
066 public class WikiPageIndexer extends BaseIndexer {
067
068 public static final String[] CLASS_NAMES = {WikiPage.class.getName()};
069
070 public static final String PORTLET_ID = PortletKeys.WIKI;
071
072 public WikiPageIndexer() {
073 setFilterSearch(true);
074 setPermissionAware(true);
075 }
076
077 @Override
078 public void addRelatedEntryFields(Document document, Object obj)
079 throws Exception {
080
081 WikiPage page = null;
082
083 if (obj instanceof DLFileEntry) {
084 DLFileEntry dlFileEntry = (DLFileEntry)obj;
085
086 page = WikiPageAttachmentsUtil.getPage(
087 dlFileEntry.getFileEntryId());
088
089 document.addKeyword(
090 Field.CLASS_NAME_ID,
091 PortalUtil.getClassNameId(WikiPage.class.getName()));
092 document.addKeyword(Field.CLASS_PK, page.getResourcePrimKey());
093 }
094 else if (obj instanceof MBMessage) {
095 MBMessage message = (MBMessage)obj;
096
097 page = WikiPageLocalServiceUtil.getPage(message.getClassPK());
098 }
099
100 document.addKeyword(Field.NODE_ID, page.getNodeId());
101 document.addKeyword(Field.RELATED_ENTRY, true);
102 }
103
104 public String[] getClassNames() {
105 return CLASS_NAMES;
106 }
107
108 public String getPortletId() {
109 return PORTLET_ID;
110 }
111
112 @Override
113 public boolean hasPermission(
114 PermissionChecker permissionChecker, String entryClassName,
115 long entryClassPK, String actionId)
116 throws Exception {
117
118 WikiPage page = WikiPageLocalServiceUtil.getPage(entryClassPK);
119
120 return WikiPagePermission.contains(
121 permissionChecker, page, ActionKeys.VIEW);
122 }
123
124 @Override
125 public void postProcessContextQuery(
126 BooleanQuery contextQuery, SearchContext searchContext)
127 throws Exception {
128
129 int status = GetterUtil.getInteger(
130 searchContext.getAttribute(Field.STATUS),
131 WorkflowConstants.STATUS_APPROVED);
132
133 if (status != WorkflowConstants.STATUS_ANY) {
134 contextQuery.addRequiredTerm(Field.STATUS, status);
135 }
136
137 long[] nodeIds = searchContext.getNodeIds();
138
139 if ((nodeIds != null) && (nodeIds.length > 0)) {
140 BooleanQuery nodeIdsQuery = BooleanQueryFactoryUtil.create(
141 searchContext);
142
143 for (long nodeId : nodeIds) {
144 try {
145 WikiNodeServiceUtil.getNode(nodeId);
146 }
147 catch (Exception e) {
148 continue;
149 }
150
151 nodeIdsQuery.addTerm(Field.NODE_ID, nodeId);
152 }
153
154 contextQuery.add(nodeIdsQuery, BooleanClauseOccur.MUST);
155 }
156 }
157
158 @Override
159 protected void doDelete(Object obj) throws Exception {
160 SearchContext searchContext = new SearchContext();
161
162 searchContext.setSearchEngineId(getSearchEngineId());
163
164 if (obj instanceof Object[]) {
165 Object[] array = (Object[])obj;
166
167 long companyId = (Long)array[0];
168 long nodeId = (Long)array[1];
169 String title = (String)array[2];
170
171 Document document = new DocumentImpl();
172
173 document.addUID(PORTLET_ID, nodeId, title);
174
175 SearchEngineUtil.deleteDocument(
176 getSearchEngineId(), companyId, document.get(Field.UID));
177
178 }
179 else if (obj instanceof WikiNode) {
180 WikiNode node = (WikiNode)obj;
181
182 BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(
183 searchContext);
184
185 booleanQuery.addRequiredTerm(Field.PORTLET_ID, PORTLET_ID);
186
187 booleanQuery.addRequiredTerm("nodeId", node.getNodeId());
188
189 Hits hits = SearchEngineUtil.search(
190 getSearchEngineId(), node.getCompanyId(), booleanQuery,
191 QueryUtil.ALL_POS, QueryUtil.ALL_POS);
192
193 for (int i = 0; i < hits.getLength(); i++) {
194 Document document = hits.doc(i);
195
196 SearchEngineUtil.deleteDocument(
197 getSearchEngineId(), node.getCompanyId(),
198 document.get(Field.UID));
199 }
200 }
201 else if (obj instanceof WikiPage) {
202 WikiPage page = (WikiPage)obj;
203
204 Document document = new DocumentImpl();
205
206 document.addUID(PORTLET_ID, page.getNodeId(), page.getTitle());
207
208 SearchEngineUtil.deleteDocument(
209 getSearchEngineId(), page.getCompanyId(),
210 document.get(Field.UID));
211 }
212 }
213
214 @Override
215 protected Document doGetDocument(Object obj) throws Exception {
216 WikiPage page = (WikiPage)obj;
217
218 Document document = getBaseModelDocument(PORTLET_ID, page);
219
220 document.addUID(PORTLET_ID, page.getNodeId(), page.getTitle());
221
222 String content = HtmlUtil.extractText(
223 WikiUtil.convert(page, null, null, null));
224
225 document.addText(Field.CONTENT, content);
226
227 document.addKeyword(Field.NODE_ID, page.getNodeId());
228 document.addText(Field.TITLE, page.getTitle());
229
230 if (!page.isInTrash() && page.isInTrashContainer()) {
231 addTrashFields(
232 document, WikiNode.class.getName(), page.getNodeId(), null,
233 null, WikiPageAssetRendererFactory.TYPE);
234
235 document.addKeyword(
236 Field.ROOT_ENTRY_CLASS_NAME, WikiNode.class.getName());
237 document.addKeyword(Field.ROOT_ENTRY_CLASS_PK, page.getNodeId());
238 document.addKeyword(
239 Field.STATUS, WorkflowConstants.STATUS_IN_TRASH);
240 }
241
242 return document;
243 }
244
245 @Override
246 protected Summary doGetSummary(
247 Document document, Locale locale, String snippet,
248 PortletURL portletURL) {
249
250 Summary summary = createSummary(document, Field.TITLE, Field.CONTENT);
251
252 summary.setMaxContentLength(200);
253
254 String nodeId = document.get("nodeId");
255
256 portletURL.setParameter("struts_action", "/wiki/view");
257 portletURL.setParameter("nodeId", nodeId);
258 portletURL.setParameter("title", summary.getTitle());
259
260 summary.setPortletURL(portletURL);
261
262 return summary;
263 }
264
265 @Override
266 protected void doReindex(Object obj) throws Exception {
267 WikiPage page = (WikiPage)obj;
268
269 if (Validator.isNotNull(page.getRedirectTitle())) {
270 return;
271 }
272
273 Document document = getDocument(page);
274
275 SearchEngineUtil.updateDocument(
276 getSearchEngineId(), page.getCompanyId(), document);
277 }
278
279 @Override
280 protected void doReindex(String className, long classPK) throws Exception {
281 WikiPage page = WikiPageLocalServiceUtil.getPage(classPK);
282
283 doReindex(page);
284 }
285
286 @Override
287 protected void doReindex(String[] ids) throws Exception {
288 long companyId = GetterUtil.getLong(ids[0]);
289
290 reindexNodes(companyId);
291 }
292
293 @Override
294 protected String getPortletId(SearchContext searchContext) {
295 return PORTLET_ID;
296 }
297
298 protected void reindexNodes(final long companyId)
299 throws PortalException, SystemException {
300
301 ActionableDynamicQuery actionableDynamicQuery =
302 new WikiNodeActionableDynamicQuery() {
303
304 @Override
305 protected void performAction(Object object)
306 throws PortalException, SystemException {
307
308 WikiNode node = (WikiNode)object;
309
310 reindexPages(companyId, node.getGroupId(), node.getNodeId());
311 }
312
313 };
314
315 actionableDynamicQuery.setCompanyId(companyId);
316
317 actionableDynamicQuery.performActions();
318 }
319
320 protected void reindexPages(long companyId, long groupId, final long nodeId)
321 throws PortalException, SystemException {
322
323 final Collection<Document> documents = new ArrayList<Document>();
324
325 ActionableDynamicQuery actionableDynamicQuery =
326 new WikiPageActionableDynamicQuery() {
327
328 @Override
329 protected void addCriteria(DynamicQuery dynamicQuery) {
330 Property nodeIdProperty = PropertyFactoryUtil.forName("nodeId");
331
332 dynamicQuery.add(nodeIdProperty.eq(nodeId));
333
334 Property headProperty = PropertyFactoryUtil.forName("head");
335
336 dynamicQuery.add(headProperty.eq(true));
337 }
338
339 @Override
340 protected void performAction(Object object) throws PortalException {
341 WikiPage page = (WikiPage)object;
342
343 Document document = getDocument(page);
344
345 documents.add(document);
346 }
347
348 };
349
350 actionableDynamicQuery.setGroupId(groupId);
351
352 actionableDynamicQuery.performActions();
353
354 SearchEngineUtil.updateDocuments(
355 getSearchEngineId(), companyId, documents);
356 }
357
358 }