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.repository.capabilities;
016    
017    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
019    import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
020    import com.liferay.portal.kernel.exception.PortalException;
021    import com.liferay.portal.kernel.repository.DocumentRepository;
022    import com.liferay.portal.kernel.repository.capabilities.BulkOperationCapability;
023    import com.liferay.portal.kernel.repository.model.FileEntry;
024    import com.liferay.portal.kernel.repository.model.Folder;
025    import com.liferay.portal.kernel.repository.model.RepositoryModelOperation;
026    import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
027    import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
028    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
029    import com.liferay.portlet.documentlibrary.model.DLFolder;
030    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
031    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
032    
033    import java.util.HashMap;
034    import java.util.Map;
035    
036    /**
037     * @author Adolfo P??rez
038     */
039    public class LiferayBulkOperationCapability implements BulkOperationCapability {
040    
041            public LiferayBulkOperationCapability(
042                    DocumentRepository documentRepository) {
043    
044                    _documentRepository = documentRepository;
045            }
046    
047            @Override
048            public void execute(
049                            BulkOperationCapability.Filter<?> filter,
050                            RepositoryModelOperation repositoryModelOperation)
051                    throws PortalException {
052    
053                    executeOnAllFileEntries(filter, repositoryModelOperation);
054                    executeOnAllFolders(filter, repositoryModelOperation);
055            }
056    
057            @Override
058            public void execute(RepositoryModelOperation repositoryModelOperation)
059                    throws PortalException {
060    
061                    execute(null, repositoryModelOperation);
062            }
063    
064            protected void executeOnAllFileEntries(
065                            Filter<?> filter, RepositoryModelOperation repositoryModelOperation)
066                    throws PortalException {
067    
068                    ActionableDynamicQuery actionableDynamicQuery =
069                            DLFileEntryLocalServiceUtil.getActionableDynamicQuery();
070    
071                    actionableDynamicQuery.setAddCriteriaMethod(
072                            new RepositoryModelAddCriteriaMethod(filter));
073                    actionableDynamicQuery.setPerformActionMethod(
074                            new FileEntryPerformActionMethod(repositoryModelOperation));
075    
076                    actionableDynamicQuery.performActions();
077            }
078    
079            protected void executeOnAllFolders(
080                            Filter<?> filter, RepositoryModelOperation repositoryModelOperation)
081                    throws PortalException {
082    
083                    ActionableDynamicQuery actionableDynamicQuery =
084                            DLFolderLocalServiceUtil.getActionableDynamicQuery();
085    
086                    actionableDynamicQuery.setAddCriteriaMethod(
087                            new RepositoryModelAddCriteriaMethod(filter));
088                    actionableDynamicQuery.setPerformActionMethod(
089                            new FolderPerformActionMethod(repositoryModelOperation));
090    
091                    actionableDynamicQuery.performActions();
092            }
093    
094            private static final Map<Class<? extends Field<?>>, String> _fieldNames =
095                    new HashMap<>();
096    
097            static {
098                    _fieldNames.put(Field.CreateDate.class, "createDate");
099            }
100    
101            private final DocumentRepository _documentRepository;
102    
103            private static class FileEntryPerformActionMethod
104                    implements ActionableDynamicQuery.PerformActionMethod {
105    
106                    public FileEntryPerformActionMethod(
107                            RepositoryModelOperation repositoryModelOperation) {
108    
109                            _repositoryModelOperation = repositoryModelOperation;
110                    }
111    
112                    @Override
113                    public void performAction(Object object) throws PortalException {
114                            DLFileEntry dlFileEntry = (DLFileEntry)object;
115    
116                            FileEntry fileEntry = new LiferayFileEntry(dlFileEntry);
117    
118                            fileEntry.execute(_repositoryModelOperation);
119                    }
120    
121                    private RepositoryModelOperation _repositoryModelOperation;
122    
123            }
124    
125            private static class FolderPerformActionMethod
126                    implements ActionableDynamicQuery.PerformActionMethod {
127    
128                    public FolderPerformActionMethod(
129                            RepositoryModelOperation repositoryModelOperation) {
130    
131                            _repositoryModelOperation = repositoryModelOperation;
132                    }
133    
134                    @Override
135                    public void performAction(Object object) throws PortalException {
136                            DLFolder dlFolder = (DLFolder)object;
137    
138                            if (dlFolder.isMountPoint()) {
139                                    return;
140                            }
141    
142                            Folder folder = new LiferayFolder(dlFolder);
143    
144                            folder.execute(_repositoryModelOperation);
145                    }
146    
147                    private final RepositoryModelOperation _repositoryModelOperation;
148    
149            }
150    
151            private class RepositoryModelAddCriteriaMethod
152                    implements ActionableDynamicQuery.AddCriteriaMethod {
153    
154                    public RepositoryModelAddCriteriaMethod(Filter<?> filter) {
155                            _filter = filter;
156                    }
157    
158                    @Override
159                    public void addCriteria(DynamicQuery dynamicQuery) {
160                            dynamicQuery.add(
161                                    RestrictionsFactoryUtil.eq(
162                                            "repositoryId", _documentRepository.getRepositoryId()));
163    
164                            if (_filter != null) {
165                                    addFilterCriteria(dynamicQuery);
166                            }
167                    }
168    
169                    protected void addFilterCriteria(DynamicQuery dynamicQuery) {
170                            Class<? extends Field<?>> field = _filter.getField();
171    
172                            String fieldName = _fieldNames.get(field);
173    
174                            if (fieldName == null) {
175                                    throw new UnsupportedOperationException(
176                                            "Unsupported field " + field.getName());
177                            }
178    
179                            Operator operator = _filter.getOperator();
180    
181                            Object value = _filter.getValue();
182    
183                            if (operator == Operator.EQ) {
184                                    dynamicQuery.add(RestrictionsFactoryUtil.eq(fieldName, value));
185                            }
186                            else if (operator == Operator.LE) {
187                                    dynamicQuery.add(RestrictionsFactoryUtil.le(fieldName, value));
188                            }
189                            else if (operator == Operator.LT) {
190                                    dynamicQuery.add(RestrictionsFactoryUtil.lt(fieldName, value));
191                            }
192                            else if (operator == Operator.GE) {
193                                    dynamicQuery.add(RestrictionsFactoryUtil.ge(fieldName, value));
194                            }
195                            else if (operator == Operator.GT) {
196                                    dynamicQuery.add(RestrictionsFactoryUtil.gt(fieldName, value));
197                            }
198                    }
199    
200                    private final Filter<?> _filter;
201    
202            }
203    
204    }