ALF-3885: find multiple class behaviours through (super-)class hierarchy (not just first) - warning: pls review/test your registered (super-)class behaviours

Merged BRANCHES/DEV/WORKP1 to HEAD
        21224: ALF-3885: find multiple class behaviours through type hierarchy (not just first)
        21249: ALF-3885: follow-on to r21224 (to fix PersonServiceTest.testSplitDuplicates)


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@21253 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Jan Vonka
2010-07-19 08:34:35 +00:00
parent 5d2a5e23cf
commit 5db5f0a1a6
4 changed files with 34 additions and 29 deletions

View File

@@ -300,6 +300,9 @@
<property name="policyComponent"> <property name="policyComponent">
<ref bean="policyComponent"/> <ref bean="policyComponent"/>
</property> </property>
<property name="policyBehaviourFilter">
<ref bean="policyBehaviourFilter" />
</property>
<property name="personCache"> <property name="personCache">
<ref bean="personCache" /> <ref bean="personCache" />
</property> </property>

View File

@@ -91,6 +91,7 @@ import org.alfresco.service.namespace.QName;
/* (non-Javadoc) /* (non-Javadoc)
* @see org.alfresco.repo.policy.BehaviourIndex#getAll() * @see org.alfresco.repo.policy.BehaviourIndex#getAll()
*/ */
@SuppressWarnings("unchecked")
public Collection<BehaviourDefinition> getAll() public Collection<BehaviourDefinition> getAll()
{ {
lock.readLock().lock(); lock.readLock().lock();
@@ -134,17 +135,14 @@ import org.alfresco.service.namespace.QName;
{ {
// Find class behaviour by scanning up the class hierarchy // Find class behaviour by scanning up the class hierarchy
List<BehaviourDefinition<B>> behaviour = null; List<BehaviourDefinition<B>> behaviour = null;
while(behaviour == null && binding != null) while (binding != null)
{ {
behaviour = classMap.get(binding); behaviour = classMap.get(binding);
if (behaviour == null)
{
binding = (B)binding.generaliseBinding();
}
}
if (behaviour != null) if (behaviour != null)
{ {
behaviours.addAll(behaviour); behaviours.addAll(0, behaviour); // note: list base/generalised before extended/specific
}
binding = (B)binding.generaliseBinding();
} }
} }

View File

@@ -225,14 +225,14 @@ public class PolicyComponentTest extends TestCase
// Test NOOP Policy delegate // Test NOOP Policy delegate
Collection<TestClassPolicy> basePolicies = delegate.getList(BASE_TYPE); Collection<TestClassPolicy> basePolicies = delegate.getList(BASE_TYPE);
assertNotNull(basePolicies); assertNotNull(basePolicies);
assertTrue(basePolicies.size() == 0); assertEquals(0, basePolicies.size());
TestClassPolicy basePolicy = delegate.get(BASE_TYPE); TestClassPolicy basePolicy = delegate.get(BASE_TYPE);
assertNotNull(basePolicy); assertNotNull(basePolicy);
// Test single Policy delegate // Test single Policy delegate
Collection<TestClassPolicy> filePolicies = delegate.getList(FILE_TYPE); Collection<TestClassPolicy> filePolicies = delegate.getList(FILE_TYPE);
assertNotNull(filePolicies); assertNotNull(filePolicies);
assertTrue(filePolicies.size() == 1); assertEquals(1, filePolicies.size());
TestClassPolicy filePolicy = delegate.get(FILE_TYPE); TestClassPolicy filePolicy = delegate.get(FILE_TYPE);
assertNotNull(filePolicy); assertNotNull(filePolicy);
assertEquals(filePolicies.iterator().next(), filePolicy); assertEquals(filePolicies.iterator().next(), filePolicy);
@@ -244,7 +244,7 @@ public class PolicyComponentTest extends TestCase
// Test multi Policy delegate // Test multi Policy delegate
Collection<TestClassPolicy> file2Policies = delegate.getList(FILE_TYPE); Collection<TestClassPolicy> file2Policies = delegate.getList(FILE_TYPE);
assertNotNull(file2Policies); assertNotNull(file2Policies);
assertTrue(file2Policies.size() == 2); assertEquals(2, file2Policies.size());
TestClassPolicy filePolicy2 = delegate.get(FILE_TYPE); TestClassPolicy filePolicy2 = delegate.get(FILE_TYPE);
assertNotNull(filePolicy2); assertNotNull(filePolicy2);
@@ -253,7 +253,7 @@ public class PolicyComponentTest extends TestCase
policyComponent.bindClassBehaviour(policyName, FILE_TYPE, file2Behaviour); policyComponent.bindClassBehaviour(policyName, FILE_TYPE, file2Behaviour);
Collection<TestClassPolicy> file3Policies = delegate.getList(FILE_TYPE); Collection<TestClassPolicy> file3Policies = delegate.getList(FILE_TYPE);
assertNotNull(file3Policies); assertNotNull(file3Policies);
assertTrue(file3Policies.size() == 3); assertEquals(3, file3Policies.size());
TestClassPolicy filePolicy3 = delegate.get(FILE_TYPE); TestClassPolicy filePolicy3 = delegate.get(FILE_TYPE);
assertNotNull(filePolicy3); assertNotNull(filePolicy3);
} }
@@ -329,7 +329,7 @@ public class PolicyComponentTest extends TestCase
String fileResult3 = filePolicy3.test("file"); String fileResult3 = filePolicy3.test("file");
assertEquals("NewBase: file", fileResult3); assertEquals("NewBase: file", fileResult3);
TestClassPolicy folderPolicy3 = delegate.get(FOLDER_TYPE); TestClassPolicy folderPolicy3 = delegate.get(FOLDER_TYPE);
assertTrue(folderPolicy3 == folderPolicy2); assertTrue(folderPolicy3 != folderPolicy2);
String folderResult3 = folderPolicy3.test("folder"); String folderResult3 = folderPolicy3.test("folder");
assertEquals("Folder: folder", folderResult3); assertEquals("Folder: folder", folderResult3);
@@ -347,7 +347,7 @@ public class PolicyComponentTest extends TestCase
String fileResult4 = filePolicy4.test("file"); String fileResult4 = filePolicy4.test("file");
assertEquals("File: file", fileResult4); assertEquals("File: file", fileResult4);
TestClassPolicy folderPolicy4 = delegate.get(FOLDER_TYPE); TestClassPolicy folderPolicy4 = delegate.get(FOLDER_TYPE);
assertTrue(folderPolicy4 == folderPolicy4); assertTrue(folderPolicy4 == folderPolicy3);
String folderResult4 = folderPolicy4.test("folder"); String folderResult4 = folderPolicy4.test("folder");
assertEquals("Folder: folder", folderResult4); assertEquals("Folder: folder", folderResult4);
} }
@@ -366,14 +366,14 @@ public class PolicyComponentTest extends TestCase
// Test NOOP Policy delegate // Test NOOP Policy delegate
Collection<TestPropertyPolicy> basePolicies = delegate.getList(BASE_TYPE, BASE_PROP_A); Collection<TestPropertyPolicy> basePolicies = delegate.getList(BASE_TYPE, BASE_PROP_A);
assertNotNull(basePolicies); assertNotNull(basePolicies);
assertTrue(basePolicies.size() == 0); assertEquals(0, basePolicies.size());
TestPropertyPolicy basePolicy = delegate.get(BASE_TYPE, BASE_PROP_A); TestPropertyPolicy basePolicy = delegate.get(BASE_TYPE, BASE_PROP_A);
assertNotNull(basePolicy); assertNotNull(basePolicy);
// Test single Policy delegate // Test single Policy delegate
Collection<TestPropertyPolicy> filePolicies = delegate.getList(FILE_TYPE, FILE_PROP_B); Collection<TestPropertyPolicy> filePolicies = delegate.getList(FILE_TYPE, FILE_PROP_B);
assertNotNull(filePolicies); assertNotNull(filePolicies);
assertTrue(filePolicies.size() == 1); assertEquals(1, filePolicies.size());
TestPropertyPolicy filePolicy = delegate.get(FILE_TYPE, FILE_PROP_B); TestPropertyPolicy filePolicy = delegate.get(FILE_TYPE, FILE_PROP_B);
assertNotNull(filePolicy); assertNotNull(filePolicy);
assertEquals(filePolicies.iterator().next(), filePolicy); assertEquals(filePolicies.iterator().next(), filePolicy);
@@ -385,7 +385,7 @@ public class PolicyComponentTest extends TestCase
// Test multi Policy delegate // Test multi Policy delegate
Collection<TestPropertyPolicy> file2Policies = delegate.getList(FILE_TYPE, FILE_PROP_B); Collection<TestPropertyPolicy> file2Policies = delegate.getList(FILE_TYPE, FILE_PROP_B);
assertNotNull(file2Policies); assertNotNull(file2Policies);
assertTrue(file2Policies.size() == 2); assertEquals(2, file2Policies.size());
TestPropertyPolicy filePolicy2 = delegate.get(FILE_TYPE, FILE_PROP_B); TestPropertyPolicy filePolicy2 = delegate.get(FILE_TYPE, FILE_PROP_B);
assertNotNull(filePolicy2); assertNotNull(filePolicy2);
} }
@@ -515,7 +515,7 @@ public class PolicyComponentTest extends TestCase
// Test single Policy delegate // Test single Policy delegate
Collection<TestAssociationPolicy> filePolicies = delegate.getList(FILE_TYPE, BASE_ASSOC_A); Collection<TestAssociationPolicy> filePolicies = delegate.getList(FILE_TYPE, BASE_ASSOC_A);
assertNotNull(filePolicies); assertNotNull(filePolicies);
assertTrue(filePolicies.size() == 1); assertEquals(1, filePolicies.size());
TestAssociationPolicy filePolicy = delegate.get(FILE_TYPE, BASE_ASSOC_A); TestAssociationPolicy filePolicy = delegate.get(FILE_TYPE, BASE_ASSOC_A);
assertNotNull(filePolicy); assertNotNull(filePolicy);
String fileResult = filePolicy.test("file"); String fileResult = filePolicy.test("file");
@@ -528,7 +528,7 @@ public class PolicyComponentTest extends TestCase
// Test multi Policy delegate // Test multi Policy delegate
Collection<TestAssociationPolicy> file2Policies = delegate.getList(FILE_TYPE, BASE_ASSOC_A); Collection<TestAssociationPolicy> file2Policies = delegate.getList(FILE_TYPE, BASE_ASSOC_A);
assertNotNull(file2Policies); assertNotNull(file2Policies);
assertTrue(file2Policies.size() == 2); assertEquals(2, file2Policies.size());
TestAssociationPolicy filePolicy2 = delegate.get(FILE_TYPE, BASE_ASSOC_A); TestAssociationPolicy filePolicy2 = delegate.get(FILE_TYPE, BASE_ASSOC_A);
assertNotNull(filePolicy2); assertNotNull(filePolicy2);
} }

