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