/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.lar.test;
import com.liferay.asset.kernel.model.AssetCategory;
import com.liferay.asset.kernel.model.AssetEntry;
import com.liferay.asset.kernel.model.AssetTag;
import com.liferay.asset.kernel.model.AssetVocabulary;
import com.liferay.asset.kernel.service.AssetCategoryLocalServiceUtil;
import com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil;
import com.liferay.asset.kernel.service.AssetTagLocalServiceUtil;
import com.liferay.asset.kernel.service.AssetVocabularyLocalServiceUtil;
import com.liferay.exportimport.kernel.lar.ExportImportClassedModelUtil;
import com.liferay.exportimport.kernel.lar.ExportImportPathUtil;
import com.liferay.exportimport.kernel.lar.ExportImportThreadLocal;
import com.liferay.exportimport.kernel.lar.PortletDataContext;
import com.liferay.exportimport.kernel.lar.PortletDataContextFactoryUtil;
import com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandler;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerRegistryUtil;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil;
import com.liferay.exportimport.kernel.lar.UserIdStrategy;
import com.liferay.message.boards.kernel.model.MBMessage;
import com.liferay.message.boards.kernel.service.MBMessageLocalServiceUtil;
import com.liferay.portal.kernel.comment.CommentManagerUtil;
import com.liferay.portal.kernel.model.Company;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.StagedGroupedModel;
import com.liferay.portal.kernel.model.StagedModel;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.service.CompanyLocalServiceUtil;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.IdentityServiceContextFunction;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.ServiceContextThreadLocal;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.util.GroupTestUtil;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.DateUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.Time;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReaderUtil;
import com.liferay.portal.kernel.zip.ZipReader;
import com.liferay.portal.kernel.zip.ZipReaderFactoryUtil;
import com.liferay.portal.kernel.zip.ZipWriter;
import com.liferay.portal.kernel.zip.ZipWriterFactoryUtil;
import com.liferay.portal.service.test.ServiceTestUtil;
import com.liferay.portlet.asset.util.test.AssetTestUtil;
import com.liferay.portlet.ratings.util.test.RatingsTestUtil;
import com.liferay.ratings.kernel.model.RatingsEntry;
import com.liferay.ratings.kernel.service.RatingsEntryLocalServiceUtil;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @author Daniel Kocsis
* @author Mate Thurzo
*/
public abstract class BaseStagedModelDataHandlerTestCase {
@Before
public void setUp() throws Exception {
liveGroup = GroupTestUtil.addGroup();
stagingGroup = GroupTestUtil.addGroup();
ServiceTestUtil.setUser(TestPropsValues.getUser());
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(stagingGroup.getGroupId());
ServiceContextThreadLocal.pushServiceContext(serviceContext);
}
@After
public void tearDown() throws Exception {
ServiceContextThreadLocal.popServiceContext();
}
@Test
public void testCleanStagedModelDataHandler() throws Exception {
// Export
initExport();
Map<String, List<StagedModel>> dependentStagedModelsMap =
addDependentStagedModelsMap(stagingGroup);
StagedModel stagedModel = addStagedModel(
stagingGroup, dependentStagedModelsMap);
// Comments
addComments(stagedModel);
// Ratings
addRatings(stagedModel);
StagedModelDataHandlerUtil.exportStagedModel(
portletDataContext, stagedModel);
validateExport(
portletDataContext, stagedModel, dependentStagedModelsMap);
// Import
initImport();
deleteStagedModel(stagedModel, dependentStagedModelsMap, stagingGroup);
// Reread the staged model for import from ZIP for true testing
StagedModel exportedStagedModel = readExportedStagedModel(stagedModel);
Assert.assertNotNull(exportedStagedModel);
StagedModelDataHandlerUtil.importStagedModel(
portletDataContext, exportedStagedModel);
}
@Test
public void testExportImportWithDefaultData() throws Exception {
// Export default data
initExport();
Map<String, List<StagedModel>> defaultDependentStagedModelsMap =
addDefaultDependentStagedModelsMap(stagingGroup);
StagedModel stagedModel = addDefaultStagedModel(
stagingGroup, defaultDependentStagedModelsMap);
if (stagedModel == null) {
return;
}
StagedModelDataHandlerUtil.exportStagedModel(
portletDataContext, stagedModel);
validateExport(
portletDataContext, stagedModel, defaultDependentStagedModelsMap);
// Add default data to live site
Map<String, List<StagedModel>> secondDependentStagedModelsMap =
addDefaultDependentStagedModelsMap(liveGroup);
addDefaultStagedModel(liveGroup, secondDependentStagedModelsMap);
// Import
initImport();
StagedModel exportedStagedModel = readExportedStagedModel(stagedModel);
Assert.assertNotNull(exportedStagedModel);
StagedModelDataHandlerUtil.importStagedModel(
portletDataContext, exportedStagedModel);
// Import again for more robustness (i.e. filter name issues)
StagedModelDataHandlerUtil.importStagedModel(
portletDataContext, exportedStagedModel);
String uuid = exportedStagedModel.getUuid();
StagedModel importedModel = getStagedModel(uuid, liveGroup);
Assert.assertNotNull(importedModel);
}
public void testLastPublishDate() throws Exception {
if (!supportLastPublishDateUpdate()) {
return;
}
Map<String, List<StagedModel>> dependentStagedModelsMap =
new HashMap<>();
StagedGroupedModel stagedGroupedModel =
(StagedGroupedModel)addStagedModel(
stagingGroup, dependentStagedModelsMap);
Assert.assertNull(stagedGroupedModel.getLastPublishDate());
initExport();
// Update last publish date
Map<String, String[]> parameterMap =
portletDataContext.getParameterMap();
parameterMap.put(
PortletDataHandlerKeys.UPDATE_LAST_PUBLISH_DATE,
new String[] {Boolean.TRUE.toString()});
try {
ExportImportThreadLocal.setPortletStagingInProcess(true);
StagedModelDataHandlerUtil.exportStagedModel(
portletDataContext, stagedGroupedModel);
}
finally {
ExportImportThreadLocal.setPortletStagingInProcess(false);
}
Assert.assertEquals(
portletDataContext.getEndDate(),
stagedGroupedModel.getLastPublishDate());
// Do not update last publish date
Date originalLastPublishDate = stagedGroupedModel.getLastPublishDate();
parameterMap.put(
PortletDataHandlerKeys.UPDATE_LAST_PUBLISH_DATE,
new String[] {Boolean.TRUE.toString()});
try {
ExportImportThreadLocal.setPortletStagingInProcess(true);
StagedModelDataHandlerUtil.exportStagedModel(
portletDataContext, stagedGroupedModel);
}
finally {
ExportImportThreadLocal.setPortletStagingInProcess(false);
}
Assert.assertEquals(
originalLastPublishDate, stagedGroupedModel.getLastPublishDate());
}
@Test
public void testStagedModelDataHandler() throws Exception {
// Export
initExport();
Map<String, List<StagedModel>> dependentStagedModelsMap =
addDependentStagedModelsMap(stagingGroup);
StagedModel stagedModel = addStagedModel(
stagingGroup, dependentStagedModelsMap);
// Assets
StagedModelAssets stagedModelAssets = updateAssetEntry(
stagedModel, stagingGroup);
// Comments
addComments(stagedModel);
// Ratings
addRatings(stagedModel);
StagedModelDataHandlerUtil.exportStagedModel(
portletDataContext, stagedModel);
validateExport(
portletDataContext, stagedModel, dependentStagedModelsMap);
// Import
initImport();
// Reread the staged model for import from ZIP for true testing
StagedModel exportedStagedModel = readExportedStagedModel(stagedModel);
Assert.assertNotNull(exportedStagedModel);
StagedModelDataHandlerUtil.importStagedModel(
portletDataContext, exportedStagedModel);
validateImport(
stagedModel, stagedModelAssets, dependentStagedModelsMap,
liveGroup);
}
@Test
public void testVersioning() throws Exception {
if (!isVersionableStagedModel()) {
return;
}
Map<String, List<StagedModel>> dependentStagedModelsMap =
addDependentStagedModelsMap(stagingGroup);
StagedModel stagedModel = addStagedModel(
stagingGroup, dependentStagedModelsMap);
stagedModel = addVersion(stagedModel);
exportImportStagedModel(stagedModel);
StagedModel importedStagedModel = getStagedModel(
stagedModel.getUuid(), liveGroup);
Assert.assertNotNull(importedStagedModel);
validateImportedStagedModel(stagedModel, importedStagedModel);
}
@Test
public void testVersioning2() throws Exception {
if (!isVersionableStagedModel()) {
return;
}
Map<String, List<StagedModel>> dependentStagedModelsMap =
addDependentStagedModelsMap(stagingGroup);
StagedModel stagedModel = addStagedModel(
stagingGroup, dependentStagedModelsMap);
// Make sure the dates are different
Thread.sleep(4000);
exportImportStagedModel(stagedModel);
StagedModel importedStagedModel = getStagedModel(
stagedModel.getUuid(), liveGroup);
validateImportedStagedModel(stagedModel, importedStagedModel);
stagedModel = addVersion(stagedModel);
exportImportStagedModel(stagedModel);
importedStagedModel = getStagedModel(stagedModel.getUuid(), liveGroup);
validateImportedStagedModel(stagedModel, importedStagedModel);
}
@Test
public void testVersioningExportImportTwice() throws Exception {
if (!isVersionableStagedModel()) {
return;
}
Map<String, List<StagedModel>> dependentStagedModelsMap =
addDependentStagedModelsMap(stagingGroup);
StagedModel stagedModel = addStagedModel(
stagingGroup, dependentStagedModelsMap);
stagedModel = addVersion(stagedModel);
exportImportStagedModel(stagedModel);
StagedModel importedStagedModel = getStagedModel(
stagedModel.getUuid(), liveGroup);
Assert.assertNotNull(importedStagedModel);
validateImportedStagedModel(stagedModel, importedStagedModel);
exportImportStagedModel(stagedModel);
importedStagedModel = getStagedModel(stagedModel.getUuid(), liveGroup);
Assert.assertNotNull(importedStagedModel);
validateImportedStagedModel(stagedModel, importedStagedModel);
}
protected void addComments(StagedModel stagedModel) throws Exception {
if (!isCommentableStagedModel()) {
return;
}
User user = TestPropsValues.getUser();
String className = ExportImportClassedModelUtil.getClassName(
stagedModel);
long classPK = ExportImportClassedModelUtil.getClassPK(stagedModel);
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(
stagingGroup.getGroupId(), user.getUserId());
CommentManagerUtil.addComment(
user.getUserId(), stagingGroup.getGroupId(), className, classPK,
user.getFullName(), RandomTestUtil.randomString(),
RandomTestUtil.randomString(50),
new IdentityServiceContextFunction(serviceContext));
}
protected Map<String, List<StagedModel>> addDefaultDependentStagedModelsMap(
Group group)
throws Exception {
return new HashMap<>();
}
protected StagedModel addDefaultStagedModel(
Group group,
Map<String, List<StagedModel>> dependentStagedModelsMap)
throws Exception {
return null;
}
protected List<StagedModel> addDependentStagedModel(
Map<String, List<StagedModel>> dependentStagedModelsMap, Class<?> clazz,
StagedModel dependentStagedModel) {
List<StagedModel> dependentStagedModels = dependentStagedModelsMap.get(
clazz.getSimpleName());
if (dependentStagedModels == null) {
dependentStagedModels = new ArrayList<>();
dependentStagedModelsMap.put(
clazz.getSimpleName(), dependentStagedModels);
}
dependentStagedModels.add(dependentStagedModel);
return dependentStagedModels;
}
protected Map<String, List<StagedModel>> addDependentStagedModelsMap(
Group group)
throws Exception {
return new HashMap<>();
}
protected void addRatings(StagedModel stagedModel) throws Exception {
RatingsTestUtil.addEntry(
ExportImportClassedModelUtil.getClassName(stagedModel),
ExportImportClassedModelUtil.getClassPK(stagedModel));
}
protected abstract StagedModel addStagedModel(
Group group,
Map<String, List<StagedModel>> dependentStagedModelsMap)
throws Exception;
protected StagedModel addVersion(StagedModel stagedModel) throws Exception {
return null;
}
protected void deleteStagedModel(
StagedModel stagedModel,
Map<String, List<StagedModel>> dependentStagedModelsMap,
Group group)
throws Exception {
@SuppressWarnings("rawtypes")
StagedModelDataHandler stagedModelDataHandler =
StagedModelDataHandlerRegistryUtil.getStagedModelDataHandler(
ExportImportClassedModelUtil.getClassName(stagedModel));
stagedModelDataHandler.deleteStagedModel(stagedModel);
for (List<StagedModel> dependentStagedModels :
dependentStagedModelsMap.values()) {
for (StagedModel dependentStagedModel : dependentStagedModels) {
stagedModelDataHandler =
StagedModelDataHandlerRegistryUtil.
getStagedModelDataHandler(
ExportImportClassedModelUtil.getClassName(
dependentStagedModel));
stagedModelDataHandler.deleteStagedModel(dependentStagedModel);
}
}
}
protected void exportImportStagedModel(StagedModel stagedModel)
throws Exception {
initExport();
StagedModelDataHandlerUtil.exportStagedModel(
portletDataContext, stagedModel);
initImport();
StagedModel exportedStagedModel = readExportedStagedModel(stagedModel);
Assert.assertNotNull(exportedStagedModel);
StagedModelDataHandlerUtil.importStagedModel(
portletDataContext, exportedStagedModel);
}
protected AssetEntry fetchAssetEntry(StagedModel stagedModel, Group group)
throws Exception {
return AssetEntryLocalServiceUtil.fetchEntry(
group.getGroupId(), stagedModel.getUuid());
}
protected Date getEndDate() {
return new Date();
}
protected Map<String, String[]> getParameterMap() {
Map<String, String[]> parameterMap = new LinkedHashMap<>();
parameterMap.put(
PortletDataHandlerKeys.DATA_STRATEGY,
new String[] {
PortletDataHandlerKeys.DATA_STRATEGY_MIRROR_OVERWRITE
});
parameterMap.put(
PortletDataHandlerKeys.IGNORE_LAST_PUBLISH_DATE,
new String[] {Boolean.TRUE.toString()});
parameterMap.put(
PortletDataHandlerKeys.PORTLET_CONFIGURATION,
new String[] {Boolean.TRUE.toString()});
parameterMap.put(
PortletDataHandlerKeys.PORTLET_CONFIGURATION_ALL,
new String[] {Boolean.TRUE.toString()});
parameterMap.put(
PortletDataHandlerKeys.PORTLET_DATA,
new String[] {Boolean.TRUE.toString()});
parameterMap.put(
PortletDataHandlerKeys.PORTLET_DATA_ALL,
new String[] {Boolean.TRUE.toString()});
parameterMap.put(
PortletDataHandlerKeys.PORTLET_SETUP_ALL,
new String[] {Boolean.TRUE.toString()});
return parameterMap;
}
protected abstract StagedModel getStagedModel(String uuid, Group group);
protected abstract Class<? extends StagedModel> getStagedModelClass();
protected Date getStartDate() {
return new Date(System.currentTimeMillis() - Time.HOUR);
}
protected void initExport() throws Exception {
zipWriter = ZipWriterFactoryUtil.getZipWriter();
portletDataContext =
PortletDataContextFactoryUtil.createExportPortletDataContext(
stagingGroup.getCompanyId(), stagingGroup.getGroupId(),
getParameterMap(), getStartDate(), getEndDate(), zipWriter);
portletDataContext.setExportImportProcessId(
BaseStagedModelDataHandlerTestCase.class.getName());
rootElement = SAXReaderUtil.createElement("root");
portletDataContext.setExportDataRootElement(rootElement);
missingReferencesElement = rootElement.addElement("missing-references");
portletDataContext.setMissingReferencesElement(
missingReferencesElement);
}
protected void initImport() throws Exception {
userIdStrategy = new TestUserIdStrategy();
zipReader = ZipReaderFactoryUtil.getZipReader(zipWriter.getFile());
String xml = zipReader.getEntryAsString("/manifest.xml");
if (xml == null) {
Document document = SAXReaderUtil.createDocument();
Element rootElement = document.addElement("root");
rootElement.addElement("header");
zipWriter.addEntry("/manifest.xml", document.asXML());
zipReader = ZipReaderFactoryUtil.getZipReader(zipWriter.getFile());
}
portletDataContext =
PortletDataContextFactoryUtil.createImportPortletDataContext(
liveGroup.getCompanyId(), liveGroup.getGroupId(),
getParameterMap(), userIdStrategy, zipReader);
portletDataContext.setExportImportProcessId(
BaseStagedModelDataHandlerTestCase.class.getName());
portletDataContext.setImportDataRootElement(rootElement);
Element missingReferencesElement = rootElement.element(
"missing-references");
if (missingReferencesElement == null) {
missingReferencesElement = rootElement.addElement(
"missing-references");
}
portletDataContext.setMissingReferencesElement(
missingReferencesElement);
Group sourceCompanyGroup = GroupLocalServiceUtil.getCompanyGroup(
stagingGroup.getCompanyId());
portletDataContext.setSourceCompanyGroupId(
sourceCompanyGroup.getGroupId());
portletDataContext.setSourceCompanyId(stagingGroup.getCompanyId());
portletDataContext.setSourceGroupId(stagingGroup.getGroupId());
}
protected boolean isAssetPrioritySupported() {
return false;
}
protected boolean isCommentableStagedModel() {
return false;
}
protected boolean isVersionableStagedModel() {
return false;
}
protected StagedModel readExportedStagedModel(StagedModel stagedModel) {
String stagedModelPath = ExportImportPathUtil.getModelPath(stagedModel);
StagedModel exportedStagedModel =
(StagedModel)portletDataContext.getZipEntryAsObject(
stagedModelPath);
return exportedStagedModel;
}
protected boolean supportLastPublishDateUpdate() {
return false;
}
protected StagedModelAssets updateAssetEntry(
StagedModel stagedModel, Group group)
throws Exception {
AssetEntry assetEntry = fetchAssetEntry(stagedModel, group);
if (assetEntry == null) {
return null;
}
AssetVocabulary assetVocabulary = AssetTestUtil.addVocabulary(
stagingGroup.getGroupId());
AssetCategory assetCategory = AssetTestUtil.addCategory(
stagingGroup.getGroupId(), assetVocabulary.getVocabularyId());
Company company = CompanyLocalServiceUtil.getCompany(
stagedModel.getCompanyId());
Group companyGroup = company.getGroup();
AssetVocabulary companyAssetVocabulary = AssetTestUtil.addVocabulary(
companyGroup.getGroupId());
AssetCategory companyAssetCategory = AssetTestUtil.addCategory(
companyGroup.getGroupId(),
companyAssetVocabulary.getVocabularyId());
AssetTag assetTag = AssetTestUtil.addTag(stagingGroup.getGroupId());
double assetPriority = assetEntry.getPriority();
if (isAssetPrioritySupported()) {
assetPriority = RandomTestUtil.nextDouble();
}
assetEntry = AssetEntryLocalServiceUtil.updateEntry(
TestPropsValues.getUserId(), stagingGroup.getGroupId(),
assetEntry.getCreateDate(), assetEntry.getModifiedDate(),
assetEntry.getClassName(), assetEntry.getClassPK(),
assetEntry.getClassUuid(), assetEntry.getClassTypeId(),
new long[] {
assetCategory.getCategoryId(),
companyAssetCategory.getCategoryId()
},
new String[] {assetTag.getName()}, assetEntry.isListable(),
assetEntry.isVisible(), assetEntry.getStartDate(),
assetEntry.getEndDate(), assetEntry.getPublishDate(),
assetEntry.getExpirationDate(), assetEntry.getMimeType(),
assetEntry.getTitle(), assetEntry.getDescription(),
assetEntry.getSummary(), assetEntry.getUrl(),
assetEntry.getLayoutUuid(), assetEntry.getHeight(),
assetEntry.getWidth(), assetPriority);
return new StagedModelAssets(
assetCategory, assetEntry, assetTag, assetVocabulary);
}
protected void validateAssets(
StagedModel stagedModel, StagedModelAssets stagedModelAssets,
Group group)
throws Exception {
if (stagedModelAssets == null) {
return;
}
AssetEntry importedAssetEntry = fetchAssetEntry(stagedModel, group);
if (isAssetPrioritySupported()) {
AssetEntry assetEntry = stagedModelAssets.getAssetEntry();
Assert.assertEquals(
assetEntry.getPriority(), importedAssetEntry.getPriority(), 0D);
}
List<AssetCategory> importedAssetCategories =
AssetCategoryLocalServiceUtil.getEntryCategories(
importedAssetEntry.getEntryId());
Assert.assertEquals(
importedAssetCategories.toString(), 2,
importedAssetCategories.size());
AssetCategory stagedAssetCategory =
stagedModelAssets.getAssetCategory();
AssetCategory importedAssetCategory = null;
Company company = CompanyLocalServiceUtil.getCompany(
group.getCompanyId());
long companyGroupId = company.getGroupId();
for (AssetCategory assetCategory : importedAssetCategories) {
long groupId = assetCategory.getGroupId();
if (groupId != companyGroupId) {
importedAssetCategory = assetCategory;
break;
}
}
Assert.assertEquals(
stagedAssetCategory.getUuid(), importedAssetCategory.getUuid());
List<AssetTag> importedAssetTags =
AssetTagLocalServiceUtil.getEntryTags(
importedAssetEntry.getEntryId());
Assert.assertEquals(
importedAssetTags.toString(), 1, importedAssetTags.size());
AssetTag assetTag = stagedModelAssets.getAssetTag();
AssetTag importedAssetTag = importedAssetTags.get(0);
Assert.assertEquals(assetTag.getName(), importedAssetTag.getName());
AssetVocabulary assetVocabulary =
stagedModelAssets.getAssetVocabulary();
AssetVocabulary importedAssetVocabulary =
AssetVocabularyLocalServiceUtil.getVocabulary(
importedAssetCategory.getVocabularyId());
Assert.assertEquals(
assetVocabulary.getUuid(), importedAssetVocabulary.getUuid());
}
protected void validateComments(
StagedModel stagedModel, StagedModel importedStagedModel,
Group group)
throws Exception {
if (!isCommentableStagedModel()) {
return;
}
List<MBMessage> discussionMBMessages =
MBMessageLocalServiceUtil.getMessages(
ExportImportClassedModelUtil.getClassName(stagedModel),
ExportImportClassedModelUtil.getClassPK(stagedModel),
WorkflowConstants.STATUS_ANY);
if (ListUtil.isEmpty(discussionMBMessages)) {
return;
}
int importedDiscussionMBMessagesCount =
MBMessageLocalServiceUtil.getDiscussionMessagesCount(
ExportImportClassedModelUtil.getClassName(importedStagedModel),
ExportImportClassedModelUtil.getClassPK(importedStagedModel),
WorkflowConstants.STATUS_ANY);
Assert.assertEquals(
discussionMBMessages.size(), importedDiscussionMBMessagesCount + 1);
for (MBMessage discussionMBMessage : discussionMBMessages) {
if (discussionMBMessage.isRoot()) {
continue;
}
MBMessage importedDiscussionMBMessage =
MBMessageLocalServiceUtil.fetchMBMessageByUuidAndGroupId(
discussionMBMessage.getUuid(), group.getGroupId());
Assert.assertNotNull(importedDiscussionMBMessage);
}
}
protected void validateExport(
PortletDataContext portletDataContext, StagedModel stagedModel,
Map<String, List<StagedModel>> dependentStagedModelsMap)
throws Exception {
Element rootElement = portletDataContext.getExportDataRootElement();
List<Element> stagedModelGroupElements = new ArrayList<>();
Class<?> stagedModelClass = getStagedModelClass();
String stagedModelClassSimpleName = stagedModelClass.getSimpleName();
stagedModelGroupElements.addAll(
rootElement.elements(stagedModelClassSimpleName));
for (String dependentStagedModelClassSimpleName :
dependentStagedModelsMap.keySet()) {
stagedModelGroupElements.addAll(
rootElement.elements(dependentStagedModelClassSimpleName));
}
for (Element stagedModelGroupElement : stagedModelGroupElements) {
String className = stagedModelGroupElement.getName();
if (className.equals("missing-references")) {
continue;
}
List<StagedModel> dependentStagedModels =
dependentStagedModelsMap.get(className);
if (dependentStagedModels == null) {
dependentStagedModels = new ArrayList<>();
}
else {
dependentStagedModels = ListUtil.copy(dependentStagedModels);
}
if (className.equals(stagedModelClassSimpleName)) {
dependentStagedModels.add(stagedModel);
}
List<Element> elements = stagedModelGroupElement.elements();
Assert.assertEquals(
elements.toString(), dependentStagedModels.size(),
elements.size());
for (Element element : elements) {
String path = element.attributeValue("path");
Assert.assertNotNull(path);
Iterator<StagedModel> iterator =
dependentStagedModels.iterator();
while (iterator.hasNext()) {
StagedModel dependentStagedModel = iterator.next();
String dependentStagedModelPath =
ExportImportPathUtil.getModelPath(dependentStagedModel);
if (path.equals(dependentStagedModelPath)) {
iterator.remove();
}
}
}
Assert.assertTrue(
"There is more than one element exported with the same path",
dependentStagedModels.isEmpty());
}
}
protected void validateImport(
Map<String, List<StagedModel>> dependentStagedModelsMap,
Group group)
throws Exception {
}
protected void validateImport(
StagedModel stagedModel, StagedModelAssets stagedModelAssets,
Map<String, List<StagedModel>> dependentStagedModelsMap,
Group group)
throws Exception {
StagedModel importedStagedModel = getStagedModel(
stagedModel.getUuid(), group);
Assert.assertNotNull(importedStagedModel);
validateAssets(importedStagedModel, stagedModelAssets, group);
validateComments(stagedModel, importedStagedModel, group);
validateImport(dependentStagedModelsMap, group);
validateImportedStagedModel(stagedModel, importedStagedModel);
validateRatings(stagedModel, importedStagedModel);
}
protected void validateImportedStagedModel(
StagedModel stagedModel, StagedModel importedStagedModel)
throws Exception {
Assert.assertTrue(
stagedModel.getCreateDate() + " " +
importedStagedModel.getCreateDate(),
DateUtil.equals(
stagedModel.getCreateDate(),
importedStagedModel.getCreateDate()));
Assert.assertTrue(
stagedModel.getModifiedDate() + " " +
importedStagedModel.getModifiedDate(),
DateUtil.equals(
stagedModel.getModifiedDate(),
importedStagedModel.getModifiedDate()));
Assert.assertEquals(
stagedModel.getUuid(), importedStagedModel.getUuid());
}
protected void validateRatings(
StagedModel stagedModel, StagedModel importedStagedModel)
throws Exception {
List<RatingsEntry> ratingsEntries =
RatingsEntryLocalServiceUtil.getEntries(
ExportImportClassedModelUtil.getClassName(stagedModel),
ExportImportClassedModelUtil.getClassPK(stagedModel),
WorkflowConstants.STATUS_ANY);
List<RatingsEntry> importedRatingsEntries =
RatingsEntryLocalServiceUtil.getEntries(
ExportImportClassedModelUtil.getClassName(importedStagedModel),
ExportImportClassedModelUtil.getClassPK(importedStagedModel),
WorkflowConstants.STATUS_ANY);
Assert.assertEquals(
importedRatingsEntries.toString(), ratingsEntries.size(),
importedRatingsEntries.size());
for (RatingsEntry ratingsEntry : ratingsEntries) {
Iterator<RatingsEntry> iterator = importedRatingsEntries.iterator();
while (iterator.hasNext()) {
RatingsEntry importedRatingsEntry = iterator.next();
if (ratingsEntry.getScore() ==
importedRatingsEntry.getScore()) {
iterator.remove();
break;
}
}
}
Assert.assertTrue(importedRatingsEntries.isEmpty());
}
@DeleteAfterTestRun
protected Group liveGroup;
protected Element missingReferencesElement;
protected PortletDataContext portletDataContext;
protected Element rootElement;
@DeleteAfterTestRun
protected Group stagingGroup;
protected UserIdStrategy userIdStrategy;
protected ZipReader zipReader;
protected ZipWriter zipWriter;
protected class StagedModelAssets implements Serializable {
public StagedModelAssets(
AssetCategory assetCategory, AssetEntry assetEntry,
AssetTag assetTag, AssetVocabulary assetVocabulary) {
_assetCategory = assetCategory;
_assetEntry = assetEntry;
_assetTag = assetTag;
_assetVocabulary = assetVocabulary;
}
public AssetCategory getAssetCategory() {
return _assetCategory;
}
public AssetEntry getAssetEntry() {
return _assetEntry;
}
public AssetTag getAssetTag() {
return _assetTag;
}
public AssetVocabulary getAssetVocabulary() {
return _assetVocabulary;
}
public void setAssetCategory(AssetCategory assetCategory) {
_assetCategory = assetCategory;
}
public void setAssetEntry(AssetEntry assetEntry) {
_assetEntry = assetEntry;
}
public void setAssetTag(AssetTag assetTag) {
_assetTag = assetTag;
}
public void setAssetVocabulary(AssetVocabulary assetVocabulary) {
_assetVocabulary = assetVocabulary;
}
private AssetCategory _assetCategory;
private AssetEntry _assetEntry;
private AssetTag _assetTag;
private AssetVocabulary _assetVocabulary;
}
protected class TestUserIdStrategy implements UserIdStrategy {
@Override
public long getUserId(String userUuid) {
try {
return TestPropsValues.getUserId();
}
catch (Exception e) {
return 0;
}
}
}
}