@startuml title Policies: Policy Component (V4.2 onwards) ' Split into 2 pages page 2x1 interface PolicyEndpointService #DDDDDD class PolicyEndpointServiceImpl #DDDDDD implements PolicyEndpointService{ - policyComponent : PolicyComponent - policyEndpointRegistry : registry + registerPolicyEndpoint(QName policy, String endpoint) : void + registerPolicyEndpoint(QName policy, QName typeOrAspect, String endpoint) : void + unregisterPolicyEndpoint(QName policy, String endpoint) : void + unregisterPolicyEndpoint(QName policy, QName typeOrAspect, String endpoint) : void } PolicyEndpointServiceImpl -> PolicyComponent class PolicyEndpointRegistry #DDDDDD { - QueuedBehaviour dynamicBehaviour - Set registrations + {static} PolicyEndpointRegistry getInstance() + reload(long fromTime) + slip(String body, @Properties Map properties) } PolicyEndpointRegistry *- "1" QueuedBehaviour PolicyEndpointServiceImpl -> PolicyEndpointRegistry class PolicyEndpoint <> #DDDDDD { - QName policy - QName typeOrAspect - String endpoint - long modified - boolean active + getKey() } PolicyEndpointRegistry *- PolicyEndpoint interface Policy interface ClassPolicy extends Policy interface OnCreateNodePolicy extends ClassPolicy { +QNAME: http://www.alfresco.org:onCreateNode +onCreateNode(ChildAssociationRef childAssocRef) } interface AssociationPolicy extends Policy interface OnCreateChildAssociationPolicy extends AssociationPolicy { +QNAME: http://www.alfresco.org:onCreateChildAssociation +onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean isNewNode) } enum NotificationFrequency { EVERY_EVENT, FIRST_EVENT, TRANSACTION_COMMIT } interface Behaviour { + getInterface(Class policy) : T + disable() + enable() + isEnabled() : boolean + getNotificationFrequency() : NotificationFrequency } class BaseBehaviour implements Behaviour { # proxies : Map # frequency : NotificationFrequency - disabled : StackThreadLocal + disable() + enable() + isEnabled() : boolean + getNotificationFrequency() : NotificationFrequency } class JavaBehaviour extends BaseBehaviour { + getInterface(Class policy) : T # getInvocationHandler(Object instance, String method, Class policyIF) : InvocationHandler } class QueuedBehaviour <> #DDDDDD extends BaseBehaviour { - ProducerTemplate queueTemplate + getInterface(Class policy) : T # getInvocationHandler(Object instance, String method, Class policyIF) : InvocationHandler } class ScriptBehaviour extends BaseBehaviour BaseBehaviour o- NotificationFrequency interface BehaviourBinding { + generaliseBinding() : BehaviourBinding } class ClassBehaviourBinding implements BehaviourBinding { + generaliseBinding() : BehaviourBinding } class ClassFeatureBehaviourBinding extends ClassBehaviourBinding { } class ServiceBehaviourBinding implements BehaviourBinding { + generaliseBinding() : BehaviourBinding } class ClassPolicyDelegate

{ - dictionary : DictionaryService - factory : CachedPolicyFactory # ClassPolicyDelegate(DictionaryService dictionary, Class

policyClass, BehaviourIndex index, long tryLockTimeout) } class AssociationPolicyDelegate

{ - dictionary : DictionaryService - factory : CachedPolicyFactory # AssociationPolicyDelegate(DictionaryService dictionary, Class

policyClass, BehaviourIndex index, long tryLockTimeout) } class PropertyPolicyDelegate

{ - dictionary : DictionaryService - factory : CachedPolicyFactory # PropertyPolicyDelegate(DictionaryService dictionary, Class

policyClass, BehaviourIndex index, long tryLockTimeout) } class PolicyFactory { - index : BehaviourIndex~ - policyClass : Class~

- transactionHandlerFactory : TransactionInvocationHandlerFactory - tenantService : TenantService -- PolicyFactory(Class

policyClass, BehaviourIndex~ index) -- } class CachedPolicyFactory extends PolicyFactory abstract class AbstractNodeServiceImpl implements NodeService { - policyComponent : PolicyComponent # dictionaryService : DictionaryService # transactionService : TransactionService # tenantService : TenantService - onCreateNodeDelegate : ClassPolicyDelegate } interface PolicyComponent { +

registerClassPolicy(Class

policy) : ClassPolicyDelegate

+

registerPropertyPolicy(Class

policy) : PropertyPolicyDelegate

+

registerAssociationPolicy(Class

policy) : AssociationPolicyDelegate

+ bindClassBehaviour(QName policy, QName className, Behaviour behaviour) : BehaviourDefinition + bindClassBehaviour(QName policy, Object service, Behaviour behaviour) : BehaviourDefinition + bindPropertyBehaviour(QName policy, QName className, QName propertyName, Behaviour behaviour) : BehaviourDefinition + bindPropertyBehaviour(QName policy, QName className, Behaviour behaviour) : BehaviourDefinition + bindPropertyBehaviour(QName policy, Object service, Behaviour behaviour) : BehaviourDefinition + bindAssociationBehaviour(QName policy, QName className, QName assocName, Behaviour behaviour) : BehaviourDefinition + bindAssociationBehaviour(QName policy, QName className, Behaviour behaviour) : BehaviourDefinition + bindAssociationBehaviour(QName policy, Object service, Behaviour behaviour) : BehaviourDefinition + removeClassDefinition(BehaviourDefinition definition) : void } class PolicyComponentImpl implements PolicyComponent { - Map> classBehaviours - Map> propertyBehaviours - Map> associationBehaviours + PolicyComponentImpl(DictionaryService dictionary) + ... (all) } interface BehaviourFilter { + disableBehaviour() : void + disableBehaviour(QName className) : void + disableBehaviour(QName className, boolean includeSubClasses) : void + disableBehaviour(NodeRef nodeRef, QName className) : void + disableBehaviour(NodeRef nodeRef) : void + enableBehaviour() : void + enableBehaviour(QName className) : void + enableBehaviour(NodeRef nodeRef, QName className) : void + enableBehaviour(NodeRef nodeRef) : void } class BehaviourFilterImpl implements BehaviourFilter { + ... (all) } AbstractNodeServiceImpl -> PolicyComponentImpl PolicyComponentImpl -> BehaviourFilterImpl PolicyComponentImpl -> "creates" ClassPolicyDelegate PolicyComponentImpl -> "creates" AssocationPolicyDelegate PolicyComponentImpl -> "creates" PropertyPolicyDelegate ClassPolicyDelegate --> "uses" PolicyFactory AssociationPolicyDelegate --> "uses" PolicyFactory PropertyPolicyDelegate --> "uses" PolicyFactory PolicyFactory --> "creates" BehaviourBinding @enduml