Moved repository master into its own directory
8
repository/docs/infrastructure/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# Repository -> Infrastructure
|
||||
|
||||
## Sub-components
|
||||
|
||||
* [ ] [Module Framework](./module-framework)
|
||||
* [ ] [Cluster](./cluster)
|
||||
* [ ] [Policies and Behaviours](./policies-and-behaviours)
|
||||
* [ ] [Multi-tenancy](./multi-tenancy)
|
After Width: | Height: | Size: 18 KiB |
@@ -0,0 +1,30 @@
|
||||
@startuml
|
||||
|
||||
title Tenant Service (aws)
|
||||
|
||||
|
||||
|
||||
interface TenantService
|
||||
interface TenantServiceSPI
|
||||
|
||||
class Tenant
|
||||
class TenantServiceDDBImpl
|
||||
class TenantServiceImpl
|
||||
class TenantServiceLambda
|
||||
|
||||
|
||||
Tenant <.. TenantService : uses
|
||||
Tenant <.. TenantServiceDDBImpl : uses
|
||||
Tenant <.. TenantServiceImpl : uses
|
||||
Tenant <.. TenantServiceSPI : uses
|
||||
TenantServiceDDBImpl <.. TenantServiceLambda : uses
|
||||
TenantServiceImpl <.. TenantServiceLambda : uses
|
||||
TenantServiceSPI <.. TenantServiceImpl : uses
|
||||
TenantServiceSPI <.. TenantServiceLambda : uses
|
||||
|
||||
TenantService <|.. TenantServiceImpl : implements
|
||||
TenantServiceSPI <|.. TenantServiceDDBImpl : implements
|
||||
|
||||
center footer © 2016 Alfresco Software Inc. all rights reserved \n Generated from PlantUML
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1,89 @@
|
||||
@startuml
|
||||
left to right direction
|
||||
|
||||
|
||||
interface com.alfresco.services.lambda.TenantServiceSPI {
|
||||
--
|
||||
+ createTenant(c String, c String) : Tenant
|
||||
+ deleteTenant(c String) : boolean
|
||||
+ getTenant(c String) : Tenant
|
||||
+ getTenantSchema(c String) : String
|
||||
+ updateTenant(c Tenant) : boolean
|
||||
|
||||
}
|
||||
interface com.alfresco.services.lambda.TenantService {
|
||||
--
|
||||
+ createTenant(c String, c String) : Tenant
|
||||
+ deleteTenant(c String) : boolean
|
||||
+ getTenant(c String) : Tenant
|
||||
+ getTenantSchema(c String) : String
|
||||
+ updateTenant(c Tenant) : boolean
|
||||
|
||||
}
|
||||
class com.alfresco.services.lambda.TenantServiceDDBImpl {
|
||||
- regions : c Regions
|
||||
- tableName : c String
|
||||
--
|
||||
+ TenantServiceDDBImpl()
|
||||
+ createTenant(c String, c String) : Tenant
|
||||
+ deleteTenant(c String) : boolean
|
||||
+ getTenant(c String) : Tenant
|
||||
+ getTenantSchema(c String) : String
|
||||
+ updateTenant(c Tenant) : boolean
|
||||
- log(c String) : void
|
||||
|
||||
}
|
||||
class com.alfresco.services.lambda.TenantServiceLambda {
|
||||
--
|
||||
+ TenantServiceLambda()
|
||||
+ handleRequest(c Tenant, i Context) : Tenant
|
||||
|
||||
}
|
||||
class com.alfresco.services.lambda.TenantServiceImpl {
|
||||
- tenantServiceSPI : i TenantServiceSPI
|
||||
--
|
||||
+ TenantServiceImpl(i TenantServiceSPI)
|
||||
+ createTenant(c String, c String) : Tenant
|
||||
+ deleteTenant(c String) : boolean
|
||||
+ getTenant(c String) : Tenant
|
||||
+ getTenantSchema(c String) : String
|
||||
+ updateTenant(c Tenant) : boolean
|
||||
|
||||
}
|
||||
class com.alfresco.services.lambda.Tenant {
|
||||
- method : c String
|
||||
- schema : c String
|
||||
- spiProvider : c String
|
||||
- tenantId : c String
|
||||
- user : c String
|
||||
--
|
||||
+ Tenant()
|
||||
+ getMethod() : String
|
||||
+ getSchema() : String
|
||||
+ getSpiProvider() : String
|
||||
+ getTenantId() : String
|
||||
+ getUser() : String
|
||||
+ setMethod(c String) : void
|
||||
+ setSchema(c String) : void
|
||||
+ setSpiProvider(c String) : void
|
||||
+ setTenantId(c String) : void
|
||||
+ setUser(c String) : void
|
||||
|
||||
}
|
||||
interface com.amazonaws.services.lambda.runtime.RequestHandler <I extends c Object, O extends c Object> {
|
||||
--
|
||||
+ handleRequest(I, i Context) : Object
|
||||
|
||||
}
|
||||
|
||||
' Relations
|
||||
|
||||
com.alfresco.services.lambda.TenantServiceImpl "1" o-left- "1" com.alfresco.services.lambda.TenantServiceSPI : tenantServiceSPI: i TenantServiceSPI
|
||||
com.alfresco.services.lambda.TenantServiceDDBImpl "1" o-left- "1" com.amazonaws.regions.Regions : regions: c Regions
|
||||
com.alfresco.services.lambda.TenantServiceImpl ..up|> com.alfresco.services.lambda.TenantService
|
||||
com.alfresco.services.lambda.TenantServiceDDBImpl ..up|> com.alfresco.services.lambda.TenantServiceSPI
|
||||
com.alfresco.services.lambda.TenantServiceLambda ..up|> com.amazonaws.services.lambda.runtime.RequestHandler
|
||||
|
||||
' Notes
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,51 @@
|
||||
@startuml
|
||||
|
||||
title Tenant Component (nosql)
|
||||
|
||||
skinparam linetype ortho
|
||||
|
||||
interface ApiConstants
|
||||
interface TenantService
|
||||
interface TenantServiceSPI
|
||||
|
||||
class AbstractRestResource {
|
||||
#switchTenant()
|
||||
}
|
||||
class AbstractServiceClient
|
||||
class An2ApiException
|
||||
class CreateTenantPojo
|
||||
class Cx1TenantService
|
||||
class GetTenantPojo
|
||||
class InitializingBean
|
||||
class NoSuchTenantException
|
||||
class TenantExistsException
|
||||
class TenantService
|
||||
class TenantServiceClient
|
||||
class TenantServiceImpl
|
||||
class TenantServiceIT
|
||||
class TenantServiceRestV1
|
||||
class VersionCheckException
|
||||
|
||||
|
||||
AbstractRestResource <|-- TenantServiceRestV1 : extends
|
||||
AbstractServiceClient <|-- TenantServiceClient : extends
|
||||
An2ApiException <|-- NoSuchTenantException : extends
|
||||
An2ApiException <|-- TenantExistsException : extends
|
||||
An2ApiException <|-- VersionCheckException : extends
|
||||
ApiConstants <|.. TenantServiceImpl : uses
|
||||
CreateTenantPojo <.. TenantServiceClient : uses
|
||||
CreateTenantPojo <.. TenantServiceRestV1 : uses
|
||||
GetTenantPojo <.. TenantServiceClient : uses
|
||||
GetTenantPojo <.. TenantServiceRestV1 : uses
|
||||
InitializingBean <|.. TenantServiceImpl : implements
|
||||
NoSuchTenantException <.. AbstractRestResource : uses
|
||||
TenantService <.. AbstractRestResource : uses
|
||||
TenantService <|.. TenantServiceClient : implements
|
||||
TenantService <|.. TenantServiceImpl : implements
|
||||
TenantService <|.. TenantServiceRestV1 : uses
|
||||
TenantServiceClient <.. TenantServiceIT : uses
|
||||
TenantServiceSPI <.. Cx1TenantService : implements
|
||||
TenantServiceSPI <.. TenantServiceImpl : uses
|
||||
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 36 KiB |
@@ -0,0 +1,39 @@
|
||||
@startuml
|
||||
|
||||
title Tenant Service (nosql)
|
||||
|
||||
skinparam linetype ortho
|
||||
|
||||
node "Service\nClient" as SC #E0F2F1
|
||||
|
||||
node "API Gateway" as APIG #EEEEEE {
|
||||
|
||||
node "/tenants Resource" as TR #EFEBE9 {
|
||||
node "method POST" as POST #FBE9E7 {
|
||||
node "POST \nbody mapping template" #DCEDC8
|
||||
}
|
||||
node "method PUT" as PUT #FBE9E7{
|
||||
node "PUT \nbody mapping template" #DCEDC8
|
||||
}
|
||||
node "method GET" as GET #FBE9E7
|
||||
node "method DELETE" As DELETE #FBE9E7
|
||||
}
|
||||
}
|
||||
node "Tenant Service \nLambda Function" as L #FFD54F
|
||||
|
||||
database "DynamoDB Database\nalf-data-tenants" as DB #80D8FF
|
||||
|
||||
node "DynamoDB\nClient" As DDBC #B3E5FC
|
||||
|
||||
node "DynamoDB" As DDB #B2EBF2
|
||||
|
||||
SC->TR:https
|
||||
POST->L:JSON
|
||||
PUT->L:JSON
|
||||
GET->L:URL {tenant-id}
|
||||
DELETE->L:URL {tenant-id}
|
||||
L->DDBC
|
||||
DDBC->DDB:reads/writes
|
||||
DDB->DB:reads/writes
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 65 KiB |
@@ -0,0 +1,86 @@
|
||||
@startuml
|
||||
|
||||
Title Tenant Deployment\nDesign Options
|
||||
|
||||
skinparam nodeBorderColor black
|
||||
|
||||
left to right direction
|
||||
|
||||
node "AWS" as 2G #EEEEEE {
|
||||
node "Tenant\nService" as 2T #white
|
||||
node "Alfresco\nControl Architecture" as 2CA #white
|
||||
node "Customer A" as 2C1 #FFCDD2 {
|
||||
node "Alfresco 5.1" as 2A1 #E6EE9C {
|
||||
node "Tenant" as 2T1
|
||||
}
|
||||
}
|
||||
node "Customer B" as 2C2 #FFCDD2{
|
||||
node "Alfresco 5.1" as 2A2 #E6EE9C {
|
||||
node "Tenant" as 2T2
|
||||
}
|
||||
}
|
||||
node "Customer C" as 2C3 #FFCDD2{
|
||||
node "Alfresco 5.1" as 2A3 #E6EE9C {
|
||||
node "Tenant" as 2T3
|
||||
}
|
||||
}
|
||||
node "Customers D and E" as CDE #FFCDD2{
|
||||
node "Repository Next" as 2B #B3E5FC
|
||||
node "Tenant\n(Customer D)" as 2CD
|
||||
node "Tenant\n(Customer E)" as 2CE
|
||||
}
|
||||
}
|
||||
|
||||
2CA=>2C1
|
||||
2CA=>2C2
|
||||
2CA=>2C3
|
||||
2CA=>CDE
|
||||
2CA=>2T
|
||||
2T=>2CD
|
||||
2T=>2CE
|
||||
2B=>2T
|
||||
|
||||
node "AWS" as G #EEEEEE {
|
||||
node "Alfresco\nControl Architecture" as CA #white
|
||||
node "Customer A" as C1 #FFCDD2 {
|
||||
node "Alfresco 5.1" as A1 #E6EE9C {
|
||||
node "Tenant" as T1
|
||||
}
|
||||
}
|
||||
node "Customer B" as C2 #FFCDD2{
|
||||
node "Alfresco 5.1" as A2 #E6EE9C {
|
||||
node "Tenant" as T2
|
||||
}
|
||||
}
|
||||
node "Customer C" as C3 #FFCDD2{
|
||||
node "Alfresco 5.1" as A3 #E6EE9C {
|
||||
node "Tenant" as T3
|
||||
}
|
||||
}
|
||||
node "Customer D" as C4 #FFCDD2 {
|
||||
node "Tenant\nService" as TC1 #white
|
||||
node "Tenant" as T5
|
||||
node "Repository Next" as B1 #B3E5FC
|
||||
}
|
||||
node "Customer E" as C5 #FFCDD2 {
|
||||
node "Tenant\nService" as TC2 #white
|
||||
node "Tenant" as T6
|
||||
node "Tenant" as T7
|
||||
node "Tenant" as T8
|
||||
node "Repository Next" as B2 #B3E5FC
|
||||
}
|
||||
}
|
||||
|
||||
TC1=>T5
|
||||
TC2=>T6
|
||||
TC2=>T7
|
||||
TC2=>T8
|
||||
CA=>C1
|
||||
CA=>C2
|
||||
CA=>C3
|
||||
CA=>C4
|
||||
CA=>C5
|
||||
B2=>TC2
|
||||
B1=>TC1
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 77 KiB |
@@ -0,0 +1,69 @@
|
||||
@startuml
|
||||
|
||||
Title: Create a Tenant (NoSQL - AWS)
|
||||
actor "User" as U
|
||||
participant "Tenant Console" as TC
|
||||
participant "API Gateway" as APIG
|
||||
participant "TenantServiceLambda" as TSL
|
||||
participant "TenantServiceImpl" as TSI
|
||||
participant "DDbTenantService" as DDTS
|
||||
participant "Dynamo DB Client" as DDBC
|
||||
database "DynamoDB" as DDB
|
||||
|
||||
U->TC:create Tenant
|
||||
note right
|
||||
What the Tenant Console
|
||||
is is TBD. It
|
||||
may be part of the
|
||||
AWS Control Architecture
|
||||
or a Beowulf Admin
|
||||
Console
|
||||
end note
|
||||
activate TC
|
||||
TC->APIG: HTTP POST {<API Gateway host:port>/public/an2/v1/tenants\nTenant Object(JSON)
|
||||
activate APIG
|
||||
APIG->TSL: handler(serialized Tenant Object(JSON))
|
||||
note right
|
||||
The HTTP Verb and UserInfo is
|
||||
passed to the Tenant Service
|
||||
Lambda in the JSON object.
|
||||
Tenant Service Lambda selects
|
||||
the TenantServiceImpl method
|
||||
to call based on the HTTP Verb
|
||||
end note
|
||||
activate TSL
|
||||
TSL->TSI: createTenant()
|
||||
note right
|
||||
Unsolved Design Challenge #1:
|
||||
How to supply a configuration
|
||||
to allow alternative
|
||||
implementations at
|
||||
runtime. In current
|
||||
form, the TenantServiceSPI
|
||||
passed to TenantServiceImpl
|
||||
is set in an API Gateway
|
||||
template. That would allow
|
||||
us to specify a different
|
||||
provider of the SPI using,
|
||||
for example, an HTTP parm
|
||||
end note
|
||||
activate TSI
|
||||
TSI->DDTS
|
||||
activate DDTS
|
||||
DDTS->DDBC: table.putItem(new Item().withPrimaryKey("tenant-id")
|
||||
activate DDBC
|
||||
DDBC->DDB: store the tenant record
|
||||
DDB->DDBC: success
|
||||
deactivate DDB
|
||||
DDBC->DDTS:success
|
||||
deactivate DDBC
|
||||
DDTS->TSI:success
|
||||
deactivate DDTS
|
||||
TSI->TSL: success
|
||||
deactivate TSI
|
||||
TSL->TC: HTTP 200 OK
|
||||
deactivate TSL
|
||||
TC->>U:success message
|
||||
deactivate TC
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 60 KiB |
@@ -0,0 +1,60 @@
|
||||
@startuml
|
||||
|
||||
Title: Create a Tenant (NoSQL)
|
||||
actor "User" as U
|
||||
participant "Tenant Console" as TC
|
||||
participant "TenantServiceClient" as TCL
|
||||
participant "TenantServiceRestV1" as TRS
|
||||
participant "TenantServiceImpl" as TSI
|
||||
participant "Cx1TenantService" as CTS
|
||||
participant "cassandra-driver-core-2.2.0-rc1" as DDC
|
||||
database "Cassandra" as C
|
||||
|
||||
U->TC:create Tenant
|
||||
note right
|
||||
The Tenant Console
|
||||
may be part of the
|
||||
Admin Console
|
||||
end note
|
||||
activate TC
|
||||
TC->TCL:createTenant()
|
||||
activate TCL
|
||||
TCL->TCL: find server from super\nAbstractServiceClient
|
||||
TCL->TRS: HTTP POST {tenantCtx}/public/an2/v1/tenants\nCreateTenantPojo(JSON)
|
||||
activate TRS
|
||||
note right
|
||||
This is wired
|
||||
to the endpoint
|
||||
using Jersey
|
||||
end note
|
||||
TRS->TSI: create(TenantServiceSPI=Cx1TenantService)
|
||||
activate TSI
|
||||
TSI->CTS: createTenant()
|
||||
note right
|
||||
The Cassandra
|
||||
implementation can
|
||||
be replaced by
|
||||
other implementations
|
||||
(e.g. Dynamo DB)
|
||||
through Spring config
|
||||
end note
|
||||
activate CTS
|
||||
CTS->DDC: insert into Table alf_data_tenants
|
||||
activate DDC
|
||||
DDC->C: store the tenant record
|
||||
C->DDC:success
|
||||
deactivate C
|
||||
DDC->CTS: success
|
||||
deactivate DDC
|
||||
CTS->TSI:success
|
||||
deactivate CTS
|
||||
TSI->TRS: success
|
||||
deactivate TSI
|
||||
TRS->TCL: HTTP 200 OK
|
||||
deactivate TRS
|
||||
TCL->TC: success
|
||||
deactivate TCL
|
||||
TC->>U:success message
|
||||
deactivate TC
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 79 KiB |
@@ -0,0 +1,175 @@
|
||||
@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<PolicyEndPointPolicyEndpoint> registrations
|
||||
+ {static} PolicyEndpointRegistry getInstance()
|
||||
+ reload(long fromTime)
|
||||
+ slip(String body, @Properties Map<String, Object> properties)
|
||||
}
|
||||
PolicyEndpointRegistry *- "1" QueuedBehaviour
|
||||
PolicyEndpointServiceImpl -> PolicyEndpointRegistry
|
||||
class PolicyEndpoint <<immutable>> #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 {
|
||||
+ <T> getInterface(Class<T> policy) : T
|
||||
+ disable()
|
||||
+ enable()
|
||||
+ isEnabled() : boolean
|
||||
+ getNotificationFrequency() : NotificationFrequency
|
||||
}
|
||||
class BaseBehaviour implements Behaviour {
|
||||
# proxies : Map<Class, Object>
|
||||
# frequency : NotificationFrequency
|
||||
- disabled : StackThreadLocal
|
||||
+ disable()
|
||||
+ enable()
|
||||
+ isEnabled() : boolean
|
||||
+ getNotificationFrequency() : NotificationFrequency
|
||||
}
|
||||
class JavaBehaviour extends BaseBehaviour {
|
||||
+ <T> getInterface(Class<T> policy) : T
|
||||
# <T> getInvocationHandler(Object instance, String method, Class<T> policyIF) : InvocationHandler
|
||||
}
|
||||
class QueuedBehaviour <<V5.2>> #DDDDDD extends BaseBehaviour {
|
||||
- ProducerTemplate queueTemplate
|
||||
+ <T> getInterface(Class<T> policy) : T
|
||||
# <T> getInvocationHandler(Object instance, String method, Class<T> 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<P extends ClassPolicy> {
|
||||
- dictionary : DictionaryService
|
||||
- factory : CachedPolicyFactory<ClassFeatureBehaviourBinding, P>
|
||||
# ClassPolicyDelegate(DictionaryService dictionary, Class<P> policyClass, BehaviourIndex<ClassBehaviourBinding> index, long tryLockTimeout)
|
||||
}
|
||||
class AssociationPolicyDelegate<P extends AssociationPolicy> {
|
||||
- dictionary : DictionaryService
|
||||
- factory : CachedPolicyFactory<ClassFeatureBehaviourBinding, P>
|
||||
# AssociationPolicyDelegate(DictionaryService dictionary, Class<P> policyClass, BehaviourIndex<ClassFeatureBehaviourBinding> index, long tryLockTimeout)
|
||||
}
|
||||
class PropertyPolicyDelegate<P extends PropertyPolicy> {
|
||||
- dictionary : DictionaryService
|
||||
- factory : CachedPolicyFactory<ClassFeatureBehaviourBinding, P>
|
||||
# PropertyPolicyDelegate(DictionaryService dictionary, Class<P> policyClass, BehaviourIndex<ClassFeatureBehaviourBinding> index, long tryLockTimeout)
|
||||
}
|
||||
class PolicyFactory<B extends BehaviourBinding, P extends Policy> {
|
||||
- index : BehaviourIndex~<B>
|
||||
- policyClass : Class~<P>
|
||||
- transactionHandlerFactory : TransactionInvocationHandlerFactory
|
||||
- tenantService : TenantService
|
||||
--
|
||||
PolicyFactory(Class<P> policyClass, BehaviourIndex~<B> index)
|
||||
--
|
||||
}
|
||||
class CachedPolicyFactory<B extends BehaviourBinding, P extends Policy> extends PolicyFactory
|
||||
|
||||
abstract class AbstractNodeServiceImpl implements NodeService {
|
||||
- policyComponent : PolicyComponent
|
||||
# dictionaryService : DictionaryService
|
||||
# transactionService : TransactionService
|
||||
# tenantService : TenantService
|
||||
- onCreateNodeDelegate : ClassPolicyDelegate<OnCreateNodePolicy>
|
||||
}
|
||||
interface PolicyComponent {
|
||||
+ <P extends ClassPolicy> registerClassPolicy(Class<P> policy) : ClassPolicyDelegate<P>
|
||||
+ <P extends PropertyPolicy> registerPropertyPolicy(Class<P> policy) : PropertyPolicyDelegate<P>
|
||||
+ <P extends AssociationPolicy> registerAssociationPolicy(Class<P> policy) : AssociationPolicyDelegate<P>
|
||||
+ bindClassBehaviour(QName policy, QName className, Behaviour behaviour) : BehaviourDefinition<ClassBehaviourBinding>
|
||||
+ bindClassBehaviour(QName policy, Object service, Behaviour behaviour) : BehaviourDefinition<ServiceBehaviourBinding>
|
||||
+ bindPropertyBehaviour(QName policy, QName className, QName propertyName, Behaviour behaviour) : BehaviourDefinition<ClassFeatureBehaviourBinding>
|
||||
+ bindPropertyBehaviour(QName policy, QName className, Behaviour behaviour) : BehaviourDefinition<ClassFeatureBehaviourBinding>
|
||||
+ bindPropertyBehaviour(QName policy, Object service, Behaviour behaviour) : BehaviourDefinition<ServiceBehaviourBinding>
|
||||
+ bindAssociationBehaviour(QName policy, QName className, QName assocName, Behaviour behaviour) : BehaviourDefinition<ClassFeatureBehaviourBinding>
|
||||
+ bindAssociationBehaviour(QName policy, QName className, Behaviour behaviour) : BehaviourDefinition<ClassFeatureBehaviourBinding>
|
||||
+ bindAssociationBehaviour(QName policy, Object service, Behaviour behaviour) : BehaviourDefinition<ServiceBehaviourBinding>
|
||||
+ removeClassDefinition(BehaviourDefinition<ClassBehaviourBinding> definition) : void
|
||||
}
|
||||
class PolicyComponentImpl implements PolicyComponent {
|
||||
- Map<QName, ClassBehaviourIndex<ClassBehaviourBinding>> classBehaviours
|
||||
- Map<QName, ClassBehaviourIndex<ClassFeatureBehaviourBinding>> propertyBehaviours
|
||||
- Map<QName, ClassBehaviourIndex<ClassFeatureBehaviourBinding>> 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
|
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,56 @@
|
||||
@startuml
|
||||
|
||||
title Policies: Queued Policies (V5.2 Proposal)
|
||||
|
||||
actor user
|
||||
|
||||
database ActiveMQ as AMQ
|
||||
database DB {
|
||||
folder alf_policies
|
||||
}
|
||||
|
||||
component "Client Application" {
|
||||
component [Client Code]
|
||||
component [ClientQueueReceiver]
|
||||
component [Camel(Client App)]
|
||||
}
|
||||
user <--> [Client Code]
|
||||
ClientQueueReceiver <-- [Camel(Client App)]
|
||||
ClientQueueReceiver -> [Client Code]
|
||||
[Camel(Client App)] <- AMQ
|
||||
|
||||
component "Alfresco One Platform" {
|
||||
component Quartz as Q
|
||||
component [Camel] as Camel
|
||||
|
||||
component [Policy ReST API] as PR
|
||||
component PolicyService as PS {
|
||||
[PolicyCheckJob] as PCJ
|
||||
[PolicyMap] as PM <<Map>>
|
||||
component Routes as R {
|
||||
component ToQueue
|
||||
component FromQueue
|
||||
}
|
||||
}
|
||||
component PolicyComponent as PC {
|
||||
component QueuedBehaviour as QB
|
||||
}
|
||||
component [Alfresco Services] as Services
|
||||
component PolicyDAO as PD
|
||||
}
|
||||
|
||||
[Client Code] <-> PR
|
||||
|
||||
Q --> PCJ
|
||||
PCJ -> PM
|
||||
PR --> PS
|
||||
Services -> PC
|
||||
PCJ --> PD
|
||||
PD -> DB
|
||||
QB -> ToQueue
|
||||
ToQueue -> Camel
|
||||
FromQueue <- Camel
|
||||
FromQueue --> Services
|
||||
Camel <-> AMQ
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 42 KiB |
@@ -0,0 +1,37 @@
|
||||
@startuml
|
||||
|
||||
Title: Policies: Register Policy Endpoint (V5.2 Proposal)
|
||||
|
||||
skinparam componentStyle uml2
|
||||
|
||||
actor "Client App" as Client
|
||||
participant "Policy Endpoint Rest API" as API
|
||||
participant "PolicyEndpointService" as PS
|
||||
participant "PolicyEndpointRegistry" as PER
|
||||
participant "PolicyEndpointDAO" as DAO
|
||||
database DB
|
||||
participant "PolicyComponent" as PC
|
||||
database AMQ
|
||||
|
||||
note over DAO,DB
|
||||
UNIQUE : policy,typeOrAspect,endpoint
|
||||
OTHER : active, modified
|
||||
SORT : modified
|
||||
end note
|
||||
|
||||
Client -> API
|
||||
API -> PS : registerPolicyEndpoint(policy, typeOrAspect, endpoint)
|
||||
PS -> DAO : createPolicyEndpoint(policy, typeOrAspect, endpoint)
|
||||
DAO -> DB : INSERT
|
||||
PS <-- DAO : success
|
||||
PS -> PER : reload(fromTime)
|
||||
PER -> DAO : getPolicyEndpoints(fromTime)
|
||||
loop each policy endpoint registration change
|
||||
PER -> PER
|
||||
end
|
||||
PS <-- PER : success
|
||||
API <-- PS : success
|
||||
Client <-- API : OK
|
||||
|
||||
|
||||
@enduml
|
After Width: | Height: | Size: 47 KiB |
@@ -0,0 +1,48 @@
|
||||
@startuml
|
||||
|
||||
Title: Policies: Reload Policy Endpoints (V5.2 Proposal)
|
||||
|
||||
skinparam componentStyle uml2
|
||||
|
||||
participant "Quartz"
|
||||
participant "PolicyCheckJob" as PCJ
|
||||
participant "PolicyEndpointRegistry" as PER
|
||||
participant "QueuedBehaviour" as QB
|
||||
participant "PolicyEndpointDAO" as DAO
|
||||
database DB
|
||||
participant "PolicyComponent" as PC
|
||||
database AMQ
|
||||
|
||||
== Static Route Initialization ==
|
||||
|
||||
activate PER
|
||||
PER -> QB: new
|
||||
activate PER
|
||||
PER -> PER: from("direct:policy")
|
||||
PER -> PER: dynamicRouter(method(PolicyEndpointRegistry.class, "slip"))
|
||||
deactivate PER
|
||||
deactivate PER
|
||||
|
||||
== Quartz ==
|
||||
|
||||
note over DAO,DB
|
||||
UNIQUE : policy,typeOrAspect,endpoint
|
||||
OTHER : active, modified
|
||||
SORT : modified
|
||||
end note
|
||||
|
||||
Quartz -> PCJ
|
||||
PCJ -> PER : reload(fromTime)
|
||||
PER -> DAO : getPolicyEndpoints(fromTime)
|
||||
DAO -> DB: SELECT(fromTime)
|
||||
DAO <-- DB
|
||||
PER <-- DAO
|
||||
loop each policy endpoint registration change
|
||||
PER -> PER: updateRegistrations(PolicyEndpoint)
|
||||
PER -> PC: bindClassBehaviour(policy,typeOrAspect, behaviour)
|
||||
end
|
||||
PCJ <-- PER : success
|
||||
Quartz <-- PCJ : success
|
||||
|
||||
|
||||
@enduml
|