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.exception.PortalException;
018    import com.liferay.portal.kernel.language.LanguageUtil;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.portlet.LiferayWindowState;
022    import com.liferay.portal.kernel.search.Document;
023    import com.liferay.portal.kernel.search.Field;
024    import com.liferay.portal.kernel.search.Hits;
025    import com.liferay.portal.kernel.util.GetterUtil;
026    import com.liferay.portal.kernel.util.HtmlUtil;
027    import com.liferay.portal.kernel.util.OrderByComparator;
028    import com.liferay.portal.kernel.util.ParamUtil;
029    import com.liferay.portal.kernel.util.StringBundler;
030    import com.liferay.portal.kernel.util.StringPool;
031    import com.liferay.portal.model.Company;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portal.util.PortletKeys;
035    import com.liferay.portal.util.WebKeys;
036    import com.liferay.portlet.PortletURLFactoryUtil;
037    import com.liferay.portlet.bookmarks.model.BookmarksEntry;
038    import com.liferay.portlet.bookmarks.model.BookmarksFolder;
039    import com.liferay.portlet.bookmarks.model.BookmarksFolderConstants;
040    import com.liferay.portlet.bookmarks.service.BookmarksEntryLocalServiceUtil;
041    import com.liferay.portlet.bookmarks.service.BookmarksFolderLocalServiceUtil;
042    import com.liferay.portlet.bookmarks.util.comparator.EntryCreateDateComparator;
043    import com.liferay.portlet.bookmarks.util.comparator.EntryModifiedDateComparator;
044    import com.liferay.portlet.bookmarks.util.comparator.EntryNameComparator;
045    import com.liferay.portlet.bookmarks.util.comparator.EntryPriorityComparator;
046    import com.liferay.portlet.bookmarks.util.comparator.EntryURLComparator;
047    import com.liferay.portlet.bookmarks.util.comparator.EntryVisitsComparator;
048    
049    import java.util.ArrayList;
050    import java.util.Collections;
051    import java.util.LinkedHashMap;
052    import java.util.List;
053    import java.util.Map;
054    
055    import javax.portlet.PortletRequest;
056    import javax.portlet.PortletURL;
057    import javax.portlet.RenderResponse;
058    
059    import javax.servlet.http.HttpServletRequest;
060    
061    /**
062     * @author Brian Wing Shun Chan
063     */
064    public class BookmarksUtil {
065    
066            public static void addPortletBreadcrumbEntries(
067                            BookmarksEntry entry, HttpServletRequest request,
068                            RenderResponse renderResponse)
069                    throws Exception {
070    
071                    BookmarksFolder folder = entry.getFolder();
072    
073                    if (folder.getFolderId() !=
074                                    BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
075    
076                            addPortletBreadcrumbEntries(folder, request, renderResponse);
077                    }
078    
079                    BookmarksEntry unescapedEntry = entry.toUnescapedModel();
080    
081                    PortletURL portletURL = renderResponse.createRenderURL();
082    
083                    portletURL.setParameter("struts_action", "/bookmarks/view_entry");
084                    portletURL.setParameter("entryId", String.valueOf(entry.getEntryId()));
085    
086                    PortalUtil.addPortletBreadcrumbEntry(
087                            request, unescapedEntry.getName(), portletURL.toString());
088            }
089    
090            public static void addPortletBreadcrumbEntries(
091                            BookmarksFolder folder, HttpServletRequest request,
092                            RenderResponse renderResponse)
093                    throws Exception {
094    
095                    String strutsAction = ParamUtil.getString(request, "struts_action");
096    
097                    PortletURL portletURL = renderResponse.createRenderURL();
098    
099                    if (strutsAction.equals("/bookmarks/select_folder")) {
100                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
101                                    WebKeys.THEME_DISPLAY);
102    
103                            portletURL.setParameter(
104                                    "struts_action", "/bookmarks/select_folder");
105                            portletURL.setWindowState(LiferayWindowState.POP_UP);
106    
107                            PortalUtil.addPortletBreadcrumbEntry(
108                                    request, themeDisplay.translate("home"), portletURL.toString());
109                    }
110                    else {
111                            portletURL.setParameter("struts_action", "/bookmarks/view");
112                    }
113    
114                    List<BookmarksFolder> ancestorFolders = folder.getAncestors();
115    
116                    Collections.reverse(ancestorFolders);
117    
118                    for (BookmarksFolder ancestorFolder : ancestorFolders) {
119                            portletURL.setParameter(
120                                    "folderId", String.valueOf(ancestorFolder.getFolderId()));
121    
122                            PortalUtil.addPortletBreadcrumbEntry(
123                                    request, ancestorFolder.getName(), portletURL.toString());
124                    }
125    
126                    portletURL.setParameter(
127                            "folderId", String.valueOf(folder.getFolderId()));
128    
129                    if (folder.getFolderId() !=
130                                    BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
131    
132                            BookmarksFolder unescapedFolder = folder.toUnescapedModel();
133    
134                            PortalUtil.addPortletBreadcrumbEntry(
135                                    request, unescapedFolder.getName(), portletURL.toString());
136                    }
137            }
138    
139            public static void addPortletBreadcrumbEntries(
140                            long folderId, HttpServletRequest request,
141                            RenderResponse renderResponse)
142                    throws Exception {
143    
144                    if (folderId == BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
145                            return;
146                    }
147    
148                    BookmarksFolder folder = BookmarksFolderLocalServiceUtil.getFolder(
149                            folderId);
150    
151                    addPortletBreadcrumbEntries(folder, request, renderResponse);
152            }
153    
154            public static String getAbsolutePath(
155                            PortletRequest portletRequest, long folderId)
156                    throws PortalException {
157    
158                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
159                            WebKeys.THEME_DISPLAY);
160    
161                    if (folderId == BookmarksFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
162                            return themeDisplay.translate("home");
163                    }
164    
165                    BookmarksFolder folder =
166                            BookmarksFolderLocalServiceUtil.fetchBookmarksFolder(folderId);
167    
168                    List<BookmarksFolder> folders = folder.getAncestors();
169    
170                    StringBundler sb = new StringBundler((folders.size() * 3) + 5);
171    
172                    sb.append(themeDisplay.translate("home"));
173                    sb.append(StringPool.SPACE);
174    
175                    Collections.reverse(folders);
176    
177                    for (BookmarksFolder curFolder : folders) {
178                            sb.append(StringPool.RAQUO_CHAR);
179                            sb.append(StringPool.SPACE);
180                            sb.append(curFolder.getName());
181                    }
182    
183                    sb.append(StringPool.RAQUO_CHAR);
184                    sb.append(StringPool.SPACE);
185                    sb.append(folder.getName());
186    
187                    return sb.toString();
188            }
189    
190            public static String getControlPanelLink(
191                            PortletRequest portletRequest, long folderId)
192                    throws PortalException {
193    
194                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
195                            WebKeys.THEME_DISPLAY);
196    
197                    PortletURL portletURL = PortletURLFactoryUtil.create(
198                            portletRequest, PortletKeys.BOOKMARKS_ADMIN,
199                            PortalUtil.getControlPanelPlid(themeDisplay.getCompanyId()),
200                            PortletRequest.RENDER_PHASE);
201    
202                    portletURL.setParameter("struts_action", "/bookmarks/view");
203                    portletURL.setParameter("folderId", String.valueOf(folderId));
204    
205                    return portletURL.toString();
206            }
207    
208            public static Map<String, String> getEmailDefinitionTerms(
209                    PortletRequest portletRequest, String emailFromAddress,
210                    String emailFromName) {
211    
212                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
213                            WebKeys.THEME_DISPLAY);
214    
215                    Map<String, String> definitionTerms =
216                            new LinkedHashMap<String, String>();
217    
218                    definitionTerms.put(
219                            "[$BOOKMARKS_ENTRY_USER_NAME$]",
220                            LanguageUtil.get(
221                                    themeDisplay.getLocale(),
222                                    "the-user-who-added-the-bookmark-entry"));
223                    definitionTerms.put(
224                            "[$BOOKMARKS_ENTRY_STATUS_BY_USER_NAME$]",
225                            LanguageUtil.get(
226                                    themeDisplay.getLocale(),
227                                    "the-user-who-updated-the-bookmark-entry"));
228                    definitionTerms.put(
229                            "[$BOOKMARKS_ENTRY_URL$]",
230                            LanguageUtil.get(
231                                    themeDisplay.getLocale(), "the-bookmark-entry-url"));
232                    definitionTerms.put(
233                            "[$FROM_ADDRESS$]", HtmlUtil.escape(emailFromAddress));
234                    definitionTerms.put("[$FROM_NAME$]", HtmlUtil.escape(emailFromName));
235    
236                    Company company = themeDisplay.getCompany();
237    
238                    definitionTerms.put("[$PORTAL_URL$]", company.getVirtualHostname());
239    
240                    definitionTerms.put(
241                            "[$PORTLET_NAME$]", PortalUtil.getPortletTitle(portletRequest));
242                    definitionTerms.put(
243                            "[$TO_ADDRESS$]",
244                            LanguageUtil.get(
245                                    themeDisplay.getLocale(),
246                                    "the-address-of-the-email-recipient"));
247                    definitionTerms.put(
248                            "[$TO_NAME$]",
249                            LanguageUtil.get(
250                                    themeDisplay.getLocale(), "the-name-of-the-email-recipient"));
251    
252                    return definitionTerms;
253            }
254    
255            public static List<Object> getEntries(Hits hits) {
256                    List<Object> entries = new ArrayList<Object>();
257    
258                    for (Document document : hits.getDocs()) {
259                            String entryClassName = document.get(Field.ENTRY_CLASS_NAME);
260                            long entryClassPK = GetterUtil.getLong(
261                                    document.get(Field.ENTRY_CLASS_PK));
262    
263                            try {
264                                    Object obj = null;
265    
266                                    if (entryClassName.equals(BookmarksEntry.class.getName())) {
267                                            obj = BookmarksEntryLocalServiceUtil.getEntry(entryClassPK);
268                                    }
269                                    else if (entryClassName.equals(
270                                                            BookmarksFolder.class.getName())) {
271    
272                                            obj = BookmarksFolderLocalServiceUtil.getFolder(
273                                                    entryClassPK);
274                                    }
275    
276                                    entries.add(obj);
277                            }
278                            catch (Exception e) {
279                                    if (_log.isWarnEnabled()) {
280                                            _log.warn(
281                                                    "Bookmarks search index is stale and contains entry " +
282                                                            entryClassPK);
283                                    }
284    
285                                    continue;
286                            }
287                    }
288    
289                    return entries;
290            }
291    
292            public static OrderByComparator<BookmarksEntry> getEntryOrderByComparator(
293                    String orderByCol, String orderByType) {
294    
295                    boolean orderByAsc = false;
296    
297                    if (orderByType.equals("asc")) {
298                            orderByAsc = true;
299                    }
300    
301                    OrderByComparator<BookmarksEntry> orderByComparator = null;
302    
303                    if (orderByCol.equals("create-date")) {
304                            orderByComparator = new EntryCreateDateComparator(orderByAsc);
305                    }
306                    else if (orderByCol.equals("modified-date")) {
307                            orderByComparator = new EntryModifiedDateComparator(orderByAsc);
308                    }
309                    else if (orderByCol.equals("name")) {
310                            orderByComparator = new EntryNameComparator(orderByAsc);
311                    }
312                    else if (orderByCol.equals("priority")) {
313                            orderByComparator = new EntryPriorityComparator(orderByAsc);
314                    }
315                    else if (orderByCol.equals("url")) {
316                            orderByComparator = new EntryURLComparator(orderByAsc);
317                    }
318                    else if (orderByCol.equals("visits")) {
319                            orderByComparator = new EntryVisitsComparator(orderByAsc);
320                    }
321    
322                    return orderByComparator;
323            }
324    
325            private static final Log _log = LogFactoryUtil.getLog(BookmarksUtil.class);
326    
327    }