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