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.asset.kernel.AssetRendererFactoryRegistryUtil;
020    import com.liferay.asset.kernel.model.AssetRenderer;
021    import com.liferay.asset.kernel.model.AssetRendererFactory;
022    import com.liferay.portal.kernel.exception.PortalException;
023    import com.liferay.portal.kernel.exception.SystemException;
024    import com.liferay.portal.kernel.json.JSONFactoryUtil;
025    import com.liferay.portal.kernel.json.JSONObject;
026    import com.liferay.portal.kernel.log.Log;
027    import com.liferay.portal.kernel.log.LogFactoryUtil;
028    import com.liferay.portal.kernel.model.ContainerModel;
029    import com.liferay.portal.kernel.model.SystemEvent;
030    import com.liferay.portal.kernel.model.SystemEventConstants;
031    import com.liferay.portal.kernel.model.TrashedModel;
032    import com.liferay.portal.kernel.search.Query;
033    import com.liferay.portal.kernel.search.SearchContext;
034    import com.liferay.portal.kernel.search.filter.Filter;
035    import com.liferay.portal.kernel.security.permission.ActionKeys;
036    import com.liferay.portal.kernel.security.permission.PermissionChecker;
037    import com.liferay.portal.kernel.service.ServiceContext;
038    import com.liferay.portal.kernel.service.SystemEventLocalServiceUtil;
039    import com.liferay.portal.kernel.util.OrderByComparator;
040    import com.liferay.portal.kernel.util.StringPool;
041    import com.liferay.trash.kernel.model.TrashEntry;
042    
043    import java.util.Collections;
044    import java.util.List;
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            @Override
137            public String getContainerModelName() {
138                    return StringPool.BLANK;
139            }
140    
141            @Override
142            @SuppressWarnings("unused")
143            public List<ContainerModel> getContainerModels(
144                            long classPK, long containerModelId, int start, int end)
145                    throws PortalException {
146    
147                    return Collections.emptyList();
148            }
149    
150            @Override
151            @SuppressWarnings("unused")
152            public int getContainerModelsCount(long classPK, long containerModelId)
153                    throws PortalException {
154    
155                    return 0;
156            }
157    
158            @Override
159            public String getDeleteMessage() {
160                    return "deleted-in-x";
161            }
162    
163            @Override
164            public long getDestinationContainerModelId(
165                    long classPK, long destinationContainerModelId) {
166    
167                    return destinationContainerModelId;
168            }
169    
170            @Override
171            public Filter getExcludeFilter(SearchContext searchContext) {
172                    return null;
173            }
174    
175            /**
176             * @deprecated As of 7.0.0, replaced by {@link
177             *             #getExcludeFilter(SearchContext)}
178             */
179            @Deprecated
180            @Override
181            public Query getExcludeQuery(SearchContext searchContext) {
182                    return null;
183            }
184    
185            @Override
186            @SuppressWarnings("unused")
187            public ContainerModel getParentContainerModel(long classPK)
188                    throws PortalException {
189    
190                    return null;
191            }
192    
193            @Override
194            public ContainerModel getParentContainerModel(TrashedModel trashedModel)
195                    throws PortalException {
196    
197                    if ((trashedModel == null) ||
198                            !(trashedModel instanceof ContainerModel)) {
199    
200                            return null;
201                    }
202    
203                    ContainerModel containerModel = (ContainerModel)trashedModel;
204    
205                    return getContainerModel(containerModel.getParentContainerModelId());
206            }
207    
208            @Override
209            @SuppressWarnings("unused")
210            public List<ContainerModel> getParentContainerModels(long classPK)
211                    throws PortalException {
212    
213                    return Collections.emptyList();
214            }
215    
216            @Override
217            @SuppressWarnings("unused")
218            public String getRestoreContainedModelLink(
219                            PortletRequest portletRequest, long classPK)
220                    throws PortalException {
221    
222                    return StringPool.BLANK;
223            }
224    
225            @Override
226            @SuppressWarnings("unused")
227            public String getRestoreContainerModelLink(
228                            PortletRequest portletRequest, long classPK)
229                    throws PortalException {
230    
231                    return StringPool.BLANK;
232            }
233    
234            @Override
235            @SuppressWarnings("unused")
236            public String getRestoreMessage(PortletRequest portletRequest, long classPK)
237                    throws PortalException {
238    
239                    return StringPool.BLANK;
240            }
241    
242            @Override
243            public String getRootContainerModelName() {
244                    return StringPool.BLANK;
245            }
246    
247            @Override
248            public String getSubcontainerModelName() {
249                    return StringPool.BLANK;
250            }
251    
252            @Override
253            public String getSystemEventClassName() {
254                    return getClassName();
255            }
256    
257            @Override
258            public String getTrashContainedModelName() {
259                    return StringPool.BLANK;
260            }
261    
262            @Override
263            @SuppressWarnings("unused")
264            public int getTrashContainedModelsCount(long classPK)
265                    throws PortalException {
266    
267                    return 0;
268            }
269    
270            @Override
271            @SuppressWarnings("unused")
272            public List<TrashRenderer> getTrashContainedModelTrashRenderers(
273                            long classPK, int start, int end)
274                    throws PortalException {
275    
276                    return Collections.emptyList();
277            }
278    
279            @Override
280            public String getTrashContainerModelName() {
281                    return StringPool.BLANK;
282            }
283    
284            @Override
285            @SuppressWarnings("unused")
286            public int getTrashContainerModelsCount(long classPK)
287                    throws PortalException {
288    
289                    return 0;
290            }
291    
292            @Override
293            @SuppressWarnings("unused")
294            public List<TrashRenderer> getTrashContainerModelTrashRenderers(
295                            long classPK, int start, int end)
296                    throws PortalException {
297    
298                    return Collections.emptyList();
299            }
300    
301            @Override
302            @SuppressWarnings("unused")
303            public TrashEntry getTrashEntry(long classPK) throws PortalException {
304                    return null;
305            }
306    
307            @Override
308            @SuppressWarnings("unused")
309            public int getTrashModelsCount(long classPK) throws PortalException {
310                    return 0;
311            }
312    
313            @Override
314            @SuppressWarnings("unused")
315            public List<TrashRenderer> getTrashModelTrashRenderers(
316                            long classPK, int start, int end, OrderByComparator<?> obc)
317                    throws PortalException {
318    
319                    return Collections.emptyList();
320            }
321    
322            @Override
323            public TrashRenderer getTrashRenderer(long classPK) throws PortalException {
324                    AssetRendererFactory<?> assetRendererFactory =
325                            getAssetRendererFactory();
326    
327                    if (assetRendererFactory != null) {
328                            AssetRenderer<?> assetRenderer =
329                                    assetRendererFactory.getAssetRenderer(classPK);
330    
331                            if (assetRenderer instanceof TrashRenderer) {
332                                    return (TrashRenderer)assetRenderer;
333                            }
334                    }
335    
336                    return null;
337            }
338    
339            @Override
340            public boolean hasTrashPermission(
341                            PermissionChecker permissionChecker, long groupId, long classPK,
342                            String trashActionId)
343                    throws PortalException {
344    
345                    String actionId = trashActionId;
346    
347                    if (trashActionId.equals(ActionKeys.DELETE)) {
348                            actionId = ActionKeys.DELETE;
349                    }
350                    else if (trashActionId.equals(TrashActionKeys.OVERWRITE)) {
351                            actionId = ActionKeys.DELETE;
352                    }
353                    else if (trashActionId.equals(TrashActionKeys.MOVE)) {
354                            return false;
355                    }
356                    else if (trashActionId.equals(TrashActionKeys.RENAME)) {
357                            actionId = ActionKeys.UPDATE;
358                    }
359                    else if (trashActionId.equals(TrashActionKeys.RESTORE)) {
360                            actionId = ActionKeys.DELETE;
361                    }
362    
363                    return hasPermission(permissionChecker, classPK, actionId);
364            }
365    
366            @Override
367            public boolean isContainerModel() {
368                    return false;
369            }
370    
371            @Override
372            public boolean isDeletable() {
373                    return true;
374            }
375    
376            @Override
377            @SuppressWarnings("unused")
378            public boolean isInTrashContainer(long classPK) throws PortalException {
379                    return false;
380            }
381    
382            @Override
383            public boolean isMovable() {
384                    return false;
385            }
386    
387            @Override
388            @SuppressWarnings("unused")
389            public boolean isRestorable(long classPK) throws PortalException {
390                    return true;
391            }
392    
393            @Override
394            @SuppressWarnings("unused")
395            public void moveEntry(
396                            long userId, long classPK, long containerModelId,
397                            ServiceContext serviceContext)
398                    throws PortalException {
399            }
400    
401            @Override
402            public void moveTrashEntry(
403                            long userId, long classPK, long containerModelId,
404                            ServiceContext serviceContext)
405                    throws PortalException {
406    
407                    if (isRestorable(classPK)) {
408                            restoreTrashEntry(userId, classPK);
409                    }
410    
411                    _log.error(
412                            "moveTrashEntry() is not implemented in " + getClass().getName());
413    
414                    throw new SystemException();
415            }
416    
417            @Override
418            @SuppressWarnings("unused")
419            public void restoreRelatedTrashEntry(String className, long classPK)
420                    throws PortalException {
421            }
422    
423            @Override
424            @SuppressWarnings("unused")
425            public void updateTitle(long classPK, String title) throws PortalException {
426            }
427    
428            protected AssetRendererFactory<?> getAssetRendererFactory() {
429                    return AssetRendererFactoryRegistryUtil.
430                            getAssetRendererFactoryByClassName(getClassName());
431            }
432    
433            protected abstract boolean hasPermission(
434                            PermissionChecker permissionChecker, long classPK, String actionId)
435                    throws PortalException;
436    
437            private static final Log _log = LogFactoryUtil.getLog(
438                    BaseTrashHandler.class);
439    
440    }