com.liferay.portlet.documentlibrary.util.AudioProcessorImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.portlet.documentlibrary.util.AudioProcessorImpl.java

Source

/**
 * 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;

    }

}