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