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