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