001
014
015 package com.liferay.portlet.journal.asset;
016
017 import com.liferay.portal.kernel.exception.PortalException;
018 import com.liferay.portal.kernel.language.LanguageUtil;
019 import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
020 import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
021 import com.liferay.portal.kernel.portlet.PortletRequestModel;
022 import com.liferay.portal.kernel.trash.TrashRenderer;
023 import com.liferay.portal.kernel.util.GetterUtil;
024 import com.liferay.portal.kernel.util.HtmlUtil;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.kernel.util.Validator;
027 import com.liferay.portal.model.Group;
028 import com.liferay.portal.model.Layout;
029 import com.liferay.portal.security.permission.ActionKeys;
030 import com.liferay.portal.security.permission.PermissionChecker;
031 import com.liferay.portal.service.GroupLocalServiceUtil;
032 import com.liferay.portal.service.LayoutLocalServiceUtil;
033 import com.liferay.portal.service.LayoutSetLocalServiceUtil;
034 import com.liferay.portal.theme.ThemeDisplay;
035 import com.liferay.portal.util.PortalUtil;
036 import com.liferay.portal.util.PortletKeys;
037 import com.liferay.portal.util.PropsValues;
038 import com.liferay.portal.util.WebKeys;
039 import com.liferay.portlet.PortletPreferencesFactoryUtil;
040 import com.liferay.portlet.asset.model.BaseAssetRenderer;
041 import com.liferay.portlet.asset.model.DDMFieldReader;
042 import com.liferay.portlet.journal.model.JournalArticle;
043 import com.liferay.portlet.journal.model.JournalArticleConstants;
044 import com.liferay.portlet.journal.model.JournalArticleDisplay;
045 import com.liferay.portlet.journal.service.JournalArticleLocalServiceUtil;
046 import com.liferay.portlet.journal.service.JournalContentSearchLocalServiceUtil;
047 import com.liferay.portlet.journal.service.permission.JournalArticlePermission;
048
049 import java.util.Date;
050 import java.util.List;
051 import java.util.Locale;
052
053 import javax.portlet.PortletPreferences;
054 import javax.portlet.PortletRequest;
055 import javax.portlet.PortletResponse;
056 import javax.portlet.PortletURL;
057 import javax.portlet.RenderRequest;
058 import javax.portlet.RenderResponse;
059
060
066 public class JournalArticleAssetRenderer
067 extends BaseAssetRenderer implements TrashRenderer {
068
069 public static final String TYPE = "journal_article";
070
071 public static long getClassPK(JournalArticle article) {
072 if ((article.isDraft() || article.isPending()) &&
073 (article.getVersion() != JournalArticleConstants.VERSION_DEFAULT)) {
074
075 return article.getPrimaryKey();
076 }
077 else {
078 return article.getResourcePrimKey();
079 }
080 }
081
082 public JournalArticleAssetRenderer(JournalArticle article) {
083 _article = article;
084 }
085
086 public JournalArticle getArticle() {
087 return _article;
088 }
089
090 @Override
091 public String[] getAvailableLanguageIds() {
092 return _article.getAvailableLanguageIds();
093 }
094
095 @Override
096 public String getClassName() {
097 return JournalArticle.class.getName();
098 }
099
100 @Override
101 public long getClassPK() {
102 return getClassPK(_article);
103 }
104
105 @Override
106 public DDMFieldReader getDDMFieldReader() {
107 return new JournalArticleDDMFieldReader(_article);
108 }
109
110 @Override
111 public String getDiscussionPath() {
112 if (PropsValues.JOURNAL_ARTICLE_COMMENTS_ENABLED) {
113 return "edit_article_discussion";
114 }
115 else {
116 return null;
117 }
118 }
119
120 @Override
121 public Date getDisplayDate() {
122 return _article.getDisplayDate();
123 }
124
125 @Override
126 public long getGroupId() {
127 return _article.getGroupId();
128 }
129
130 @Override
131 public String getPortletId() {
132 return PortletKeys.JOURNAL;
133 }
134
135 @Override
136 public String getSummary(
137 PortletRequest portletRequest, PortletResponse portletResponse) {
138
139 Locale locale = getLocale(portletRequest);
140
141 String summary = _article.getDescription(locale);
142
143 if (Validator.isNotNull(summary)) {
144 return summary;
145 }
146
147 try {
148 PortletRequestModel portletRequestModel = null;
149 ThemeDisplay themeDisplay = null;
150
151 if ((portletRequest != null) && (portletResponse != null)) {
152 portletRequestModel = new PortletRequestModel(
153 portletRequest, portletResponse);
154 themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
155 WebKeys.THEME_DISPLAY);
156 }
157
158 JournalArticleDisplay articleDisplay =
159 JournalArticleLocalServiceUtil.getArticleDisplay(
160 _article, null, null, LanguageUtil.getLanguageId(locale), 1,
161 portletRequestModel, themeDisplay);
162
163 summary = StringUtil.shorten(
164 HtmlUtil.stripHtml(articleDisplay.getContent()), 200);
165 }
166 catch (Exception e) {
167 }
168
169 return summary;
170 }
171
172 @Override
173 public String getThumbnailPath(PortletRequest portletRequest)
174 throws Exception {
175
176 ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
177 WebKeys.THEME_DISPLAY);
178
179 String thumbnailSrc = _article.getArticleImageURL(themeDisplay);
180
181 if (Validator.isNotNull(thumbnailSrc)) {
182 return thumbnailSrc;
183 }
184
185 return themeDisplay.getPathThemeImages() +
186 "/file_system/large/article.png";
187 }
188
189 @Override
190 public String getTitle(Locale locale) {
191 return _article.getTitle(locale);
192 }
193
194 @Override
195 public String getType() {
196 return TYPE;
197 }
198
199 @Override
200 public PortletURL getURLEdit(
201 LiferayPortletRequest liferayPortletRequest,
202 LiferayPortletResponse liferayPortletResponse)
203 throws Exception {
204
205 PortletURL portletURL = liferayPortletResponse.createLiferayPortletURL(
206 getControlPanelPlid(liferayPortletRequest), PortletKeys.JOURNAL,
207 PortletRequest.RENDER_PHASE);
208
209 portletURL.setParameter("struts_action", "/journal/edit_article");
210 portletURL.setParameter(
211 "groupId", String.valueOf(_article.getGroupId()));
212 portletURL.setParameter("articleId", _article.getArticleId());
213 portletURL.setParameter(
214 "version", String.valueOf(_article.getVersion()));
215
216 return portletURL;
217 }
218
219 @Override
220 public PortletURL getURLExport(
221 LiferayPortletRequest liferayPortletRequest,
222 LiferayPortletResponse liferayPortletResponse) {
223
224 PortletURL portletURL = liferayPortletResponse.createActionURL();
225
226 portletURL.setParameter(
227 "struts_action", "/asset_publisher/export_journal_article");
228 portletURL.setParameter(
229 "groupId", String.valueOf(_article.getGroupId()));
230 portletURL.setParameter("articleId", _article.getArticleId());
231
232 return portletURL;
233 }
234
235 @Override
236 public String getUrlTitle() {
237 return _article.getUrlTitle();
238 }
239
240 @Override
241 public PortletURL getURLViewDiffs(
242 LiferayPortletRequest liferayPortletRequest,
243 LiferayPortletResponse liferayPortletResponse)
244 throws Exception {
245
246 PortletURL portletURL = liferayPortletResponse.createLiferayPortletURL(
247 getControlPanelPlid(liferayPortletRequest), PortletKeys.JOURNAL,
248 PortletRequest.RENDER_PHASE);
249
250 JournalArticle previousApprovedArticle =
251 JournalArticleLocalServiceUtil.getPreviousApprovedArticle(_article);
252
253 if (previousApprovedArticle.getVersion() == _article.getVersion()) {
254 return null;
255 }
256
257 portletURL.setParameter("struts_action", "/journal/compare_versions");
258 portletURL.setParameter(
259 "groupId", String.valueOf(_article.getGroupId()));
260 portletURL.setParameter("articleId", _article.getArticleId());
261 portletURL.setParameter(
262 "sourceVersion",
263 String.valueOf(previousApprovedArticle.getVersion()));
264 portletURL.setParameter(
265 "targetVersion", String.valueOf(_article.getVersion()));
266
267 return portletURL;
268 }
269
270 @Override
271 public String getURLViewInContext(
272 LiferayPortletRequest liferayPortletRequest,
273 LiferayPortletResponse liferayPortletResponse,
274 String noSuchEntryRedirect)
275 throws Exception {
276
277 ThemeDisplay themeDisplay =
278 (ThemeDisplay)liferayPortletRequest.getAttribute(
279 WebKeys.THEME_DISPLAY);
280
281 Layout layout = _article.getLayout();
282
283 if (layout == null) {
284 layout = themeDisplay.getLayout();
285 }
286
287 String portletId = (String)liferayPortletRequest.getAttribute(
288 WebKeys.PORTLET_ID);
289
290 PortletPreferences portletSetup =
291 PortletPreferencesFactoryUtil.getLayoutPortletSetup(
292 layout, portletId);
293
294 String linkToLayoutUuid = GetterUtil.getString(
295 portletSetup.getValue("portletSetupLinkToLayoutUuid", null));
296
297 if (Validator.isNotNull(_article.getLayoutUuid()) &&
298 Validator.isNull(linkToLayoutUuid)) {
299
300 Group group = themeDisplay.getScopeGroup();
301
302 if (group.getGroupId() != _article.getGroupId()) {
303 group = GroupLocalServiceUtil.getGroup(_article.getGroupId());
304 }
305
306 String groupFriendlyURL = PortalUtil.getGroupFriendlyURL(
307 LayoutSetLocalServiceUtil.getLayoutSet(
308 group.getGroupId(), layout.isPrivateLayout()),
309 themeDisplay);
310
311 return PortalUtil.addPreservedParameters(
312 themeDisplay,
313 groupFriendlyURL.concat(
314 JournalArticleConstants.CANONICAL_URL_SEPARATOR).concat(
315 _article.getUrlTitle()));
316 }
317
318 List<Long> hitLayoutIds =
319 JournalContentSearchLocalServiceUtil.getLayoutIds(
320 _article.getGroupId(), layout.isPrivateLayout(),
321 _article.getArticleId());
322
323 if (!hitLayoutIds.isEmpty()) {
324 Long hitLayoutId = hitLayoutIds.get(0);
325
326 Layout hitLayout = LayoutLocalServiceUtil.getLayout(
327 _article.getGroupId(), layout.isPrivateLayout(),
328 hitLayoutId.longValue());
329
330 return PortalUtil.getLayoutURL(hitLayout, themeDisplay);
331 }
332
333 return noSuchEntryRedirect;
334 }
335
336 @Override
337 public long getUserId() {
338 return _article.getUserId();
339 }
340
341 @Override
342 public String getUserName() {
343 return _article.getUserName();
344 }
345
346 @Override
347 public String getUuid() {
348 return _article.getUuid();
349 }
350
351 @Override
352 public String getViewInContextMessage() {
353 return "view[action]";
354 }
355
356 @Override
357 public boolean hasEditPermission(PermissionChecker permissionChecker)
358 throws PortalException {
359
360 return JournalArticlePermission.contains(
361 permissionChecker, _article, ActionKeys.UPDATE);
362 }
363
364 @Override
365 public boolean hasViewPermission(PermissionChecker permissionChecker)
366 throws PortalException {
367
368 return JournalArticlePermission.contains(
369 permissionChecker, _article, ActionKeys.VIEW);
370 }
371
372 @Override
373 public boolean isConvertible() {
374 return true;
375 }
376
377 @Override
378 public boolean isDisplayable() {
379 Date now = new Date();
380
381 Date displayDate = _article.getDisplayDate();
382
383 if ((displayDate != null) && displayDate.after(now)) {
384 return false;
385 }
386
387 Date expirationDate = _article.getExpirationDate();
388
389 if ((expirationDate != null) && expirationDate.before(now)) {
390 return false;
391 }
392
393 return true;
394 }
395
396 @Override
397 public boolean isLocalizable() {
398 return true;
399 }
400
401 @Override
402 public boolean isPrintable() {
403 return true;
404 }
405
406 @Override
407 public String render(
408 RenderRequest renderRequest, RenderResponse renderResponse,
409 String template)
410 throws Exception {
411
412 if (template.equals(TEMPLATE_ABSTRACT) ||
413 template.equals(TEMPLATE_FULL_CONTENT)) {
414
415 renderRequest.setAttribute(WebKeys.JOURNAL_ARTICLE, _article);
416
417 return "/html/portlet/journal/asset/" + template + ".jsp";
418 }
419 else {
420 return null;
421 }
422 }
423
424 @Override
425 protected String getIconPath(ThemeDisplay themeDisplay) {
426 return themeDisplay.getPathThemeImages() + "/common/history.png";
427 }
428
429 private final JournalArticle _article;
430
431 }