001
014
015 package com.liferay.portlet.messageboards.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.exception.PortalException;
022 import com.liferay.portal.kernel.exception.SystemException;
023 import com.liferay.portal.kernel.search.BaseIndexer;
024 import com.liferay.portal.kernel.search.BooleanQuery;
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.model.Group;
034 import com.liferay.portal.security.permission.PermissionChecker;
035 import com.liferay.portal.service.persistence.GroupActionableDynamicQuery;
036 import com.liferay.portal.util.PortletKeys;
037 import com.liferay.portlet.messageboards.NoSuchDiscussionException;
038 import com.liferay.portlet.messageboards.model.MBCategory;
039 import com.liferay.portlet.messageboards.model.MBCategoryConstants;
040 import com.liferay.portlet.messageboards.model.MBThread;
041 import com.liferay.portlet.messageboards.service.MBDiscussionLocalServiceUtil;
042 import com.liferay.portlet.messageboards.service.MBThreadLocalServiceUtil;
043 import com.liferay.portlet.messageboards.service.persistence.MBCategoryActionableDynamicQuery;
044 import com.liferay.portlet.messageboards.service.persistence.MBThreadActionableDynamicQuery;
045 import com.liferay.portlet.messageboards.trash.MBThreadTrashRenderer;
046
047 import java.util.ArrayList;
048 import java.util.Collection;
049 import java.util.Locale;
050
051 import javax.portlet.PortletURL;
052
053
056 public class MBThreadIndexer extends BaseIndexer {
057
058 public static final String[] CLASS_NAMES = {MBThread.class.getName()};
059
060 public static final String PORTLET_ID = PortletKeys.MESSAGE_BOARDS;
061
062 public MBThreadIndexer() {
063 setFilterSearch(true);
064 setPermissionAware(true);
065 }
066
067 @Override
068 public String[] getClassNames() {
069 return CLASS_NAMES;
070 }
071
072 @Override
073 public String getPortletId() {
074 return PORTLET_ID;
075 }
076
077 @Override
078 public boolean hasPermission(
079 PermissionChecker permissionChecker, String entryClassName,
080 long entryClassPK, String actionId)
081 throws Exception {
082
083 return true;
084 }
085
086 @Override
087 public void postProcessContextQuery(
088 BooleanQuery contextQuery, SearchContext searchContext)
089 throws Exception {
090
091 addStatus(contextQuery, searchContext);
092
093 boolean discussion = GetterUtil.getBoolean(
094 searchContext.getAttribute("discussion"), false);
095
096 contextQuery.addRequiredTerm("discussion", discussion);
097
098 long endDate = GetterUtil.getLong(
099 searchContext.getAttribute("endDate"));
100 long startDate = GetterUtil.getLong(
101 searchContext.getAttribute("startDate"));
102
103 if ((endDate > 0) && (startDate > 0)) {
104 contextQuery.addRangeTerm("lastPostDate", startDate, endDate);
105 }
106
107 long participantUserId = GetterUtil.getLong(
108 searchContext.getAttribute("participantUserId"));
109
110 if (participantUserId > 0) {
111 contextQuery.addRequiredTerm(
112 "participantUserIds", participantUserId);
113 }
114 }
115
116 @Override
117 protected void doDelete(Object obj) throws Exception {
118 SearchContext searchContext = new SearchContext();
119
120 searchContext.setSearchEngineId(getSearchEngineId());
121
122 MBThread thread = (MBThread)obj;
123
124 Document document = new DocumentImpl();
125
126 document.addUID(PORTLET_ID, thread.getThreadId());
127
128 SearchEngineUtil.deleteDocument(
129 getSearchEngineId(), thread.getCompanyId(),
130 document.get(Field.UID));
131 }
132
133 @Override
134 protected Document doGetDocument(Object obj) throws Exception {
135 MBThread thread = (MBThread)obj;
136
137 Document document = getBaseModelDocument(PORTLET_ID, thread);
138
139 try {
140 MBDiscussionLocalServiceUtil.getThreadDiscussion(
141 thread.getThreadId());
142
143 document.addKeyword("discussion", true);
144 }
145 catch (NoSuchDiscussionException nsde) {
146 document.addKeyword("discussion", false);
147 }
148
149 document.addKeyword("lastPostDate", thread.getLastPostDate().getTime());
150 document.addKeyword(
151 "participantUserIds", thread.getParticipantUserIds());
152
153 if (!thread.isInTrash() && thread.isInTrashContainer()) {
154 addTrashFields(
155 document, MBThread.class.getName(), thread.getThreadId(), null,
156 null, MBThreadTrashRenderer.TYPE);
157
158 String className = MBCategory.class.getName();
159 long classPK = thread.getCategoryId();
160
161 if (thread.isInTrashContainer()) {
162 MBCategory category = thread.getTrashContainer();
163
164 classPK = category.getCategoryId();
165 }
166
167 document.addKeyword(Field.ROOT_ENTRY_CLASS_NAME, className);
168 document.addKeyword(Field.ROOT_ENTRY_CLASS_PK, classPK);
169
170 document.addKeyword(
171 Field.STATUS, WorkflowConstants.STATUS_IN_TRASH);
172 }
173
174 return document;
175 }
176
177 @Override
178 protected Summary doGetSummary(
179 Document document, Locale locale, String snippet,
180 PortletURL portletURL) {
181
182 return null;
183 }
184
185 @Override
186 protected void doReindex(Object obj) throws Exception {
187 MBThread thread = (MBThread)obj;
188
189 Document document = getDocument(thread);
190
191 SearchEngineUtil.updateDocument(
192 getSearchEngineId(), thread.getCompanyId(), document);
193 }
194
195 @Override
196 protected void doReindex(String className, long classPK) throws Exception {
197 MBThread thread = MBThreadLocalServiceUtil.getThread(classPK);
198
199 doReindex(thread);
200 }
201
202 @Override
203 protected void doReindex(String[] ids) throws Exception {
204 long companyId = GetterUtil.getLong(ids[0]);
205
206 reindexCategories(companyId);
207 reindexDiscussions(companyId);
208 reindexRoot(companyId);
209 }
210
211 @Override
212 protected String getPortletId(SearchContext searchContext) {
213 return PORTLET_ID;
214 }
215
216 protected void reindexCategories(final long companyId)
217 throws PortalException, SystemException {
218
219 ActionableDynamicQuery actionableDynamicQuery =
220 new MBCategoryActionableDynamicQuery() {
221
222 @Override
223 protected void performAction(Object object)
224 throws PortalException, SystemException {
225
226 MBCategory category = (MBCategory)object;
227
228 reindexThreads(
229 companyId, category.getGroupId(), category.getCategoryId());
230 }
231
232 };
233
234 actionableDynamicQuery.setCompanyId(companyId);
235
236 actionableDynamicQuery.performActions();
237 }
238
239 protected void reindexDiscussions(final long companyId)
240 throws PortalException, SystemException {
241
242 ActionableDynamicQuery actionableDynamicQuery =
243 new GroupActionableDynamicQuery() {
244
245 @Override
246 protected void performAction(Object object)
247 throws PortalException, SystemException {
248
249 Group group = (Group)object;
250
251 reindexThreads(
252 companyId, group.getGroupId(),
253 MBCategoryConstants.DISCUSSION_CATEGORY_ID);
254 }
255
256 };
257
258 actionableDynamicQuery.setCompanyId(companyId);
259
260 actionableDynamicQuery.performActions();
261 }
262
263 protected void reindexRoot(final long companyId)
264 throws PortalException, SystemException {
265
266 ActionableDynamicQuery actionableDynamicQuery =
267 new GroupActionableDynamicQuery() {
268
269 @Override
270 protected void performAction(Object object)
271 throws PortalException, SystemException {
272
273 Group group = (Group)object;
274
275 reindexThreads(
276 companyId, group.getGroupId(),
277 MBCategoryConstants.DEFAULT_PARENT_CATEGORY_ID);
278 }
279
280 };
281
282 actionableDynamicQuery.setCompanyId(companyId);
283
284 actionableDynamicQuery.performActions();
285 }
286
287 protected void reindexThreads(
288 long companyId, long groupId, final long categoryId)
289 throws PortalException, SystemException {
290
291 final Collection<Document> documents = new ArrayList<Document>();
292
293 ActionableDynamicQuery actionableDynamicQuery =
294 new MBThreadActionableDynamicQuery() {
295
296 @Override
297 protected void addCriteria(DynamicQuery dynamicQuery) {
298 Property categoryIdProperty = PropertyFactoryUtil.forName(
299 "categoryId");
300
301 dynamicQuery.add(categoryIdProperty.eq(categoryId));
302
303 Property statusProperty = PropertyFactoryUtil.forName("status");
304
305 dynamicQuery.add(
306 statusProperty.eq(WorkflowConstants.STATUS_APPROVED));
307 }
308
309 @Override
310 protected void performAction(Object object) throws PortalException {
311 MBThread thread = (MBThread)object;
312
313 Document document = getDocument(thread);
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 }