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.portal.kernel.trash;
016    
017    import aQute.bnd.annotation.ProviderType;
018    
019    import com.liferay.portal.kernel.exception.PortalException;
020    import com.liferay.portal.kernel.exception.SystemException;
021    import com.liferay.portal.kernel.json.JSONFactoryUtil;
022    import com.liferay.portal.kernel.json.JSONObject;
023    import com.liferay.portal.kernel.log.Log;
024    import com.liferay.portal.kernel.log.LogFactoryUtil;
025    import com.liferay.portal.kernel.search.Query;
026    import com.liferay.portal.kernel.search.SearchContext;
027    import com.liferay.portal.kernel.search.filter.Filter;
028    import com.liferay.portal.kernel.util.StringPool;
029    import com.liferay.portal.model.ContainerModel;
030    import com.liferay.portal.model.SystemEvent;
031    import com.liferay.portal.model.SystemEventConstants;
032    import com.liferay.portal.model.TrashedModel;
033    import com.liferay.portal.security.permission.ActionKeys;
034    import com.liferay.portal.security.permission.PermissionChecker;
035    import com.liferay.portal.service.ServiceContext;
036    import com.liferay.portal.service.SystemEventLocalServiceUtil;
037    import com.liferay.portlet.asset.AssetRendererFactoryRegistryUtil;
038    import com.liferay.portlet.asset.model.AssetRenderer;
039    import com.liferay.portlet.asset.model.AssetRendererFactory;
040    import com.liferay.portlet.trash.model.TrashEntry;
041    
042    import java.util.Collections;
043    import java.util.List;
044    import java.util.Locale;
045    
046    import javax.portlet.PortletRequest;
047    
048    /**
049     * Provides the base implementation of {@link TrashHandler}.
050     *
051     * @author Alexander Chow
052     * @author Zsolt Berentey
053     * @see    TrashHandler
054     */
055    @ProviderType
056    public abstract class BaseTrashHandler implements TrashHandler {
057    
058            @Override
059            public SystemEvent addDeletionSystemEvent(
060                            long userId, long groupId, long classPK, String classUuid,
061                            String referrerClassName)
062                    throws PortalException {
063    
064                    JSONObject extraDataJSONObject = JSONFactoryUtil.createJSONObject();
065    
066                    extraDataJSONObject.put("inTrash", true);
067    
068                    return SystemEventLocalServiceUtil.addSystemEvent(
069                            userId, groupId, getSystemEventClassName(), classPK, classUuid,
070                            referrerClassName, SystemEventConstants.TYPE_DELETE,
071                            extraDataJSONObject.toString());
072            }
073    
074            /**
075             * @deprecated As of 7.0.0, replaced by {@link #checkRestorableEntry(long,
076             *             long, String)}
077             */
078            @Deprecated
079            @Override
080            public void checkDuplicateEntry(
081                            long classPK, long containerModelId, String newName)
082                    throws PortalException {
083    
084                    checkRestorableEntry(classPK, containerModelId, newName);
085            }
086    
087            /**
088             * @deprecated As of 7.0.0, replaced by {@link
089             *             #checkRestorableEntry(TrashEntry, long, String)}
090             */
091            @Deprecated
092            @Override
093            public void checkDuplicateTrashEntry(
094                            TrashEntry trashEntry, long containerModelId, String newName)
095                    throws PortalException {
096    
097                    checkRestorableEntry(trashEntry, containerModelId, newName);
098            }
099    
100            @Override
101            @SuppressWarnings("unused")
102            public void checkRestorableEntry(
103                            long classPK, long containerModelId, String newName)
104                    throws PortalException {
105            }
106    
107            @Override
108            @SuppressWarnings("unused")
109            public void checkRestorableEntry(
110                            TrashEntry trashEntry, long containerModelId, String newName)
111                    throws PortalException {
112            }
113    
114            @Override
115            @SuppressWarnings("unused")
116            public ContainerModel getContainerModel(long containerModelId)
117                    throws PortalException {
118    
119                    return null;
120            }
121    
122            /**
123             * @deprecated As of 7.0.0, replaced by {@link #getContainerModel(long)}
124             */
125            @Deprecated
126            @Override
127            public String getContainerModelClassName() {
128                    return getContainerModelClassName(0);
129            }
130    
131            @Override
132            public String getContainerModelClassName(long classPK) {
133                    return StringPool.BLANK;
134            }
135    
136            /**
137             * @deprecated As of 7.0.0, replaced by {@link #getContainerModelName(long)}
138             */
139            @Deprecated
140            @Override
141            public String getContainerModelName() {
142                    return StringPool.BLANK;
143            }
144    
145            /**
146             * @throws PortalException
147             */
148            @Override
149            public String getContainerModelName(long classPK) throws PortalException {
150                    return StringPool.BLANK;
151            }
152    
153            @Override
154            @SuppressWarnings("unused")
155            public List<ContainerModel> getContainerModels(
156                            long classPK, long containerModelId, int start, int end)
157                    throws PortalException {
158    
159                    return Collections.emptyList();
160            }
161    
162            @Override
163            @SuppressWarnings("unused")
164            public int getContainerModelsCount(long classPK, long containerModelId)
165                    throws PortalException {
166    
167                    return 0;
168            }
169    
170            @Override
171            public String getDeleteMessage() {
172                    return "deleted-in-x";
173            }
174    
175            @Override
176            public long getDestinationContainerModelId(
177                    long classPK, long destinationContainerModelId) {
178    
179                    return destinationContainerModelId;
180            }
181    
182            @Override
183            public Filter getExcludeFilter(SearchContext searchContext) {
184                    return null;
185            }
186    
187            /**
188             * @deprecated As of 7.0.0, replaced by {@link #getExcludeFilter(
189             *             SearchContext)}
190             */
191            @Deprecated
192            @Override
193            public Query getExcludeQuery(SearchContext searchContext) {
194                    return null;
195            }
196    
197            @Override
198            @SuppressWarnings("unused")
199            public ContainerModel getParentContainerModel(long classPK)
200                    throws PortalException {
201    
202                    return null;
203            }
204    
205            @Override
206            public ContainerModel getParentContainerModel(TrashedModel trashedModel)
207                    throws PortalException {
208    
209                    if ((trashedModel == null) ||
210                            !(trashedModel instanceof ContainerModel)) {
211    
212                            return null;
213                    }
214    
215                    ContainerModel containerModel = (ContainerModel)trashedModel;
216    
217                    return getContainerModel(containerModel.getParentContainerModelId());
218            }
219    
220            @Override
221            @SuppressWarnings("unused")
222            public List<ContainerModel> getParentContainerModels(long classPK)
223                    throws PortalException {
224    
225                    return Collections.emptyList();
226            }
227    
228            @Override
229            @SuppressWarnings("unused")
230            public String getRestoreContainedModelLink(
231                            PortletRequest portletRequest, long classPK)
232                    throws PortalException {
233    
234                    return StringPool.BLANK;
235            }
236    
237            @Override
238            @SuppressWarnings("unused")
239            public String getRestoreContainerModelLink(
240                            PortletRequest portletRequest, long classPK)
241                    throws PortalException {
242    
243                    return StringPool.BLANK;
244            }
245    
246            @Override
247            @SuppressWarnings("unused")
248            public String getRestoreMessage(PortletRequest portletRequest, long classPK)
249                    throws PortalException {
250    
251                    return StringPool.BLANK;
252            }
253    
254            @Override
255            public String getRootContainerModelClassName() {
256                    return getContainerModelClassName(0);
257            }
258    
259            /**
260             * @throws PortalException
261             */
262            @Override
263            public long getRootContainerModelId(long classPK) throws PortalException {
264                    return 0;
265            }
266    
267            @Override
268            public String getRootContainerModelName() {
269                    return StringPool.BLANK;
270            }
271    
272            /**
273             * @throws PortalException
274             */
275            @Override
276            public List<ContainerModel> getRootContainerModels(long groupId)
277                    throws PortalException {
278    
279                    return Collections.emptyList();
280            }
281    
282            @Override
283            public int getRootContainerModelsCount(long groupId) {
284                    return 0;
285            }
286    
287            /**
288             * @throws PortalException
289             */
290            @Override
291            public String getRootContainerModelTitle(
292                            long containerModelId, Locale locale)
293                    throws PortalException {
294    
295                    return StringPool.BLANK;
296            }
297    
298            @Override
299            public String getSubcontainerModelName() {
300                    return StringPool.BLANK;
301            }
302    
303            @Override
304            public String getSystemEventClassName() {
305                    return getClassName();
306            }
307    
308            @Override
309            public String getTrashContainedModelName() {
310                    return StringPool.BLANK;
311            }
312    
313            @Override
314            @SuppressWarnings("unused")
315            public int getTrashContainedModelsCount(long classPK)
316                    throws PortalException {
317    
318                    return 0;
319            }
320    
321            @Override
322            @SuppressWarnings("unused")
323            public List<TrashRenderer> getTrashContainedModelTrashRenderers(
324                            long classPK, int start, int end)
325                    throws PortalException {
326    
327                    return Collections.emptyList();
328            }
329    
330            @Override
331            public String getTrashContainerModelName() {
332                    return StringPool.BLANK;
333            }
334    
335            @Override
336            @SuppressWarnings("unused")
337            public int getTrashContainerModelsCount(long classPK)
338                    throws PortalException {
339    
340                    return 0;
341            }
342    
343            @Override
344            @SuppressWarnings("unused")
345            public List<TrashRenderer> getTrashContainerModelTrashRenderers(
346                            long classPK, int start, int end)
347                    throws PortalException {
348    
349                    return Collections.emptyList();
350            }
351    
352            @Override
353            @SuppressWarnings("unused")
354            public TrashEntry getTrashEntry(long classPK) throws PortalException {
355                    return null;
356            }
357    
358            @Override
359            public TrashRenderer getTrashRenderer(long classPK) throws PortalException {
360                    AssetRendererFactory assetRendererFactory = getAssetRendererFactory();
361    
362                    if (assetRendererFactory != null) {
363                            AssetRenderer assetRenderer = assetRendererFactory.getAssetRenderer(
364                                    classPK);
365    
366                            if (assetRenderer instanceof TrashRenderer) {
367                                    return (TrashRenderer)assetRenderer;
368                            }
369                    }
370    
371                    return null;
372            }
373    
374            @Override
375            public boolean hasTrashPermission(
376                            PermissionChecker permissionChecker, long groupId, long classPK,
377                            String trashActionId)
378                    throws PortalException {
379    
380                    String actionId = trashActionId;
381    
382                    if (trashActionId.equals(ActionKeys.DELETE)) {
383                            actionId = ActionKeys.DELETE;
384                    }
385                    else if (trashActionId.equals(TrashActionKeys.OVERWRITE)) {
386                            actionId = ActionKeys.DELETE;
387                    }
388                    else if (trashActionId.equals(TrashActionKeys.MOVE)) {
389                            return false;
390                    }
391                    else if (trashActionId.equals(TrashActionKeys.RENAME)) {
392                            actionId = ActionKeys.UPDATE;
393                    }
394                    else if (trashActionId.equals(TrashActionKeys.RESTORE)) {
395                            actionId = ActionKeys.DELETE;
396                    }
397    
398                    return hasPermission(permissionChecker, classPK, actionId);
399            }
400    
401            @Override
402            public boolean isContainerModel() {
403                    return false;
404            }
405    
406            @Override
407            public boolean isDeletable() {
408                    return true;
409            }
410    
411            @Override
412            @SuppressWarnings("unused")
413            public boolean isInTrashContainer(long classPK) throws PortalException {
414                    return false;
415            }
416    
417            @Override
418            public boolean isMovable() {
419                    return false;
420            }
421    
422            @Override
423            @SuppressWarnings("unused")
424            public boolean isRestorable(long classPK) throws PortalException {
425                    return true;
426            }
427    
428            @Override
429            public boolean isRootContainerModelMovable() {
430                    return false;
431            }
432    
433            @Override
434            @SuppressWarnings("unused")
435            public void moveEntry(
436                            long userId, long classPK, long containerModelId,
437                            ServiceContext serviceContext)
438                    throws PortalException {
439            }
440    
441            @Override
442            public void moveTrashEntry(
443                            long userId, long classPK, long containerModelId,
444                            ServiceContext serviceContext)
445                    throws PortalException {
446    
447                    if (isRestorable(classPK)) {
448                            restoreTrashEntry(userId, classPK);
449                    }
450    
451                    _log.error(
452                            "moveTrashEntry() is not implemented in " + getClass().getName());
453    
454                    throw new SystemException();
455            }
456    
457            @Override
458            @SuppressWarnings("unused")
459            public void restoreRelatedTrashEntry(String className, long classPK)
460                    throws PortalException {
461            }
462    
463            @Override
464            @SuppressWarnings("unused")
465            public void updateTitle(long classPK, String title) throws PortalException {
466            }
467    
468            protected AssetRendererFactory getAssetRendererFactory() {
469                    return AssetRendererFactoryRegistryUtil.
470                            getAssetRendererFactoryByClassName(getClassName());
471            }
472    
473            protected abstract boolean hasPermission(
474                            PermissionChecker permissionChecker, long classPK, String actionId)
475                    throws PortalException;
476    
477            private static final Log _log = LogFactoryUtil.getLog(
478                    BaseTrashHandler.class);
479    
480    }