001
014
015 package com.liferay.portlet.journal.util;
016
017 import com.liferay.portal.kernel.search.Document;
018 import com.liferay.portal.kernel.search.HitsOpenSearchImpl;
019 import com.liferay.portal.kernel.search.Indexer;
020 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
021 import com.liferay.portal.kernel.util.Validator;
022 import com.liferay.portal.model.Layout;
023 import com.liferay.portal.security.permission.ActionKeys;
024 import com.liferay.portal.security.permission.PermissionChecker;
025 import com.liferay.portal.service.GroupLocalServiceUtil;
026 import com.liferay.portal.service.LayoutLocalServiceUtil;
027 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
028 import com.liferay.portal.service.permission.LayoutPermissionUtil;
029 import com.liferay.portal.theme.ThemeDisplay;
030 import com.liferay.portal.util.PortalUtil;
031 import com.liferay.portal.util.PortletKeys;
032 import com.liferay.portlet.journal.model.JournalArticle;
033 import com.liferay.portlet.journal.model.JournalArticleConstants;
034 import com.liferay.portlet.journal.model.JournalContentSearch;
035 import com.liferay.portlet.journal.service.JournalArticleServiceUtil;
036 import com.liferay.portlet.journal.service.JournalContentSearchLocalServiceUtil;
037
038 import java.util.List;
039
040 import javax.portlet.PortletURL;
041
042
046 public class JournalOpenSearchImpl extends HitsOpenSearchImpl {
047
048 public static final String SEARCH_PATH = "/c/journal/open_search";
049
050 public static final String TITLE = "Liferay Journal Search: ";
051
052 @Override
053 public Indexer getIndexer() {
054 return IndexerRegistryUtil.getIndexer(JournalArticle.class);
055 }
056
057 @Override
058 public String getPortletId() {
059 return PortletKeys.JOURNAL;
060 }
061
062 @Override
063 public String getSearchPath() {
064 return SEARCH_PATH;
065 }
066
067 @Override
068 public String getTitle(String keywords) {
069 return TITLE + keywords;
070 }
071
072 protected String getLayoutURL(ThemeDisplay themeDisplay, String articleId)
073 throws Exception {
074
075 PermissionChecker permissionChecker =
076 themeDisplay.getPermissionChecker();
077
078 List<JournalContentSearch> contentSearches =
079 JournalContentSearchLocalServiceUtil.getArticleContentSearches(
080 articleId);
081
082 for (JournalContentSearch contentSearch : contentSearches) {
083 if (LayoutPermissionUtil.contains(
084 permissionChecker, contentSearch.getGroupId(),
085 contentSearch.isPrivateLayout(),
086 contentSearch.getLayoutId(), ActionKeys.VIEW)) {
087
088 if (contentSearch.isPrivateLayout()) {
089 if (!GroupLocalServiceUtil.hasUserGroup(
090 themeDisplay.getUserId(),
091 contentSearch.getGroupId())) {
092
093 continue;
094 }
095 }
096
097 Layout hitLayout = LayoutLocalServiceUtil.getLayout(
098 contentSearch.getGroupId(), contentSearch.isPrivateLayout(),
099 contentSearch.getLayoutId());
100
101 return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
102 }
103 }
104
105 return null;
106 }
107
108 @Override
109 protected String getURL(
110 ThemeDisplay themeDisplay, long groupId, Document result,
111 PortletURL portletURL)
112 throws Exception {
113
114 String articleId = result.get("articleId");
115
116 JournalArticle article = JournalArticleServiceUtil.getArticle(
117 groupId, articleId);
118
119 if (Validator.isNotNull(article.getLayoutUuid())) {
120 String groupFriendlyURL = PortalUtil.getGroupFriendlyURL(
121 LayoutSetLocalServiceUtil.getLayoutSet(
122 article.getGroupId(), false),
123 themeDisplay);
124
125 return groupFriendlyURL.concat(
126 JournalArticleConstants.CANONICAL_URL_SEPARATOR).concat(
127 article.getUrlTitle());
128 }
129
130 Layout layout = themeDisplay.getLayout();
131
132 List<Long> hitLayoutIds =
133 JournalContentSearchLocalServiceUtil.getLayoutIds(
134 layout.getGroupId(), layout.isPrivateLayout(), articleId);
135
136 for (Long hitLayoutId : hitLayoutIds) {
137 PermissionChecker permissionChecker =
138 themeDisplay.getPermissionChecker();
139
140 if (LayoutPermissionUtil.contains(
141 permissionChecker, layout.getGroupId(),
142 layout.isPrivateLayout(), hitLayoutId, ActionKeys.VIEW)) {
143
144 Layout hitLayout = LayoutLocalServiceUtil.getLayout(
145 layout.getGroupId(), layout.isPrivateLayout(),
146 hitLayoutId.longValue());
147
148 return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
149 }
150 }
151
152 String layoutURL = getLayoutURL(themeDisplay, articleId);
153
154 if (layoutURL != null) {
155 return layoutURL;
156 }
157
158 portletURL.setParameter("struts_action", "/journal/view_article");
159 portletURL.setParameter("groupId", String.valueOf(groupId));
160 portletURL.setParameter("articleId", articleId);
161
162 String version = result.get("version");
163
164 portletURL.setParameter("version", version);
165
166 return portletURL.toString();
167 }
168
169 }