1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    *
5    *
6    *
7    * The contents of this file are subject to the terms of the Liferay Enterprise
8    * Subscription License ("License"). You may not use this file except in
9    * compliance with the License. You can obtain a copy of the License by
10   * contacting Liferay, Inc. See the License for the specific language governing
11   * permissions and limitations under the License, including but not limited to
12   * distribution rights of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.journal.util;
24  
25  import com.liferay.portal.kernel.search.Document;
26  import com.liferay.portal.kernel.search.Field;
27  import com.liferay.portal.kernel.search.Hits;
28  import com.liferay.portal.model.Layout;
29  import com.liferay.portal.search.HitsOpenSearchImpl;
30  import com.liferay.portal.security.permission.ActionKeys;
31  import com.liferay.portal.security.permission.PermissionChecker;
32  import com.liferay.portal.service.GroupLocalServiceUtil;
33  import com.liferay.portal.service.LayoutLocalServiceUtil;
34  import com.liferay.portal.service.permission.LayoutPermissionUtil;
35  import com.liferay.portal.theme.ThemeDisplay;
36  import com.liferay.portal.util.PortalUtil;
37  import com.liferay.portlet.journal.model.JournalContentSearch;
38  import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
39  import com.liferay.portlet.journal.service.JournalContentSearchLocalServiceUtil;
40  
41  import java.util.List;
42  
43  import javax.portlet.PortletURL;
44  
45  /**
46   * <a href="JournalOpenSearchImpl.java.html"><b><i>View Source</i></b></a>
47   *
48   * @author Brian Wing Shun Chan
49   * @author Wesley Gong
50   */
51  public class JournalOpenSearchImpl extends HitsOpenSearchImpl {
52  
53      public static final String SEARCH_PATH = "/c/journal/open_search";
54  
55      public static final String TITLE = "Liferay Journal Search: ";
56  
57      public Hits getHits(
58              long companyId, String keywords, int start, int end)
59          throws Exception {
60  
61          return JournalArticleLocalServiceUtil.search(
62              companyId, 0, keywords, start, end);
63      }
64  
65      public String getSearchPath() {
66          return SEARCH_PATH;
67      }
68  
69      public String getTitle(String keywords) {
70          return TITLE + keywords;
71      }
72  
73      protected String getLayoutURL(ThemeDisplay themeDisplay, String articleId)
74          throws Exception {
75  
76          PermissionChecker permissionChecker =
77              themeDisplay.getPermissionChecker();
78  
79          List<JournalContentSearch> contentSearches =
80              JournalContentSearchLocalServiceUtil.getArticleContentSearches(
81                  articleId);
82  
83          for (JournalContentSearch contentSearch : contentSearches) {
84              if (LayoutPermissionUtil.contains(
85                      permissionChecker, contentSearch.getGroupId(),
86                      contentSearch.isPrivateLayout(),
87                      contentSearch.getLayoutId(), ActionKeys.VIEW)) {
88  
89                  if (contentSearch.isPrivateLayout()) {
90                      if (!GroupLocalServiceUtil.hasUserGroup(
91                              themeDisplay.getUserId(),
92                              contentSearch.getGroupId())) {
93  
94                          continue;
95                      }
96                  }
97  
98                  Layout hitLayout = LayoutLocalServiceUtil.getLayout(
99                      contentSearch.getGroupId(), contentSearch.isPrivateLayout(),
100                     contentSearch.getLayoutId());
101 
102                 return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
103             }
104         }
105 
106         return null;
107     }
108 
109     protected String getURL(
110             ThemeDisplay themeDisplay, long groupId, Document result,
111             PortletURL portletURL)
112         throws Exception {
113 
114         PermissionChecker permissionChecker =
115             themeDisplay.getPermissionChecker();
116 
117         Layout layout = themeDisplay.getLayout();
118 
119         String articleId = result.get(Field.ENTRY_CLASS_PK);
120         String version = result.get("version");
121 
122         List<Long> hitLayoutIds =
123             JournalContentSearchLocalServiceUtil.getLayoutIds(
124                 layout.getGroupId(), layout.isPrivateLayout(), articleId);
125 
126         for (Long hitLayoutId : hitLayoutIds) {
127             if (LayoutPermissionUtil.contains(
128                     permissionChecker, layout.getGroupId(),
129                     layout.isPrivateLayout(), hitLayoutId, ActionKeys.VIEW)) {
130 
131                 Layout hitLayout = LayoutLocalServiceUtil.getLayout(
132                     layout.getGroupId(), layout.isPrivateLayout(),
133                     hitLayoutId.longValue());
134 
135                 return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
136             }
137         }
138 
139         String layoutURL = getLayoutURL(themeDisplay, articleId);
140 
141         if (layoutURL != null) {
142             return layoutURL;
143         }
144 
145         StringBuilder sb = new StringBuilder();
146 
147         sb.append(themeDisplay.getPathMain());
148         sb.append("/journal/view_article_content?groupId=");
149         sb.append(groupId);
150         sb.append("&articleId=");
151         sb.append(articleId);
152         sb.append("&version=");
153         sb.append(version);
154 
155         return sb.toString();
156     }
157 
158 }