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.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    /**
061     * @author Julio Camarero
062     * @author Juan Fern??ndez
063     * @author Sergio Gonz??lez
064     * @author Raymond Aug??
065     */
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    }