From 17ee08366f0fcd279a7094daa09f68a62a5c53cd Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 24 Apr 2012 15:00:21 +0000 Subject: [PATCH] Merged BRANCHES/DEV/CLOUDSYNCLOCAL2 to HEAD: 35620: More JUnit Rules Enhancements, covering well known nodes and easier context loading git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@35621 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../junitrules/ApplicationContextInit.java | 7 +- .../util/test/junitrules/TemporaryNodes.java | 19 ++- .../util/test/junitrules/WellKnownNodes.java | 121 ++++++++++++++++++ 3 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 source/java/org/alfresco/util/test/junitrules/WellKnownNodes.java diff --git a/source/java/org/alfresco/util/test/junitrules/ApplicationContextInit.java b/source/java/org/alfresco/util/test/junitrules/ApplicationContextInit.java index 2f307ffe2e..1f6a2e6c13 100644 --- a/source/java/org/alfresco/util/test/junitrules/ApplicationContextInit.java +++ b/source/java/org/alfresco/util/test/junitrules/ApplicationContextInit.java @@ -108,7 +108,7 @@ public class ApplicationContextInit extends ExternalResource return new ApplicationContextInit(contextsAsArray); } - @Override protected void before() throws Throwable + @Override protected void before() { // Were any context locations specified in the constructor? if (configLocations.length > 0) @@ -144,6 +144,11 @@ public class ApplicationContextInit extends ExternalResource */ public ApplicationContext getApplicationContext() { + if (this.appContext == null) + { + // Chain order is wrong, try to help out by doing the @Before now + before(); + } return this.appContext; } diff --git a/source/java/org/alfresco/util/test/junitrules/TemporaryNodes.java b/source/java/org/alfresco/util/test/junitrules/TemporaryNodes.java index 299016cff9..2971bcde74 100644 --- a/source/java/org/alfresco/util/test/junitrules/TemporaryNodes.java +++ b/source/java/org/alfresco/util/test/junitrules/TemporaryNodes.java @@ -142,6 +142,24 @@ public class TemporaryNodes extends ExternalResource * @return the newly created NodeRef. */ public NodeRef createNodeWithTextContent(final NodeRef parentNode, final String nodeCmName, final QName nodeType, final String nodeCreator, final String textContent) + { + QName childName = QName.createQName(NamespaceService.APP_MODEL_1_0_URI, nodeCmName); + return createNodeWithTextContent(parentNode, childName, nodeCmName, nodeType, nodeCreator, textContent); + } + + /** + * This method creates a NodeRef with some text/plain, UTF-8 content 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 parentNode the parent node + * @param nodeCmName the cm:name of the new node + * @param nodeType the type of the new node + * @param nodeCreator the username of the person who will create the node + * @param textContent the text/plain, UTF-8 content that will be stored in the node's content. null content will not be written. + * @return the newly created NodeRef. + */ + public NodeRef createNodeWithTextContent(final NodeRef parentNode, final QName childName, final String nodeCmName, final QName nodeType, final String nodeCreator, final String textContent) { final RetryingTransactionHelper transactionHelper = (RetryingTransactionHelper) appContextRule.getApplicationContext().getBean("retryingTransactionHelper"); @@ -156,7 +174,6 @@ public class TemporaryNodes extends ExternalResource Map props = new HashMap(); props.put(ContentModel.PROP_NAME, nodeCmName); - QName childName = QName.createQName(NamespaceService.APP_MODEL_1_0_URI, nodeCmName); ChildAssociationRef childAssoc = nodeService.createNode(parentNode, ContentModel.ASSOC_CONTAINS, childName, diff --git a/source/java/org/alfresco/util/test/junitrules/WellKnownNodes.java b/source/java/org/alfresco/util/test/junitrules/WellKnownNodes.java new file mode 100644 index 0000000000..d321ae8c0f --- /dev/null +++ b/source/java/org/alfresco/util/test/junitrules/WellKnownNodes.java @@ -0,0 +1,121 @@ +/* + * Copyright (C) 2005-2012 + 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.util.test.junitrules; + +import java.util.List; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.model.Repository; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.repository.NodeService; +import org.alfresco.service.namespace.NamespaceService; +import org.alfresco.service.namespace.QName; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.rules.ExternalResource; + +/** + * A JUnit rule designed to help with finding well known nodes + * in the system. It provides functionality similar to + * {@link Repository}, but with extra nodes needed for testing + * + * @author Nick Burch + * @since Odin + */ +public class WellKnownNodes extends ExternalResource +{ + private static final Log log = LogFactory.getLog(WellKnownNodes.class); + + private final ApplicationContextInit appContextRule; + private final Repository repositoryHelper; + private final NodeService nodeService; + + private static QName SYSTEM_FOLDER_QNAME = + QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "system"); + + /** + * Constructs the rule with a reference to a {@link ApplicationContextInit rule} which can be used to retrieve the ApplicationContext. + * + * @param appContextRule a rule which can be used to retrieve the spring app context. + */ + public WellKnownNodes(ApplicationContextInit appContextRule) + { + this.appContextRule = appContextRule; + this.repositoryHelper = (Repository)appContextRule.getApplicationContext().getBean("repositoryHelper"); + this.nodeService = (NodeService)appContextRule.getApplicationContext().getBean("NodeService"); + } + + + @Override protected void before() throws Throwable + { + // Intentionally empty + } + + @Override protected void after() + { + // Intentionally empty + } + + /** + * Returns the root of the workspace store + */ + public NodeRef getWorkspaceRoot() + { + return repositoryHelper.getRootHome(); + } + /** + * Returns company home + */ + public NodeRef getCompanyHome() + { + return repositoryHelper.getCompanyHome(); + } + /** + * Returns the system root + */ + public NodeRef getSystemRoot() + { + NodeRef root = getWorkspaceRoot(); + List sysRefs = nodeService.getChildAssocs( + root, ContentModel.ASSOC_CHILDREN, SYSTEM_FOLDER_QNAME); + if (sysRefs.size() != 1) + { + throw new IllegalStateException("System folder missing / duplicated! Found " + sysRefs); + } + final NodeRef system = sysRefs.get(0).getChildRef(); + return system; + } + /** + * Returns the given System Container + */ + public NodeRef getSystemContainer(QName containerName) + { + NodeRef system = getSystemRoot(); + List containerRefs = nodeService.getChildAssocs( + system, ContentModel.ASSOC_CHILDREN, containerName); + if (containerRefs.size() != 1) + { + throw new IllegalStateException("System Container " + containerName + " missing / duplicated! Found " + containerRefs); + } + final NodeRef container = containerRefs.get(0).getChildRef(); + return container; + } +}