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.repository.model.Folder;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.MapUtil;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.kernel.xml.Element;
028    import com.liferay.portal.model.Group;
029    import com.liferay.portal.model.Repository;
030    import com.liferay.portal.model.StagedModel;
031    import com.liferay.portal.repository.liferayrepository.model.LiferayFolder;
032    import com.liferay.portal.service.GroupLocalServiceUtil;
033    import com.liferay.portal.service.ServiceContext;
034    import com.liferay.portal.service.persistence.RepositoryUtil;
035    import com.liferay.portlet.documentlibrary.model.DLFileEntryType;
036    import com.liferay.portlet.documentlibrary.model.DLFileEntryTypeConstants;
037    import com.liferay.portlet.documentlibrary.model.DLFolder;
038    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
039    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
040    import com.liferay.portlet.documentlibrary.service.DLFileEntryTypeLocalServiceUtil;
041    import com.liferay.portlet.documentlibrary.service.DLFolderLocalServiceUtil;
042    import com.liferay.portlet.documentlibrary.service.persistence.DLFileEntryTypeUtil;
043    
044    import java.util.ArrayList;
045    import java.util.List;
046    import java.util.Map;
047    
048    /**
049     * @author Mate Thurzo
050     */
051    public class FolderStagedModelDataHandler
052            extends BaseStagedModelDataHandler<Folder> {
053    
054            public static final String[] CLASS_NAMES = {
055                    DLFolder.class.getName(), Folder.class.getName(),
056                    LiferayFolder.class.getName()
057            };
058    
059            @Override
060            public String[] getClassNames() {
061                    return CLASS_NAMES;
062            }
063    
064            @Override
065            protected void doExportStagedModel(
066                            PortletDataContext portletDataContext, Folder folder)
067                    throws Exception {
068    
069                    Element folderGroupElement =
070                            portletDataContext.getExportDataGroupElement(Folder.class);
071    
072                    Element folderElement = folderGroupElement.addElement("staged-model");
073    
074                    String folderPath = ExportImportPathUtil.getModelPath(
075                            folder.getGroupId(), Folder.class.getName(), folder.getFolderId());
076    
077                    if (folder.isMountPoint()) {
078                            Repository repository = RepositoryUtil.findByPrimaryKey(
079                                    folder.getRepositoryId());
080    
081                            StagedModelDataHandlerUtil.exportStagedModel(
082                                    portletDataContext, repository);
083    
084                            portletDataContext.addReferenceElement(folderElement, repository);
085                    }
086                    else if (!folder.isDefaultRepository()) {
087    
088                            // No need to export non-Liferay repository items since they would
089                            // be exported as part of repository export
090    
091                            return;
092                    }
093    
094                    if (folder.getParentFolderId() !=
095                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
096    
097                            StagedModelDataHandlerUtil.exportStagedModel(
098                                    portletDataContext, folder.getParentFolder());
099                    }
100    
101                    exportFolderFileEntryTypes(portletDataContext, folder, folderElement);
102    
103                    portletDataContext.addClassedModel(
104                            folderElement, folderPath, folder, DLPortletDataHandler.NAMESPACE);
105            }
106    
107            @Override
108            protected void doImportStagedModel(
109                            PortletDataContext portletDataContext, Folder folder)
110                    throws Exception {
111    
112                    long userId = portletDataContext.getUserId(folder.getUserUuid());
113    
114                    String path = ExportImportPathUtil.getModelPath(
115                            portletDataContext, Folder.class.getName(), folder.getFolderId());
116    
117                    Element folderElement =
118                            portletDataContext.getImportDataStagedModelElement(
119                                    Folder.class.getSimpleName(), "path", path);
120    
121                    Element referencesElement = folderElement.element("references");
122    
123                    if (referencesElement != null) {
124                            List<Element> referenceElements = referencesElement.elements();
125    
126                            for (Element referenceElement : referenceElements) {
127                                    String className = referenceElement.attributeValue(
128                                            "class-name");
129    
130                                    if (!className.equals(Repository.class.getSimpleName())) {
131                                            continue;
132                                    }
133    
134                                    String classPK = referenceElement.attributeValue("class-pk");
135    
136                                    String referencePath = ExportImportPathUtil.getModelPath(
137                                            portletDataContext, className, GetterUtil.getLong(classPK));
138    
139                                    StagedModel referenceStagedModel =
140                                            (StagedModel)portletDataContext.getZipEntryAsObject(
141                                                    referencePath);
142    
143                                    StagedModelDataHandlerUtil.importStagedModel(
144                                            portletDataContext, referenceStagedModel);
145                            }
146                    }
147    
148                    if (folder.getParentFolderId() !=
149                                    DLFolderConstants.DEFAULT_PARENT_FOLDER_ID) {
150    
151                            String parentFolderPath = ExportImportPathUtil.getModelPath(
152                                    portletDataContext, Folder.class.getName(),
153                                    folder.getParentFolderId());
154    
155                            Folder parentFolder =
156                                    (Folder)portletDataContext.getZipEntryAsObject(
157                                            parentFolderPath);
158    
159                            StagedModelDataHandlerUtil.importStagedModel(
160                                    portletDataContext, parentFolder);
161                    }
162    
163                    Map<Long, Long> folderIds =
164                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
165                                    Folder.class);
166    
167                    long parentFolderId = MapUtil.getLong(
168                            folderIds, folder.getParentFolderId(), folder.getParentFolderId());
169    
170                    ServiceContext serviceContext = portletDataContext.createServiceContext(
171                            folder, DLPortletDataHandler.NAMESPACE);
172    
173                    serviceContext.setUserId(userId);
174    
175                    Folder importedFolder = null;
176    
177                    if (portletDataContext.isDataStrategyMirror()) {
178                            Folder existingFolder = FolderUtil.fetchByUUID_R(
179                                    folder.getUuid(), portletDataContext.getScopeGroupId());
180    
181                            if (existingFolder == null) {
182                                    String name = getFolderName(
183                                            null, portletDataContext.getScopeGroupId(), parentFolderId,
184                                            folder.getName(), 2);
185    
186                                    serviceContext.setUuid(folder.getUuid());
187    
188                                    importedFolder = DLAppLocalServiceUtil.addFolder(
189                                            userId, portletDataContext.getScopeGroupId(),
190                                            parentFolderId, name, folder.getDescription(),
191                                            serviceContext);
192                            }
193                            else {
194                                    String name = getFolderName(
195                                            folder.getUuid(), portletDataContext.getScopeGroupId(),
196                                            parentFolderId, folder.getName(), 2);
197    
198                                    importedFolder = DLAppLocalServiceUtil.updateFolder(
199                                            existingFolder.getFolderId(), parentFolderId, name,
200                                            folder.getDescription(), serviceContext);
201                            }
202                    }
203                    else {
204                            String name = getFolderName(
205                                    null, portletDataContext.getScopeGroupId(), parentFolderId,
206                                    folder.getName(), 2);
207    
208                            importedFolder = DLAppLocalServiceUtil.addFolder(
209                                    userId, portletDataContext.getScopeGroupId(), parentFolderId,
210                                    name, folder.getDescription(), serviceContext);
211                    }
212    
213                    folderIds.put(folder.getFolderId(), importedFolder.getFolderId());
214    
215                    importFolderFileEntryTypes(
216                            portletDataContext, folderElement, folder, serviceContext);
217    
218                    portletDataContext.importClassedModel(
219                            folder, importedFolder, DLPortletDataHandler.NAMESPACE);
220            }
221    
222            protected void exportFolderFileEntryTypes(
223                            PortletDataContext portletDataContext, Folder folder,
224                            Element folderElement)
225                    throws Exception {
226    
227                    List<DLFileEntryType> dlFileEntryTypes =
228                            DLFileEntryTypeLocalServiceUtil.getFolderFileEntryTypes(
229                                    new long[]{portletDataContext.getScopeGroupId()},
230                                    folder.getFolderId(), false);
231    
232                    long defaultFileEntryTypeId =
233                            DLFileEntryTypeLocalServiceUtil.getDefaultFileEntryTypeId(
234                                    folder.getFolderId());
235    
236                    String defaultFileEntryTypeUuid = StringPool.BLANK;
237    
238                    for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
239                            if (dlFileEntryType.getFileEntryTypeId() ==
240                                            DLFileEntryTypeConstants.
241                                                    FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT) {
242    
243                                    folderElement.addAttribute("basic-document", "true");
244    
245                                    continue;
246                            }
247    
248                            if (defaultFileEntryTypeId ==
249                                            dlFileEntryType.getFileEntryTypeId()) {
250    
251                                    defaultFileEntryTypeUuid = dlFileEntryType.getUuid();
252                            }
253    
254                            if (dlFileEntryType.isExportable()) {
255                                    StagedModelDataHandlerUtil.exportStagedModel(
256                                            portletDataContext, dlFileEntryType);
257    
258                                    portletDataContext.addReferenceElement(
259                                            folderElement, dlFileEntryType);
260                            }
261                    }
262    
263                    folderElement.addAttribute(
264                            "defaultFileEntryTypeUuid", defaultFileEntryTypeUuid);
265            }
266    
267            /**
268             * @see com.liferay.portal.lar.PortletImporter#getAssetCategoryName(String,
269             *      long, long, String, int)
270             * @see com.liferay.portal.lar.PortletImporter#getAssetVocabularyName(
271             *      String, long, String, int)
272             */
273            protected String getFolderName(
274                            String uuid, long groupId, long parentFolderId, String name,
275                            int count)
276                    throws Exception {
277    
278                    Folder folder = FolderUtil.fetchByR_P_N(groupId, parentFolderId, name);
279    
280                    if (folder == null) {
281                            return name;
282                    }
283    
284                    if (Validator.isNotNull(uuid) && uuid.equals(folder.getUuid())) {
285                            return name;
286                    }
287    
288                    name = StringUtil.appendParentheticalSuffix(name, count);
289    
290                    return getFolderName(uuid, groupId, parentFolderId, name, ++count);
291            }
292    
293            protected void importFolderFileEntryTypes(
294                            PortletDataContext portletDataContext, Element folderElement,
295                            Folder folder, ServiceContext serviceContext)
296                    throws Exception {
297    
298                    List<Long> fileEntryTypeIds = new ArrayList<Long>();
299    
300                    String defaultFileEntryTypeUuid = GetterUtil.getString(
301                            folderElement.attributeValue("defaultFileEntryTypeUuid"));
302    
303                    long defaultFileEntryTypeId = 0;
304    
305                    Element referencesElement = folderElement.element("references");
306    
307                    if (referencesElement == null) {
308                            return;
309                    }
310    
311                    List<Element> referenceElements = referencesElement.elements();
312    
313                    for (Element referenceElement : referenceElements) {
314                            String className = referenceElement.attributeValue("class-name");
315    
316                            if (!className.equals(DLFileEntryType.class.getSimpleName())) {
317                                    continue;
318                            }
319    
320                            String referencePath = referenceElement.attributeValue("path");
321    
322                            DLFileEntryType referenceDLFileEntryType =
323                                    (DLFileEntryType)portletDataContext.getZipEntryAsObject(
324                                            referencePath);
325    
326                            String fileEntryTypeUuid = referenceDLFileEntryType.getUuid();
327    
328                            DLFileEntryType dlFileEntryType = DLFileEntryTypeUtil.fetchByUUID_G(
329                                    fileEntryTypeUuid, portletDataContext.getScopeGroupId());
330    
331                            if (dlFileEntryType == null) {
332                                    Group companyGroup = GroupLocalServiceUtil.getCompanyGroup(
333                                            portletDataContext.getCompanyId());
334    
335                                    dlFileEntryType = DLFileEntryTypeUtil.fetchByUUID_G(
336                                            fileEntryTypeUuid, companyGroup.getGroupId());
337                            }
338    
339                            if (dlFileEntryType == null) {
340                                    continue;
341                            }
342    
343                            fileEntryTypeIds.add(dlFileEntryType.getFileEntryTypeId());
344    
345                            if (defaultFileEntryTypeUuid.equals(dlFileEntryType.getUuid())) {
346                                    defaultFileEntryTypeId = dlFileEntryType.getFileEntryTypeId();
347                            }
348                    }
349    
350                    if (GetterUtil.getBoolean(
351                                    folderElement.attributeValue("basic-document"))) {
352    
353                            DLFileEntryType dlFileEntryType =
354                                    DLFileEntryTypeLocalServiceUtil.fetchDLFileEntryType(0);
355    
356                            fileEntryTypeIds.add(dlFileEntryType.getFileEntryTypeId());
357                    }
358    
359                    if (!fileEntryTypeIds.isEmpty()) {
360                            DLFolder dlFolder = (DLFolder)folder.getModel();
361    
362                            dlFolder.setDefaultFileEntryTypeId(defaultFileEntryTypeId);
363                            dlFolder.setOverrideFileEntryTypes(true);
364    
365                            DLFolderLocalServiceUtil.updateDLFolder(dlFolder);
366    
367                            DLFileEntryTypeLocalServiceUtil.updateFolderFileEntryTypes(
368                                    dlFolder, fileEntryTypeIds, defaultFileEntryTypeId,
369                                    serviceContext);
370                    }
371            }
372    
373    }