/**
* 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.document.library.service.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.document.library.kernel.exception.NoSuchFolderException;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.model.DLFileEntryConstants;
import com.liferay.document.library.kernel.model.DLFileEntryType;
import com.liferay.document.library.kernel.model.DLFileEntryTypeConstants;
import com.liferay.document.library.kernel.model.DLFileVersion;
import com.liferay.document.library.kernel.model.DLFolderConstants;
import com.liferay.document.library.kernel.service.DLAppServiceUtil;
import com.liferay.document.library.kernel.service.DLFileEntryTypeLocalServiceUtil;
import com.liferay.document.library.kernel.service.DLFileVersionLocalServiceUtil;
import com.liferay.dynamic.data.mapping.kernel.DDMForm;
import com.liferay.dynamic.data.mapping.kernel.DDMFormFieldValue;
import com.liferay.dynamic.data.mapping.kernel.DDMFormValues;
import com.liferay.dynamic.data.mapping.kernel.DDMStructure;
import com.liferay.dynamic.data.mapping.kernel.LocalizedValue;
import com.liferay.expando.kernel.model.ExpandoColumnConstants;
import com.liferay.expando.kernel.model.ExpandoTable;
import com.liferay.expando.kernel.service.ExpandoColumnLocalServiceUtil;
import com.liferay.expando.kernel.service.ExpandoTableLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.RoleConstants;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.security.auth.PrincipalThreadLocal;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.security.permission.PermissionThreadLocal;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.rule.Sync;
import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule;
import com.liferay.portal.kernel.test.util.GroupTestUtil;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.RoleTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.security.permission.SimplePermissionChecker;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* @author Preston Crary
*/
@RunWith(Arquillian.class)
@Sync
public class DLFileVersionTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new AggregateTestRule(
new LiferayIntegrationTestRule(),
SynchronousDestinationTestRule.INSTANCE);
@Before
public void setUp() throws Exception {
setUpPermissionThreadLocal();
setUpPrincipalThreadLocal();
_group = GroupTestUtil.addGroup();
setUpParentFolder();
setUpResourcePermission();
List<DLFileEntryType> dlFileEntryTypes =
DLFileEntryTypeLocalServiceUtil.getFileEntryTypes(
PortalUtil.getCurrentAndAncestorSiteGroupIds(
_group.getGroupId()));
for (DLFileEntryType dlFileEntryType : dlFileEntryTypes) {
String fileEntryTypeKey = dlFileEntryType.getFileEntryTypeKey();
if (fileEntryTypeKey.equals(
DLFileEntryTypeConstants.FILE_ENTRY_TYPE_KEY_CONTRACT)) {
_contractDLFileEntryTypeId =
dlFileEntryType.getFileEntryTypeId();
}
}
ExpandoTable expandoTable =
ExpandoTableLocalServiceUtil.addDefaultTable(
PortalUtil.getDefaultCompanyId(), DLFileEntry.class.getName());
ExpandoColumnLocalServiceUtil.addColumn(
expandoTable.getTableId(), _EXPANDO_ATTRIBUTE_NAME,
ExpandoColumnConstants.STRING, StringPool.BLANK);
_serviceContext = getServiceContext();
FileEntry fileEntry = DLAppServiceUtil.addFileEntry(
_group.getGroupId(), _parentFolder.getFolderId(), _SOURCE_FILE_NAME,
ContentTypes.APPLICATION_OCTET_STREAM, _TITLE, StringPool.BLANK,
StringPool.BLANK, _DATA_VERSION_1, _serviceContext);
_fileVersion = DLFileVersionLocalServiceUtil.getFileVersion(
fileEntry.getFileEntryId(), DLFileEntryConstants.VERSION_DEFAULT);
}
@After
public void tearDown() throws Exception {
ExpandoTable expandoTable =
ExpandoTableLocalServiceUtil.getDefaultTable(
PortalUtil.getDefaultCompanyId(), DLFileEntry.class.getName());
ExpandoTableLocalServiceUtil.deleteTable(expandoTable);
tearDownPermissionThreadLocal();
tearDownPrincipalThreadLocal();
tearDownResourcePermission();
}
@Test
public void testRevertVersion() throws Exception {
DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _UPDATE_VALUE,
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
DLAppServiceUtil.revertFileEntry(
fileEntry.getFileEntryId(), DLFileEntryConstants.VERSION_DEFAULT,
_serviceContext);
fileEntry = DLAppServiceUtil.getFileEntry(fileEntry.getFileEntryId());
Assert.assertEquals("2.0", fileEntry.getVersion());
}
@Test
public void testUpdateChecksum() throws Exception {
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_2, _serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateDescription() throws Exception {
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(), _UPDATE_VALUE,
_fileVersion.getChangeLog(), false, _DATA_VERSION_1,
_serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateExpando() throws Exception {
updateServiceContext(
_UPDATE_VALUE, _contractDLFileEntryTypeId, StringPool.BLANK);
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateFileEntryType() throws Exception {
updateServiceContext(
StringPool.BLANK,
DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT,
StringPool.BLANK);
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateMetadata() throws Exception {
updateServiceContext(
StringPool.BLANK, _contractDLFileEntryTypeId, _UPDATE_VALUE);
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateNothing() throws Exception {
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
Assert.assertEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateSize() throws Exception {
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _fileVersion.getTitle(),
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_3, _serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
@Test
public void testUpdateTitle() throws Exception {
FileEntry fileEntry = DLAppServiceUtil.updateFileEntry(
_fileVersion.getFileEntryId(), _SOURCE_FILE_NAME,
_fileVersion.getMimeType(), _UPDATE_VALUE,
_fileVersion.getDescription(), _fileVersion.getChangeLog(), false,
_DATA_VERSION_1, _serviceContext);
Assert.assertNotEquals(
DLFileEntryConstants.VERSION_DEFAULT, fileEntry.getVersion());
}
protected DDMFormFieldValue createDDMFormFieldValue(String name) {
DDMFormFieldValue ddmFormFieldValue = new DDMFormFieldValue();
ddmFormFieldValue.setName(name);
LocalizedValue localizedValue = new LocalizedValue(LocaleUtil.US);
localizedValue.addString(LocaleUtil.US, StringPool.BLANK);
ddmFormFieldValue.setValue(localizedValue);
return ddmFormFieldValue;
}
protected DDMFormValues createDDMFormValues(DDMForm ddmForm) {
DDMFormValues ddmFormValues = new DDMFormValues(ddmForm);
ddmFormValues.addAvailableLocale(LocaleUtil.US);
ddmFormValues.setDefaultLocale(LocaleUtil.US);
return ddmFormValues;
}
protected ServiceContext getServiceContext() throws Exception {
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(_group.getGroupId());
serviceContext.setAttribute(
"fileEntryTypeId", _contractDLFileEntryTypeId);
Map<String, Serializable> expandoBridgeAttributes =
serviceContext.getExpandoBridgeAttributes();
expandoBridgeAttributes.put(_EXPANDO_ATTRIBUTE_NAME, StringPool.BLANK);
serviceContext.setExpandoBridgeAttributes(expandoBridgeAttributes);
DLFileEntryType fileEntryType =
DLFileEntryTypeLocalServiceUtil.getFileEntryType(
_contractDLFileEntryTypeId);
List<DDMStructure> ddmStructures = fileEntryType.getDDMStructures();
for (DDMStructure ddmStructure : ddmStructures) {
DDMFormValues ddmFormValues = createDDMFormValues(
ddmStructure.getDDMForm());
for (String fieldName : ddmStructure.getFieldNames()) {
DDMFormFieldValue ddmFormFieldValue = createDDMFormFieldValue(
fieldName);
ddmFormValues.addDDMFormFieldValue(ddmFormFieldValue);
}
serviceContext.setAttribute(
DDMFormValues.class.getName() + ddmStructure.getStructureId(),
ddmFormValues);
}
return serviceContext;
}
protected void setUpParentFolder() throws Exception {
try {
DLAppServiceUtil.deleteFolder(
_group.getGroupId(), DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
"Test Folder");
}
catch (NoSuchFolderException nsfe) {
}
ServiceContext serviceContext =
ServiceContextTestUtil.getServiceContext(
_group.getGroupId(), TestPropsValues.getUserId());
_parentFolder = DLAppServiceUtil.addFolder(
_group.getGroupId(), DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
"Test Folder", RandomTestUtil.randomString(), serviceContext);
}
protected void setUpPermissionThreadLocal() throws Exception {
_originalPermissionChecker =
PermissionThreadLocal.getPermissionChecker();
PermissionThreadLocal.setPermissionChecker(
new SimplePermissionChecker() {
{
init(TestPropsValues.getUser());
}
@Override
public boolean hasOwnerPermission(
long companyId, String name, String primKey, long ownerId,
String actionId) {
return true;
}
@Override
public boolean hasPermission(
long groupId, String name, String primKey,
String actionId) {
return true;
}
});
}
protected void setUpPrincipalThreadLocal() throws Exception {
_originalName = PrincipalThreadLocal.getName();
PrincipalThreadLocal.setName(TestPropsValues.getUserId());
}
protected void setUpResourcePermission() throws Exception {
RoleTestUtil.addResourcePermission(
RoleConstants.GUEST, "com.liferay.document.library",
ResourceConstants.SCOPE_GROUP, String.valueOf(_group.getGroupId()),
ActionKeys.VIEW);
}
protected void tearDownPermissionThreadLocal() {
PermissionThreadLocal.setPermissionChecker(_originalPermissionChecker);
}
protected void tearDownPrincipalThreadLocal() {
PrincipalThreadLocal.setName(_originalName);
}
protected void tearDownResourcePermission() throws Exception {
RoleTestUtil.removeResourcePermission(
RoleConstants.GUEST, "com.liferay.document.library",
ResourceConstants.SCOPE_GROUP, String.valueOf(_group.getGroupId()),
ActionKeys.VIEW);
}
protected void updateServiceContext(
String expando, long fileEntryTypeId, String metadata)
throws PortalException {
Map<String, Serializable> expandoBridgeAttributes =
_serviceContext.getExpandoBridgeAttributes();
expandoBridgeAttributes.put(_EXPANDO_ATTRIBUTE_NAME, expando);
_serviceContext.setExpandoBridgeAttributes(expandoBridgeAttributes);
_serviceContext.setAttribute("fileEntryTypeId", fileEntryTypeId);
if (fileEntryTypeId <= 0) {
return;
}
DLFileEntryType fileEntryType =
DLFileEntryTypeLocalServiceUtil.getFileEntryType(fileEntryTypeId);
List<DDMStructure> ddmStructures = fileEntryType.getDDMStructures();
for (DDMStructure ddmStructure : ddmStructures) {
DDMFormValues ddmFormValues =
(DDMFormValues)_serviceContext.getAttribute(
DDMFormValues.class.getName() +
ddmStructure.getStructureId());
for (DDMFormFieldValue ddmFormFieldValue :
ddmFormValues.getDDMFormFieldValues()) {
String fieldType = ddmStructure.getFieldType(
ddmFormFieldValue.getName());
if (fieldType.equals("text")) {
LocalizedValue localizedValue = new LocalizedValue(
LocaleUtil.US);
localizedValue.addString(LocaleUtil.US, metadata);
ddmFormFieldValue.setValue(localizedValue);
}
}
_serviceContext.setAttribute(
DDMFormValues.class.getName() + ddmStructure.getStructureId(),
ddmFormValues);
}
}
private static final int _DATA_SIZE_1 = 512;
private static final int _DATA_SIZE_2 = 1024;
private static final byte[] _DATA_VERSION_1 = new byte[_DATA_SIZE_1];
private static final byte[] _DATA_VERSION_2 = new byte[_DATA_SIZE_1];
private static final byte[] _DATA_VERSION_3 = new byte[_DATA_SIZE_2];
private static final String _EXPANDO_ATTRIBUTE_NAME = "Expando";
private static final String _SOURCE_FILE_NAME = "SourceFileName.txt";
private static final String _TITLE = "Title";
private static final String _UPDATE_VALUE = "Update Value";
static {
for (int i = 0; i < _DATA_SIZE_1; i++) {
_DATA_VERSION_1[i] = (byte)i;
_DATA_VERSION_2[i] = (byte)(i + 1);
}
for (int i = 0; i < _DATA_SIZE_2; i++) {
_DATA_VERSION_3[i] = (byte)i;
}
}
private long _contractDLFileEntryTypeId;
private DLFileVersion _fileVersion;
@DeleteAfterTestRun
private Group _group;
private String _originalName;
private PermissionChecker _originalPermissionChecker;
private Folder _parentFolder;
private ServiceContext _serviceContext;
}