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