001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
052     * @author Brian Wing Shun Chan
053     * @author Bruno Farache
054     * @author Raymond Aug??
055     */
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    }