/*
* Copyright (C) 2005-2013 Alfresco Software Limited.
*
* This file is part of Alfresco
*
* Alfresco 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 3 of the License, or
* (at your option) any later version.
*
* Alfresco 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.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see .
*/
package org.alfresco.repo.model.filefolder;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import junit.framework.TestCase;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.security.authentication.AuthenticationUtil;
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
import org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback;
import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.model.FileFolderService;
import org.alfresco.service.cmr.model.FileInfo;
import org.alfresco.service.cmr.model.FileNotFoundException;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.search.ResultSet;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.cmr.security.MutableAuthenticationService;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.transaction.TransactionService;
import org.alfresco.util.ApplicationContextHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
/**
* @see FileFolderService
* @author Dmitry Velichkevich
*/
public class FileFolderServicePropagationTest extends TestCase
{
private static final String TEST_USER_NAME = "userx";
private static final String TEST_USER_PASSWORD = TEST_USER_NAME;
private static final String ADMIN_USER_NAME = "admin";
private ApplicationContext applicationContext = ApplicationContextHelper.getApplicationContext();
private Boolean defaultPreservationValue;
private MutableAuthenticationService authenticationService;
private TransactionService transactionService;
private FileFolderServiceImpl fileFolderService;
private PermissionService permissionService;
private SearchService searchService;
private NodeService nodeService;
private FileInfo testFile;
private FileInfo testFolder;
private FileInfo testRootFolder;
private FileInfo testEmptyFolder;
@Before
public void setUp() throws Exception
{
fileFolderService = (FileFolderServiceImpl) applicationContext.getBean("fileFolderService");
if (null == defaultPreservationValue)
{
defaultPreservationValue = fileFolderService.isPreserveAuditableData();
}
ServiceRegistry serviceRegistry = (ServiceRegistry) applicationContext.getBean(ServiceRegistry.SERVICE_REGISTRY);
authenticationService = serviceRegistry.getAuthenticationService();
transactionService = serviceRegistry.getTransactionService();
permissionService = serviceRegistry.getPermissionService();
searchService = serviceRegistry.getSearchService();
nodeService = serviceRegistry.getNodeService();
testFile = transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public FileInfo execute() throws Throwable
{
FileInfo result = AuthenticationUtil.runAs(new RunAsWork()
{
@Override
public FileInfo doWork() throws Exception
{
ResultSet resultSet = searchService.query(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, SearchService.LANGUAGE_LUCENE, "PATH:\"/app:company_home\"");
NodeRef companyHome = resultSet.getNodeRef(0);
resultSet.close();
StringBuilder name = new StringBuilder("TestRootFolder-").append(System.currentTimeMillis());
testRootFolder = fileFolderService.create(companyHome, name.toString(), ContentModel.TYPE_FOLDER);
name = new StringBuilder("TestDocument-").append(System.currentTimeMillis()).append(".txt");
FileInfo result = fileFolderService.create(testRootFolder.getNodeRef(), name.toString(), ContentModel.TYPE_CONTENT);
ContentWriter writer = fileFolderService.getWriter(result.getNodeRef());
writer.setEncoding("UTF-8");
writer.setMimetype("text/plain");
writer.putContent("Test content named " + result.getName());
name = new StringBuilder("TestEmptyFolder-").append(System.currentTimeMillis());
testEmptyFolder = fileFolderService.create(testRootFolder.getNodeRef(), name.toString(), ContentModel.TYPE_FOLDER);
name = new StringBuilder("TestFolder-").append(System.currentTimeMillis());
testFolder = fileFolderService.create(testRootFolder.getNodeRef(), name.toString(), ContentModel.TYPE_FOLDER);
return result;
}
}, ADMIN_USER_NAME);
AuthenticationUtil.runAsSystem(new RunAsWork()
{
@Override
public Void doWork() throws Exception
{
authenticationService.createAuthentication(TEST_USER_NAME, TEST_USER_PASSWORD.toCharArray());
permissionService.setPermission(testRootFolder.getNodeRef(), TEST_USER_NAME, PermissionService.FULL_CONTROL, true);
return null;
}
});
return result;
}
});
}
@After
public void tearDown() throws Exception
{
// Resetting to default value...
fileFolderService.setPreserveAuditableData(defaultPreservationValue);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
return AuthenticationUtil.runAsSystem(new RunAsWork()
{
@Override
public Void doWork() throws Exception
{
authenticationService.deleteAuthentication(TEST_USER_NAME);
fileFolderService.delete(testRootFolder.getNodeRef());
return null;
}
});
}
});
}
@Test
public void testPreservingPropertiesOfDocumentMnt8109() throws Exception
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
// Just stop to wait for the end of...
}
// Enabling preservation of modification properties data...
fileFolderService.setPreserveAuditableData(true);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_NAME);
moveObjectAndAssert(testFile);
return null;
}
});
}
@Test
public void testPreservingPropertiesOfFolderMnt8109() throws Exception
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
// Just stop to wait for the end of...
}
// Enabling preservation of modification properties data...
fileFolderService.setPreserveAuditableData(true);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_NAME);
moveObjectAndAssert(testFolder);
return null;
}
});
}
@Test
public void testPreservingPropertiesOfParentFolderMnt8109() throws Exception
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
// Just stop to wait for the end of...
}
// Enabling preservation of modification properties data...
fileFolderService.setPreserveAuditableData(true);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_NAME);
moveObjectAndAssert(testFile);
return null;
}
});
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
FileInfo actualParent = fileFolderService.getFileInfo(getAndAssertSingleParent(testFile));
assertEquals(testEmptyFolder.getModifiedDate(), actualParent.getModifiedDate());
assertEquals(testEmptyFolder.getProperties().get(ContentModel.PROP_MODIFIER), actualParent.getProperties().get(ContentModel.PROP_MODIFIER));
return null;
}
});
}
private void moveObjectAndAssert(FileInfo object) throws FileNotFoundException
{
FileInfo moved = fileFolderService.move(object.getNodeRef(), testEmptyFolder.getNodeRef(), object.getName());
assertParent(moved, testEmptyFolder);
assertEquals(object.getModifiedDate(), moved.getModifiedDate());
assertEquals(object.getProperties().get(ContentModel.PROP_MODIFIER), moved.getProperties().get(ContentModel.PROP_MODIFIER));
}
@Test
public void testNotPreservingPropertiesOfDocumentMnt8109() throws Exception
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
// Just stop to wait for the end of...
}
// Disabling preservation of modification properties data...
fileFolderService.setPreserveAuditableData(false);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_NAME);
moveObjectAndAssertAbsenceOfPropertiesPreserving(testFile);
return null;
}
});
}
@Test
public void testNotPreservingPropertiesOfFolderMnt8109() throws Exception
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
// Just stop to wait for the end of...
}
// Disabling preservation of modification properties data...
fileFolderService.setPreserveAuditableData(false);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_NAME);
moveObjectAndAssertAbsenceOfPropertiesPreserving(testFolder);
return null;
}
});
}
@Test
public void testNotPreservingPropertiesOfParentFolderMnt8109() throws Exception
{
try
{
Thread.sleep(1000);
}
catch (Exception e)
{
// Just stop to wait for the end of...
}
// Disabling preservation of modification properties data...
fileFolderService.setPreserveAuditableData(false);
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_NAME);
moveObjectAndAssertAbsenceOfPropertiesPreserving(testFile);
return null;
}
});
transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback()
{
@Override
public Void execute() throws Throwable
{
FileInfo actualParent = fileFolderService.getFileInfo(getAndAssertSingleParent(testFile));
assertTrue("Modification time difference MUST BE greater or equal than 1 000 milliseconds!", (actualParent.getModifiedDate().getTime() - testEmptyFolder
.getModifiedDate().getTime()) >= 1000);
assertEquals(TEST_USER_NAME, actualParent.getProperties().get(ContentModel.PROP_MODIFIER));
return null;
}
});
}
private void moveObjectAndAssertAbsenceOfPropertiesPreserving(FileInfo object) throws FileNotFoundException
{
FileInfo moved = fileFolderService.move(object.getNodeRef(), testEmptyFolder.getNodeRef(), object.getName());
assertParent(moved, testEmptyFolder);
assertTrue("Modification time difference MUST BE greater or equal than 1 000 milliseconds!", (moved.getModifiedDate().getTime() - object.getModifiedDate().getTime()) >= 1000);
assertEquals(TEST_USER_NAME, moved.getProperties().get(ContentModel.PROP_MODIFIER));
}
private void assertParent(FileInfo child, FileInfo expectedParent)
{
assertEquals(expectedParent.getNodeRef(), getAndAssertSingleParent(child));
}
private NodeRef getAndAssertSingleParent(FileInfo child)
{
List parentAssocs = nodeService.getParentAssocs(child.getNodeRef());
assertNotNull(("No one parent has been found for " + child.toString()), parentAssocs);
assertEquals(1, parentAssocs.size());
return parentAssocs.iterator().next().getParentRef();
}
}