Files
alfresco-community-repo/source/test-java/org/alfresco/repo/policy/PolicyComponentTransactionTest.java
Jan Vonka 30f8e49239 ACE-4250: Revert r110119 (except keep 2 out of 4 unit tests)
- note: related to ACE-4421/MNT-13836

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@114219 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2015-10-12 22:15:03 +00:00

785 lines
33 KiB
Java

/*
* Copyright (C) 2005-2010 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 <http://www.gnu.org/licenses/>.
*/
package org.alfresco.repo.policy;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.transaction.UserTransaction;
import junit.framework.TestCase;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.dictionary.DictionaryBootstrap;
import org.alfresco.repo.dictionary.DictionaryDAO;
import org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy;
import org.alfresco.repo.nodelocator.CompanyHomeNodeLocator;
import org.alfresco.repo.nodelocator.NodeLocatorService;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.Policy.Arg;
import org.alfresco.repo.security.authentication.AuthenticationComponent;
import org.alfresco.repo.tenant.TenantService;
import org.alfresco.repo.transaction.AlfrescoTransactionSupport;
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.alfresco.service.transaction.TransactionService;
import org.alfresco.test_category.OwnJVMTestsCategory;
import org.alfresco.util.ApplicationContextHelper;
import org.junit.experimental.categories.Category;
import org.springframework.context.ApplicationContext;
/**
* Test Transaction-level Policies
*/
@Category(OwnJVMTestsCategory.class)
public class PolicyComponentTransactionTest extends TestCase
{
private static final String TEST_MODEL = "org/alfresco/repo/policy/policycomponenttest_model.xml";
private static final String TEST_NAMESPACE = "http://www.alfresco.org/test/policycomponenttest/1.0";
private static QName BASE_TYPE = QName.createQName(TEST_NAMESPACE, "base");
private static QName FILE_TYPE = QName.createQName(TEST_NAMESPACE, "file");
private static ApplicationContext applicationContext = ApplicationContextHelper.getApplicationContext();
private static ClassPolicyDelegate<SideEffectTestPolicy> sideEffectDelegate = null;
private PolicyComponent policyComponent;
private BehaviourFilter behaviourFilter;
private TransactionService trxService;
private AuthenticationComponent authenticationComponent;
private NodeService nodeService;
private NodeLocatorService nodeLocatorService;
private NodeRef companyHome;
@Override
protected void setUp() throws Exception
{
// initialise policy test model
DictionaryBootstrap bootstrap = new DictionaryBootstrap();
List<String> bootstrapModels = new ArrayList<String>();
bootstrapModels.add(TEST_MODEL);
bootstrap.setModels(bootstrapModels);
bootstrap.setDictionaryDAO((DictionaryDAO)applicationContext.getBean("dictionaryDAO"));
bootstrap.setTenantService((TenantService)applicationContext.getBean("tenantService"));
bootstrap.bootstrap();
// retrieve policy component
this.policyComponent = (PolicyComponent)applicationContext.getBean("policyComponent");
this.behaviourFilter = (BehaviourFilter) applicationContext.getBean("policyBehaviourFilter");
this.trxService = (TransactionService) applicationContext.getBean("transactionComponent");
this.nodeService = (NodeService) applicationContext.getBean("nodeService");
this.nodeLocatorService = (NodeLocatorService) applicationContext.getBean("nodeLocatorService");
this.authenticationComponent = (AuthenticationComponent)applicationContext.getBean("authenticationComponent");
this.authenticationComponent.setSystemUserAsCurrentUser();
// Register Policy
if (sideEffectDelegate == null)
{
sideEffectDelegate = policyComponent.registerClassPolicy(SideEffectTestPolicy.class);
// Bind Behaviour to side effect policy
QName policyName = QName.createQName(TEST_NAMESPACE, "sideEffect");
Behaviour baseBehaviour = new JavaBehaviour(this, "sideEffectTest", NotificationFrequency.TRANSACTION_COMMIT);
this.policyComponent.bindClassBehaviour(policyName, BASE_TYPE, baseBehaviour);
}
this.companyHome = nodeLocatorService.getNode(CompanyHomeNodeLocator.NAME, null, null);
}
@Override
protected void tearDown() throws Exception
{
authenticationComponent.clearCurrentSecurityContext();
}
public void testStartTransactionPolicy()
throws Exception
{
ClassPolicyDelegate<StartTestPolicy> startDelegate = policyComponent.registerClassPolicy(StartTestPolicy.class);
// Register Policy
QName policyName = QName.createQName(TEST_NAMESPACE, "start");
PolicyDefinition<Policy> definition = policyComponent.getRegisteredPolicy(PolicyType.Class, policyName);
assertNotNull(definition);
Arg arg0 = definition.getArgument(0);
assertEquals(Arg.KEY, arg0);
Arg arg1 = definition.getArgument(1);
assertEquals(Arg.KEY, arg1);
Arg arg2 = definition.getArgument(2);
assertEquals(Arg.START_VALUE, arg2);
Arg arg3 = definition.getArgument(3);
assertEquals(Arg.END_VALUE, arg3);
// Bind Behaviour
Behaviour baseBehaviour = new JavaBehaviour(this, "startTransactionTest", NotificationFrequency.FIRST_EVENT);
policyComponent.bindClassBehaviour(policyName, BASE_TYPE, baseBehaviour);
// Invoke Behaviour
UserTransaction userTransaction1 = trxService.getUserTransaction();
try
{
userTransaction1.begin();
List<TestResult> results = new ArrayList<TestResult>();
StartTestPolicy basePolicy = startDelegate.get(BASE_TYPE);
String baseResult1 = basePolicy.start("1", "2", "value1a", "value2a", false, results);
TestResult result1 = new TestResult("startTransactionTest", "1", "2", "value1a", "value2a");
assertEquals(result1.toString(), baseResult1);
assertEquals(1, results.size());
assertEquals(result1, results.get(0));
String baseResult2 = basePolicy.start("2", "1", "value1b", "value2b", false, results);
TestResult result2 = new TestResult("startTransactionTest", "2", "1", "value1b", "value2b");
assertEquals(result2.toString(), baseResult2);
assertEquals(2, results.size());
assertEquals(result2, results.get(1));
String baseResult3 = basePolicy.start("1", "2", "value1c", "value2c", false, results);
assertEquals(result1.toString(), baseResult3);
assertEquals(2, results.size());
userTransaction1.commit();
assertEquals(2, results.size());
assertEquals(result1, results.get(0));
assertEquals(result2, results.get(1));
}
catch(Exception e)
{
try { userTransaction1.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
// Invoke Behaviour
UserTransaction userTransaction2 = trxService.getUserTransaction();
try
{
userTransaction2.begin();
List<TestResult> results = new ArrayList<TestResult>();
StartTestPolicy basePolicy = startDelegate.get(BASE_TYPE);
String baseResult1 = basePolicy.start("1", "2", "value1a", "value2a", true, results);
TestResult result1 = new TestResult("startTransactionTest", "1", "2", "value1a", "value2a");
assertEquals(result1.toString(), baseResult1);
assertEquals(1, results.size());
assertEquals(result1, results.get(0));
String baseResult2 = basePolicy.start("2", "1", "value1b", "value2b", true, results);
TestResult result2 = new TestResult("startTransactionTest", "2", "1", "value1b", "value2b");
assertEquals(result2.toString(), baseResult2);
assertEquals(2, results.size());
assertEquals(result2, results.get(1));
String baseResult3 = basePolicy.start("1", "2", "value1c", "value2c", true, results);
assertEquals(result1.toString(), baseResult3);
assertEquals(2, results.size());
TestResult result3 = new TestResult("sideEffectTest", "1", "2", "value1a", "value2a");
TestResult result4 = new TestResult("sideEffectTest", "2", "1", "value1b", "value2b");
userTransaction2.commit();
assertEquals(4, results.size());
assertEquals(result1, results.get(0));
assertEquals(result2, results.get(1));
assertEquals(result3, results.get(2));
assertEquals(result4, results.get(3));
}
catch(Exception e)
{
try { userTransaction2.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
}
public void testEndTransactionPolicy()
throws Exception
{
ClassPolicyDelegate<EndTestPolicy> endDelegate = policyComponent.registerClassPolicy(EndTestPolicy.class);
QName policyName = QName.createQName(TEST_NAMESPACE, "end");
PolicyDefinition<Policy> definition = policyComponent.getRegisteredPolicy(PolicyType.Class, policyName);
assertNotNull(definition);
Arg arg0 = definition.getArgument(0);
assertEquals(Arg.KEY, arg0);
Arg arg1 = definition.getArgument(1);
assertEquals(Arg.KEY, arg1);
Arg arg2 = definition.getArgument(2);
assertEquals(Arg.START_VALUE, arg2);
Arg arg3 = definition.getArgument(3);
assertEquals(Arg.END_VALUE, arg3);
// Bind Behaviour
Behaviour baseBehaviour = new JavaBehaviour(this, "endTransactionTest", NotificationFrequency.TRANSACTION_COMMIT);
policyComponent.bindClassBehaviour(policyName, BASE_TYPE, baseBehaviour);
UserTransaction userTransaction1 = trxService.getUserTransaction();
try
{
userTransaction1.begin();
List<TestResult> results = new ArrayList<TestResult>();
// Invoke Behaviour
EndTestPolicy basePolicy = endDelegate.get(BASE_TYPE);
String baseResult1 = basePolicy.end("1", "2", "value1a", "value2a", false, results);
assertEquals(null, baseResult1);
assertEquals(0, results.size());
String baseResult2 = basePolicy.end("2", "1", "value1b", "value2b", false, results);
assertEquals(null, baseResult2);
assertEquals(0, results.size());
String baseResult3 = basePolicy.end("1", "2", "value1a", "value2c", false, results);
assertEquals(null, baseResult3);
assertEquals(0, results.size());
TestResult result1 = new TestResult("endTransactionTest", "1", "2", "value1a", "value2c");
TestResult result2 = new TestResult("endTransactionTest", "2", "1", "value1b", "value2b");
userTransaction1.commit();
assertEquals(2, results.size());
assertEquals(result1, results.get(0));
assertEquals(result2, results.get(1));
}
catch(Exception e)
{
try { userTransaction1.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
UserTransaction userTransaction2 = trxService.getUserTransaction();
try
{
userTransaction2.begin();
List<TestResult> results = new ArrayList<TestResult>();
// Invoke Behaviour
EndTestPolicy basePolicy = endDelegate.get(BASE_TYPE);
String baseResult1 = basePolicy.end("1", "2", "value1a", "value2a", true, results);
assertEquals(null, baseResult1);
assertEquals(0, results.size());
String baseResult2 = basePolicy.end("2", "1", "value1b", "value2b", true, results);
assertEquals(null, baseResult2);
assertEquals(0, results.size());
String baseResult3 = basePolicy.end("1", "2", "value1a", "value2c", true, results);
assertEquals(null, baseResult3);
assertEquals(0, results.size());
TestResult result1 = new TestResult("endTransactionTest", "1", "2", "value1a", "value2c");
TestResult result2 = new TestResult("endTransactionTest", "2", "1", "value1b", "value2b");
TestResult result3 = new TestResult("sideEffectTest", "1", "2", "value1a", "value2c");
TestResult result4 = new TestResult("sideEffectTest", "2", "1", "value1b", "value2b");
userTransaction2.commit();
assertEquals(4, results.size());
assertEquals(result1, results.get(0));
assertEquals(result2, results.get(1));
assertEquals(result3, results.get(2));
assertEquals(result4, results.get(3));
}
catch(Exception e)
{
try { userTransaction2.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
NodeRef nodeRef = new NodeRef(TEST_NAMESPACE, "test", "123");
// Check enabling and disabling of behaviours within the transaction
// We disable multiple times and enable, including enabling when not disabled
UserTransaction userTransaction3 = trxService.getUserTransaction();
try
{
userTransaction3.begin();
// Check all enabled to start
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
// Check instance with nesting
behaviourFilter.enableBehaviour(nodeRef);
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
behaviourFilter.disableBehaviour(nodeRef);
checkBehaviour(BASE_TYPE, nodeRef, true, true, false, false);
behaviourFilter.disableBehaviour(nodeRef);
checkBehaviour(BASE_TYPE, nodeRef, true, true, false, false);
behaviourFilter.enableBehaviour(nodeRef);
checkBehaviour(BASE_TYPE, nodeRef, true, true, false, false);
behaviourFilter.enableBehaviour(nodeRef);
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
// Check class and instance with nesting
behaviourFilter.enableBehaviour(nodeRef, BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
behaviourFilter.disableBehaviour(nodeRef, BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, false, true);
behaviourFilter.disableBehaviour(nodeRef, BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, false, true);
behaviourFilter.enableBehaviour(nodeRef, BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, false, true);
behaviourFilter.enableBehaviour(nodeRef, BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
// Check class with nesting
behaviourFilter.enableBehaviour(BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
behaviourFilter.disableBehaviour(BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, false, false, true);
behaviourFilter.disableBehaviour(BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, false, false, true);
behaviourFilter.enableBehaviour(BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, false, false, true);
behaviourFilter.enableBehaviour(BASE_TYPE);
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
// Check global with nesting
behaviourFilter.enableBehaviour();
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
behaviourFilter.disableBehaviour();
checkBehaviour(BASE_TYPE, nodeRef, false, false, false, false);
behaviourFilter.disableBehaviour();
checkBehaviour(BASE_TYPE, nodeRef, false, false, false, false);
behaviourFilter.enableBehaviour();
checkBehaviour(BASE_TYPE, nodeRef, false, false, false, false);
behaviourFilter.enableBehaviour();
checkBehaviour(BASE_TYPE, nodeRef, true, true, true, true);
userTransaction3.commit();
}
catch(Exception e)
{
try { userTransaction3.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
}
/**
* Test for MNT_13836
* <p>first show that both behaviours are enabled and triggered for a sub- (child) instance</p>
* @throws Exception
*/
public void testChildParentBehaviours1() throws Exception
{
TestOnCreateNodePolicy baseTypeBehavior = new TestOnCreateNodePolicy();
TestOnCreateNodePolicy fileTypeBehavior = new TestOnCreateNodePolicy();
// bind custom behavior for parent type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, BASE_TYPE, new JavaBehaviour(baseTypeBehavior, "onCreateNode"));
// bind custom behavior for child type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, FILE_TYPE, new JavaBehaviour(fileTypeBehavior, "onCreateNode"));
UserTransaction transaction = trxService.getUserTransaction();
try
{
transaction.begin();
final String name = "Test (" + System.currentTimeMillis() + ").docx";
final Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>();
contentProps.put(ContentModel.PROP_NAME, name);
// create node of child type
nodeService.createNode(companyHome,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_PREFIX, name),
FILE_TYPE,
contentProps);
transaction.commit();
}
catch(Exception e)
{
try { transaction.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
assertTrue("Behavior should be executed for parent type.", baseTypeBehavior.isExecuted());
assertEquals(1, baseTypeBehavior.getExecutionCount());
assertTrue("Behavior should be executed for child type.", fileTypeBehavior.isExecuted());
assertEquals(1, fileTypeBehavior.getExecutionCount());
}
/**
* Test for MNT_13836
* <p>then disable the super- behaviour only and show that sub behaviour is still enabled and triggered</p>
* @throws Exception
*/
/*
public void testChildParentBehaviours2() throws Exception
{
TestOnCreateNodePolicy baseTypeBehavior = new TestOnCreateNodePolicy();
TestOnCreateNodePolicy fileTypeBehavior = new TestOnCreateNodePolicy();
// bind custom behavior for parent type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, BASE_TYPE, new JavaBehaviour(baseTypeBehavior, "onCreateNode"));
// bind custom behavior for child type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, FILE_TYPE, new JavaBehaviour(fileTypeBehavior, "onCreateNode"));
UserTransaction transaction = trxService.getUserTransaction();
try
{
transaction.begin();
// disable behavior for parent type
behaviourFilter.disableBehaviour(BASE_TYPE);
// check that behavior is disabled correctly
try
{
checkBehaviour(BASE_TYPE, companyHome, true, false, false, true);
final String name = "Test (" + System.currentTimeMillis() + ").docx";
final Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>();
contentProps.put(ContentModel.PROP_NAME, name);
// create node of child type
nodeService.createNode(companyHome,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_PREFIX, name),
FILE_TYPE,
contentProps);
}
finally
{
behaviourFilter.enableBehaviour(BASE_TYPE);
checkBehaviour(BASE_TYPE, companyHome, true, true, true, true);
}
transaction.commit();
}
catch(Exception e)
{
try { transaction.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
assertFalse("Behavior should not be executed for parent type.", baseTypeBehavior.isExecuted());
assertEquals(0, baseTypeBehavior.getExecutionCount());
assertTrue("Behavior should be executed for child type.", fileTypeBehavior.isExecuted());
assertEquals(1, fileTypeBehavior.getExecutionCount());
}
*/
/**
* Test for MNT_13836
* <p>then also disable the sub- behaviour and show that neither behaviour is triggered</p>
* @throws Exception
*/
public void testChildParentBehaviours3() throws Exception
{
TestOnCreateNodePolicy baseTypeBehavior = new TestOnCreateNodePolicy();
TestOnCreateNodePolicy fileTypeBehavior = new TestOnCreateNodePolicy();
// bind custom behavior for parent type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, BASE_TYPE, new JavaBehaviour(baseTypeBehavior, "onCreateNode"));
// bind custom behavior for child type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, FILE_TYPE, new JavaBehaviour(fileTypeBehavior, "onCreateNode"));
UserTransaction transaction = trxService.getUserTransaction();
try
{
transaction.begin();
// disable behavior for parent type
behaviourFilter.disableBehaviour(BASE_TYPE);
// check that behavior is disabled correctly
checkBehaviour(BASE_TYPE, companyHome, true, false, false, true);
// disable behavior for child type
behaviourFilter.disableBehaviour(FILE_TYPE);
// check that behavior is disabled correctly
checkBehaviour(FILE_TYPE, companyHome, true, false, false, true);
try
{
final String name = "Test (" + System.currentTimeMillis() + ").docx";
final Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>();
contentProps.put(ContentModel.PROP_NAME, name);
// create node of child type
nodeService.createNode(companyHome,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_PREFIX, name),
FILE_TYPE,
contentProps);
}
finally
{
behaviourFilter.enableBehaviour(BASE_TYPE);
behaviourFilter.enableBehaviour(FILE_TYPE);
checkBehaviour(BASE_TYPE, companyHome, true, true, true, true);
checkBehaviour(FILE_TYPE, companyHome, true, true, true, true);
}
transaction.commit();
}
catch(Exception e)
{
try { transaction.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
assertFalse("Behavior should not be executed for parent type.", baseTypeBehavior.isExecuted());
assertEquals(0, baseTypeBehavior.getExecutionCount());
assertFalse("Behavior should not be executed for child type.", fileTypeBehavior.isExecuted());
assertEquals(0, fileTypeBehavior.getExecutionCount());
}
/**
* Test for MNT_13836
* <p>then vice-versa, ie. disabling sub- behaviour does not disable inherited super- behaviours</p>
* @throws Exception
*/
/*
public void testChildParentBehaviours4() throws Exception
{
TestOnCreateNodePolicy baseTypeBehavior = new TestOnCreateNodePolicy();
TestOnCreateNodePolicy fileTypeBehavior = new TestOnCreateNodePolicy();
// bind custom behavior for parent type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, BASE_TYPE, new JavaBehaviour(baseTypeBehavior, "onCreateNode"));
// bind custom behavior for child type
policyComponent.bindClassBehaviour(OnCreateNodePolicy.QNAME, FILE_TYPE, new JavaBehaviour(fileTypeBehavior, "onCreateNode"));
UserTransaction transaction = trxService.getUserTransaction();
try
{
transaction.begin();
// disable behavior for child type
behaviourFilter.disableBehaviour(FILE_TYPE);
// check that behavior is disabled correctly
checkBehaviour(FILE_TYPE, companyHome, true, false, false, true);
try
{
final String name = "Test (" + System.currentTimeMillis() + ").docx";
final Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>();
contentProps.put(ContentModel.PROP_NAME, name);
// create node of child type
nodeService.createNode(companyHome,
ContentModel.ASSOC_CONTAINS,
QName.createQName(NamespaceService.CONTENT_MODEL_PREFIX, name),
FILE_TYPE,
contentProps);
}
finally
{
behaviourFilter.enableBehaviour(FILE_TYPE);
checkBehaviour(FILE_TYPE, companyHome, true, true, true, true);
}
transaction.commit();
}
catch(Exception e)
{
try { transaction.rollback(); } catch (IllegalStateException ee) {}
throw e;
}
assertTrue("Behavior should be executed for parent type.", baseTypeBehavior.isExecuted());
assertEquals(1, baseTypeBehavior.getExecutionCount());
assertFalse("Behavior should not be executed for child type.", fileTypeBehavior.isExecuted());
assertEquals(0, fileTypeBehavior.getExecutionCount());
}
*/
/**
* @param className the class to check
* @param nodeRef the node instance to check
* @param globalEnabled <tt>true</tt> if the global filter should be enabled
* @param classEnabled <tt>true</tt> if the class should be enabled
* @param classInstanceEnabled <tt>true</tt> if the class and instance should be enabled
* @param instanceEnabled <tt>true</tt> if the instance should be enabled
*/
private void checkBehaviour(
QName className, NodeRef nodeRef,
boolean globalEnabled,
boolean classEnabled,
boolean classInstanceEnabled,
boolean instanceEnabled)
{
assertEquals("Incorrect behaviour state: global: ", globalEnabled, behaviourFilter.isEnabled());
assertEquals("Incorrect behaviour state: class: ", classEnabled, behaviourFilter.isEnabled(className));
assertEquals("Incorrect behaviour state: classAndInstance", classInstanceEnabled, behaviourFilter.isEnabled(nodeRef, className));
assertEquals("Incorrect behaviour state: instance", instanceEnabled, behaviourFilter.isEnabled(nodeRef));
assertEquals("'Active' flag incorrect: ",
!(globalEnabled && classEnabled && classInstanceEnabled && instanceEnabled),
behaviourFilter.isActivated());
}
//
// Behaviour Implementations
//
public String startTransactionTest(String key1, String key2, String arg1, String arg2, boolean sideEffect, List<TestResult> results)
{
TestResult result = new TestResult("startTransactionTest", key1, key2, arg1, arg2);
results.add(result);
if (sideEffect)
{
SideEffectTestPolicy policy = sideEffectDelegate.get(BASE_TYPE);
policy.sideEffect(key1, key2, arg1, arg2, results);
}
return result.toString();
}
public String endTransactionTest(String key1, String key2, String arg1, String arg2, boolean sideEffect, List<TestResult> results)
{
TestResult result = new TestResult("endTransactionTest", key1, key2, arg1, arg2);
results.add(result);
if (sideEffect)
{
SideEffectTestPolicy policy = sideEffectDelegate.get(BASE_TYPE);
policy.sideEffect(key1, key2, arg1, arg2, results);
}
return result.toString();
}
public String sideEffectTest(String key1, String key2, String arg1, String arg2, List<TestResult> results)
{
TestResult result = new TestResult("sideEffectTest", key1, key2, arg1, arg2);
results.add(result);
return result.toString();
}
//
// Policy Definitions
//
public interface StartTestPolicy extends ClassPolicy
{
public String start(String key1, String key2, String arg1, String arg2, boolean sideEffect, List<TestResult> results);
static String NAMESPACE = TEST_NAMESPACE;
static Arg ARG_0 = Arg.KEY;
static Arg ARG_1 = Arg.KEY;
static Arg ARG_2 = Arg.START_VALUE;
static Arg ARG_3 = Arg.END_VALUE;
}
public interface EndTestPolicy extends ClassPolicy
{
public String end(String key1, String key2, String arg1, String arg2, boolean sideEffect, List<TestResult> results);
static String NAMESPACE = TEST_NAMESPACE;
static Arg ARG_0 = Arg.KEY;
static Arg ARG_1 = Arg.KEY;
static Arg ARG_2 = Arg.START_VALUE;
static Arg ARG_3 = Arg.END_VALUE;
}
public interface SideEffectTestPolicy extends ClassPolicy
{
public String sideEffect(String key1, String key2, String arg1, String arg2, List<TestResult> resultTest);
static String NAMESPACE = TEST_NAMESPACE;
static Arg ARG_0 = Arg.KEY;
static Arg ARG_1 = Arg.KEY;
}
/**
* Result of Policy Invocation
*/
private class TestResult
{
private String trxId;
private String behaviour;
private String key1;
private String key2;
private String arg1;
private String arg2;
/**
* Construct
*
* @param behaviour String
* @param key1 String
* @param key2 String
* @param arg1 String
* @param arg2 String
*/
public TestResult(String behaviour, String key1, String key2, String arg1, String arg2)
{
this.trxId = AlfrescoTransactionSupport.getTransactionId();
this.behaviour = behaviour;
this.key1 = key1;
this.key2 = key2;
this.arg1 = arg1;
this.arg2 = arg2;
}
@Override
public boolean equals(Object obj)
{
if (this == obj)
{
return true;
}
if (obj instanceof TestResult)
{
TestResult that = (TestResult) obj;
return (this.trxId.equals(that.trxId) &&
this.behaviour.equals(that.behaviour) &&
this.key1.equals(that.key1) &&
this.key2.equals(that.key2) &&
this.arg1.equals(that.arg1) &&
this.arg2.equals(that.arg2));
}
else
{
return false;
}
}
@Override
public String toString()
{
return "trxId=" + trxId + ", behaviour=" + behaviour + ", key1=" + key1 + ", key2=" + key2 + ", arg1=" + arg1 + ", arg2=" + arg2;
}
}
private class TestOnCreateNodePolicy implements OnCreateNodePolicy
{
private boolean executed;
private int executionCount;
@Override
public void onCreateNode(ChildAssociationRef childAssocRef)
{
executed = true;
executionCount++;
}
public boolean isExecuted()
{
return executed;
}
public int getExecutionCount()
{
return executionCount;
}
}
}