001    /**
002     * Copyright (c) 2000-2013 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.lar;
016    
017    import com.liferay.portal.kernel.lar.BaseStagedModelDataHandler;
018    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
019    import com.liferay.portal.kernel.lar.PortletDataContext;
020    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
021    import com.liferay.portal.kernel.log.Log;
022    import com.liferay.portal.kernel.log.LogFactoryUtil;
023    import com.liferay.portal.kernel.repository.model.FileEntry;
024    import com.liferay.portal.kernel.repository.model.Folder;
025    import com.liferay.portal.kernel.util.MapUtil;
026    import com.liferay.portal.kernel.xml.Element;
027    import com.liferay.portal.service.ServiceContext;
028    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
029    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
030    import com.liferay.portlet.documentlibrary.model.DLFolder;
031    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
032    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
033    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
034    import com.liferay.portlet.documentlibrary.service.persistence.DLFileShortcutUtil;
035    
036    import java.util.Map;
037    
038    /**
039     * @author Mate Thurzo
040     */
041    public class DLFileShortcutStagedModelDataHandler
042            extends BaseStagedModelDataHandler<DLFileShortcut> {
043    
044            public static final String[] CLASS_NAMES = {DLFileShortcut.class.getName()};
045    
046            @Override
047            public String[] getClassNames() {
048                    return CLASS_NAMES;
049            }
050    
051            @Override
052            protected void doExportStagedModel(
053                            PortletDataContext portletDataContext, DLFileShortcut fileShortcut)
054                    throws Exception {
055    
056                    if (fileShortcut.getFolderId() !=
057                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
058    
059                            StagedModelDataHandlerUtil.exportStagedModel(
060                                    portletDataContext, fileShortcut);
061                    }
062    
063                    DLFileEntry dlFileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(
064                            fileShortcut.getToFileEntryId());
065    
066                    StagedModelDataHandlerUtil.exportStagedModel(
067                            portletDataContext, dlFileEntry);
068    
069                    Element fileShortcutElement =
070                            portletDataContext.getExportDataStagedModelElement(fileShortcut);
071    
072                    fileShortcutElement.addAttribute(
073                            "file-entry-uuid", dlFileEntry.getUuid());
074    
075                    portletDataContext.addClassedModel(
076                            fileShortcutElement,
077                            ExportImportPathUtil.getModelPath(fileShortcut), fileShortcut,
078                            DLPortletDataHandler.NAMESPACE);
079            }
080    
081            @Override
082            protected void doImportStagedModel(
083                            PortletDataContext portletDataContext, DLFileShortcut fileShortcut)
084                    throws Exception {
085    
086                    long userId = portletDataContext.getUserId(fileShortcut.getUserUuid());
087    
088                    if (fileShortcut.getFolderId() !=
089                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
090    
091                            String folderPath = ExportImportPathUtil.getModelPath(
092                                    portletDataContext, Folder.class.getName(),
093                                    fileShortcut.getFolderId());
094    
095                            DLFolder dlFolder =
096                                    (DLFolder)portletDataContext.getZipEntryAsObject(folderPath);
097    
098                            StagedModelDataHandlerUtil.importStagedModel(
099                                    portletDataContext, dlFolder);
100                    }
101    
102                    Map<Long, Long> folderIds =
103                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
104                                    Folder.class);
105    
106                    long folderId = MapUtil.getLong(
107                            folderIds, fileShortcut.getFolderId(), fileShortcut.getFolderId());
108    
109                    long groupId = portletDataContext.getScopeGroupId();
110    
111                    if (folderId != DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
112                            Folder folder = FolderUtil.findByPrimaryKey(folderId);
113    
114                            groupId = folder.getRepositoryId();
115                    }
116    
117                    String fileEntryPath = ExportImportPathUtil.getModelPath(
118                            portletDataContext, DLFileEntry.class.getName(),
119                            fileShortcut.getToFileEntryId());
120    
121                    DLFileEntry dlFileEntry =
122                            (DLFileEntry)portletDataContext.getZipEntryAsObject(fileEntryPath);
123    
124                    StagedModelDataHandlerUtil.importStagedModel(
125                            portletDataContext, dlFileEntry);
126    
127                    Element fileShortcutElement =
128                            portletDataContext.getImportDataStagedModelElement(fileShortcut);
129    
130                    String fileEntryUuid = fileShortcutElement.attributeValue(
131                            "file-entry-uuid");
132    
133                    FileEntry fileEntry = FileEntryUtil.fetchByUUID_R(
134                            fileEntryUuid, groupId);
135    
136                    if (fileEntry == null) {
137                            if (_log.isWarnEnabled()) {
138                                    _log.warn(
139                                            "Unable to fetch file entry {uuid=" + fileEntryUuid +
140                                                    ", groupId=" + groupId + "}");
141                            }
142    
143                            return;
144                    }
145    
146                    ServiceContext serviceContext = portletDataContext.createServiceContext(
147                            fileShortcut, DLPortletDataHandler.NAMESPACE);
148    
149                    DLFileShortcut importedFileShortcut = null;
150    
151                    if (portletDataContext.isDataStrategyMirror()) {
152                            DLFileShortcut existingFileShortcut =
153                                    DLFileShortcutUtil.fetchByUUID_G(
154                                            fileShortcut.getUuid(),
155                                            portletDataContext.getScopeGroupId());
156    
157                            if (existingFileShortcut == null) {
158                                    serviceContext.setUuid(fileShortcut.getUuid());
159    
160                                    importedFileShortcut = DLAppLocalServiceUtil.addFileShortcut(
161                                            userId, groupId, folderId, fileEntry.getFileEntryId(),
162                                            serviceContext);
163                            }
164                            else {
165                                    importedFileShortcut = DLAppLocalServiceUtil.updateFileShortcut(
166                                            userId, existingFileShortcut.getFileShortcutId(), folderId,
167                                            fileEntry.getFileEntryId(), serviceContext);
168                            }
169                    }
170                    else {
171                            importedFileShortcut = DLAppLocalServiceUtil.addFileShortcut(
172                                    userId, groupId, folderId, fileEntry.getFileEntryId(),
173                                    serviceContext);
174                    }
175    
176                    portletDataContext.importClassedModel(
177                            fileShortcut, importedFileShortcut, DLPortletDataHandler.NAMESPACE);
178            }
179    
180            private static Log _log = LogFactoryUtil.getLog(
181                    DLFileShortcutStagedModelDataHandler.class);
182    
183    }