001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portlet.documentlibrary.util;
016    
017    import com.liferay.portal.kernel.dao.orm.QueryUtil;
018    import com.liferay.portal.kernel.exception.PortalException;
019    import com.liferay.portal.kernel.exception.SystemException;
020    import com.liferay.portal.kernel.lar.PortletDataContext;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.messaging.DestinationNames;
024    import com.liferay.portal.kernel.messaging.MessageBusException;
025    import com.liferay.portal.kernel.messaging.MessageBusUtil;
026    import com.liferay.portal.kernel.metadata.RawMetadataProcessorUtil;
027    import com.liferay.portal.kernel.repository.model.FileEntry;
028    import com.liferay.portal.kernel.repository.model.FileVersion;
029    import com.liferay.portal.kernel.search.Indexer;
030    import com.liferay.portal.kernel.search.IndexerRegistryUtil;
031    import com.liferay.portal.kernel.util.InstancePool;
032    import com.liferay.portal.kernel.util.StreamUtil;
033    import com.liferay.portal.kernel.xml.Element;
034    import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
035    import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
036    import com.liferay.portal.service.ServiceContext;
037    import com.liferay.portal.util.PortalUtil;
038    import com.liferay.portal.util.PropsValues;
039    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
040    import com.liferay.portlet.documentlibrary.model.DLFileEntryConstants;
041    import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
042    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
043    import com.liferay.portlet.dynamicdatamapping.service.DDMStructureLocalServiceUtil;
044    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
045    
046    import java.io.File;
047    import java.io.InputStream;
048    
049    import java.util.List;
050    import java.util.Map;
051    
052    /**
053     * @author Alexander Chow
054     * @author Mika Koivisto
055     * @author Miguel Pastor
056     */
057    public class RawMetadataProcessorImpl
058            extends BaseDLProcessorImpl implements RawMetadataProcessor {
059    
060            public static RawMetadataProcessorImpl getInstance() {
061                    return _instance;
062            }
063    
064            public void cleanUp(FileEntry fileEntry) {
065            }
066    
067            public void cleanUp(FileVersion fileVersion) {
068            }
069    
070            public void exportGeneratedFiles(
071                            PortletDataContext portletDataContext, FileEntry fileEntry,
072                            Element fileEntryElement)
073                    throws Exception {
074    
075                    return;
076            }
077    
078            public void generateMetadata(FileVersion fileVersion)
079                    throws SystemException {
080    
081                    if (!isEnabled()) {
082                            return;
083                    }
084    
085                    long fileEntryMetadataCount =
086                            DLFileEntryMetadataLocalServiceUtil.getFileEntryMetadataCount(
087                                    fileVersion.getFileEntryId(), fileVersion.getFileVersionId());
088    
089                    if (fileEntryMetadataCount == 0) {
090                            _instance.trigger(fileVersion);
091                    }
092            }
093    
094            public void importGeneratedFiles(
095                            PortletDataContext portletDataContext, FileEntry fileEntry,
096                            FileEntry importedFileEntry, Element fileEntryElement)
097                    throws Exception {
098    
099                    return;
100            }
101    
102            public boolean isSupported(FileVersion fileVersion) {
103                    return true;
104            }
105    
106            public boolean isSupported(String mimeType) {
107                    return true;
108            }
109    
110            public void saveMetadata(FileVersion fileVersion)
111                    throws PortalException, SystemException {
112    
113                    if (!isEnabled()) {
114                            return;
115                    }
116    
117                    Map<String, Fields> rawMetadataMap = null;
118    
119                    if (fileVersion instanceof LiferayFileVersion) {
120                            try {
121                                    LiferayFileVersion liferayFileVersion =
122                                            (LiferayFileVersion)fileVersion;
123    
124                                    File file = liferayFileVersion.getFile(false);
125    
126                                    rawMetadataMap = RawMetadataProcessorUtil.getRawMetadataMap(
127                                            fileVersion.getExtension(), fileVersion.getMimeType(),
128                                            file);
129                            }
130                            catch (UnsupportedOperationException uoe) {
131                            }
132                    }
133    
134                    if (rawMetadataMap == null) {
135                            InputStream inputStream = null;
136    
137                            try {
138                                    inputStream = fileVersion.getContentStream(false);
139    
140                                    rawMetadataMap = RawMetadataProcessorUtil.getRawMetadataMap(
141                                            fileVersion.getExtension(), fileVersion.getMimeType(),
142                                            inputStream);
143                            }
144                            finally {
145                                    StreamUtil.cleanUp(inputStream);
146                            }
147                    }
148    
149                    List<DDMStructure> ddmStructures =
150                            DDMStructureLocalServiceUtil.getClassStructures(
151                                    PortalUtil.getClassNameId(DLFileEntry.class), QueryUtil.ALL_POS,
152                                    QueryUtil.ALL_POS);
153    
154                    ServiceContext serviceContext = new ServiceContext();
155    
156                    serviceContext.setScopeGroupId(fileVersion.getGroupId());
157                    serviceContext.setUserId(fileVersion.getUserId());
158    
159                    DLFileEntryMetadataLocalServiceUtil.updateFileEntryMetadata(
160                            fileVersion.getCompanyId(), ddmStructures, 0L,
161                            fileVersion.getFileEntryId(), fileVersion.getFileVersionId(),
162                            rawMetadataMap, serviceContext);
163    
164                    FileEntry fileEntry = fileVersion.getFileEntry();
165    
166                    if (fileEntry instanceof LiferayFileEntry) {
167                            Indexer indexer = IndexerRegistryUtil.getIndexer(
168                                    DLFileEntryConstants.getClassName());
169    
170                            LiferayFileEntry liferayFileEntry = (LiferayFileEntry)fileEntry;
171    
172                            indexer.reindex(liferayFileEntry.getDLFileEntry());
173                    }
174            }
175    
176            public void trigger(FileVersion fileVersion) {
177                    if (!isEnabled()) {
178                            return;
179                    }
180    
181                    if (PropsValues.DL_FILE_ENTRY_PROCESSORS_TRIGGER_SYNCHRONOUSLY) {
182                            try {
183                                    MessageBusUtil.sendSynchronousMessage(
184                                            DestinationNames.DOCUMENT_LIBRARY_RAW_METADATA_PROCESSOR,
185                                            fileVersion);
186                            }
187                            catch (MessageBusException mbe) {
188                                    if (_log.isWarnEnabled()) {
189                                            _log.warn(mbe, mbe);
190                                    }
191                            }
192                    }
193                    else {
194                            MessageBusUtil.sendMessage(
195                                    DestinationNames.DOCUMENT_LIBRARY_RAW_METADATA_PROCESSOR,
196                                    fileVersion);
197                    }
198            }
199    
200            private RawMetadataProcessorImpl() {
201            }
202    
203            private static Log _log = LogFactoryUtil.getLog(
204                    RawMetadataProcessorImpl.class);
205    
206            private static RawMetadataProcessorImpl _instance =
207                    new RawMetadataProcessorImpl();
208    
209            static {
210                    InstancePool.put(RawMetadataProcessorImpl.class.getName(), _instance);
211            }
212    
213    }