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