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