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