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.Folder;
024    import com.liferay.portal.kernel.util.GetterUtil;
025    import com.liferay.portal.kernel.xml.Element;
026    import com.liferay.portal.model.Repository;
027    import com.liferay.portal.model.RepositoryEntry;
028    import com.liferay.portal.repository.liferayrepository.LiferayRepository;
029    import com.liferay.portal.service.RepositoryLocalServiceUtil;
030    import com.liferay.portal.service.ServiceContext;
031    import com.liferay.portal.service.persistence.RepositoryEntryUtil;
032    import com.liferay.portal.service.persistence.RepositoryUtil;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portlet.documentlibrary.model.DLFolder;
035    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
036    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
037    
038    import java.util.List;
039    
040    /**
041     * @author Mate Thurzo
042     */
043    public class RepositoryStagedModelDataHandler
044            extends BaseStagedModelDataHandler<Repository> {
045    
046            public static final String[] CLASS_NAMES = {Repository.class.getName()};
047    
048            @Override
049            public String[] getClassNames() {
050                    return CLASS_NAMES;
051            }
052    
053            @Override
054            protected void doExportStagedModel(
055                            PortletDataContext portletDataContext, Repository repository)
056                    throws Exception {
057    
058                    Element repositoryElement =
059                            portletDataContext.getExportDataStagedModelElement(repository);
060    
061                    Folder folder = DLAppLocalServiceUtil.getFolder(
062                            repository.getDlFolderId());
063    
064                    if (folder.getModel() instanceof DLFolder) {
065                            DLFolder dlFolder = (DLFolder)folder.getModel();
066    
067                            repositoryElement.addAttribute(
068                                    "hidden", String.valueOf(dlFolder.isHidden()));
069                    }
070    
071                    portletDataContext.addClassedModel(
072                            repositoryElement, ExportImportPathUtil.getModelPath(repository),
073                            repository, DLPortletDataHandler.NAMESPACE);
074    
075                    List<RepositoryEntry> repositoryEntries =
076                            RepositoryEntryUtil.findByRepositoryId(
077                                    repository.getRepositoryId());
078    
079                    for (RepositoryEntry repositoryEntry : repositoryEntries) {
080                            StagedModelDataHandlerUtil.exportStagedModel(
081                                    portletDataContext, repositoryEntry);
082    
083                            portletDataContext.addReferenceElement(
084                                    repositoryElement, repositoryEntry);
085                    }
086            }
087    
088            @Override
089            protected void doImportStagedModel(
090                            PortletDataContext portletDataContext, Repository repository)
091                    throws Exception {
092    
093                    long userId = portletDataContext.getUserId(repository.getUserUuid());
094    
095                    ServiceContext serviceContext = portletDataContext.createServiceContext(
096                            repository, DLPortletDataHandler.NAMESPACE);
097    
098                    Repository importedRepository = null;
099    
100                    Element repositoryElement =
101                            portletDataContext.getImportDataStagedModelElement(repository);
102    
103                    try {
104                            boolean hidden = GetterUtil.getBoolean(
105                                    repositoryElement.attributeValue("hidden"));
106    
107                            if (portletDataContext.isDataStrategyMirror()) {
108                                    Repository existingRepository = RepositoryUtil.fetchByUUID_G(
109                                            repository.getUuid(), portletDataContext.getScopeGroupId());
110    
111                                    if (existingRepository == null) {
112                                            existingRepository =
113                                                    RepositoryLocalServiceUtil.fetchRepository(
114                                                            portletDataContext.getScopeGroupId(),
115                                                            repository.getName());
116                                    }
117    
118                                    long classNameId = 0;
119    
120                                    if (existingRepository != null) {
121                                            classNameId = existingRepository.getClassNameId();
122                                    }
123    
124                                    if ((existingRepository == null) ||
125                                            (classNameId !=
126                                                    PortalUtil.getClassNameId(LiferayRepository.class))) {
127    
128                                            serviceContext.setUuid(repository.getUuid());
129    
130                                            importedRepository =
131                                                    RepositoryLocalServiceUtil.addRepository(
132                                                            userId, portletDataContext.getScopeGroupId(),
133                                                            repository.getClassNameId(),
134                                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
135                                                            repository.getName(), repository.getDescription(),
136                                                            repository.getPortletId(),
137                                                            repository.getTypeSettingsProperties(), hidden,
138                                                            serviceContext);
139                                    }
140                                    else {
141                                            RepositoryLocalServiceUtil.updateRepository(
142                                                    existingRepository.getRepositoryId(),
143                                                    repository.getName(), repository.getDescription());
144    
145                                            importedRepository = existingRepository;
146                                    }
147                            }
148                            else {
149                                    importedRepository = RepositoryLocalServiceUtil.addRepository(
150                                            userId, portletDataContext.getScopeGroupId(),
151                                            repository.getClassNameId(),
152                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
153                                            repository.getName(), repository.getDescription(),
154                                            repository.getPortletId(),
155                                            repository.getTypeSettingsProperties(), hidden,
156                                            serviceContext);
157                            }
158                    }
159                    catch (Exception e) {
160                            if (_log.isWarnEnabled()) {
161                                    _log.warn(
162                                            "Unable to connect to repository {name=" +
163                                                    repository.getName() + ", typeSettings=" +
164                                                            repository.getTypeSettingsProperties() + "}",
165                                            e);
166                            }
167                    }
168    
169                    portletDataContext.importClassedModel(
170                            repository, importedRepository, DLPortletDataHandler.NAMESPACE);
171    
172                    List<Element> repositoryEntryElements =
173                            portletDataContext.getReferencedDataElements(
174                                    repository, RepositoryEntry.class);
175    
176                    for (Element repositoryEntryElement : repositoryEntryElements) {
177                            StagedModelDataHandlerUtil.importStagedModel(
178                                    portletDataContext, repositoryEntryElement);
179                    }
180            }
181    
182            private static Log _log = LogFactoryUtil.getLog(
183                    RepositoryStagedModelDataHandler.class);
184    
185    }