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