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