001    /**
002     * Copyright (c) 2000-2013 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.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    /**
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                    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    }