001    /**
002     * Copyright (c) 2000-present 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.document.library.kernel.model.DLFileEntry;
018    import com.liferay.document.library.kernel.model.DLFileEntryConstants;
019    import com.liferay.document.library.kernel.model.DLProcessorConstants;
020    import com.liferay.document.library.kernel.service.DLFileEntryMetadataLocalServiceUtil;
021    import com.liferay.document.library.kernel.util.DLProcessor;
022    import com.liferay.document.library.kernel.util.RawMetadataProcessor;
023    import com.liferay.dynamic.data.mapping.kernel.DDMFormValues;
024    import com.liferay.dynamic.data.mapping.kernel.DDMStructure;
025    import com.liferay.dynamic.data.mapping.kernel.DDMStructureManagerUtil;
026    import com.liferay.exportimport.kernel.lar.PortletDataContext;
027    import com.liferay.portal.kernel.dao.orm.QueryUtil;
028    import com.liferay.portal.kernel.exception.PortalException;
029    import com.liferay.portal.kernel.log.Log;
030    import com.liferay.portal.kernel.log.LogFactoryUtil;
031    import com.liferay.portal.kernel.messaging.DestinationNames;
032    import com.liferay.portal.kernel.messaging.MessageBusUtil;
033    import com.liferay.portal.kernel.metadata.RawMetadataProcessorUtil;
034    import com.liferay.portal.kernel.repository.model.FileEntry;
035    import com.liferay.portal.kernel.repository.model.FileVersion;
036    import com.liferay.portal.kernel.search.Indexer;
037    import com.liferay.portal.kernel.search.IndexerRegistryUtil;
038    import com.liferay.portal.kernel.security.pacl.DoPrivileged;
039    import com.liferay.portal.kernel.service.ServiceContext;
040    import com.liferay.portal.kernel.util.ArrayUtil;
041    import com.liferay.portal.kernel.util.PortalUtil;
042    import com.liferay.portal.kernel.util.StreamUtil;
043    import com.liferay.portal.kernel.xml.Element;
044    import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
045    import com.liferay.portal.repository.liferayrepository.model.LiferayFileVersion;
046    import com.liferay.portal.util.PropsValues;
047    
048    import java.io.File;
049    import java.io.InputStream;
050    
051    import java.util.List;
052    import java.util.Map;
053    
054    /**
055     * @author Alexander Chow
056     * @author Mika Koivisto
057     * @author Miguel Pastor
058     */
059    @DoPrivileged
060    public class RawMetadataProcessorImpl
061            implements DLProcessor, RawMetadataProcessor {
062    
063            @Override
064            public void afterPropertiesSet() {
065            }
066    
067            @Override
068            public void cleanUp(FileEntry fileEntry) {
069            }
070    
071            @Override
072            public void cleanUp(FileVersion fileVersion) {
073            }
074    
075            @Override
076            public void copy(
077                    FileVersion sourceFileVersion, FileVersion destinationFileVersion) {
078            }
079    
080            @Override
081            public void exportGeneratedFiles(
082                    PortletDataContext portletDataContext, FileEntry fileEntry,
083                    Element fileEntryElement) {
084            }
085    
086            @Override
087            public void generateMetadata(FileVersion fileVersion) {
088                    long fileEntryMetadataCount =
089                            DLFileEntryMetadataLocalServiceUtil.
090                                    getFileVersionFileEntryMetadatasCount(
091                                            fileVersion.getFileVersionId());
092    
093                    if (fileEntryMetadataCount == 0) {
094                            trigger(fileVersion);
095                    }
096            }
097    
098            @Override
099            public String getType() {
100                    return DLProcessorConstants.RAW_METADATA_PROCESSOR;
101            }
102    
103            @Override
104            public void importGeneratedFiles(
105                    PortletDataContext portletDataContext, FileEntry fileEntry,
106                    FileEntry importedFileEntry, Element fileEntryElement) {
107            }
108    
109            @Override
110            public boolean isSupported(FileVersion fileVersion) {
111                    return isSupported(fileVersion.getMimeType());
112            }
113    
114            @Override
115            public boolean isSupported(String mimeType) {
116                    return !ArrayUtil.contains(
117                            PropsValues.
118                                    DL_FILE_ENTRY_RAW_METADATA_PROCESSOR_EXCLUDED_MIME_TYPES,
119                            mimeType);
120            }
121    
122            @Override
123            public void saveMetadata(FileVersion fileVersion) throws PortalException {
124                    Map<String, DDMFormValues> rawMetadataMap = null;
125    
126                    if (fileVersion instanceof LiferayFileVersion) {
127                            try {
128                                    LiferayFileVersion liferayFileVersion =
129                                            (LiferayFileVersion)fileVersion;
130    
131                                    File file = liferayFileVersion.getFile(false);
132    
133                                    rawMetadataMap = RawMetadataProcessorUtil.getRawMetadataMap(
134                                            fileVersion.getExtension(), fileVersion.getMimeType(),
135                                            file);
136                            }
137                            catch (UnsupportedOperationException uoe) {
138                            }
139                    }
140    
141                    if (rawMetadataMap == null) {
142                            InputStream inputStream = null;
143    
144                            try {
145                                    inputStream = fileVersion.getContentStream(false);
146    
147                                    if (inputStream == null) {
148                                            if (_log.isWarnEnabled()) {
149                                                    _log.warn(
150                                                            "No metadata is available for file version " +
151                                                                    fileVersion.getFileVersionId());
152                                            }
153    
154                                            return;
155                                    }
156    
157                                    rawMetadataMap = RawMetadataProcessorUtil.getRawMetadataMap(
158                                            fileVersion.getExtension(), fileVersion.getMimeType(),
159                                            inputStream);
160                            }
161                            finally {
162                                    StreamUtil.cleanUp(inputStream);
163                            }
164                    }
165    
166                    List<DDMStructure> ddmStructures =
167                            DDMStructureManagerUtil.getClassStructures(
168                                    fileVersion.getCompanyId(),
169                                    PortalUtil.getClassNameId(RawMetadataProcessor.class),
170                                    QueryUtil.ALL_POS, QueryUtil.ALL_POS);
171    
172                    ServiceContext serviceContext = new ServiceContext();
173    
174                    serviceContext.setScopeGroupId(fileVersion.getGroupId());
175                    serviceContext.setUserId(fileVersion.getUserId());
176    
177                    DLFileEntryMetadataLocalServiceUtil.updateFileEntryMetadata(
178                            fileVersion.getCompanyId(), ddmStructures,
179                            fileVersion.getFileEntryId(), fileVersion.getFileVersionId(),
180                            rawMetadataMap, serviceContext);
181    
182                    FileEntry fileEntry = fileVersion.getFileEntry();
183    
184                    if (fileEntry instanceof LiferayFileEntry) {
185                            Indexer<DLFileEntry> indexer = IndexerRegistryUtil.getIndexer(
186                                    DLFileEntryConstants.getClassName());
187    
188                            LiferayFileEntry liferayFileEntry = (LiferayFileEntry)fileEntry;
189    
190                            indexer.reindex(liferayFileEntry.getDLFileEntry());
191                    }
192            }
193    
194            @Override
195            public void trigger(FileVersion fileVersion) {
196                    trigger(fileVersion, fileVersion);
197            }
198    
199            @Override
200            public void trigger(
201                    FileVersion sourceFileVersion, FileVersion destinationFileVersion) {
202    
203                    MessageBusUtil.sendMessage(
204                            DestinationNames.DOCUMENT_LIBRARY_RAW_METADATA_PROCESSOR,
205                            destinationFileVersion);
206            }
207    
208            private static final Log _log = LogFactoryUtil.getLog(
209                    RawMetadataProcessorImpl.class);
210    
211    }