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.asset.model;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
019    import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
020    import com.liferay.portal.kernel.portlet.LiferayPortletURL;
021    import com.liferay.portal.kernel.util.HttpUtil;
022    import com.liferay.portal.kernel.util.LocaleUtil;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.kernel.util.WebKeys;
028    import com.liferay.portal.model.Group;
029    import com.liferay.portal.model.Layout;
030    import com.liferay.portal.security.permission.PermissionChecker;
031    import com.liferay.portal.theme.PortletDisplay;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portal.util.PortletKeys;
035    import com.liferay.portlet.asset.AssetRendererFactoryRegistryUtil;
036    import com.liferay.portlet.asset.provider.DisplayPortletProvider;
037    import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil;
038    import com.liferay.portlet.assetpublisher.util.AssetPublisherUtil;
039    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
040    import com.liferay.portlet.trash.util.TrashUtil;
041    import com.liferay.registry.collections.ServiceTrackerCollections;
042    import com.liferay.registry.collections.ServiceTrackerMap;
043    
044    import java.util.Date;
045    import java.util.Locale;
046    
047    import javax.portlet.PortletMode;
048    import javax.portlet.PortletPreferences;
049    import javax.portlet.PortletRequest;
050    import javax.portlet.PortletResponse;
051    import javax.portlet.PortletURL;
052    import javax.portlet.RenderRequest;
053    import javax.portlet.RenderResponse;
054    import javax.portlet.WindowState;
055    
056    /**
057     * @author Jorge Ferrer
058     * @author Sergio Gonz??lez
059     */
060    public abstract class BaseAssetRenderer implements AssetRenderer {
061    
062            @Override
063            public String getAddToPagePortletId() throws Exception {
064                    DisplayPortletProvider displayPortletProvider =
065                            _serviceTrackerMap.getService(getClassName());
066    
067                    if (displayPortletProvider != null) {
068                            return displayPortletProvider.getPortletId();
069                    }
070    
071                    return PortletKeys.ASSET_PUBLISHER;
072            }
073    
074            public AssetRendererFactory getAssetRendererFactory() {
075                    if (_assetRendererFactory != null) {
076                            return _assetRendererFactory;
077                    }
078    
079                    _assetRendererFactory =
080                            AssetRendererFactoryRegistryUtil.getAssetRendererFactoryByClassName(
081                                    getClassName());
082    
083                    return _assetRendererFactory;
084            }
085    
086            @Override
087            public int getAssetRendererType() {
088                    return _assetRendererType;
089            }
090    
091            @Override
092            public String[] getAvailableLanguageIds() {
093                    return _AVAILABLE_LANGUAGE_IDS;
094            }
095    
096            /**
097             * @deprecated As of 6.2.0, replaced by {@link #getAvailableLanguageIds}
098             */
099            @Deprecated
100            @Override
101            public String[] getAvailableLocales() {
102                    return getAvailableLanguageIds();
103            }
104    
105            @Override
106            public DDMFieldReader getDDMFieldReader() {
107                    return _nullDDMFieldReader;
108            }
109    
110            @Override
111            public String getDiscussionPath() {
112                    return null;
113            }
114    
115            @Override
116            public Date getDisplayDate() {
117                    return null;
118            }
119    
120            @Override
121            @SuppressWarnings("unused")
122            public String getIconCssClass() throws PortalException {
123                    return getAssetRendererFactory().getIconCssClass();
124            }
125    
126            @Override
127            public String getIconPath(PortletRequest portletRequest) {
128                    ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute(
129                            WebKeys.THEME_DISPLAY);
130    
131                    return getIconPath(themeDisplay);
132            }
133    
134            @Override
135            public String getNewName(String oldName, String token) {
136                    return TrashUtil.getNewName(oldName, token);
137            }
138    
139            @Override
140            public String getPreviewPath(
141                            PortletRequest portletRequest, PortletResponse PortletResponse)
142                    throws Exception {
143    
144                    return "/html/portlet/asset_publisher/display/preview.jsp";
145            }
146    
147            @Override
148            public String getSearchSummary(Locale locale) {
149                    return getSummary(null, null);
150            }
151    
152            @Override
153            public String getSummary() {
154                    return getSummary(null, null);
155            }
156    
157            /**
158             * @deprecated As of 7.0.0, replaced by {@link #getSummary(PortletRequest,
159             *             PortletResponse)}
160             */
161            @Deprecated
162            @Override
163            public String getSummary(Locale locale) {
164                    return getSummary(null, null);
165            }
166    
167            @Override
168            public String[] getSupportedConversions() {
169                    return null;
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                    return themeDisplay.getPathThemeImages() +
180                            "/file_system/large/default.png";
181            }
182    
183            @Override
184            public String getURLDownload(ThemeDisplay themeDisplay) {
185                    return null;
186            }
187    
188            @Override
189            public PortletURL getURLEdit(
190                            LiferayPortletRequest liferayPortletRequest,
191                            LiferayPortletResponse liferayPortletResponse)
192                    throws Exception {
193    
194                    return null;
195            }
196    
197            @Override
198            public PortletURL getURLEdit(
199                            LiferayPortletRequest liferayPortletRequest,
200                            LiferayPortletResponse liferayPortletResponse,
201                            WindowState windowState, PortletURL redirectURL)
202                    throws Exception {
203    
204                    LiferayPortletURL editPortletURL = (LiferayPortletURL)getURLEdit(
205                            liferayPortletRequest, liferayPortletResponse);
206    
207                    if (editPortletURL == null) {
208                            return null;
209                    }
210    
211                    ThemeDisplay themeDisplay =
212                            (ThemeDisplay)liferayPortletRequest.getAttribute(
213                                    WebKeys.THEME_DISPLAY);
214    
215                    Group group = themeDisplay.getScopeGroup();
216    
217                    if (group.isLayout()) {
218                            Layout layout = themeDisplay.getLayout();
219    
220                            group = layout.getGroup();
221                    }
222    
223                    if (group.hasStagingGroup()) {
224                            return null;
225                    }
226    
227                    editPortletURL.setDoAsGroupId(getGroupId());
228    
229                    editPortletURL.setParameter("redirect", redirectURL.toString());
230    
231                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
232    
233                    String portletResource = ParamUtil.getString(
234                            liferayPortletRequest, "portletResource", portletDisplay.getId());
235    
236                    if (Validator.isNotNull(portletResource)) {
237                            editPortletURL.setParameter(
238                                    "referringPortletResource", portletResource);
239                    }
240                    else {
241                            editPortletURL.setParameter(
242                                    "referringPortletResource", portletDisplay.getId());
243                    }
244    
245                    editPortletURL.setPortletMode(PortletMode.VIEW);
246                    editPortletURL.setRefererPlid(themeDisplay.getPlid());
247                    editPortletURL.setWindowState(windowState);
248    
249                    return editPortletURL;
250            }
251    
252            @Override
253            public PortletURL getURLExport(
254                            LiferayPortletRequest liferayPortletRequest,
255                            LiferayPortletResponse liferayPortletResponse)
256                    throws Exception {
257    
258                    return null;
259            }
260    
261            @Override
262            public String getURLImagePreview(PortletRequest portletRequest)
263                    throws Exception {
264    
265                    return getThumbnailPath(portletRequest);
266            }
267    
268            @Override
269            public String getUrlTitle() {
270                    return null;
271            }
272    
273            @Override
274            public PortletURL getURLView(
275                            LiferayPortletResponse liferayPortletResponse,
276                            WindowState windowState)
277                    throws Exception {
278    
279                    return null;
280            }
281    
282            @Override
283            public PortletURL getURLViewDiffs(
284                            LiferayPortletRequest liferayPortletRequest,
285                            LiferayPortletResponse liferayPortletResponse)
286                    throws Exception {
287    
288                    return null;
289            }
290    
291            @Override
292            public String getURLViewInContext(
293                            LiferayPortletRequest liferayPortletRequest,
294                            LiferayPortletResponse liferayPortletResponse,
295                            String noSuchEntryRedirect)
296                    throws Exception {
297    
298                    return null;
299            }
300    
301            @Override
302            public String getViewInContextMessage() {
303                    return "view-in-context";
304            }
305    
306            @Override
307            @SuppressWarnings("unused")
308            public boolean hasEditPermission(PermissionChecker permissionChecker)
309                    throws PortalException {
310    
311                    return false;
312            }
313    
314            @Override
315            @SuppressWarnings("unused")
316            public boolean hasViewPermission(PermissionChecker permissionChecker)
317                    throws PortalException {
318    
319                    return true;
320            }
321    
322            @Override
323            public boolean isConvertible() {
324                    return false;
325            }
326    
327            @Override
328            public boolean isDisplayable() {
329                    return true;
330            }
331    
332            @Override
333            public boolean isLocalizable() {
334                    return false;
335            }
336    
337            @Override
338            public boolean isPreviewInContext() {
339                    return false;
340            }
341    
342            @Override
343            public boolean isPrintable() {
344                    return false;
345            }
346    
347            public String renderActions(
348                            RenderRequest renderRequest, RenderResponse renderResponse)
349                    throws Exception {
350    
351                    return null;
352            }
353    
354            @Override
355            public void setAddToPagePreferences(
356                            PortletPreferences portletPreferences, String portletId,
357                            ThemeDisplay themeDisplay)
358                    throws Exception {
359    
360                    DisplayPortletProvider displayPortletProvider =
361                            _serviceTrackerMap.getService(getClassName());
362    
363                    if (displayPortletProvider != null) {
364                            displayPortletProvider.setPortletPreferences(
365                                    portletPreferences, portletId, getClassName(), getClassPK(),
366                                    themeDisplay);
367    
368                            return;
369                    }
370    
371                    portletPreferences.setValue("displayStyle", "full-content");
372                    portletPreferences.setValue(
373                            "emailAssetEntryAddedEnabled", Boolean.FALSE.toString());
374                    portletPreferences.setValue("selectionStyle", "manual");
375                    portletPreferences.setValue(
376                            "showAddContentButton", Boolean.FALSE.toString());
377    
378                    AssetEntry assetEntry = AssetEntryLocalServiceUtil.getEntry(
379                            getClassName(), getClassPK());
380    
381                    AssetPublisherUtil.addSelection(
382                            themeDisplay, portletPreferences, portletId,
383                            assetEntry.getEntryId(), -1, assetEntry.getClassName());
384            }
385    
386            public void setAssetRendererType(int assetRendererType) {
387                    _assetRendererType = assetRendererType;
388            }
389    
390            protected long getControlPanelPlid(
391                            LiferayPortletRequest liferayPortletRequest)
392                    throws PortalException {
393    
394                    return PortalUtil.getControlPanelPlid(liferayPortletRequest);
395            }
396    
397            protected long getControlPanelPlid(ThemeDisplay themeDisplay)
398                    throws PortalException {
399    
400                    return PortalUtil.getControlPanelPlid(themeDisplay.getCompanyId());
401            }
402    
403            protected String getIconPath(ThemeDisplay themeDisplay) {
404                    return themeDisplay.getPathThemeImages() + "/common/page.png";
405            }
406    
407            protected Locale getLocale(PortletRequest portletRequest) {
408                    if (portletRequest != null) {
409                            return portletRequest.getLocale();
410                    }
411    
412                    return LocaleUtil.getMostRelevantLocale();
413            }
414    
415            protected String getURLViewInContext(
416                    LiferayPortletRequest liferayPortletRequest, String noSuchEntryRedirect,
417                    String path, String primaryKeyParameterName,
418                    long primaryKeyParameterValue) {
419    
420                    ThemeDisplay themeDisplay =
421                            (ThemeDisplay)liferayPortletRequest.getAttribute(
422                                    WebKeys.THEME_DISPLAY);
423    
424                    StringBundler sb = new StringBundler(11);
425    
426                    sb.append(themeDisplay.getPortalURL());
427                    sb.append(themeDisplay.getPathMain());
428                    sb.append(path);
429                    sb.append("?p_l_id=");
430                    sb.append(themeDisplay.getPlid());
431                    sb.append("&noSuchEntryRedirect=");
432                    sb.append(HttpUtil.encodeURL(noSuchEntryRedirect));
433                    sb.append(StringPool.AMPERSAND);
434                    sb.append(primaryKeyParameterName);
435                    sb.append(StringPool.EQUAL);
436                    sb.append(primaryKeyParameterValue);
437    
438                    return PortalUtil.addPreservedParameters(themeDisplay, sb.toString());
439            }
440    
441            private static final String[] _AVAILABLE_LANGUAGE_IDS = new String[0];
442    
443            private static final DDMFieldReader _nullDDMFieldReader =
444                    new NullDDMFieldReader();
445            private static final ServiceTrackerMap<String, DisplayPortletProvider>
446                    _serviceTrackerMap = ServiceTrackerCollections.singleValueMap(
447                            DisplayPortletProvider.class, "model.class.name");
448    
449            static {
450                    _serviceTrackerMap.open();
451            }
452    
453            private AssetRendererFactory _assetRendererFactory;
454            private int _assetRendererType = AssetRendererFactory.TYPE_LATEST_APPROVED;
455    
456            private static final class NullDDMFieldReader implements DDMFieldReader {
457    
458                    @Override
459                    public Fields getFields() {
460                            return new Fields();
461                    }
462    
463                    @Override
464                    public Fields getFields(String ddmType) {
465                            return getFields();
466                    }
467    
468            }
469    
470    }