mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Merged BRANCHES/DEV/V4.1-BUG-FIX to HEAD:
54639: As part of work on ALF-19783, I have added support for versioned nodes to the TemporaryNodes JUnit rule. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@54641 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -44,6 +44,7 @@ import org.alfresco.service.cmr.repository.NodeRef;
|
|||||||
import org.alfresco.service.cmr.repository.NodeService;
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.cmr.site.SiteInfo;
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
import org.alfresco.service.cmr.site.SiteService;
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
|
import org.alfresco.service.cmr.version.VersionService;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
@@ -90,6 +91,7 @@ public class TemporaryNodes extends ExternalResource
|
|||||||
final DictionaryService dictionaryService = springContext.getBean("DictionaryService", DictionaryService.class);
|
final DictionaryService dictionaryService = springContext.getBean("DictionaryService", DictionaryService.class);
|
||||||
final NodeService nodeService = springContext.getBean("NodeService", NodeService.class);
|
final NodeService nodeService = springContext.getBean("NodeService", NodeService.class);
|
||||||
final SiteService siteService = springContext.getBean("SiteService", SiteService.class);
|
final SiteService siteService = springContext.getBean("SiteService", SiteService.class);
|
||||||
|
final VersionService versionService = springContext.getBean("VersionService", VersionService.class);
|
||||||
|
|
||||||
// Run as system to ensure all non-system nodes can be deleted irrespective of which user created them.
|
// Run as system to ensure all non-system nodes can be deleted irrespective of which user created them.
|
||||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||||
@@ -113,6 +115,14 @@ public class TemporaryNodes extends ExternalResource
|
|||||||
NodeRef workingCopy = cociService.getWorkingCopy(node);
|
NodeRef workingCopy = cociService.getWorkingCopy(node);
|
||||||
cociService.cancelCheckout(workingCopy);
|
cociService.cancelCheckout(workingCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If it's been versioned, then we need to clean out the version history too.
|
||||||
|
if (versionService.isVersioned(node))
|
||||||
|
{
|
||||||
|
log.debug("Deleting version history of temporary node " + nodeService.getProperty(node, ContentModel.PROP_NAME));
|
||||||
|
versionService.deleteVersionHistory(node);
|
||||||
|
}
|
||||||
|
|
||||||
log.debug("Deleting temporary node " + nodeService.getProperty(node, ContentModel.PROP_NAME));
|
log.debug("Deleting temporary node " + nodeService.getProperty(node, ContentModel.PROP_NAME));
|
||||||
|
|
||||||
// Site nodes are a special case which must be deleted through the SiteService.
|
// Site nodes are a special case which must be deleted through the SiteService.
|
||||||
@@ -277,8 +287,27 @@ public class TemporaryNodes extends ExternalResource
|
|||||||
* @param nodeCmName the cm:name of the new node
|
* @param nodeCmName the cm:name of the new node
|
||||||
* @param nodeCreator the username of the person who will create the node
|
* @param nodeCreator the username of the person who will create the node
|
||||||
* @return the newly created NodeRef.
|
* @return the newly created NodeRef.
|
||||||
|
* @since 4.1.7
|
||||||
*/
|
*/
|
||||||
public NodeRef createQuickFile(final String mimetype, final NodeRef parentNode, final String nodeCmName, final String nodeCreator)
|
public NodeRef createQuickFile(final String mimetype, final NodeRef parentNode, final String nodeCmName, final String nodeCreator)
|
||||||
|
{
|
||||||
|
return createQuickFile(mimetype, parentNode, nodeCmName, nodeCreator, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method creates a cm:content NodeRef whose content is taken from an Alfresco 'quick' file and adds it to the internal
|
||||||
|
* list of NodeRefs to be tidied up by the rule.
|
||||||
|
* This method will be run in its own transaction and will be run with the specified user as the fully authenticated user,
|
||||||
|
* thus ensuring the named user is the cm:creator of the new node.
|
||||||
|
*
|
||||||
|
* @param mimetype the MimeType of the content to put in the new node.
|
||||||
|
* @param parentNode the parent node
|
||||||
|
* @param nodeCmName the cm:name of the new node
|
||||||
|
* @param nodeCreator the username of the person who will create the node
|
||||||
|
* @param isVersionable should the new node be {@link ContentModel#ASPECT_VERSIONABLE versionable}?
|
||||||
|
* @return the newly created NodeRef.
|
||||||
|
*/
|
||||||
|
public NodeRef createQuickFile(final String mimetype, final NodeRef parentNode, final String nodeCmName, final String nodeCreator, final boolean isVersionable)
|
||||||
{
|
{
|
||||||
final RetryingTransactionHelper transactionHelper = (RetryingTransactionHelper) appContextRule.getApplicationContext().getBean("retryingTransactionHelper");
|
final RetryingTransactionHelper transactionHelper = (RetryingTransactionHelper) appContextRule.getApplicationContext().getBean("retryingTransactionHelper");
|
||||||
|
|
||||||
@@ -291,6 +320,12 @@ public class TemporaryNodes extends ExternalResource
|
|||||||
{
|
{
|
||||||
final NodeRef result = createNode(nodeCmName, parentNode, ContentModel.TYPE_CONTENT);
|
final NodeRef result = createNode(nodeCmName, parentNode, ContentModel.TYPE_CONTENT);
|
||||||
|
|
||||||
|
if (isVersionable)
|
||||||
|
{
|
||||||
|
NodeService nodeService = appContextRule.getApplicationContext().getBean("nodeService", NodeService.class);
|
||||||
|
nodeService.addAspect(result, ContentModel.ASPECT_VERSIONABLE, null);
|
||||||
|
}
|
||||||
|
|
||||||
File quickFile = loadQuickFile(getQuickResource(mimetype));
|
File quickFile = loadQuickFile(getQuickResource(mimetype));
|
||||||
|
|
||||||
ContentService contentService = appContextRule.getApplicationContext().getBean("contentService", ContentService.class);
|
ContentService contentService = appContextRule.getApplicationContext().getBean("contentService", ContentService.class);
|
||||||
|
@@ -44,6 +44,8 @@ import org.alfresco.service.cmr.repository.NodeService;
|
|||||||
import org.alfresco.service.cmr.site.SiteInfo;
|
import org.alfresco.service.cmr.site.SiteInfo;
|
||||||
import org.alfresco.service.cmr.site.SiteService;
|
import org.alfresco.service.cmr.site.SiteService;
|
||||||
import org.alfresco.service.cmr.site.SiteVisibility;
|
import org.alfresco.service.cmr.site.SiteVisibility;
|
||||||
|
import org.alfresco.service.cmr.version.Version;
|
||||||
|
import org.alfresco.service.cmr.version.VersionService;
|
||||||
import org.alfresco.service.namespace.QName;
|
import org.alfresco.service.namespace.QName;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
@@ -88,6 +90,7 @@ public class TemporaryNodesTest
|
|||||||
private static NodeService NODE_SERVICE;
|
private static NodeService NODE_SERVICE;
|
||||||
private static SiteService SITE_SERVICE;
|
private static SiteService SITE_SERVICE;
|
||||||
private static RetryingTransactionHelper TRANSACTION_HELPER;
|
private static RetryingTransactionHelper TRANSACTION_HELPER;
|
||||||
|
private static VersionService VERSION_SERVICE;
|
||||||
|
|
||||||
private static NodeRef COMPANY_HOME;
|
private static NodeRef COMPANY_HOME;
|
||||||
|
|
||||||
@@ -97,10 +100,11 @@ public class TemporaryNodesTest
|
|||||||
@BeforeClass public static void initStaticData() throws Exception
|
@BeforeClass public static void initStaticData() throws Exception
|
||||||
{
|
{
|
||||||
COCI_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("checkOutCheckInService", CheckOutCheckInService.class);
|
COCI_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("checkOutCheckInService", CheckOutCheckInService.class);
|
||||||
CONTENT_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("contentService", ContentService.class);
|
CONTENT_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("ContentService", ContentService.class);
|
||||||
NODE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("nodeService", NodeService.class);
|
NODE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("NodeService", NodeService.class);
|
||||||
SITE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("siteService", SiteService.class);
|
SITE_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("SiteService", SiteService.class);
|
||||||
TRANSACTION_HELPER = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class);
|
TRANSACTION_HELPER = APP_CONTEXT_INIT.getApplicationContext().getBean("retryingTransactionHelper", RetryingTransactionHelper.class);
|
||||||
|
VERSION_SERVICE = APP_CONTEXT_INIT.getApplicationContext().getBean("VersionService", VersionService.class);
|
||||||
|
|
||||||
Repository repositoryHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("repositoryHelper", Repository.class);
|
Repository repositoryHelper = APP_CONTEXT_INIT.getApplicationContext().getBean("repositoryHelper", Repository.class);
|
||||||
COMPANY_HOME = repositoryHelper.getCompanyHome();
|
COMPANY_HOME = repositoryHelper.getCompanyHome();
|
||||||
@@ -198,6 +202,75 @@ public class TemporaryNodesTest
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This test ensures that any temporary nodes which are versioned, have all their various versions cleaned up too.
|
||||||
|
* @since 4.1.7
|
||||||
|
*/
|
||||||
|
@Test public void ensureVersionedNodesAreFullyCleanedUp() throws Throwable
|
||||||
|
{
|
||||||
|
// Note that because we need to test that the Rule's 'after' behaviour has worked correctly, we cannot
|
||||||
|
// use the Rule that has been declared in the normal way - otherwise nothing would be cleaned up until
|
||||||
|
// after our test method.
|
||||||
|
// Therefore we have to manually poke the Rule to get it to cleanup during test execution.
|
||||||
|
// NOTE! This is *not* how a JUnit Rule would normally be used.
|
||||||
|
final TemporaryNodes myTemporaryNodes = new TemporaryNodes(APP_CONTEXT_INIT);
|
||||||
|
|
||||||
|
// Currently this is a no-op, but just in case that changes.
|
||||||
|
myTemporaryNodes.before();
|
||||||
|
|
||||||
|
|
||||||
|
final List<NodeRef> nodesThatShouldBeDeletedByRule = new ArrayList<NodeRef>();
|
||||||
|
|
||||||
|
// Create a versioned, temporary node
|
||||||
|
final NodeRef versionedTempNode = myTemporaryNodes.createQuickFile(MimetypeMap.MIMETYPE_TEXT_PLAIN,
|
||||||
|
COMPANY_HOME,
|
||||||
|
"versionableNode",
|
||||||
|
TEST_USER1.getUsername(),
|
||||||
|
true);
|
||||||
|
|
||||||
|
nodesThatShouldBeDeletedByRule.add(versionedTempNode);
|
||||||
|
|
||||||
|
// Create various versions
|
||||||
|
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
assertTrue("The test node was not versioned as it should be.", VERSION_SERVICE.isVersioned(versionedTempNode));
|
||||||
|
|
||||||
|
Version v1 = VERSION_SERVICE.createVersion(versionedTempNode, null);
|
||||||
|
Version v2 = VERSION_SERVICE.createVersion(versionedTempNode, null);
|
||||||
|
Version v3 = VERSION_SERVICE.createVersion(versionedTempNode, null);
|
||||||
|
|
||||||
|
// Ensure that these version nodes are all cleaned up too.
|
||||||
|
for (Version v : new Version[] {v1, v2, v3})
|
||||||
|
{
|
||||||
|
nodesThatShouldBeDeletedByRule.add(v.getFrozenStateNodeRef());
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Now trigger the Rule's cleanup behaviour.
|
||||||
|
myTemporaryNodes.after();
|
||||||
|
|
||||||
|
// and ensure that the nodes are all gone.
|
||||||
|
TRANSACTION_HELPER.doInTransaction(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
for (NodeRef node : nodesThatShouldBeDeletedByRule)
|
||||||
|
{
|
||||||
|
if (NODE_SERVICE.exists(node))
|
||||||
|
{
|
||||||
|
fail("Node '" + NODE_SERVICE.getProperty(node, ContentModel.PROP_NAME) + "' still exists.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** Site nodes are a special case as they can only be deleted through the SiteService. */
|
/** Site nodes are a special case as they can only be deleted through the SiteService. */
|
||||||
@Test public void ensureSiteNodesAreCleanedUp() throws Throwable
|
@Test public void ensureSiteNodesAreCleanedUp() throws Throwable
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user