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.search.BaseIndexer;
023 import com.liferay.portal.kernel.search.BooleanQuery;
024 import com.liferay.portal.kernel.search.Document;
025 import com.liferay.portal.kernel.search.Field;
026 import com.liferay.portal.kernel.search.SearchContext;
027 import com.liferay.portal.kernel.search.SearchEngineUtil;
028 import com.liferay.portal.kernel.search.Summary;
029 import com.liferay.portal.kernel.util.CharPool;
030 import com.liferay.portal.kernel.util.GetterUtil;
031 import com.liferay.portal.kernel.util.StringUtil;
032 import com.liferay.portal.kernel.workflow.WorkflowConstants;
033 import com.liferay.portal.model.Group;
034 import com.liferay.portal.security.permission.ActionKeys;
035 import com.liferay.portal.security.permission.PermissionChecker;
036 import com.liferay.portal.service.GroupLocalServiceUtil;
037 import com.liferay.portal.util.PortletKeys;
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.BookmarksFolderLocalServiceUtil;
043 import com.liferay.portlet.bookmarks.service.permission.BookmarksEntryPermission;
044
045 import java.util.Locale;
046
047 import javax.portlet.PortletRequest;
048 import javax.portlet.PortletResponse;
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 setDefaultSelectedFieldNames(
064 Field.COMPANY_ID, Field.ENTRY_CLASS_NAME, Field.ENTRY_CLASS_PK,
065 Field.TITLE, Field.UID, Field.URL);
066 setFilterSearch(true);
067 setPermissionAware(true);
068 }
069
070 @Override
071 public String[] getClassNames() {
072 return CLASS_NAMES;
073 }
074
075 @Override
076 public String getPortletId() {
077 return PORTLET_ID;
078 }
079
080 @Override
081 public boolean hasPermission(
082 PermissionChecker permissionChecker, String entryClassName,
083 long entryClassPK, String actionId)
084 throws Exception {
085
086 return BookmarksEntryPermission.contains(
087 permissionChecker, entryClassPK, ActionKeys.VIEW);
088 }
089
090 @Override
091 public void postProcessContextQuery(
092 BooleanQuery contextQuery, SearchContext searchContext)
093 throws Exception {
094
095 addStatus(contextQuery, searchContext);
096 }
097
098 @Override
099 protected void doDelete(Object obj) throws Exception {
100 BookmarksEntry entry = (BookmarksEntry)obj;
101
102 deleteDocument(entry.getCompanyId(), entry.getEntryId());
103 }
104
105 @Override
106 protected Document doGetDocument(Object obj) throws Exception {
107 BookmarksEntry entry = (BookmarksEntry)obj;
108
109 Document document = getBaseModelDocument(PORTLET_ID, entry);
110
111 document.addText(Field.DESCRIPTION, entry.getDescription());
112 document.addKeyword(Field.FOLDER_ID, entry.getFolderId());
113 document.addText(Field.TITLE, entry.getName());
114 document.addKeyword(
115 Field.TREE_PATH,
116 StringUtil.split(entry.getTreePath(), CharPool.SLASH));
117 document.addText(Field.URL, entry.getUrl());
118
119 return document;
120 }
121
122 @Override
123 protected Summary doGetSummary(
124 Document document, Locale locale, String snippet, PortletURL portletURL,
125 PortletRequest portletRequest, PortletResponse portletResponse) {
126
127 String entryId = document.get(Field.ENTRY_CLASS_PK);
128
129 portletURL.setParameter("struts_action", "/bookmarks/view_entry");
130 portletURL.setParameter("entryId", entryId);
131
132 Summary summary = createSummary(document, Field.TITLE, Field.URL);
133
134 summary.setPortletURL(portletURL);
135
136 return summary;
137 }
138
139 @Override
140 protected void doReindex(Object obj) throws Exception {
141 BookmarksEntry entry = (BookmarksEntry)obj;
142
143 Document document = getDocument(entry);
144
145 SearchEngineUtil.updateDocument(
146 getSearchEngineId(), entry.getCompanyId(), document,
147 isCommitImmediately());
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 {
173
174 final ActionableDynamicQuery actionableDynamicQuery =
175 BookmarksEntryLocalServiceUtil.getActionableDynamicQuery();
176
177 actionableDynamicQuery.setAddCriteriaMethod(
178 new ActionableDynamicQuery.AddCriteriaMethod() {
179
180 @Override
181 public void addCriteria(DynamicQuery dynamicQuery) {
182 Property folderIdProperty = PropertyFactoryUtil.forName(
183 "folderId");
184
185 dynamicQuery.add(folderIdProperty.eq(folderId));
186
187 Property statusProperty = PropertyFactoryUtil.forName(
188 "status");
189
190 Integer[] statuses = {
191 WorkflowConstants.STATUS_APPROVED,
192 WorkflowConstants.STATUS_IN_TRASH
193 };
194
195 dynamicQuery.add(statusProperty.in(statuses));
196 }
197
198 });
199 actionableDynamicQuery.setCompanyId(companyId);
200 actionableDynamicQuery.setGroupId(groupId);
201 actionableDynamicQuery.setPerformActionMethod(
202 new ActionableDynamicQuery.PerformActionMethod() {
203
204 @Override
205 public void performAction(Object object)
206 throws PortalException {
207
208 BookmarksEntry entry = (BookmarksEntry)object;
209
210 Document document = getDocument(entry);
211
212 actionableDynamicQuery.addDocument(document);
213 }
214
215 });
216 actionableDynamicQuery.setSearchEngineId(getSearchEngineId());
217
218 actionableDynamicQuery.performActions();
219 }
220
221 protected void reindexFolders(final long companyId) throws PortalException {
222 final ActionableDynamicQuery actionableDynamicQuery =
223 BookmarksFolderLocalServiceUtil.getActionableDynamicQuery();
224
225 actionableDynamicQuery.setCompanyId(companyId);
226 actionableDynamicQuery.setPerformActionMethod(
227 new ActionableDynamicQuery.PerformActionMethod() {
228
229 @Override
230 public void performAction(Object object)
231 throws PortalException {
232
233 BookmarksFolder folder = (BookmarksFolder)object;
234
235 long groupId = folder.getGroupId();
236 long folderId = folder.getFolderId();
237
238 reindexEntries(companyId, groupId, folderId);
239 }
240
241 });
242
243 actionableDynamicQuery.performActions();
244 }
245
246 protected void reindexRoot(final long companyId) throws PortalException {
247 ActionableDynamicQuery actionableDynamicQuery =
248 GroupLocalServiceUtil.getActionableDynamicQuery();
249
250 actionableDynamicQuery.setCompanyId(companyId);
251 actionableDynamicQuery.setPerformActionMethod(
252 new ActionableDynamicQuery.PerformActionMethod() {
253
254 @Override
255 public void performAction(Object object)
256 throws PortalException {
257
258 Group group = (Group)object;
259
260 long groupId = group.getGroupId();
261 long folderId =
262 BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID;
263
264 reindexEntries(companyId, groupId, folderId);
265 }
266
267 });
268
269 actionableDynamicQuery.performActions();
270 }
271
272 }