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