View File

@@ -38,6 +38,7 @@ import org.alfresco.repo.node.NodeServicePolicies;
import org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy; import org.alfresco.repo.node.NodeServicePolicies.BeforeDeleteNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy; import org.alfresco.repo.node.NodeServicePolicies.OnCreateNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy; import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;
import org.alfresco.repo.policy.BehaviourFilter;
import org.alfresco.repo.policy.JavaBehaviour; import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent; import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.repo.security.authentication.AuthenticationException; import org.alfresco.repo.security.authentication.AuthenticationException;
@@ -115,6 +116,8 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
private PolicyComponent policyComponent; private PolicyComponent policyComponent;
private BehaviourFilter policyBehaviourFilter;
private boolean createMissingPeople; private boolean createMissingPeople;
private static Set<QName> mutableProperties; private static Set<QName> mutableProperties;
@@ -133,9 +136,6 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
private PermissionsManager permissionsManager; private PermissionsManager permissionsManager;
// Behaviours
JavaBehaviour onUpdatePropertiesBehaviour;
/** a transactionally-safe cache to be injected */ /** a transactionally-safe cache to be injected */
private SimpleCache<String, Set<NodeRef>> personCache; private SimpleCache<String, Set<NodeRef>> personCache;
@@ -190,17 +190,16 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
OnCreateNodePolicy.QNAME, OnCreateNodePolicy.QNAME,
ContentModel.TYPE_PERSON, ContentModel.TYPE_PERSON,
new JavaBehaviour(this, "onCreateNode")); new JavaBehaviour(this, "onCreateNode"));
this.policyComponent.bindClassBehaviour( this.policyComponent.bindClassBehaviour(
BeforeDeleteNodePolicy.QNAME, BeforeDeleteNodePolicy.QNAME,
ContentModel.TYPE_PERSON, ContentModel.TYPE_PERSON,
new JavaBehaviour(this, "beforeDeleteNode")); new JavaBehaviour(this, "beforeDeleteNode"));
onUpdatePropertiesBehaviour = new JavaBehaviour(this, "onUpdateProperties");
this.policyComponent.bindClassBehaviour( this.policyComponent.bindClassBehaviour(
OnUpdatePropertiesPolicy.QNAME, OnUpdatePropertiesPolicy.QNAME,
ContentModel.TYPE_PERSON, ContentModel.TYPE_PERSON,
onUpdatePropertiesBehaviour); new JavaBehaviour(this, "onUpdateProperties"));
} }
public UserNameMatcher getUserNameMatcher() public UserNameMatcher getUserNameMatcher()
@@ -461,7 +460,7 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
{ {
try try
{ {
onUpdatePropertiesBehaviour.disable(); policyBehaviourFilter.disableBehaviour(ContentModel.TYPE_PERSON);
if (duplicateMode.equalsIgnoreCase(SPLIT)) if (duplicateMode.equalsIgnoreCase(SPLIT))
{ {
@@ -485,7 +484,7 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
} }
finally finally
{ {
onUpdatePropertiesBehaviour.enable(); policyBehaviourFilter.enableBehaviour(ContentModel.TYPE_PERSON);
} }
// Done // Done
@@ -955,6 +954,11 @@ public class PersonServiceImpl extends TransactionListenerAdapter implements Per
this.policyComponent = policyComponent; this.policyComponent = policyComponent;
} }
public void setPolicyBehaviourFilter(BehaviourFilter policyBehaviourFilter)
{
this.policyBehaviourFilter = policyBehaviourFilter;
}
public void setStoreUrl(String storeUrl) public void setStoreUrl(String storeUrl)
{ {
this.storeRef = new StoreRef(storeUrl); this.storeRef = new StoreRef(storeUrl);