Java tutorial
/** * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portlet.documentlibrary.util; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.messaging.DestinationNames; import com.liferay.portal.kernel.messaging.MessageBusException; import com.liferay.portal.kernel.messaging.MessageBusUtil; import com.liferay.portal.kernel.process.ClassPathUtil; import com.liferay.portal.kernel.process.ProcessCallable; import com.liferay.portal.kernel.process.ProcessException; import com.liferay.portal.kernel.process.ProcessExecutor; import com.liferay.portal.kernel.repository.model.FileVersion; import com.liferay.portal.kernel.util.FileUtil; import com.liferay.portal.kernel.util.InstancePool; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.ServerDetector; import com.liferay.portal.kernel.util.SetUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.log.Log4jLogFactoryImpl; import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion; import com.liferay.portal.util.PrefsPropsUtil; import com.liferay.portal.util.PropsUtil; import com.liferay.portal.util.PropsValues; import com.liferay.portlet.documentlibrary.NoSuchFileEntryException; import com.liferay.portlet.documentlibrary.store.DLStoreUtil; import com.liferay.util.log4j.Log4JUtil; import java.io.File; import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Vector; import org.apache.commons.lang.time.StopWatch; /** * @author Juan Gonzlez * @author Sergio Gonzlez * @author Mika Koivisto */ public class AudioProcessorImpl extends DefaultPreviewableProcessor implements AudioProcessor { public static AudioProcessorImpl getInstance() { return _instance; } public void generateAudio(FileVersion fileVersion) throws Exception { _instance._generateAudio(fileVersion); } public Set<String> getAudioMimeTypes() { return _instance._audioMimeTypes; } public InputStream getPreviewAsStream(FileVersion fileVersion) throws Exception { return _instance.doGetPreviewAsStream(fileVersion); } public long getPreviewFileSize(FileVersion fileVersion) throws Exception { return _instance.doGetPreviewFileSize(fileVersion); } public boolean hasAudio(FileVersion fileVersion) { boolean hasAudio = false; try { hasAudio = _instance._hasAudio(fileVersion); if (!hasAudio && _instance.isSupported(fileVersion)) { _instance._queueGeneration(fileVersion); } } catch (Exception e) { _log.error(e, e); } return hasAudio; } public boolean isAudioSupported(FileVersion fileVersion) { return _instance.isSupported(fileVersion); } public boolean isAudioSupported(String mimeType) { return _instance.isSupported(mimeType); } public boolean isSupported(String mimeType) { if (Validator.isNull(mimeType)) { return false; } try { if (PrefsPropsUtil.getBoolean(PropsKeys.XUGGLER_ENABLED, PropsValues.XUGGLER_ENABLED)) { return _audioMimeTypes.contains(mimeType); } } catch (Exception e) { } return false; } public void trigger(FileVersion fileVersion) { _instance._queueGeneration(fileVersion); } @Override protected String getPreviewType(FileVersion fileVersion) { return PREVIEW_TYPE; } @Override protected String getThumbnailType(FileVersion fileVersion) { return null; } private AudioProcessorImpl() { FileUtil.mkdirs(PREVIEW_TMP_PATH); } private void _generateAudio(FileVersion fileVersion) throws Exception { String tempFileId = DLUtil.getTempFileId(fileVersion.getFileEntryId(), fileVersion.getVersion()); File audioTempFile = _getAudioTempFile(tempFileId, fileVersion.getExtension()); File previewTempFile = getPreviewTempFile(tempFileId); try { if (!PrefsPropsUtil.getBoolean(PropsKeys.XUGGLER_ENABLED, PropsValues.XUGGLER_ENABLED) || _hasAudio(fileVersion)) { return; } if (_isGeneratePreview(fileVersion)) { File file = null; if (fileVersion instanceof LiferayFileVersion) { try { LiferayFileVersion liferayFileVersion = (LiferayFileVersion) fileVersion; file = liferayFileVersion.getFile(false); } catch (UnsupportedOperationException uoe) { } } if (file == null) { InputStream inputStream = fileVersion.getContentStream(false); FileUtil.write(audioTempFile, inputStream); file = audioTempFile; } try { _generateAudioXuggler(fileVersion, file, previewTempFile); } catch (Exception e) { _log.error(e, e); } } } catch (NoSuchFileEntryException nsfee) { } finally { _fileVersionIds.remove(fileVersion.getFileVersionId()); FileUtil.delete(audioTempFile); FileUtil.delete(previewTempFile); } } private void _generateAudioXuggler(FileVersion fileVersion, File srcFile, File destFile) throws Exception { StopWatch stopWatch = null; if (_log.isInfoEnabled()) { stopWatch = new StopWatch(); stopWatch.start(); } try { if (PropsValues.DL_FILE_ENTRY_PREVIEW_FORK_PROCESS_ENABLED) { ProcessCallable<String> processCallable = new LiferayAudioProcessCallable( ServerDetector.getServerId(), PropsUtil.get(PropsKeys.LIFERAY_HOME), Log4JUtil.getCustomLogSettings(), srcFile.getCanonicalPath(), destFile.getCanonicalPath()); ProcessExecutor.execute(processCallable, ClassPathUtil.getPortalClassPath()); } else { LiferayConverter liferayConverter = new LiferayAudioConverter(srcFile.getCanonicalPath(), destFile.getCanonicalPath()); liferayConverter.convert(); } } catch (Exception e) { _log.error(e, e); } addFileToStore(fileVersion.getCompanyId(), PREVIEW_PATH, getPreviewFilePath(fileVersion), destFile); if (_log.isInfoEnabled()) { _log.info("Xuggler generated a preview audio for " + fileVersion.getTitle() + " in " + stopWatch); } } private File _getAudioTempFile(String tempFileId, String targetExtension) { String audioTempFilePath = _getAudioTempFilePath(tempFileId, targetExtension); return new File(audioTempFilePath); } private String _getAudioTempFilePath(String tempFileId, String targetExtension) { StringBundler sb = new StringBundler(5); sb.append(PREVIEW_TMP_PATH); sb.append(tempFileId); if (PREVIEW_TYPE.equals(targetExtension)) { sb.append("_tmp"); } sb.append(StringPool.PERIOD); sb.append(targetExtension); return sb.toString(); } private boolean _hasAudio(FileVersion fileVersion) throws Exception { if (!isSupported(fileVersion)) { return false; } boolean previewExists = DLStoreUtil.hasFile(fileVersion.getCompanyId(), REPOSITORY_ID, getPreviewFilePath(fileVersion)); if (PropsValues.DL_FILE_ENTRY_PREVIEW_ENABLED && previewExists) { return true; } return false; } private boolean _isGeneratePreview(FileVersion fileVersion) throws Exception { String previewFilePath = getPreviewFilePath(fileVersion); if (PropsValues.DL_FILE_ENTRY_PREVIEW_ENABLED && !DLStoreUtil.hasFile(fileVersion.getCompanyId(), REPOSITORY_ID, previewFilePath)) { return true; } else { return false; } } private void _queueGeneration(FileVersion fileVersion) { if (_fileVersionIds.contains(fileVersion.getFileVersionId()) || !isSupported(fileVersion)) { return; } _fileVersionIds.add(fileVersion.getFileVersionId()); if (PropsValues.DL_FILE_ENTRY_PROCESSORS_TRIGGER_SYNCHRONOUSLY) { try { MessageBusUtil.sendSynchronousMessage(DestinationNames.DOCUMENT_LIBRARY_AUDIO_PROCESSOR, fileVersion); } catch (MessageBusException mbe) { if (_log.isWarnEnabled()) { _log.warn(mbe, mbe); } } } else { MessageBusUtil.sendMessage(DestinationNames.DOCUMENT_LIBRARY_AUDIO_PROCESSOR, fileVersion); } } private static Log _log = LogFactoryUtil.getLog(AudioProcessorImpl.class); private static AudioProcessorImpl _instance = new AudioProcessorImpl(); static { InstancePool.put(AudioProcessorImpl.class.getName(), _instance); } private Set<String> _audioMimeTypes = SetUtil.fromArray(PropsValues.DL_FILE_ENTRY_PREVIEW_AUDIO_MIME_TYPES); private List<Long> _fileVersionIds = new Vector<Long>(); private static class LiferayAudioProcessCallable implements ProcessCallable<String> { public LiferayAudioProcessCallable(String serverId, String liferayHome, Map<String, String> customLogSettings, String inputURL, String outputURL) { _serverId = serverId; _liferayHome = liferayHome; _customLogSettings = customLogSettings; _inputURL = inputURL; _outputURL = outputURL; } public String call() throws ProcessException { Class<?> clazz = getClass(); ClassLoader classLoader = clazz.getClassLoader(); Log4JUtil.initLog4J(_serverId, _liferayHome, classLoader, new Log4jLogFactoryImpl(), _customLogSettings); try { LiferayConverter liferayConverter = new LiferayAudioConverter(_inputURL, _outputURL); liferayConverter.convert(); } catch (Exception e) { throw new ProcessException(e); } return StringPool.BLANK; } private Map<String, String> _customLogSettings; private String _inputURL; private String _liferayHome; private String _outputURL; private String _serverId; } }