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