001    /**
002     * Copyright (c) 2000-2013 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.portlet.documentlibrary.util;
016    
017    import com.liferay.portal.kernel.lar.PortletDataContext;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.repository.model.FileEntry;
021    import com.liferay.portal.kernel.repository.model.FileVersion;
022    import com.liferay.portal.kernel.security.pacl.DoPrivileged;
023    import com.liferay.portal.kernel.util.InstanceFactory;
024    import com.liferay.portal.kernel.util.PropsKeys;
025    import com.liferay.portal.kernel.util.PropsUtil;
026    import com.liferay.portal.kernel.xml.Element;
027    import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
028    import com.liferay.portal.util.ClassLoaderUtil;
029    import com.liferay.portal.util.PrefsPropsUtil;
030    import com.liferay.portal.util.PropsValues;
031    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
032    import com.liferay.portlet.documentlibrary.model.DLProcessorConstants;
033    
034    import java.util.Map;
035    import java.util.concurrent.ConcurrentHashMap;
036    
037    /**
038     * @author Mika Koivisto
039     */
040    @DoPrivileged
041    public class DLProcessorRegistryImpl implements DLProcessorRegistry {
042    
043            public void afterPropertiesSet() throws Exception {
044                    ClassLoader classLoader = ClassLoaderUtil.getPortalClassLoader();
045    
046                    for (String dlProcessorClassName : _DL_FILE_ENTRY_PROCESSORS) {
047                            DLProcessor dlProcessor = (DLProcessor)InstanceFactory.newInstance(
048                                    classLoader, dlProcessorClassName);
049    
050                            dlProcessor.afterPropertiesSet();
051    
052                            register(dlProcessor);
053                    }
054            }
055    
056            @Override
057            public void cleanUp(FileEntry fileEntry) {
058                    if (!DLProcessorThreadLocal.isEnabled()) {
059                            return;
060                    }
061    
062                    for (DLProcessor dlProcessor : _dlProcessors.values()) {
063                            if (dlProcessor.isSupported(fileEntry.getMimeType())) {
064                                    dlProcessor.cleanUp(fileEntry);
065                            }
066                    }
067            }
068    
069            @Override
070            public void cleanUp(FileVersion fileVersion) {
071                    if (!DLProcessorThreadLocal.isEnabled()) {
072                            return;
073                    }
074    
075                    for (DLProcessor dlProcessor : _dlProcessors.values()) {
076                            if (dlProcessor.isSupported(fileVersion)) {
077                                    dlProcessor.cleanUp(fileVersion);
078                            }
079                    }
080            }
081    
082            @Override
083            public void exportGeneratedFiles(
084                            PortletDataContext portletDataContext, FileEntry fileEntry,
085                            Element fileEntryElement)
086                    throws Exception {
087    
088                    if ((fileEntry == null) || (fileEntry.getSize() == 0)) {
089                            return;
090                    }
091    
092                    FileVersion latestFileVersion = _getLatestFileVersion(fileEntry, true);
093    
094                    if (latestFileVersion == null) {
095                            return;
096                    }
097    
098                    for (DLProcessor dlProcessor : _dlProcessors.values()) {
099                            if (dlProcessor.isSupported(latestFileVersion)) {
100                                    dlProcessor.exportGeneratedFiles(
101                                            portletDataContext, fileEntry, fileEntryElement);
102                            }
103                    }
104            }
105    
106            @Override
107            public DLProcessor getDLProcessor(String dlProcessorType) {
108                    return _dlProcessors.get(dlProcessorType);
109            }
110    
111            @Override
112            public void importGeneratedFiles(
113                            PortletDataContext portletDataContext, FileEntry fileEntry,
114                            FileEntry importedFileEntry, Element fileEntryElement)
115                    throws Exception {
116    
117                    if ((importedFileEntry == null) || (importedFileEntry.getSize() == 0)) {
118                            return;
119                    }
120    
121                    FileVersion fileVersion = importedFileEntry.getFileVersion();
122    
123                    if (fileVersion == null) {
124                            return;
125                    }
126    
127                    for (DLProcessor dlProcessor : _dlProcessors.values()) {
128                            if (dlProcessor.isSupported(fileVersion)) {
129                                    dlProcessor.importGeneratedFiles(
130                                            portletDataContext, fileEntry, importedFileEntry,
131                                            fileEntryElement);
132                            }
133                    }
134            }
135    
136            @Override
137            public boolean isPreviewableSize(FileVersion fileVersion) {
138                    long fileEntryPreviewableProcessorMaxSize =
139                            PropsValues.DL_FILE_ENTRY_PREVIEWABLE_PROCESSOR_MAX_SIZE;
140    
141                    try {
142                            fileEntryPreviewableProcessorMaxSize = PrefsPropsUtil.getLong(
143                                    PropsKeys.DL_FILE_ENTRY_PREVIEWABLE_PROCESSOR_MAX_SIZE);
144                    }
145                    catch (Exception e) {
146                            _log.error(e, e);
147                    }
148    
149                    if (fileEntryPreviewableProcessorMaxSize == 0) {
150                            return false;
151                    }
152    
153                    if ((fileEntryPreviewableProcessorMaxSize > 0) &&
154                            (fileVersion.getSize() > fileEntryPreviewableProcessorMaxSize)) {
155    
156                            return false;
157                    }
158    
159                    return true;
160            }
161    
162            @Override
163            public void register(DLProcessor dlProcessor) {
164                    String type = _getType(dlProcessor);
165    
166                    _dlProcessors.put(type, dlProcessor);
167            }
168    
169            @Override
170            public void trigger(FileEntry fileEntry, FileVersion fileVersion) {
171                    trigger(fileEntry, fileVersion, false);
172            }
173    
174            @Override
175            public void trigger(
176                    FileEntry fileEntry, FileVersion fileVersion, boolean trusted) {
177    
178                    if (!DLProcessorThreadLocal.isEnabled()) {
179                            return;
180                    }
181    
182                    if ((fileEntry == null) || (fileEntry.getSize() == 0)) {
183                            return;
184                    }
185    
186                    FileVersion latestFileVersion = _getLatestFileVersion(
187                            fileEntry, trusted);
188    
189                    if (latestFileVersion == null) {
190                            return;
191                    }
192    
193                    for (DLProcessor dlProcessor : _dlProcessors.values()) {
194                            if (dlProcessor.isSupported(latestFileVersion)) {
195                                    dlProcessor.trigger(fileVersion, latestFileVersion);
196                            }
197                    }
198            }
199    
200            @Override
201            public void unregister(DLProcessor dlProcessor) {
202                    String type = _getType(dlProcessor);
203    
204                    _dlProcessors.remove(type);
205            }
206    
207            private FileVersion _getLatestFileVersion(
208                    FileEntry fileEntry, boolean trusted) {
209    
210                    FileVersion latestFileVersion = null;
211    
212                    try {
213                            if (fileEntry.getModel() instanceof DLFileEntry) {
214                                    DLFileEntry dlFileEntry = (DLFileEntry)fileEntry.getModel();
215    
216                                    latestFileVersion = new LiferayFileVersion(
217                                            dlFileEntry.getLatestFileVersion(trusted));
218                            }
219                            else {
220                                    latestFileVersion = fileEntry.getLatestFileVersion();
221                            }
222    
223                            return latestFileVersion;
224                    }
225                    catch (Exception e) {
226                            _log.error(e, e);
227    
228                            return null;
229                    }
230            }
231    
232            private String _getType(DLProcessor dlProcessor) {
233                    if (dlProcessor instanceof AudioProcessor) {
234                            return DLProcessorConstants.AUDIO_PROCESSOR;
235                    }
236                    else if (dlProcessor instanceof ImageProcessor) {
237                            return DLProcessorConstants.IMAGE_PROCESSOR;
238                    }
239                    else if (dlProcessor instanceof PDFProcessor) {
240                            return DLProcessorConstants.PDF_PROCESSOR;
241                    }
242                    else if (dlProcessor instanceof RawMetadataProcessor) {
243                            return DLProcessorConstants.RAW_METADATA_PROCESSOR;
244                    }
245                    else if (dlProcessor instanceof VideoProcessor) {
246                            return DLProcessorConstants.VIDEO_PROCESSOR;
247                    }
248    
249                    return null;
250            }
251    
252            private static final String[] _DL_FILE_ENTRY_PROCESSORS =
253                    PropsUtil.getArray(PropsKeys.DL_FILE_ENTRY_PROCESSORS);
254    
255            private static Log _log = LogFactoryUtil.getLog(
256                    DLProcessorRegistryImpl.class);
257    
258            private Map<String, DLProcessor> _dlProcessors =
259                    new ConcurrentHashMap<String, DLProcessor>();
260    
261    }