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.lar;
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.BaseStagedModelDataHandler;
020    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
021    import com.liferay.portal.kernel.lar.PortletDataContext;
022    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
023    import com.liferay.portal.kernel.lar.StagedModelModifiedDateComparator;
024    import com.liferay.portal.kernel.log.Log;
025    import com.liferay.portal.kernel.log.LogFactoryUtil;
026    import com.liferay.portal.kernel.repository.model.Folder;
027    import com.liferay.portal.kernel.util.GetterUtil;
028    import com.liferay.portal.kernel.util.ListUtil;
029    import com.liferay.portal.kernel.xml.Element;
030    import com.liferay.portal.model.Repository;
031    import com.liferay.portal.model.RepositoryEntry;
032    import com.liferay.portal.service.RepositoryEntryLocalServiceUtil;
033    import com.liferay.portal.service.RepositoryLocalServiceUtil;
034    import com.liferay.portal.service.ServiceContext;
035    import com.liferay.portlet.documentlibrary.model.DLFolder;
036    import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
037    import com.liferay.portlet.documentlibrary.service.DLAppLocalServiceUtil;
038    
039    import java.util.List;
040    
041    /**
042     * @author Mate Thurzo
043     */
044    public class RepositoryStagedModelDataHandler
045            extends BaseStagedModelDataHandler<Repository> {
046    
047            public static final String[] CLASS_NAMES = {Repository.class.getName()};
048    
049            @Override
050            public void deleteStagedModel(
051                            String uuid, long groupId, String className, String extraData)
052                    throws PortalException {
053    
054                    Repository repository = fetchStagedModelByUuidAndGroupId(uuid, groupId);
055    
056                    if (repository != null) {
057                            RepositoryLocalServiceUtil.deleteRepository(
058                                    repository.getRepositoryId());
059                    }
060            }
061    
062            @Override
063            public Repository fetchStagedModelByUuidAndCompanyId(
064                    String uuid, long companyId) {
065    
066                    List<Repository> repositories =
067                            RepositoryLocalServiceUtil.getRepositoriesByUuidAndCompanyId(
068                                    uuid, companyId, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
069                                    new StagedModelModifiedDateComparator<Repository>());
070    
071                    if (ListUtil.isEmpty(repositories)) {
072                            return null;
073                    }
074    
075                    return repositories.get(0);
076            }
077    
078            @Override
079            public Repository fetchStagedModelByUuidAndGroupId(
080                    String uuid, long groupId) {
081    
082                    return RepositoryLocalServiceUtil.fetchRepositoryByUuidAndGroupId(
083                            uuid, groupId);
084            }
085    
086            @Override
087            public String[] getClassNames() {
088                    return CLASS_NAMES;
089            }
090    
091            @Override
092            public String getDisplayName(Repository repository) {
093                    return repository.getName();
094            }
095    
096            @Override
097            protected void doExportStagedModel(
098                            PortletDataContext portletDataContext, Repository repository)
099                    throws Exception {
100    
101                    Element repositoryElement = portletDataContext.getExportDataElement(
102                            repository);
103    
104                    Folder folder = DLAppLocalServiceUtil.getFolder(
105                            repository.getDlFolderId());
106    
107                    if (folder.getModel() instanceof DLFolder) {
108                            DLFolder dlFolder = (DLFolder)folder.getModel();
109    
110                            repositoryElement.addAttribute(
111                                    "hidden", String.valueOf(dlFolder.isHidden()));
112                    }
113    
114                    portletDataContext.addClassedModel(
115                            repositoryElement, ExportImportPathUtil.getModelPath(repository),
116                            repository);
117    
118                    List<RepositoryEntry> repositoryEntries =
119                            RepositoryEntryLocalServiceUtil.getRepositoryEntries(
120                                    repository.getRepositoryId());
121    
122                    for (RepositoryEntry repositoryEntry : repositoryEntries) {
123                            StagedModelDataHandlerUtil.exportReferenceStagedModel(
124                                    portletDataContext, repository, repositoryEntry,
125                                    PortletDataContext.REFERENCE_TYPE_CHILD);
126                    }
127            }
128    
129            @Override
130            protected void doImportStagedModel(
131                            PortletDataContext portletDataContext, Repository repository)
132                    throws Exception {
133    
134                    long userId = portletDataContext.getUserId(repository.getUserUuid());
135    
136                    ServiceContext serviceContext = portletDataContext.createServiceContext(
137                            repository);
138    
139                    Repository importedRepository = null;
140    
141                    Element repositoryElement =
142                            portletDataContext.getImportDataStagedModelElement(repository);
143    
144                    try {
145                            boolean hidden = GetterUtil.getBoolean(
146                                    repositoryElement.attributeValue("hidden"));
147    
148                            if (portletDataContext.isDataStrategyMirror()) {
149                                    Repository existingRepository =
150                                            fetchStagedModelByUuidAndGroupId(
151                                                    repository.getUuid(),
152                                                    portletDataContext.getScopeGroupId());
153    
154                                    if (existingRepository == null) {
155                                            existingRepository =
156                                                    RepositoryLocalServiceUtil.fetchRepository(
157                                                            portletDataContext.getScopeGroupId(),
158                                                            repository.getName());
159                                    }
160    
161                                    if (existingRepository == null) {
162                                            serviceContext.setUuid(repository.getUuid());
163    
164                                            importedRepository =
165                                                    RepositoryLocalServiceUtil.addRepository(
166                                                            userId, portletDataContext.getScopeGroupId(),
167                                                            repository.getClassNameId(),
168                                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
169                                                            repository.getName(), repository.getDescription(),
170                                                            repository.getPortletId(),
171                                                            repository.getTypeSettingsProperties(), hidden,
172                                                            serviceContext);
173                                    }
174                                    else {
175                                            RepositoryLocalServiceUtil.updateRepository(
176                                                    existingRepository.getRepositoryId(),
177                                                    repository.getName(), repository.getDescription());
178    
179                                            importedRepository = existingRepository;
180                                    }
181                            }
182                            else {
183                                    importedRepository = RepositoryLocalServiceUtil.addRepository(
184                                            userId, portletDataContext.getScopeGroupId(),
185                                            repository.getClassNameId(),
186                                            DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
187                                            repository.getName(), repository.getDescription(),
188                                            repository.getPortletId(),
189                                            repository.getTypeSettingsProperties(), hidden,
190                                            serviceContext);
191                            }
192                    }
193                    catch (Exception e) {
194                            if (_log.isWarnEnabled()) {
195                                    _log.warn(
196                                            "Unable to connect to repository {name=" +
197                                                    repository.getName() + ", typeSettings=" +
198                                                            repository.getTypeSettingsProperties() + "}",
199                                            e);
200                            }
201                    }
202    
203                    portletDataContext.importClassedModel(repository, importedRepository);
204    
205                    StagedModelDataHandlerUtil.importReferenceStagedModels(
206                            portletDataContext, repository, RepositoryEntry.class);
207            }
208    
209            @Override
210            protected void importReferenceStagedModels(
211                    PortletDataContext portletDataContext, Repository stagedModel) {
212            }
213    
214            private static final Log _log = LogFactoryUtil.getLog(
215                    RepositoryStagedModelDataHandler.class);
216    
217    }