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