1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet.journal.util;
16  
17  import com.liferay.portal.kernel.search.Document;
18  import com.liferay.portal.kernel.search.Field;
19  import com.liferay.portal.kernel.util.StringBundler;
20  import com.liferay.portal.model.Layout;
21  import com.liferay.portal.search.HitsOpenSearchImpl;
22  import com.liferay.portal.security.permission.ActionKeys;
23  import com.liferay.portal.security.permission.PermissionChecker;
24  import com.liferay.portal.service.GroupLocalServiceUtil;
25  import com.liferay.portal.service.LayoutLocalServiceUtil;
26  import com.liferay.portal.service.permission.LayoutPermissionUtil;
27  import com.liferay.portal.theme.ThemeDisplay;
28  import com.liferay.portal.util.PortalUtil;
29  import com.liferay.portlet.journal.model.JournalContentSearch;
30  import com.liferay.portlet.journal.service.JournalContentSearchLocalServiceUtil;
31  
32  import java.util.List;
33  
34  import javax.portlet.PortletURL;
35  
36  /**
37   * <a href="JournalOpenSearchImpl.java.html"><b><i>View Source</i></b></a>
38   *
39   * @author Brian Wing Shun Chan
40   * @author Wesley Gong
41   */
42  public class JournalOpenSearchImpl extends HitsOpenSearchImpl {
43  
44      public static final String SEARCH_PATH = "/c/journal/open_search";
45  
46      public static final String TITLE = "Liferay Journal Search: ";
47  
48      public String getPortletId() {
49          return JournalIndexer.PORTLET_ID;
50      }
51  
52      public String getSearchPath() {
53          return SEARCH_PATH;
54      }
55  
56      public String getTitle(String keywords) {
57          return TITLE + keywords;
58      }
59  
60      protected String getLayoutURL(ThemeDisplay themeDisplay, String articleId)
61          throws Exception {
62  
63          PermissionChecker permissionChecker =
64              themeDisplay.getPermissionChecker();
65  
66          List<JournalContentSearch> contentSearches =
67              JournalContentSearchLocalServiceUtil.getArticleContentSearches(
68                  articleId);
69  
70          for (JournalContentSearch contentSearch : contentSearches) {
71              if (LayoutPermissionUtil.contains(
72                      permissionChecker, contentSearch.getGroupId(),
73                      contentSearch.isPrivateLayout(),
74                      contentSearch.getLayoutId(), ActionKeys.VIEW)) {
75  
76                  if (contentSearch.isPrivateLayout()) {
77                      if (!GroupLocalServiceUtil.hasUserGroup(
78                              themeDisplay.getUserId(),
79                              contentSearch.getGroupId())) {
80  
81                          continue;
82                      }
83                  }
84  
85                  Layout hitLayout = LayoutLocalServiceUtil.getLayout(
86                      contentSearch.getGroupId(), contentSearch.isPrivateLayout(),
87                      contentSearch.getLayoutId());
88  
89                  return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
90              }
91          }
92  
93          return null;
94      }
95  
96      protected String getURL(
97              ThemeDisplay themeDisplay, long groupId, Document result,
98              PortletURL portletURL)
99          throws Exception {
100 
101         PermissionChecker permissionChecker =
102             themeDisplay.getPermissionChecker();
103 
104         Layout layout = themeDisplay.getLayout();
105 
106         String articleId = result.get(Field.ENTRY_CLASS_PK);
107         String version = result.get("version");
108 
109         List<Long> hitLayoutIds =
110             JournalContentSearchLocalServiceUtil.getLayoutIds(
111                 layout.getGroupId(), layout.isPrivateLayout(), articleId);
112 
113         for (Long hitLayoutId : hitLayoutIds) {
114             if (LayoutPermissionUtil.contains(
115                     permissionChecker, layout.getGroupId(),
116                     layout.isPrivateLayout(), hitLayoutId, ActionKeys.VIEW)) {
117 
118                 Layout hitLayout = LayoutLocalServiceUtil.getLayout(
119                     layout.getGroupId(), layout.isPrivateLayout(),
120                     hitLayoutId.longValue());
121 
122                 return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
123             }
124         }
125 
126         String layoutURL = getLayoutURL(themeDisplay, articleId);
127 
128         if (layoutURL != null) {
129             return layoutURL;
130         }
131 
132         StringBundler sb = new StringBundler(7);
133 
134         sb.append(themeDisplay.getPathMain());
135         sb.append("/journal/view_article_content?groupId=");
136         sb.append(groupId);
137         sb.append("&articleId=");
138         sb.append(articleId);
139         sb.append("&version=");
140         sb.append(version);
141 
142         return sb.toString();
143     }
144 
145 }