001    /**
002     * Copyright (c) 2000-2013 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.lar;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
020    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
021    import com.liferay.portal.kernel.lar.PortletDataContext;
022    import com.liferay.portal.kernel.lar.PortletDataException;
023    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
024    import com.liferay.portal.kernel.log.Log;
025    import com.liferay.portal.kernel.log.LogFactoryUtil;
026    import com.liferay.portal.kernel.repository.model.FileEntry;
027    import com.liferay.portal.kernel.repository.model.FileVersion;
028    import com.liferay.portal.kernel.repository.model.Folder;
029    import com.liferay.portal.kernel.search.Indexer;
030    import com.liferay.portal.kernel.search.IndexerRegistryUtil;
031    import com.liferay.portal.kernel.trash.TrashHandler;
032    import com.liferay.portal.kernel.trash.TrashHandlerRegistryUtil;
033    import com.liferay.portal.kernel.util.ArrayUtil;
034    import com.liferay.portal.kernel.util.FileUtil;
035    import com.liferay.portal.kernel.util.MapUtil;
036    import com.liferay.portal.kernel.util.StringPool;
037    import com.liferay.portal.kernel.util.StringUtil;
038    import com.liferay.portal.kernel.util.Validator;
039    import com.liferay.portal.kernel.xml.Element;
040    import com.liferay.portal.model.Repository;
041    import com.liferay.portal.repository.liferayrepository.LiferayRepository;
042    import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
043    import com.liferay.portal.service.RepositoryLocalServiceUtil;
044    import com.liferay.portal.service.ServiceContext;
045    import com.liferay.portal.util.PortalUtil;
046    import com.liferay.portlet.documentlibrary.DuplicateFileException;
047    import com.liferay.portlet.documentlibrary.NoSuchFileException;
048    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
049    import com.liferay.portlet.documentlibrary.model.DLFileEntryMetadata;
050    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
051    import com.liferay.portlet.documentlibrary.model.DLFileVersion;
052    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
053    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
054    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
055    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
056    import com.liferay.portlet.documentlibrary.service.DLFileEntryMetadataLocalServiceUtil;
057    import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
058    import com.liferay.portlet.documentlibrary.service.DLFileVersionLocalServiceUtil;
059    import com.liferay.portlet.documentlibrary.util.DLProcessorRegistryUtil;
060    import com.liferay.portlet.documentlibrary.util.DLProcessorThreadLocal;
061    import com.liferay.portlet.documentlibrary.util.DLUtil;
062    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
063    import com.liferay.portlet.dynamicdatamapping.storage.Fields;
064    import com.liferay.portlet.dynamicdatamapping.storage.StorageEngineUtil;
065    
066    import java.io.IOException;
067    import java.io.InputStream;
068    
069    import java.util.List;
070    import java.util.Map;
071    
072    /**
073     * @author Mate Thurzo
074     */
075    public class FileEntryStagedModelDataHandler
076            extends BaseStagedModelDataHandler<FileEntry> {
077    
078            public static final String[] CLASS_NAMES = {
079                    DLFileEntry.class.getName(), FileEntry.class.getName(),
080                    LiferayFileEntry.class.getName()
081            };
082    
083            @Override
084            public void deleteStagedModel(
085                            String uuid, long groupId, String className, String extraData)
086                    throws PortalException, SystemException {
087    
088                    FileEntry fileEntry = FileEntryUtil.fetchByUUID_R(uuid, groupId);
089    
090                    if (fileEntry != null) {
091                            DLAppLocalServiceUtil.deleteFileEntry(fileEntry.getFileEntryId());
092                    }
093            }
094    
095            @Override
096            public String[] getClassNames() {
097                    return CLASS_NAMES;
098            }
099    
100            @Override
101            public String getDisplayName(FileEntry fileEntry) {
102                    return fileEntry.getTitle();
103            }
104    
105            @Override
106            public void importStagedModel(
107                            PortletDataContext portletDataContext, FileEntry fileEntry)
108                    throws PortletDataException {
109    
110                    boolean dlProcessorEnabled = DLProcessorThreadLocal.isEnabled();
111    
112                    try {
113                            DLProcessorThreadLocal.setEnabled(false);
114    
115                            super.importStagedModel(portletDataContext, fileEntry);
116                    }
117                    finally {
118                            DLProcessorThreadLocal.setEnabled(dlProcessorEnabled);
119                    }
120            }
121    
122            @Override
123            protected void doExportStagedModel(
124                            PortletDataContext portletDataContext, FileEntry fileEntry)
125                    throws Exception {
126    
127                    Element fileEntryElement = portletDataContext.getExportDataElement(
128                            fileEntry, FileEntry.class);
129    
130                    String fileEntryPath = ExportImportPathUtil.getModelPath(fileEntry);
131    
132                    if (!fileEntry.isDefaultRepository()) {
133                            Repository repository = RepositoryLocalServiceUtil.getRepository(
134                                    fileEntry.getRepositoryId());
135    
136                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
137                                    portletDataContext, fileEntry, FileEntry.class, repository,
138                                    Repository.class, PortletDataContext.REFERENCE_TYPE_STRONG);
139    
140                            portletDataContext.addClassedModel(
141                                    fileEntryElement, fileEntryPath, fileEntry);
142    
143                            long liferayRepositoryClassNameId = PortalUtil.getClassNameId(
144                                    LiferayRepository.class.getName());
145    
146                            if (repository.getClassNameId() != liferayRepositoryClassNameId) {
147                                    return;
148                            }
149                    }
150    
151                    FileVersion fileVersion = fileEntry.getFileVersion();
152    
153                    if (!fileVersion.isApproved() && !fileEntry.isInTrash()) {
154                            return;
155                    }
156    
157                    if (fileEntry.getFolderId() !=
158                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
159    
160                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
161                                    portletDataContext, fileEntry, FileEntry.class,
162                                    fileEntry.getFolder(), Folder.class,
163                                    PortletDataContext.REFERENCE_TYPE_PARENT);
164                    }
165    
166                    LiferayFileEntry liferayFileEntry = (LiferayFileEntry)fileEntry;
167    
168                    liferayFileEntry.setCachedFileVersion(fileVersion);
169    
170                    if (!portletDataContext.isPerformDirectBinaryImport()) {
171                            InputStream is = null;
172    
173                            try {
174                                    is = FileEntryUtil.getContentStream(fileEntry);
175                            }
176                            catch (NoSuchFileException nsfe) {
177                            }
178    
179                            if (is == null) {
180                                    if (_log.isWarnEnabled()) {
181                                            _log.warn(
182                                                    "No file found for file entry " +
183                                                            fileEntry.getFileEntryId());
184                                    }
185    
186                                    fileEntryElement.detach();
187    
188                                    return;
189                            }
190    
191                            try {
192                                    String binPath = ExportImportPathUtil.getModelPath(
193                                            fileEntry, fileEntry.getVersion());
194    
195                                    portletDataContext.addZipEntry(binPath, is);
196    
197                                    fileEntryElement.addAttribute("bin-path", binPath);
198                            }
199                            finally {
200                                    try {
201                                            is.close();
202                                    }
203                                    catch (IOException ioe) {
204                                            _log.error(ioe, ioe);
205                                    }
206                            }
207                    }
208    
209                    if (portletDataContext.getBooleanParameter(
210                                    DLPortletDataHandler.NAMESPACE, "previews-and-thumbnails")) {
211    
212                            DLProcessorRegistryUtil.exportGeneratedFiles(
213                                    portletDataContext, fileEntry, fileEntryElement);
214                    }
215    
216                    exportMetaData(portletDataContext, fileEntryElement, fileEntry);
217    
218                    portletDataContext.addClassedModel(
219                            fileEntryElement, fileEntryPath, liferayFileEntry,
220                            DLFileEntry.class);
221            }
222    
223            @Override
224            protected void doImportStagedModel(
225                            PortletDataContext portletDataContext, FileEntry fileEntry)
226                    throws Exception {
227    
228                    long userId = portletDataContext.getUserId(fileEntry.getUserUuid());
229    
230                    if (!fileEntry.isDefaultRepository()) {
231                            StagedModelDataHandlerUtil.importReferenceStagedModel(
232                                    portletDataContext, fileEntry, Repository.class,
233                                    fileEntry.getRepositoryId());
234                    }
235    
236                    if (fileEntry.getFolderId() !=
237                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
238    
239                            StagedModelDataHandlerUtil.importReferenceStagedModel(
240                                    portletDataContext, fileEntry, Folder.class,
241                                    fileEntry.getFolderId());
242                    }
243    
244                    Map<Long, Long> folderIds =
245                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
246                                    Folder.class);
247    
248                    long folderId = MapUtil.getLong(
249                            folderIds, fileEntry.getFolderId(), fileEntry.getFolderId());
250    
251                    long[] assetCategoryIds = portletDataContext.getAssetCategoryIds(
252                            DLFileEntry.class, fileEntry.getFileEntryId());
253                    String[] assetTagNames = portletDataContext.getAssetTagNames(
254                            DLFileEntry.class, fileEntry.getFileEntryId());
255    
256                    ServiceContext serviceContext = portletDataContext.createServiceContext(
257                            fileEntry, DLFileEntry.class);
258    
259                    serviceContext.setAttribute(
260                            "sourceFileName", "A." + fileEntry.getExtension());
261                    serviceContext.setUserId(userId);
262    
263                    Element fileEntryElement = portletDataContext.getImportDataElement(
264                            fileEntry);
265    
266                    String binPath = fileEntryElement.attributeValue("bin-path");
267    
268                    InputStream is = null;
269    
270                    if (Validator.isNull(binPath) &&
271                            portletDataContext.isPerformDirectBinaryImport()) {
272    
273                            try {
274                                    is = FileEntryUtil.getContentStream(fileEntry);
275                            }
276                            catch (NoSuchFileException nsfe) {
277                            }
278                    }
279                    else {
280                            is = portletDataContext.getZipEntryAsInputStream(binPath);
281                    }
282    
283                    if (is == null) {
284                            if (_log.isWarnEnabled()) {
285                                    _log.warn(
286                                            "No file found for file entry " +
287                                                    fileEntry.getFileEntryId());
288                            }
289    
290                            return;
291                    }
292    
293                    importMetaData(
294                            portletDataContext, fileEntryElement, fileEntry, serviceContext);
295    
296                    FileEntry importedFileEntry = null;
297    
298                    String titleWithExtension = DLUtil.getTitleWithExtension(fileEntry);
299                    String extension = fileEntry.getExtension();
300    
301                    String periodAndExtension = StringPool.PERIOD.concat(extension);
302    
303                    if (portletDataContext.isDataStrategyMirror()) {
304                            FileEntry existingFileEntry = FileEntryUtil.fetchByUUID_R(
305                                    fileEntry.getUuid(), portletDataContext.getScopeGroupId());
306    
307                            FileVersion fileVersion = fileEntry.getFileVersion();
308    
309                            if (existingFileEntry == null) {
310                                    String fileEntryTitle = fileEntry.getTitle();
311    
312                                    FileEntry existingTitleFileEntry = FileEntryUtil.fetchByR_F_T(
313                                            portletDataContext.getScopeGroupId(), folderId,
314                                            fileEntryTitle);
315    
316                                    if (existingTitleFileEntry != null) {
317                                            if ((fileEntry.getGroupId() ==
318                                                            portletDataContext.getSourceGroupId()) &&
319                                                    portletDataContext.
320                                                            isDataStrategyMirrorWithOverwriting()) {
321    
322                                                    DLAppLocalServiceUtil.deleteFileEntry(
323                                                            existingTitleFileEntry.getFileEntryId());
324                                            }
325                                            else {
326                                                    boolean titleHasExtension = false;
327    
328                                                    if (fileEntryTitle.endsWith(periodAndExtension)) {
329                                                            fileEntryTitle = FileUtil.stripExtension(
330                                                                    fileEntryTitle);
331    
332                                                            titleHasExtension = true;
333                                                    }
334    
335                                                    for (int i = 1;; i++) {
336                                                            fileEntryTitle += StringPool.SPACE + i;
337    
338                                                            titleWithExtension =
339                                                                    fileEntryTitle + periodAndExtension;
340    
341                                                            existingTitleFileEntry = FileEntryUtil.fetchByR_F_T(
342                                                                    portletDataContext.getScopeGroupId(), folderId,
343                                                                    titleWithExtension);
344    
345                                                            if (existingTitleFileEntry == null) {
346                                                                    if (titleHasExtension) {
347                                                                            fileEntryTitle += periodAndExtension;
348                                                                    }
349    
350                                                                    break;
351                                                            }
352                                                    }
353                                            }
354                                    }
355    
356                                    serviceContext.setAttribute(
357                                            "fileVersionUuid", fileVersion.getUuid());
358                                    serviceContext.setUuid(fileEntry.getUuid());
359    
360                                    importedFileEntry = DLAppLocalServiceUtil.addFileEntry(
361                                            userId, portletDataContext.getScopeGroupId(), folderId,
362                                            titleWithExtension, fileEntry.getMimeType(), fileEntryTitle,
363                                            fileEntry.getDescription(), null, is, fileEntry.getSize(),
364                                            serviceContext);
365    
366                                    if (fileEntry.isInTrash()) {
367                                            importedFileEntry = DLAppServiceUtil.moveFileEntryToTrash(
368                                                    importedFileEntry.getFileEntryId());
369                                    }
370                            }
371                            else {
372                                    FileVersion latestExistingFileVersion =
373                                            existingFileEntry.getLatestFileVersion();
374    
375                                    boolean indexEnabled = serviceContext.isIndexingEnabled();
376    
377                                    try {
378                                            serviceContext.setIndexingEnabled(false);
379    
380                                            if (!fileVersion.getUuid().equals(
381                                                            latestExistingFileVersion.getUuid())) {
382    
383                                                    DLFileVersion alreadyExistingFileVersion =
384                                                            DLFileVersionLocalServiceUtil.
385                                                                    getFileVersionByUuidAndGroupId(
386                                                                            fileVersion.getUuid(),
387                                                                            existingFileEntry.getGroupId());
388    
389                                                    if (alreadyExistingFileVersion != null) {
390                                                            serviceContext.setAttribute(
391                                                                    "existingDLFileVersionId",
392                                                                    alreadyExistingFileVersion.getFileVersionId());
393                                                    }
394    
395                                                    serviceContext.setUuid(fileVersion.getUuid());
396    
397                                                    importedFileEntry =
398                                                            DLAppLocalServiceUtil.updateFileEntry(
399                                                                    userId, existingFileEntry.getFileEntryId(),
400                                                                    fileEntry.getTitle(), fileEntry.getMimeType(),
401                                                                    fileEntry.getTitle(),
402                                                                    fileEntry.getDescription(), null, false, is,
403                                                                    fileEntry.getSize(), serviceContext);
404                                            }
405                                            else {
406                                                    DLAppLocalServiceUtil.updateAsset(
407                                                            userId, existingFileEntry,
408                                                            latestExistingFileVersion, assetCategoryIds,
409                                                            assetTagNames, null);
410    
411                                                    importedFileEntry = existingFileEntry;
412                                            }
413    
414                                            if (importedFileEntry.getFolderId() != folderId) {
415                                                    importedFileEntry = DLAppLocalServiceUtil.moveFileEntry(
416                                                            userId, importedFileEntry.getFileEntryId(),
417                                                            folderId, serviceContext);
418                                            }
419    
420                                            if (importedFileEntry instanceof LiferayFileEntry) {
421                                                    LiferayFileEntry liferayFileEntry =
422                                                            (LiferayFileEntry)importedFileEntry;
423    
424                                                    Indexer indexer = IndexerRegistryUtil.getIndexer(
425                                                            DLFileEntry.class);
426    
427                                                    indexer.reindex(liferayFileEntry.getModel());
428                                            }
429                                    }
430                                    finally {
431                                            serviceContext.setIndexingEnabled(indexEnabled);
432                                    }
433                            }
434                    }
435                    else {
436                            try {
437                                    importedFileEntry = DLAppLocalServiceUtil.addFileEntry(
438                                            userId, portletDataContext.getScopeGroupId(), folderId,
439                                            titleWithExtension, fileEntry.getMimeType(),
440                                            fileEntry.getTitle(), fileEntry.getDescription(), null, is,
441                                            fileEntry.getSize(), serviceContext);
442                            }
443                            catch (DuplicateFileException dfe) {
444                                    String title = fileEntry.getTitle();
445    
446                                    String[] titleParts = title.split("\\.", 2);
447    
448                                    title = titleParts[0] + StringUtil.randomString();
449    
450                                    if (titleParts.length > 1) {
451                                            title += StringPool.PERIOD + titleParts[1];
452                                    }
453    
454                                    if (!title.endsWith(periodAndExtension)) {
455                                            title += periodAndExtension;
456                                    }
457    
458                                    importedFileEntry = DLAppLocalServiceUtil.addFileEntry(
459                                            userId, portletDataContext.getScopeGroupId(), folderId,
460                                            title, fileEntry.getMimeType(), title,
461                                            fileEntry.getDescription(), null, is, fileEntry.getSize(),
462                                            serviceContext);
463                            }
464                    }
465    
466                    if (portletDataContext.getBooleanParameter(
467                                    DLPortletDataHandler.NAMESPACE, "previews-and-thumbnails")) {
468    
469                            DLProcessorRegistryUtil.importGeneratedFiles(
470                                    portletDataContext, fileEntry, importedFileEntry,
471                                    fileEntryElement);
472                    }
473    
474                    portletDataContext.importClassedModel(
475                            fileEntry, importedFileEntry, DLFileEntry.class);
476    
477                    Map<Long, Long> fileEntryIds =
478                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
479                                    FileEntry.class);
480    
481                    fileEntryIds.put(
482                            fileEntry.getFileEntryId(), importedFileEntry.getFileEntryId());
483            }
484    
485            @Override
486            protected void doRestoreStagedModel(
487                            PortletDataContext portletDataContext, FileEntry fileEntry)
488                    throws Exception {
489    
490                    long userId = portletDataContext.getUserId(fileEntry.getUserUuid());
491    
492                    FileEntry existingFileEntry = FileEntryUtil.fetchByUUID_R(
493                            fileEntry.getUuid(), portletDataContext.getScopeGroupId());
494    
495                    if ((existingFileEntry == null) || !existingFileEntry.isInTrash()) {
496                            return;
497                    }
498    
499                    TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(
500                            DLFileEntry.class.getName());
501    
502                    if (trashHandler.isRestorable(existingFileEntry.getFileEntryId())) {
503                            trashHandler.restoreTrashEntry(
504                                    userId, existingFileEntry.getFileEntryId());
505                    }
506            }
507    
508            protected void exportMetaData(
509                            PortletDataContext portletDataContext, Element fileEntryElement,
510                            FileEntry fileEntry)
511                    throws Exception {
512    
513                    LiferayFileEntry liferayFileEntry = (LiferayFileEntry)fileEntry;
514    
515                    DLFileEntry dlFileEntry = liferayFileEntry.getDLFileEntry();
516    
517                    long fileEntryTypeId = dlFileEntry.getFileEntryTypeId();
518    
519                    DLFileEntryType dlFileEntryType =
520                            DLFileEntryTypeLocalServiceUtil.fetchFileEntryType(fileEntryTypeId);
521    
522                    if ((dlFileEntryType == null) || !dlFileEntryType.isExportable()) {
523                            return;
524                    }
525    
526                    StagedModelDataHandlerUtil.exportReferenceStagedModel(
527                            portletDataContext, fileEntry, FileEntry.class, dlFileEntryType,
528                            DLFileEntryType.class, PortletDataContext.REFERENCE_TYPE_STRONG);
529    
530                    List<DDMStructure> ddmStructures = dlFileEntryType.getDDMStructures();
531    
532                    for (DDMStructure ddmStructure : ddmStructures) {
533                            FileVersion fileVersion = fileEntry.getFileVersion();
534    
535                            DLFileEntryMetadata dlFileEntryMetadata =
536                                    DLFileEntryMetadataLocalServiceUtil.fetchFileEntryMetadata(
537                                            ddmStructure.getStructureId(),
538                                            fileVersion.getFileVersionId());
539    
540                            if (dlFileEntryMetadata == null) {
541                                    continue;
542                            }
543    
544                            Element structureFields = fileEntryElement.addElement(
545                                    "structure-fields");
546    
547                            String path = ExportImportPathUtil.getModelPath(
548                                    ddmStructure, String.valueOf(ddmStructure.getStructureId()));
549    
550                            structureFields.addAttribute("path", path);
551    
552                            structureFields.addAttribute(
553                                    "structureUuid", ddmStructure.getUuid());
554    
555                            Fields fields = StorageEngineUtil.getFields(
556                                    dlFileEntryMetadata.getDDMStorageId());
557    
558                            portletDataContext.addZipEntry(path, fields);
559                    }
560            }
561    
562            protected void importMetaData(
563                            PortletDataContext portletDataContext, Element fileEntryElement,
564                            FileEntry fileEntry, ServiceContext serviceContext)
565                    throws Exception {
566    
567                    LiferayFileEntry liferayFileEntry = (LiferayFileEntry)fileEntry;
568    
569                    DLFileEntry dlFileEntry = liferayFileEntry.getDLFileEntry();
570    
571                    StagedModelDataHandlerUtil.importReferenceStagedModel(
572                            portletDataContext, fileEntry, DLFileEntryType.class,
573                            dlFileEntry.getFileEntryTypeId());
574    
575                    Map<Long, Long> dlFileEntryTypeIds =
576                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
577                                    DLFileEntryType.class);
578    
579                    long dlFileEntryTypeId = MapUtil.getLong(
580                            dlFileEntryTypeIds, dlFileEntry.getFileEntryTypeId(),
581                            dlFileEntry.getFileEntryTypeId());
582    
583                    DLFileEntryType existingDLFileEntryType =
584                            DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(
585                                    dlFileEntryTypeId);
586    
587                    if (existingDLFileEntryType == null) {
588                            serviceContext.setAttribute("fileEntryTypeId", -1);
589    
590                            return;
591                    }
592    
593                    serviceContext.setAttribute(
594                            "fileEntryTypeId", existingDLFileEntryType.getFileEntryTypeId());
595    
596                    List<DDMStructure> ddmStructures =
597                            existingDLFileEntryType.getDDMStructures();
598    
599                    for (DDMStructure ddmStructure : ddmStructures) {
600                            Element structureFieldsElement =
601                                    (Element)fileEntryElement.selectSingleNode(
602                                            "structure-fields[@structureUuid='".concat(
603                                                    ddmStructure.getUuid()).concat("']"));
604    
605                            if (structureFieldsElement == null) {
606                                    continue;
607                            }
608    
609                            String path = structureFieldsElement.attributeValue("path");
610    
611                            Fields fields = (Fields)portletDataContext.getZipEntryAsObject(
612                                    path);
613    
614                            serviceContext.setAttribute(
615                                    Fields.class.getName() + ddmStructure.getStructureId(), fields);
616                    }
617            }
618    
619            @Override
620            protected void validateExport(
621                            PortletDataContext portletDataContext, FileEntry fileEntry)
622                    throws PortletDataException {
623    
624                    if ((fileEntry.getGroupId() != portletDataContext.getGroupId()) &&
625                            (fileEntry.getGroupId() != portletDataContext.getScopeGroupId())) {
626    
627                            PortletDataException pde = new PortletDataException(
628                                    PortletDataException.INVALID_GROUP);
629    
630                            pde.setStagedModel(fileEntry);
631    
632                            throw pde;
633                    }
634    
635                    try {
636                            FileVersion fileVersion = fileEntry.getFileVersion();
637    
638                            if (!ArrayUtil.contains(
639                                            getExportableStatuses(), fileVersion.getStatus())) {
640    
641                                    throw new PortletDataException(
642                                            PortletDataException.STATUS_UNAVAILABLE);
643                            }
644                    }
645                    catch (PortletDataException pde) {
646                            throw pde;
647                    }
648                    catch (Exception e) {
649                            if (_log.isWarnEnabled()) {
650                                    _log.warn(
651                                            "Unable to check workflow status for " +
652                                                    DLFileEntry.class.getName());
653                            }
654                    }
655    
656                    TrashHandler trashHandler = TrashHandlerRegistryUtil.getTrashHandler(
657                            DLFileEntry.class.getName());
658    
659                    if (trashHandler != null) {
660                            try {
661                                    if (trashHandler.isInTrash(fileEntry.getFileEntryId()) ||
662                                            trashHandler.isInTrashContainer(
663                                                    fileEntry.getFileEntryId())) {
664    
665                                            throw new PortletDataException(
666                                                    PortletDataException.STATUS_IN_TRASH);
667                                    }
668                            }
669                            catch (PortletDataException pde) {
670                                    throw pde;
671                            }
672                            catch (Exception e) {
673                                    if (_log.isWarnEnabled()) {
674                                            _log.warn(
675                                                    "Unable to check trash status for " +
676                                                            DLFileEntry.class.getName());
677                                    }
678                            }
679                    }
680            }
681    
682            @Override
683            protected boolean validateMissingReference(
684                            String uuid, long companyId, long groupId)
685                    throws Exception {
686    
687                    DLFileEntry dlFileEntry =
688                            DLFileEntryLocalServiceUtil.fetchDLFileEntryByUuidAndGroupId(
689                                    uuid, groupId);
690    
691                    if (dlFileEntry == null) {
692                            return false;
693                    }
694    
695                    return true;
696            }
697    
698            private static Log _log = LogFactoryUtil.getLog(
699                    FileEntryStagedModelDataHandler.class);
700    
701    }