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