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