001
014
015 package com.liferay.portlet.bookmarks.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.BooleanClauseOccur;
025 import com.liferay.portal.kernel.search.BooleanQuery;
026 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
027 import com.liferay.portal.kernel.search.Document;
028 import com.liferay.portal.kernel.search.Field;
029 import com.liferay.portal.kernel.search.SearchContext;
030 import com.liferay.portal.kernel.search.SearchEngineUtil;
031 import com.liferay.portal.kernel.search.Summary;
032 import com.liferay.portal.kernel.util.GetterUtil;
033 import com.liferay.portal.kernel.workflow.WorkflowConstants;
034 import com.liferay.portal.model.Group;
035 import com.liferay.portal.service.persistence.GroupActionableDynamicQuery;
036 import com.liferay.portal.util.PortletKeys;
037 import com.liferay.portlet.bookmarks.asset.BookmarksEntryAssetRendererFactory;
038 import com.liferay.portlet.bookmarks.model.BookmarksEntry;
039 import com.liferay.portlet.bookmarks.model.BookmarksFolder;
040 import com.liferay.portlet.bookmarks.model.BookmarksFolderConstants;
041 import com.liferay.portlet.bookmarks.service.BookmarksEntryLocalServiceUtil;
042 import com.liferay.portlet.bookmarks.service.BookmarksFolderServiceUtil;
043 import com.liferay.portlet.bookmarks.service.persistence.BookmarksEntryActionableDynamicQuery;
044 import com.liferay.portlet.bookmarks.service.persistence.BookmarksFolderActionableDynamicQuery;
045
046 import java.util.ArrayList;
047 import java.util.Collection;
048 import java.util.Locale;
049
050 import javax.portlet.PortletURL;
051
052
057 public class BookmarksEntryIndexer extends BaseIndexer {
058
059 public static final String[] CLASS_NAMES = {BookmarksEntry.class.getName()};
060
061 public static final String PORTLET_ID = PortletKeys.BOOKMARKS;
062
063 public BookmarksEntryIndexer() {
064 setPermissionAware(true);
065 }
066
067 public String[] getClassNames() {
068 return CLASS_NAMES;
069 }
070
071 public String getPortletId() {
072 return PORTLET_ID;
073 }
074
075 @Override
076 public void postProcessContextQuery(
077 BooleanQuery contextQuery, SearchContext searchContext)
078 throws Exception {
079
080 int status = GetterUtil.getInteger(
081 searchContext.getAttribute(Field.STATUS),
082 WorkflowConstants.STATUS_APPROVED);
083
084 if (status != WorkflowConstants.STATUS_ANY) {
085 contextQuery.addRequiredTerm(Field.STATUS, status);
086 }
087
088 long[] folderIds = searchContext.getFolderIds();
089
090 if ((folderIds != null) && (folderIds.length > 0)) {
091 if (folderIds[0] ==
092 BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
093
094 return;
095 }
096
097 BooleanQuery folderIdsQuery = BooleanQueryFactoryUtil.create(
098 searchContext);
099
100 for (long folderId : folderIds) {
101 try {
102 BookmarksFolderServiceUtil.getFolder(folderId);
103 }
104 catch (Exception e) {
105 continue;
106 }
107
108 folderIdsQuery.addTerm(Field.FOLDER_ID, folderId);
109 }
110
111 contextQuery.add(folderIdsQuery, BooleanClauseOccur.MUST);
112 }
113 }
114
115 @Override
116 protected void doDelete(Object obj) throws Exception {
117 BookmarksEntry entry = (BookmarksEntry)obj;
118
119 deleteDocument(entry.getCompanyId(), entry.getEntryId());
120 }
121
122 @Override
123 protected Document doGetDocument(Object obj) throws Exception {
124 BookmarksEntry entry = (BookmarksEntry)obj;
125
126 Document document = getBaseModelDocument(PORTLET_ID, entry);
127
128 document.addText(Field.DESCRIPTION, entry.getDescription());
129 document.addKeyword(Field.FOLDER_ID, entry.getFolderId());
130 document.addText(Field.TITLE, entry.getName());
131 document.addText(Field.URL, entry.getUrl());
132
133 if (!entry.isInTrash() && entry.isInTrashContainer()) {
134 BookmarksFolder folder = entry.getTrashContainer();
135
136 addTrashFields(
137 document, BookmarksFolder.class.getName(), folder.getFolderId(),
138 null, null, BookmarksEntryAssetRendererFactory.TYPE);
139
140 document.addKeyword(
141 Field.ROOT_ENTRY_CLASS_NAME, BookmarksFolder.class.getName());
142 document.addKeyword(
143 Field.ROOT_ENTRY_CLASS_PK, folder.getFolderId());
144 document.addKeyword(
145 Field.STATUS, WorkflowConstants.STATUS_IN_TRASH);
146 }
147
148 return document;
149 }
150
151 @Override
152 protected Summary doGetSummary(
153 Document document, Locale locale, String snippet,
154 PortletURL portletURL) {
155
156 String entryId = document.get(Field.ENTRY_CLASS_PK);
157
158 portletURL.setParameter("struts_action", "/bookmarks/view_entry");
159 portletURL.setParameter("entryId", entryId);
160
161 Summary summary = createSummary(document, Field.TITLE, Field.URL);
162
163 summary.setPortletURL(portletURL);
164
165 return summary;
166 }
167
168 @Override
169 protected void doReindex(Object obj) throws Exception {
170 BookmarksEntry entry = (BookmarksEntry)obj;
171
172 Document document = getDocument(entry);
173
174 SearchEngineUtil.updateDocument(
175 getSearchEngineId(), entry.getCompanyId(), document);
176 }
177
178 @Override
179 protected void doReindex(String className, long classPK) throws Exception {
180 BookmarksEntry entry = BookmarksEntryLocalServiceUtil.getEntry(classPK);
181
182 doReindex(entry);
183 }
184
185 @Override
186 protected void doReindex(String[] ids) throws Exception {
187 long companyId = GetterUtil.getLong(ids[0]);
188
189 reindexFolders(companyId);
190 reindexRoot(companyId);
191 }
192
193 @Override
194 protected String getPortletId(SearchContext searchContext) {
195 return PORTLET_ID;
196 }
197
198 protected void reindexEntries(
199 long companyId, final long groupId, final long folderId)
200 throws PortalException, SystemException {
201
202 final Collection<Document> documents = new ArrayList<Document>();
203
204 ActionableDynamicQuery actionableDynamicQuery =
205 new BookmarksEntryActionableDynamicQuery() {
206
207 @Override
208 protected void addCriteria(DynamicQuery dynamicQuery) {
209 Property folderIdProperty = PropertyFactoryUtil.forName(
210 "folderId");
211
212 dynamicQuery.add(folderIdProperty.eq(folderId));
213
214 Property statusProperty = PropertyFactoryUtil.forName("status");
215
216 Integer[] statuses = {
217 WorkflowConstants.STATUS_APPROVED,
218 WorkflowConstants.STATUS_IN_TRASH
219 };
220
221 dynamicQuery.add(statusProperty.in(statuses));
222 }
223
224 @Override
225 protected void performAction(Object object) throws PortalException {
226 BookmarksEntry entry = (BookmarksEntry)object;
227
228 Document document = getDocument(entry);
229
230 documents.add(document);
231 }
232
233 };
234
235 actionableDynamicQuery.setGroupId(groupId);
236
237 actionableDynamicQuery.performActions();
238
239 SearchEngineUtil.updateDocuments(
240 getSearchEngineId(), companyId, documents);
241 }
242
243 protected void reindexFolders(final long companyId)
244 throws PortalException, SystemException {
245
246 ActionableDynamicQuery actionableDynamicQuery =
247 new BookmarksFolderActionableDynamicQuery() {
248
249 @Override
250 protected void performAction(Object object)
251 throws PortalException, SystemException {
252
253 BookmarksFolder folder = (BookmarksFolder)object;
254
255 long groupId = folder.getGroupId();
256 long folderId = folder.getFolderId();
257
258 reindexEntries(companyId, groupId, folderId);
259 }
260
261 };
262
263 actionableDynamicQuery.setCompanyId(companyId);
264
265 actionableDynamicQuery.performActions();
266 }
267
268 protected void reindexRoot(final long companyId)
269 throws PortalException, SystemException {
270
271 ActionableDynamicQuery actionableDynamicQuery =
272 new GroupActionableDynamicQuery() {
273
274 @Override
275 protected void performAction(Object object)
276 throws PortalException, SystemException {
277
278 Group group = (Group)object;
279
280 long groupId = group.getGroupId();
281 long folderId =
282 BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID;
283
284 reindexEntries(companyId, groupId, folderId);
285 }
286
287 };
288
289 actionableDynamicQuery.setCompanyId(companyId);
290
291 actionableDynamicQuery.performActions();
292 }
293
294 }