SlideShare a Scribd company logo
Jan Vonka 
Repository Team, Alfresco 
1
• Introduction 
• Modelling 
• Overview 
• Components 
• Examples 
• Behaviours 
• Overview 
• Components 
• Examples 
• Past, present & future 
• Q & A … feedback 
2
• About me 
• I’ve been with Alfresco since early 2007 
• primarily working in the core repository team 
• worked for various companies in UK & California 
• I enjoy flying hot-air balloons ;-) 
• Spelling 
3 
• to be consistent I’ll stick with the British spelling 
• Modelling <=> Modeling 
• Behaviour <=> Behavior 
• About you 
• Modelling vs Behaviours … how much time (50/50) ? 
• I’d like to allow enough time for 
• Q & A and general feedback (your experience)
How many of you have … ? 
• attended training course 
• DevCon JumpStart course 
• Intensive Developers course 
• and/or read 
• Professional Alfresco book (chapter 5) 
• Jeff Pott’s Alfresco Developer Guide (chapters 3 & 4) 
• Alfresco wiki (“Data Dictionary” and related pages) 
• and/or hands-on experience 
4 
• followed examples (eg. Books and/or Alfresco SDK) 
• developed your own custom content model & app’
Modelling 
5 
• [something] used as an 
example to follow or imitate 
• to make [something] conform 
to a chosen standard 
Behaviour 
• the way in which [something] 
behaves in response to a 
particular situation or 
stimulus
Embeds a storage engine Domain 
• which enables storage of a 
potentially arbitrary 
network of entity data 
6 
• content entities 
• “metadata” (about the 
entities) 
• relationships (between the 
entities) 
• Stores 
• store ref(erence) 
• root node 
• Nodes 
• unique node ref(erence) 
• Properties 
• on nodes 
• (Peer) Associations 
• from source to target node 
• Child associations 
• between parent & child node 
• primary & secondary
Model / domain consistency can be maintained via … 
• Content Model + Integrity Checker 
• formal model definition 
• including built-in constraints 
• option to also write & plug-in custom constraints (not specifically 
covered here) 
• Behaviours 
• custom business logic bound to policies 
• Rules & Actions 
7 
• not covered here … see separate session
8 
• [something] used as an example to follow or imitate 
• to make [something] conform to a chosen standard
• Content models 
9 
• are all about metadata (data that describes data) 
• constrain otherwise arbitrary nodes, properties and associations 
• are named and define one or more namespaces 
• can import namespaces in order to allow references to other models 
• must be configured and loaded in dependent order 
• “bootstrap” models are statically loaded from the filesystem 
(“extensions” classpath) when repo starts 
• “dynamic” models are dynamically loaded from the repo 
(“Models” space) when models are added or changed 
• integrity checks fire when transaction commits 
• mandatory can be enforced (else node is marked as incomplete)
Dictionary Service 
• Get def’ (or all QNames) 
• model 
• types / aspect 
• property 
• datatype 
• constraint 
• association 
• also: is sub-class ? 
• Also refers to 
10 
• QName 
• NamespaceService (prefix 
resolver) 
Node Service 
• Nodes 
• create, move, delete, restore 
• Properties 
• set, get, remove 
• Associations 
• create, remove, 
• get sources, get targets 
• Child Associations 
• get children, get parents 
• get primary parent
11 
Type Aspect 
Class 
Property 
Association 
Child 
Association 
Data Type 
Constraint
Summary 
modelSchema.xsd 
12 
• Imports 
• Namespaces 
• Data-types 
• Constraints 
• Types / Aspects 
• Properties 
• Constraints 
• Associations 
• Child Associations
• Node 
13 
• must be of a given type when created 
• can also setType (ie. specialise / change type) 
• may have zero or more aspects attached 
• either from type or at runtime 
• may have a set of properties 
• defined by type & aspects (including inherited types & aspects) 
• may be associated with other nodes 
• defined by type & aspects (including inherited types & aspects)
• Property 
14 
• must be named 
• must be of a given datatype 
• may be single-valued (default) or multi-valued 
• may have zero or more constraints (inline or referenced) 
• may be mandatory 
• either: enforced 
• or: relaxed (if missing, node marked with incomplete aspect) 
• may have default value 
• may be “residual” 
• in this case there is no associated property definition 
• can be overridden in terms of inheritance 
• to a limited extent – mandatory, default, constraints
• Built-in constraint types: 
15 
• LIST (“ListOfValuesConstraint) 
• LENGTH (“StringLengthConstraint”) 
• MINMAX (“NumericRangeConstraint”) 
• REGEXP (“RegexConstraint”) 
• Other examples, eg. RM caveats use: 
• “RMListOfValuesConstraint” (extends “ListOfValuesConstraint”) 
• You can hook in your own constraint implementations 
• implement “Constraint” interface 
• typically extend “AbstractConstraint” 
• must have default constructor (as it’s used to instantiate it) 
• in model, define constraint with “type” attribute set to fully-qualified class name 
• make sure you unit test your constraint (it is performance sensitive) 
• Constraints execute 
• as part of integrity checks prior to commit (ie. at the end of a server transaction)
• (Peer) Association 
16 
• association type is named 
• source node may be associated with zero or more target nodes 
• may be mandatory 
• enforced or relaxed (missing => node marked with incomplete 
aspect) 
• cardinality can be defined via many / mandatory 
• 0 or 1(mandatory = false, many = false) 
• 1 (mandatory = true, many = false) 
• 0 or more (mandatory = false, many = true) 
• 1 or more (mandatory = true, many = true)
• Child Association 
17 
• defined in same way as peer association with extra features 
• parent node may be associated with zero or more child nodes 
• affects certain operations, eg. delete will cascade 
• also defines if child name can be duplicated or unique within parent 
• a node can have one primary child association 
• a node may have one or more secondary child associations
• Don’t forget “the Node Browser is your friend !” 
18 
• in theory never lies … 
• … although be careful with browser back button (JSF issue)
• Dynamic models 
19 
• since 3.0 
• reduces need for server restart, also enables multi-tenancy option 
• CMIS mapping 
• CMIS type, CMIS property, CMIS relationship (peer assoc) 
• CMIS document (cm:content), CMIS folder (cm:folder) 
• Constraints support title & description (needed by RM) 
• since 3.2 
• Tightened validation check for content models 
• since 3.4 
• unfortunately, due to a long standing bug, it has always been possible to define 
new model elements using a namespace that wasn't defined by the containing 
model (eg. using an imported namespace) 
• with the recent bug fix, it is now only possible to create model elements whose 
namespace is also defined by the containing model 
• “DataModel” split out from “Repository” 
• since 3.4 
• split into separate JAR / Eclipse project – for future SOLR integration
20 
sys:referenceable 
- sys:store-protocol 
- sys:store-identifier 
- sys:node-uuid 
- sys:node-dbid 
sys:base 
cm:cmobject 
- cm:name 
cm:content cm:folder 
cm:auditable 
- cm:created 
- cm:creator 
- cm:modified 
- cm:modifier
my:customBaseAspect my:customBaseFolder 
21 
cm:content cm:folder 
my:customContent 
my:customSubFolder 
my:customBaseContent 
my:customSubAspect
GenSimpleXMIFromModel.java (extract) 
… more here … 
Map<String, Object> fmModel = new HashMap<String, Object>(); 
fmModel.put("prefixDelimiter", prefixDelimiter); 
fmModel.put("classes", allM2Classes); 
fmModel.put("datatypes", datatypes); 
Configuration cfg = new Configuration(); 
cfg.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER); 
String userDir = System.getProperty("user.dir"); 
cfg.setDirectoryForTemplateLoading(new File(userDir+"/source/test-resources/ 
22 
SimpleXMI")); 
// UML 1.4 / XMI 1.2 - suitable for ArgoUML (eg. 0.30.2) 
Template temp = cfg.getTemplate("simple-Xmi1.2-Uml1.4.ftl"); 
File f = new File(userDir, "simpleXMI-"+System.currentTimeMillis() 
+".xmi"); 
Writer out = new FileWriter(f); 
temp.process(fmModel, out); 
out.flush(); 
out.close(); 
… more here … 
simple-Xmi1.2-Uml1.4.ftl (extract) 
… more here … 
<#list datatypes as datatype> 
<#assign split=datatype.name?index_of(":")> 
<UML:DataType xmi.id = 'id-datatype:${datatype.name}' 
name = '${datatype.name?substring(split+1)}' 
isSpecification = 'false' isRoot = 'false' isLeaf = 'false' 
isAbstract = 'false'/> 
</#list> 
<#list classes as class> 
<UML:Class xmi.id = 'id-class:${class.name}' 
name = '${class.name?replace(":",prefixDelimiter)}’ 
isSpecification = 'false' isRoot = 'false' 
isLeaf = 'false' isAbstract = 'false' isActive = 'false'> 
<#if class.isAspect() == true > 
<UML:ModelElement.stereotype> 
<UML:Stereotype xmi.idref = 'id-stereotype:aspect'/> 
</UML:ModelElement.stereotype> 
<#else> 
… more here …
23
24
• Many examples “out-of-the-box” 
• Search for “*Model.xml” across the Alfresco source tree 
• Core model files (with defined namespaces) include: 
25 
• dictionaryModel.xml 
• http://www.alfresco.org (alf) 
• http://www.alfresco.org/model/dictionary/1.0 (d) 
• http://www.alfresco.org/view/repository/1.0 (view) 
• systemModel.xml 
• http://www.alfresco.org/model/system/1.0 (sys) 
• http://www.alfresco.org/system/registry/1.0 (reg) 
• http://www.alfresco.org/system/modules/1.0 (module) 
• contentModel.xml 
• http://www.alfresco.org/model/content/1.0 (cm) 
• http://www.alfresco.org/model/rendition/1.0 (rn) 
• http://www.alfresco.org/model/exif/1.0 (exif)
• Alfresco modules also provide some great examples, eg. 
26 
• Records Management (RM / DOD5015) 
• dod5015Model.xml 
• http://www.alfresco.org/model/dod5015/1.0 (dod) 
• recordsCustomModel.xml (dynamically managed) 
• http://www.alfresco.org/model/rmcustom/1.0 (rmc) 
• Web Quick Start (WQS) 
• webSiteModel.xml 
• http://www.alfresco.org/model/website/1.0 (ws)
27 
• the way in which [something] behaves in response to a particular 
situation or stimulus
• Policies provide hook points to which you can bind 
behaviours to events based on class or association 
• behaviours are (policy) handlers that execute specific business logic 
• behaviours can be implemented in Java and/or JavaScript 
• Behaviours can be bound to a type or aspect 
28 
• node in the content repository must be of a single type 
• node may have one or more aspects attached 
• aspects are either inherited from its type (defined by the model) 
• or can be attached (or detached) at runtime … 
• allowing a node to dynamically inherit features and capabilities 
• aspects can be interpreted by the repository to change behaviour 
• eg. by the presence of an aspect (even with no properties)
• From JavaDoc (org.alfresco.repo.policy) … 
The Policy Component manages Policies and Behaviours. It provides the 
ability to: 
a) Register policies 
b) Bind behaviours to policies 
c) Invoke policy behaviours 
A behaviour may be bound to a Policy before the Policy is registered. In 
this case, the behaviour is not validated (i.e. checked to determine if it 
Supports the policy interface) until the Policy is registered. Otherwise, 
the behaviour is validated at bind-time. 
Policies may be selectively "turned off" by the Behaviour Filter. 
29
• Behaviour 
30 
• BaseBehaviour 
• JavaBehaviour 
• ScriptBehaviour
• Policy 
31 
• ClassPolicy (type or aspect) 
• AssociationPolicy (peer or parent-child) 
• PropertyPolicy (not used)
• Search for “*Policies.java” across the Alfresco source tree 
• Examples include: 
32 
• NodeServicePolicies 
• before/onCreateNode, 
• beforeDeleteNode (don’t use “on”) 
• before/onUpdateNode 
• onUpdateProperties 
• before/onAddAspect 
• before/onRemoveAspect 
• before/onCreateChildAssociation 
• before/onDeleteChildAssocation 
• onCreateAssociation 
• onDeleteAssociation 
• …. 
• ContentServicePolicies 
• onContentUpdate 
• onContentPropertyUpdate
33 
• CopyServicePolicies 
• before/onCopy 
• onCopyComplete 
• CheckOutCheckInServicePolicies 
• before/OnCheckOut 
• before/OnCheckIn 
• before/OnCancelCheckOut 
• And more … 
• VersionServicePolicies 
• StoreSelectorPolicies 
• AsynchronousActionExecutionQueuePolicies 
• RecordsManagementPolicies 
• Note: you can define, register and invoke you own custom policies, eg. 
• RecordsManagementPolicies <= RecordsManagementActionServiceImpl
public interface NodeServicePolicies! 
{ !! 
!public interface OnAddAspectPolicy extends ClassPolicy! 
!{! 
! !public static final QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect");! 
! 
! !// Called after an <b>aspect</b> has been added to a node! 
! !public void onAddAspect(NodeRef nodeRef, QName aspectTypeQName);! 
!}! 
}! 
! 
public abstract class AbstractNodeServiceImpl implements NodeService! 
{! 
!// note: policyComponent is injected … (not shown here)! 
! 
!public void init()! 
!{! 
! !// Register the policy! 
! !onAddAspectDelegate = policyComponent.registerClassPolicy ! ! ! ! ! ! !! 
! ! ! ! ! ! ! ! !(NodeServicePolicies.OnAddAspectPolicy.class);! 
!}! 
! 
!protected void invokeOnAddAspect(NodeRef nodeRef, QName aspectTypeQName)! 
!{ ! !! 
! !NodeServicePolicies.OnAddAspectPolicy policy = onAddAspectDelegate.get(nodeRef, aspectTypeQName);! 
! !policy.onAddAspect(nodeRef, aspectTypeQName);! 
!}! 
}! 
! 
! 
34
public class XyzAspect implements NodeServicePolicies.OnAddAspectPolicy, ...! 
{! 
!// note: policyComponent is injected … (not shown here)! 
! 
!public void init()! 
!{! 
! !// bind to the policy! 
! !policyComponent.bindClassBehaviour(! 
! ! !OnAddAspectPolicy.QNAME,! 
! ! !ContentModel.ASPECT_XYZ,! 
! ! !new JavaBehaviour(this, "onAddAspect”, ! ! ! ! ! ! ! ! 
! ! ! !Behaviour.NotificationFrequency.TRANSACTION_COMMIT));! 
!}! 
! 
!public void onAddAspect(NodeRef nodeRef, QName aspectTypeQName)! 
!{! 
! !// implement behaviour here … (for when aspect XYZ is added)! 
!}! 
}! 
! 
35
…! 
! 
//! 
// note: usually try to bind on specific class (type/aspect) rather than service method! 
//! 
! 
// class binding – specific type or aspect! 
policyComponent.bindClassBehaviour(! 
! !NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,! 
! !ContentModel.TYPE_PERSON, ! 
! !new JavaBehaviour(this, ! 
! ! ! ! ! !"onUpdateProperties”,! 
! ! ! ! ! !Behaviour.NotificationFrequency.EVERY_EVENT));! 
! 
// service binding – all types/aspects! 
policyComponent.bindClassBehaviour( ! 
! !NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,! 
! !this,! 
! !new JavaBehaviour(this, ! 
! ! ! ! ! ! "onUpdateProperties”,! 
! ! ! ! ! ! Behaviour.NotificationFrequency.EVERY_EVENT));! 
… ! 
36
• Notification Frequency 
• behaviours can be defined with a notification frequency – “every 
event” (default), “first event”, “transaction commit” 
• consider that during a given transaction, certain policies may fire 
multiple times (ie. “every event”) 
• can set notification frequency to “first event” or “transaction commit” 
• Using Transactional Resource 
37 
• option to execute logic immediately or queue (eg. via transactional 
resource) until commit (beforeCommit and/or afterCommit) 
• AlfrescoTransactionSupport.bindResource(K, V) 
• V = AlfrescoTransactionSupport.getResource(K)
• Behaviours can be temporarily disabled 
38 
• BehaviourFilter interface 
• for current transaction only 
• for “class” (type or aspect) or “node + class” 
• disableBehaviour 
• enableBehaviour 
• isEnabled 
• for “node” 
• enableBehaviours 
• for “all” 
• disableAllBehaviours 
• enableAllBehaviours 
• isActivated 
• Behaviour interface 
• for current thread only 
• disable / enable, eg. in try / finally block 
• Examples – importer, transfer – disable behaviours
• From the perspective of the custom behaviour 
• delete is delete (you should not need to care whether it is archived) 
• create is create (even if it is restored from the archive) 
• Bind to beforeDeleteNode (not onDeleteNode) 
• note: will fire for parent and recursively for each of it’s cascade 
deleted children (if any) 
• Don’t rely (or be dependent) on the archive store 
• deleted node may not be archived 
• archived node may never be restored 
• you should not need to check for archive store 
• One exception is peer associations 
39 
• assocs to “archived” nodes may remain (pending ALF-4119 for 3.4+)
“live” store 
40 
“archive” store 
archive://SpacesStore 
deleteNode deleteNode 
(purgeArchivedNode) 
restoreNode 
version://version2Store 
workspace://SpacesStore 
“version” store 
deleteNode 
createVersion deleteVersion 
deleteVersionHistory
• More than one handler can be registered for a given policy 
• since 3.0 
• We now also trigger policies through the type hierarchy 
• since 3.4 
• if you use earlier Alfresco and yet to upgrade then workaround is to 
bind to service bind and use “isSubClassOf” to check type 
• You should not need to check for archive store 
41 
• since 3.3 
• operations on archive store no longer fire polices 
• also applies to version store
• Search through the code for policy bindings or use Eclipse 
to find call hierarchy for 
• bindClassBehaviour (x2) 
• bindAssociationBehaviour (x3) 
• Many examples both in core services as well as module 
extensions such as 
42 
• Web Quick Start 
• http://wiki.alfresco.com/wiki/ 
Web_Quick_Start_Developer_Guide#Behaviours 
• DOD 5015 (Records Management) 
• You can refer to the SDK for a simple example 
• Also, for JavaScript Behaviours, refer to *old* RM module
• Modelling 
• consider using dynamic models during dev & test cycles 
• beware of deep class hierarchies 
• consider performance of any custom registered constraints 
• Behaviours 
• consider notification frequency 
• add debug logging 
• don’t rely on archive store 
• can temporarily disable/re-enable (thread or transaction) 
• General 
43 
• start with the SDK and if needed move to complete SVN source tree 
• write unit tests (+ve & -ve) to exercise custom models & behaviours 
• run existing regression tests (eg. “ant test-repository” or continuous) 
• develop and package as an AMP (Alfresco Module Package)
• Modelling 
44 
• integrity checks do not apply to version store 
• data model has been split off (eg. for future SOLR integration) 
• now only possible to create model elements whose namespace is also 
defined by the containing model 
• composite content (anticipated for Project “Swift”) 
• major model enhancement 
• will also impact various foundation services 
• see wiki for more details (early draft - subject to change) 
• Behaviours 
• more than one handler can be registered for a policy 
• policies do not fire for archive store & version store 
• policies are now triggered through the type hierarchy 
• maybe some consolidation & rationalisation 
• also potentially new policies (to hook into)
• Alfresco wiki / forums 
• Books 
• Professional Alfresco (Wrox) 
• Alfresco Developer Guide (Packt Publishing) 
• Alfresco Training courses 
• Intensive Developers Course (5 day) 
• Fundamentals (2 day) – new 
• Advanced Content Modelling – TBC 
• and obviously the source code itself J 
45 
• including modules, such as RM (DOD 5015)
46
wiki.alfresco.com 
forums.alfresco.com 
twitter: @AlfrescoECM 
47
48
Normal Text 
Normal Text 
Normal Text 
49
50
<?xml version="1.0" encoding="UTF-8"?>! 
! 
<model name="cm:contentmodel" ! 
51 
xmlns="http://www.alfresco.org/model/dictionary/1.0" ! 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">! 
! 
<description>Alfresco Content Domain Model</description>! 
<author>Alfresco</author>! 
<published>2009-06-04</published>! 
<version>1.1</version>! 
! 
<imports>! 
<import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>! 
<import uri="http://www.alfresco.org/model/system/1.0" prefix="sys"/>! 
</imports>! 
! 
<namespaces>! 
<namespace uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>! 
<namespace uri="http://www.alfresco.org/model/rendition/1.0" prefix="rn"/>! 
<namespace uri="http://www.alfresco.org/model/exif/1.0" prefix="exif"/>! 
</namespaces>!
! !<type name="cm:cmobject">! 
52 
<title>Object</title>! 
<parent>sys:base</parent>! 
<properties>! 
<property name="cm:name">! 
<title>Name</title>! 
<type>d:text</type>! 
<mandatory enforced="true">true</mandatory>! 
! ! <index enabled="true">! 
! ! ! !<atomic>true</atomic>! 
! ! ! !<stored>false</stored> ! 
<tokenised>both</tokenised>! 
</index>! 
<constraints>! 
<constraint ref="cm:filename" />! 
</constraints>! 
</property>! 
</properties>! 
<mandatory-aspects>! 
<aspect>cm:auditable</aspect>! 
</mandatory-aspects>! 
</type>! 
!!
<type name="cm:folder">! 
53 
<title>Folder</title>! 
<parent>cm:cmobject</parent>! 
<archive>true</archive>! 
<associations>! 
<child-association name="cm:contains">! 
<source>! 
<mandatory>false</mandatory>! 
<many>true</many>! 
</source>! 
<target>! 
<class>sys:base</class>! 
<mandatory>false</mandatory>! 
<many>true</many>! 
</target>! 
<duplicate>false</duplicate>! 
<propagateTimestamps>true</propagateTimestamps>! 
</child-association>! 
</associations>! 
</type>!

More Related Content

What's hot

Scale your Alfresco Solutions
Scale your Alfresco Solutions Scale your Alfresco Solutions
Scale your Alfresco Solutions
Alfresco Software
 
Webscripts
WebscriptsWebscripts
Webscripts
Alfresco Software
 
The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora - Benchmark ...
The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora  - Benchmark ...The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora  - Benchmark ...
The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora - Benchmark ...
Symphony Software Foundation
 
Alfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transitAlfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transit
Toni de la Fuente
 
Upgrading to Alfresco 6
Upgrading to Alfresco 6Upgrading to Alfresco 6
Upgrading to Alfresco 6
Angel Borroy López
 
Alfresco Transform Service DevCon 2019
Alfresco Transform Service DevCon 2019Alfresco Transform Service DevCon 2019
Alfresco Transform Service DevCon 2019
J V
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
Angel Borroy López
 
(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco
Angel Borroy López
 
Alfresco CMIS
Alfresco CMISAlfresco CMIS
Alfresco CMIS
Alfresco Software
 
Alfresco Certificates
Alfresco Certificates Alfresco Certificates
Alfresco Certificates
Angel Borroy López
 
OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...
OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...
OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...
NETWAYS
 
Bulk Export Tool for Alfresco
Bulk Export Tool for AlfrescoBulk Export Tool for Alfresco
Bulk Export Tool for Alfresco
Richard McKnight
 
Alfresco DevCon 2019 Performance Tools of the Trade
Alfresco DevCon 2019   Performance Tools of the TradeAlfresco DevCon 2019   Performance Tools of the Trade
Alfresco DevCon 2019 Performance Tools of the Trade
Luis Colorado
 
Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0
Angel Borroy López
 
Alfresco Backup and Disaster Recovery White Paper
Alfresco Backup and Disaster Recovery White PaperAlfresco Backup and Disaster Recovery White Paper
Alfresco Backup and Disaster Recovery White Paper
Toni de la Fuente
 
Integrating Alfresco with MS Dynamics
Integrating Alfresco with MS DynamicsIntegrating Alfresco with MS Dynamics
Integrating Alfresco with MS Dynamics
Zia Consulting
 
Moving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco RepositoryMoving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco Repository
Jeff Potts
 
Alfresco勉強会#26 alfresco community 5.0でssoを設定する
Alfresco勉強会#26 alfresco community 5.0でssoを設定するAlfresco勉強会#26 alfresco community 5.0でssoを設定する
Alfresco勉強会#26 alfresco community 5.0でssoを設定する
Tasuku Otani
 
Metadata Extraction and Content Transformation
Metadata Extraction and Content TransformationMetadata Extraction and Content Transformation
Metadata Extraction and Content Transformation
Alfresco Software
 
PLAT-13 Metadata Extraction and Transformation
PLAT-13 Metadata Extraction and TransformationPLAT-13 Metadata Extraction and Transformation
PLAT-13 Metadata Extraction and Transformation
Alfresco Software
 

What's hot (20)

Scale your Alfresco Solutions
Scale your Alfresco Solutions Scale your Alfresco Solutions
Scale your Alfresco Solutions
 
Webscripts
WebscriptsWebscripts
Webscripts
 
The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora - Benchmark ...
The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora  - Benchmark ...The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora  - Benchmark ...
The Alfresco ECM 1 Billion Document Benchmark on AWS and Aurora - Benchmark ...
 
Alfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transitAlfresco DevCon 2019: Encryption at-rest and in-transit
Alfresco DevCon 2019: Encryption at-rest and in-transit
 
Upgrading to Alfresco 6
Upgrading to Alfresco 6Upgrading to Alfresco 6
Upgrading to Alfresco 6
 
Alfresco Transform Service DevCon 2019
Alfresco Transform Service DevCon 2019Alfresco Transform Service DevCon 2019
Alfresco Transform Service DevCon 2019
 
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterpriseHow to migrate from Alfresco Search Services to Alfresco SearchEnterprise
How to migrate from Alfresco Search Services to Alfresco SearchEnterprise
 
(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco(Re)Indexing Large Repositories in Alfresco
(Re)Indexing Large Repositories in Alfresco
 
Alfresco CMIS
Alfresco CMISAlfresco CMIS
Alfresco CMIS
 
Alfresco Certificates
Alfresco Certificates Alfresco Certificates
Alfresco Certificates
 
OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...
OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...
OSMC 2022 | Ignite: Observability with Grafana & Prometheus for Kafka on Kube...
 
Bulk Export Tool for Alfresco
Bulk Export Tool for AlfrescoBulk Export Tool for Alfresco
Bulk Export Tool for Alfresco
 
Alfresco DevCon 2019 Performance Tools of the Trade
Alfresco DevCon 2019   Performance Tools of the TradeAlfresco DevCon 2019   Performance Tools of the Trade
Alfresco DevCon 2019 Performance Tools of the Trade
 
Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0Discovering the 2 in Alfresco Search Services 2.0
Discovering the 2 in Alfresco Search Services 2.0
 
Alfresco Backup and Disaster Recovery White Paper
Alfresco Backup and Disaster Recovery White PaperAlfresco Backup and Disaster Recovery White Paper
Alfresco Backup and Disaster Recovery White Paper
 
Integrating Alfresco with MS Dynamics
Integrating Alfresco with MS DynamicsIntegrating Alfresco with MS Dynamics
Integrating Alfresco with MS Dynamics
 
Moving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco RepositoryMoving Gigantic Files Into and Out of the Alfresco Repository
Moving Gigantic Files Into and Out of the Alfresco Repository
 
Alfresco勉強会#26 alfresco community 5.0でssoを設定する
Alfresco勉強会#26 alfresco community 5.0でssoを設定するAlfresco勉強会#26 alfresco community 5.0でssoを設定する
Alfresco勉強会#26 alfresco community 5.0でssoを設定する
 
Metadata Extraction and Content Transformation
Metadata Extraction and Content TransformationMetadata Extraction and Content Transformation
Metadata Extraction and Content Transformation
 
PLAT-13 Metadata Extraction and Transformation
PLAT-13 Metadata Extraction and TransformationPLAT-13 Metadata Extraction and Transformation
PLAT-13 Metadata Extraction and Transformation
 

Viewers also liked

Content Modeling Behavior
Content Modeling BehaviorContent Modeling Behavior
Content Modeling Behavior
Alfresco Software
 
Alfresco content model
Alfresco content modelAlfresco content model
Alfresco content model
Muralidharan Deenathayalan
 
Alfresco: Implementing secure single sign on (SSO) with OpenSAML
Alfresco: Implementing secure single sign on (SSO) with OpenSAMLAlfresco: Implementing secure single sign on (SSO) with OpenSAML
Alfresco: Implementing secure single sign on (SSO) with OpenSAML
J V
 
Alfresco REST API of the future ... is closer than you think
Alfresco REST API of the future ... is closer than you thinkAlfresco REST API of the future ... is closer than you think
Alfresco REST API of the future ... is closer than you think
J V
 
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
J V
 
Alfresco 5.2 REST API
Alfresco 5.2 REST APIAlfresco 5.2 REST API
Alfresco 5.2 REST API
J V
 

Viewers also liked (6)

Content Modeling Behavior
Content Modeling BehaviorContent Modeling Behavior
Content Modeling Behavior
 
Alfresco content model
Alfresco content modelAlfresco content model
Alfresco content model
 
Alfresco: Implementing secure single sign on (SSO) with OpenSAML
Alfresco: Implementing secure single sign on (SSO) with OpenSAMLAlfresco: Implementing secure single sign on (SSO) with OpenSAML
Alfresco: Implementing secure single sign on (SSO) with OpenSAML
 
Alfresco REST API of the future ... is closer than you think
Alfresco REST API of the future ... is closer than you thinkAlfresco REST API of the future ... is closer than you think
Alfresco REST API of the future ... is closer than you think
 
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
Deep Dive: Alfresco Core Repository (... embedded in a micro-services style a...
 
Alfresco 5.2 REST API
Alfresco 5.2 REST APIAlfresco 5.2 REST API
Alfresco 5.2 REST API
 

Similar to Alfresco Content Modelling and Policy Behaviours

Django introduction @ UGent
Django introduction @ UGentDjango introduction @ UGent
Django introduction @ UGent
kevinvw
 
Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)
Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)
Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)
Alexandre Rafalovitch
 
Introduction to Monsoon PHP framework
Introduction to Monsoon PHP frameworkIntroduction to Monsoon PHP framework
Introduction to Monsoon PHP framework
Krishna Srikanth Manda
 
The CoFX Data Model
The CoFX Data ModelThe CoFX Data Model
The CoFX Data Model
Rainer Stropek
 
Advanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoAdvanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojo
Fu Cheng
 
Introduction to Python and Django
Introduction to Python and DjangoIntroduction to Python and Django
Introduction to Python and Django
solutionstreet
 
Introduction to Design Patterns in Javascript
Introduction to Design Patterns in JavascriptIntroduction to Design Patterns in Javascript
Introduction to Design Patterns in Javascript
Santhosh Kumar Srinivasan
 
Salesforce Development Best Practices
Salesforce Development Best PracticesSalesforce Development Best Practices
Salesforce Development Best Practices
Vivek Chawla
 
Staying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHPStaying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHP
Oscar Merida
 
Advanced
AdvancedAdvanced
Advanced
mxmxm
 
Information Retrieval - Data Science Bootcamp
Information Retrieval - Data Science BootcampInformation Retrieval - Data Science Bootcamp
Information Retrieval - Data Science Bootcamp
Kais Hassan, PhD
 
Javasession6
Javasession6Javasession6
Javasession6
Rajeev Kumar
 
Into The Box 2018 - CBT
Into The Box 2018 - CBTInto The Box 2018 - CBT
Into The Box 2018 - CBT
Ortus Solutions, Corp
 
FFW Gabrovo PMG - JavaScript 1
FFW Gabrovo PMG - JavaScript 1FFW Gabrovo PMG - JavaScript 1
FFW Gabrovo PMG - JavaScript 1
Toni Kolev
 
Hibernate tutorial
Hibernate tutorialHibernate tutorial
Hibernate tutorial
Mumbai Academisc
 
UsingCPP_for_Artist.ppt
UsingCPP_for_Artist.pptUsingCPP_for_Artist.ppt
UsingCPP_for_Artist.ppt
vinu28455
 
Solr Recipes Workshop
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes Workshop
Erik Hatcher
 
JS Essence
JS EssenceJS Essence
JS Essence
Uladzimir Piatryka
 
Play Framework and Activator
Play Framework and ActivatorPlay Framework and Activator
Play Framework and Activator
Kevin Webber
 
Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)
Ryan Cuprak
 

Similar to Alfresco Content Modelling and Policy Behaviours (20)

Django introduction @ UGent
Django introduction @ UGentDjango introduction @ UGent
Django introduction @ UGent
 
Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)
Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)
Rebuilding Solr 6 examples - layer by layer (LuceneSolrRevolution 2016)
 
Introduction to Monsoon PHP framework
Introduction to Monsoon PHP frameworkIntroduction to Monsoon PHP framework
Introduction to Monsoon PHP framework
 
The CoFX Data Model
The CoFX Data ModelThe CoFX Data Model
The CoFX Data Model
 
Advanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojoAdvanced guide to develop ajax applications using dojo
Advanced guide to develop ajax applications using dojo
 
Introduction to Python and Django
Introduction to Python and DjangoIntroduction to Python and Django
Introduction to Python and Django
 
Introduction to Design Patterns in Javascript
Introduction to Design Patterns in JavascriptIntroduction to Design Patterns in Javascript
Introduction to Design Patterns in Javascript
 
Salesforce Development Best Practices
Salesforce Development Best PracticesSalesforce Development Best Practices
Salesforce Development Best Practices
 
Staying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHPStaying Sane with Drupal NEPHP
Staying Sane with Drupal NEPHP
 
Advanced
AdvancedAdvanced
Advanced
 
Information Retrieval - Data Science Bootcamp
Information Retrieval - Data Science BootcampInformation Retrieval - Data Science Bootcamp
Information Retrieval - Data Science Bootcamp
 
Javasession6
Javasession6Javasession6
Javasession6
 
Into The Box 2018 - CBT
Into The Box 2018 - CBTInto The Box 2018 - CBT
Into The Box 2018 - CBT
 
FFW Gabrovo PMG - JavaScript 1
FFW Gabrovo PMG - JavaScript 1FFW Gabrovo PMG - JavaScript 1
FFW Gabrovo PMG - JavaScript 1
 
Hibernate tutorial
Hibernate tutorialHibernate tutorial
Hibernate tutorial
 
UsingCPP_for_Artist.ppt
UsingCPP_for_Artist.pptUsingCPP_for_Artist.ppt
UsingCPP_for_Artist.ppt
 
Solr Recipes Workshop
Solr Recipes WorkshopSolr Recipes Workshop
Solr Recipes Workshop
 
JS Essence
JS EssenceJS Essence
JS Essence
 
Play Framework and Activator
Play Framework and ActivatorPlay Framework and Activator
Play Framework and Activator
 
Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)Exploring Java Heap Dumps (Oracle Code One 2018)
Exploring Java Heap Dumps (Oracle Code One 2018)
 

Recently uploaded

9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
saastr
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
Zilliz
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
akankshawande
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
DianaGray10
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
Edge AI and Vision Alliance
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
Antonios Katsarakis
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
Alex Pruden
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Tosin Akinosho
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
Ivanti
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
Javier Junquera
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
AstuteBusiness
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
Tatiana Kojar
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
Jason Packer
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
Pixlogix Infotech
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
Postman
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
ScyllaDB
 
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectorsConnector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
DianaGray10
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
Zilliz
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
Zilliz
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
Fwdays
 

Recently uploaded (20)

9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
9 CEO's who hit $100m ARR Share Their Top Growth Tactics Nathan Latka, Founde...
 
Fueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte WebinarFueling AI with Great Data with Airbyte Webinar
Fueling AI with Great Data with Airbyte Webinar
 
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development ProvidersYour One-Stop Shop for Python Success: Top 10 US Python Development Providers
Your One-Stop Shop for Python Success: Top 10 US Python Development Providers
 
What is an RPA CoE? Session 1 – CoE Vision
What is an RPA CoE?  Session 1 – CoE VisionWhat is an RPA CoE?  Session 1 – CoE Vision
What is an RPA CoE? Session 1 – CoE Vision
 
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
“How Axelera AI Uses Digital Compute-in-memory to Deliver Fast and Energy-eff...
 
Dandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity serverDandelion Hashtable: beyond billion requests per second on a commodity server
Dandelion Hashtable: beyond billion requests per second on a commodity server
 
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
zkStudyClub - LatticeFold: A Lattice-based Folding Scheme and its Application...
 
Monitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdfMonitoring and Managing Anomaly Detection on OpenShift.pdf
Monitoring and Managing Anomaly Detection on OpenShift.pdf
 
June Patch Tuesday
June Patch TuesdayJune Patch Tuesday
June Patch Tuesday
 
GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)GNSS spoofing via SDR (Criptored Talks 2024)
GNSS spoofing via SDR (Criptored Talks 2024)
 
Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |Astute Business Solutions | Oracle Cloud Partner |
Astute Business Solutions | Oracle Cloud Partner |
 
Skybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoptionSkybuffer SAM4U tool for SAP license adoption
Skybuffer SAM4U tool for SAP license adoption
 
Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024Columbus Data & Analytics Wednesdays - June 2024
Columbus Data & Analytics Wednesdays - June 2024
 
Best 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERPBest 20 SEO Techniques To Improve Website Visibility In SERP
Best 20 SEO Techniques To Improve Website Visibility In SERP
 
WeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation TechniquesWeTestAthens: Postman's AI & Automation Techniques
WeTestAthens: Postman's AI & Automation Techniques
 
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-EfficiencyFreshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
Freshworks Rethinks NoSQL for Rapid Scaling & Cost-Efficiency
 
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectorsConnector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
Connector Corner: Seamlessly power UiPath Apps, GenAI with prebuilt connectors
 
Programming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup SlidesProgramming Foundation Models with DSPy - Meetup Slides
Programming Foundation Models with DSPy - Meetup Slides
 
Generating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and MilvusGenerating privacy-protected synthetic data using Secludy and Milvus
Generating privacy-protected synthetic data using Secludy and Milvus
 
"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota"Choosing proper type of scaling", Olena Syrota
"Choosing proper type of scaling", Olena Syrota
 

Alfresco Content Modelling and Policy Behaviours

  • 1. Jan Vonka Repository Team, Alfresco 1
  • 2. • Introduction • Modelling • Overview • Components • Examples • Behaviours • Overview • Components • Examples • Past, present & future • Q & A … feedback 2
  • 3. • About me • I’ve been with Alfresco since early 2007 • primarily working in the core repository team • worked for various companies in UK & California • I enjoy flying hot-air balloons ;-) • Spelling 3 • to be consistent I’ll stick with the British spelling • Modelling <=> Modeling • Behaviour <=> Behavior • About you • Modelling vs Behaviours … how much time (50/50) ? • I’d like to allow enough time for • Q & A and general feedback (your experience)
  • 4. How many of you have … ? • attended training course • DevCon JumpStart course • Intensive Developers course • and/or read • Professional Alfresco book (chapter 5) • Jeff Pott’s Alfresco Developer Guide (chapters 3 & 4) • Alfresco wiki (“Data Dictionary” and related pages) • and/or hands-on experience 4 • followed examples (eg. Books and/or Alfresco SDK) • developed your own custom content model & app’
  • 5. Modelling 5 • [something] used as an example to follow or imitate • to make [something] conform to a chosen standard Behaviour • the way in which [something] behaves in response to a particular situation or stimulus
  • 6. Embeds a storage engine Domain • which enables storage of a potentially arbitrary network of entity data 6 • content entities • “metadata” (about the entities) • relationships (between the entities) • Stores • store ref(erence) • root node • Nodes • unique node ref(erence) • Properties • on nodes • (Peer) Associations • from source to target node • Child associations • between parent & child node • primary & secondary
  • 7. Model / domain consistency can be maintained via … • Content Model + Integrity Checker • formal model definition • including built-in constraints • option to also write & plug-in custom constraints (not specifically covered here) • Behaviours • custom business logic bound to policies • Rules & Actions 7 • not covered here … see separate session
  • 8. 8 • [something] used as an example to follow or imitate • to make [something] conform to a chosen standard
  • 9. • Content models 9 • are all about metadata (data that describes data) • constrain otherwise arbitrary nodes, properties and associations • are named and define one or more namespaces • can import namespaces in order to allow references to other models • must be configured and loaded in dependent order • “bootstrap” models are statically loaded from the filesystem (“extensions” classpath) when repo starts • “dynamic” models are dynamically loaded from the repo (“Models” space) when models are added or changed • integrity checks fire when transaction commits • mandatory can be enforced (else node is marked as incomplete)
  • 10. Dictionary Service • Get def’ (or all QNames) • model • types / aspect • property • datatype • constraint • association • also: is sub-class ? • Also refers to 10 • QName • NamespaceService (prefix resolver) Node Service • Nodes • create, move, delete, restore • Properties • set, get, remove • Associations • create, remove, • get sources, get targets • Child Associations • get children, get parents • get primary parent
  • 11. 11 Type Aspect Class Property Association Child Association Data Type Constraint
  • 12. Summary modelSchema.xsd 12 • Imports • Namespaces • Data-types • Constraints • Types / Aspects • Properties • Constraints • Associations • Child Associations
  • 13. • Node 13 • must be of a given type when created • can also setType (ie. specialise / change type) • may have zero or more aspects attached • either from type or at runtime • may have a set of properties • defined by type & aspects (including inherited types & aspects) • may be associated with other nodes • defined by type & aspects (including inherited types & aspects)
  • 14. • Property 14 • must be named • must be of a given datatype • may be single-valued (default) or multi-valued • may have zero or more constraints (inline or referenced) • may be mandatory • either: enforced • or: relaxed (if missing, node marked with incomplete aspect) • may have default value • may be “residual” • in this case there is no associated property definition • can be overridden in terms of inheritance • to a limited extent – mandatory, default, constraints
  • 15. • Built-in constraint types: 15 • LIST (“ListOfValuesConstraint) • LENGTH (“StringLengthConstraint”) • MINMAX (“NumericRangeConstraint”) • REGEXP (“RegexConstraint”) • Other examples, eg. RM caveats use: • “RMListOfValuesConstraint” (extends “ListOfValuesConstraint”) • You can hook in your own constraint implementations • implement “Constraint” interface • typically extend “AbstractConstraint” • must have default constructor (as it’s used to instantiate it) • in model, define constraint with “type” attribute set to fully-qualified class name • make sure you unit test your constraint (it is performance sensitive) • Constraints execute • as part of integrity checks prior to commit (ie. at the end of a server transaction)
  • 16. • (Peer) Association 16 • association type is named • source node may be associated with zero or more target nodes • may be mandatory • enforced or relaxed (missing => node marked with incomplete aspect) • cardinality can be defined via many / mandatory • 0 or 1(mandatory = false, many = false) • 1 (mandatory = true, many = false) • 0 or more (mandatory = false, many = true) • 1 or more (mandatory = true, many = true)
  • 17. • Child Association 17 • defined in same way as peer association with extra features • parent node may be associated with zero or more child nodes • affects certain operations, eg. delete will cascade • also defines if child name can be duplicated or unique within parent • a node can have one primary child association • a node may have one or more secondary child associations
  • 18. • Don’t forget “the Node Browser is your friend !” 18 • in theory never lies … • … although be careful with browser back button (JSF issue)
  • 19. • Dynamic models 19 • since 3.0 • reduces need for server restart, also enables multi-tenancy option • CMIS mapping • CMIS type, CMIS property, CMIS relationship (peer assoc) • CMIS document (cm:content), CMIS folder (cm:folder) • Constraints support title & description (needed by RM) • since 3.2 • Tightened validation check for content models • since 3.4 • unfortunately, due to a long standing bug, it has always been possible to define new model elements using a namespace that wasn't defined by the containing model (eg. using an imported namespace) • with the recent bug fix, it is now only possible to create model elements whose namespace is also defined by the containing model • “DataModel” split out from “Repository” • since 3.4 • split into separate JAR / Eclipse project – for future SOLR integration
  • 20. 20 sys:referenceable - sys:store-protocol - sys:store-identifier - sys:node-uuid - sys:node-dbid sys:base cm:cmobject - cm:name cm:content cm:folder cm:auditable - cm:created - cm:creator - cm:modified - cm:modifier
  • 21. my:customBaseAspect my:customBaseFolder 21 cm:content cm:folder my:customContent my:customSubFolder my:customBaseContent my:customSubAspect
  • 22. GenSimpleXMIFromModel.java (extract) … more here … Map<String, Object> fmModel = new HashMap<String, Object>(); fmModel.put("prefixDelimiter", prefixDelimiter); fmModel.put("classes", allM2Classes); fmModel.put("datatypes", datatypes); Configuration cfg = new Configuration(); cfg.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER); String userDir = System.getProperty("user.dir"); cfg.setDirectoryForTemplateLoading(new File(userDir+"/source/test-resources/ 22 SimpleXMI")); // UML 1.4 / XMI 1.2 - suitable for ArgoUML (eg. 0.30.2) Template temp = cfg.getTemplate("simple-Xmi1.2-Uml1.4.ftl"); File f = new File(userDir, "simpleXMI-"+System.currentTimeMillis() +".xmi"); Writer out = new FileWriter(f); temp.process(fmModel, out); out.flush(); out.close(); … more here … simple-Xmi1.2-Uml1.4.ftl (extract) … more here … <#list datatypes as datatype> <#assign split=datatype.name?index_of(":")> <UML:DataType xmi.id = 'id-datatype:${datatype.name}' name = '${datatype.name?substring(split+1)}' isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false'/> </#list> <#list classes as class> <UML:Class xmi.id = 'id-class:${class.name}' name = '${class.name?replace(":",prefixDelimiter)}’ isSpecification = 'false' isRoot = 'false' isLeaf = 'false' isAbstract = 'false' isActive = 'false'> <#if class.isAspect() == true > <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref = 'id-stereotype:aspect'/> </UML:ModelElement.stereotype> <#else> … more here …
  • 23. 23
  • 24. 24
  • 25. • Many examples “out-of-the-box” • Search for “*Model.xml” across the Alfresco source tree • Core model files (with defined namespaces) include: 25 • dictionaryModel.xml • http://www.alfresco.org (alf) • http://www.alfresco.org/model/dictionary/1.0 (d) • http://www.alfresco.org/view/repository/1.0 (view) • systemModel.xml • http://www.alfresco.org/model/system/1.0 (sys) • http://www.alfresco.org/system/registry/1.0 (reg) • http://www.alfresco.org/system/modules/1.0 (module) • contentModel.xml • http://www.alfresco.org/model/content/1.0 (cm) • http://www.alfresco.org/model/rendition/1.0 (rn) • http://www.alfresco.org/model/exif/1.0 (exif)
  • 26. • Alfresco modules also provide some great examples, eg. 26 • Records Management (RM / DOD5015) • dod5015Model.xml • http://www.alfresco.org/model/dod5015/1.0 (dod) • recordsCustomModel.xml (dynamically managed) • http://www.alfresco.org/model/rmcustom/1.0 (rmc) • Web Quick Start (WQS) • webSiteModel.xml • http://www.alfresco.org/model/website/1.0 (ws)
  • 27. 27 • the way in which [something] behaves in response to a particular situation or stimulus
  • 28. • Policies provide hook points to which you can bind behaviours to events based on class or association • behaviours are (policy) handlers that execute specific business logic • behaviours can be implemented in Java and/or JavaScript • Behaviours can be bound to a type or aspect 28 • node in the content repository must be of a single type • node may have one or more aspects attached • aspects are either inherited from its type (defined by the model) • or can be attached (or detached) at runtime … • allowing a node to dynamically inherit features and capabilities • aspects can be interpreted by the repository to change behaviour • eg. by the presence of an aspect (even with no properties)
  • 29. • From JavaDoc (org.alfresco.repo.policy) … The Policy Component manages Policies and Behaviours. It provides the ability to: a) Register policies b) Bind behaviours to policies c) Invoke policy behaviours A behaviour may be bound to a Policy before the Policy is registered. In this case, the behaviour is not validated (i.e. checked to determine if it Supports the policy interface) until the Policy is registered. Otherwise, the behaviour is validated at bind-time. Policies may be selectively "turned off" by the Behaviour Filter. 29
  • 30. • Behaviour 30 • BaseBehaviour • JavaBehaviour • ScriptBehaviour
  • 31. • Policy 31 • ClassPolicy (type or aspect) • AssociationPolicy (peer or parent-child) • PropertyPolicy (not used)
  • 32. • Search for “*Policies.java” across the Alfresco source tree • Examples include: 32 • NodeServicePolicies • before/onCreateNode, • beforeDeleteNode (don’t use “on”) • before/onUpdateNode • onUpdateProperties • before/onAddAspect • before/onRemoveAspect • before/onCreateChildAssociation • before/onDeleteChildAssocation • onCreateAssociation • onDeleteAssociation • …. • ContentServicePolicies • onContentUpdate • onContentPropertyUpdate
  • 33. 33 • CopyServicePolicies • before/onCopy • onCopyComplete • CheckOutCheckInServicePolicies • before/OnCheckOut • before/OnCheckIn • before/OnCancelCheckOut • And more … • VersionServicePolicies • StoreSelectorPolicies • AsynchronousActionExecutionQueuePolicies • RecordsManagementPolicies • Note: you can define, register and invoke you own custom policies, eg. • RecordsManagementPolicies <= RecordsManagementActionServiceImpl
  • 34. public interface NodeServicePolicies! { !! !public interface OnAddAspectPolicy extends ClassPolicy! !{! ! !public static final QName QNAME = QName.createQName(NamespaceService.ALFRESCO_URI, "onAddAspect");! ! ! !// Called after an <b>aspect</b> has been added to a node! ! !public void onAddAspect(NodeRef nodeRef, QName aspectTypeQName);! !}! }! ! public abstract class AbstractNodeServiceImpl implements NodeService! {! !// note: policyComponent is injected … (not shown here)! ! !public void init()! !{! ! !// Register the policy! ! !onAddAspectDelegate = policyComponent.registerClassPolicy ! ! ! ! ! ! !! ! ! ! ! ! ! ! ! !(NodeServicePolicies.OnAddAspectPolicy.class);! !}! ! !protected void invokeOnAddAspect(NodeRef nodeRef, QName aspectTypeQName)! !{ ! !! ! !NodeServicePolicies.OnAddAspectPolicy policy = onAddAspectDelegate.get(nodeRef, aspectTypeQName);! ! !policy.onAddAspect(nodeRef, aspectTypeQName);! !}! }! ! ! 34
  • 35. public class XyzAspect implements NodeServicePolicies.OnAddAspectPolicy, ...! {! !// note: policyComponent is injected … (not shown here)! ! !public void init()! !{! ! !// bind to the policy! ! !policyComponent.bindClassBehaviour(! ! ! !OnAddAspectPolicy.QNAME,! ! ! !ContentModel.ASPECT_XYZ,! ! ! !new JavaBehaviour(this, "onAddAspect”, ! ! ! ! ! ! ! ! ! ! ! !Behaviour.NotificationFrequency.TRANSACTION_COMMIT));! !}! ! !public void onAddAspect(NodeRef nodeRef, QName aspectTypeQName)! !{! ! !// implement behaviour here … (for when aspect XYZ is added)! !}! }! ! 35
  • 36. …! ! //! // note: usually try to bind on specific class (type/aspect) rather than service method! //! ! // class binding – specific type or aspect! policyComponent.bindClassBehaviour(! ! !NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,! ! !ContentModel.TYPE_PERSON, ! ! !new JavaBehaviour(this, ! ! ! ! ! ! !"onUpdateProperties”,! ! ! ! ! ! !Behaviour.NotificationFrequency.EVERY_EVENT));! ! // service binding – all types/aspects! policyComponent.bindClassBehaviour( ! ! !NodeServicePolicies.OnUpdatePropertiesPolicy.QNAME,! ! !this,! ! !new JavaBehaviour(this, ! ! ! ! ! ! ! "onUpdateProperties”,! ! ! ! ! ! ! Behaviour.NotificationFrequency.EVERY_EVENT));! … ! 36
  • 37. • Notification Frequency • behaviours can be defined with a notification frequency – “every event” (default), “first event”, “transaction commit” • consider that during a given transaction, certain policies may fire multiple times (ie. “every event”) • can set notification frequency to “first event” or “transaction commit” • Using Transactional Resource 37 • option to execute logic immediately or queue (eg. via transactional resource) until commit (beforeCommit and/or afterCommit) • AlfrescoTransactionSupport.bindResource(K, V) • V = AlfrescoTransactionSupport.getResource(K)
  • 38. • Behaviours can be temporarily disabled 38 • BehaviourFilter interface • for current transaction only • for “class” (type or aspect) or “node + class” • disableBehaviour • enableBehaviour • isEnabled • for “node” • enableBehaviours • for “all” • disableAllBehaviours • enableAllBehaviours • isActivated • Behaviour interface • for current thread only • disable / enable, eg. in try / finally block • Examples – importer, transfer – disable behaviours
  • 39. • From the perspective of the custom behaviour • delete is delete (you should not need to care whether it is archived) • create is create (even if it is restored from the archive) • Bind to beforeDeleteNode (not onDeleteNode) • note: will fire for parent and recursively for each of it’s cascade deleted children (if any) • Don’t rely (or be dependent) on the archive store • deleted node may not be archived • archived node may never be restored • you should not need to check for archive store • One exception is peer associations 39 • assocs to “archived” nodes may remain (pending ALF-4119 for 3.4+)
  • 40. “live” store 40 “archive” store archive://SpacesStore deleteNode deleteNode (purgeArchivedNode) restoreNode version://version2Store workspace://SpacesStore “version” store deleteNode createVersion deleteVersion deleteVersionHistory
  • 41. • More than one handler can be registered for a given policy • since 3.0 • We now also trigger policies through the type hierarchy • since 3.4 • if you use earlier Alfresco and yet to upgrade then workaround is to bind to service bind and use “isSubClassOf” to check type • You should not need to check for archive store 41 • since 3.3 • operations on archive store no longer fire polices • also applies to version store
  • 42. • Search through the code for policy bindings or use Eclipse to find call hierarchy for • bindClassBehaviour (x2) • bindAssociationBehaviour (x3) • Many examples both in core services as well as module extensions such as 42 • Web Quick Start • http://wiki.alfresco.com/wiki/ Web_Quick_Start_Developer_Guide#Behaviours • DOD 5015 (Records Management) • You can refer to the SDK for a simple example • Also, for JavaScript Behaviours, refer to *old* RM module
  • 43. • Modelling • consider using dynamic models during dev & test cycles • beware of deep class hierarchies • consider performance of any custom registered constraints • Behaviours • consider notification frequency • add debug logging • don’t rely on archive store • can temporarily disable/re-enable (thread or transaction) • General 43 • start with the SDK and if needed move to complete SVN source tree • write unit tests (+ve & -ve) to exercise custom models & behaviours • run existing regression tests (eg. “ant test-repository” or continuous) • develop and package as an AMP (Alfresco Module Package)
  • 44. • Modelling 44 • integrity checks do not apply to version store • data model has been split off (eg. for future SOLR integration) • now only possible to create model elements whose namespace is also defined by the containing model • composite content (anticipated for Project “Swift”) • major model enhancement • will also impact various foundation services • see wiki for more details (early draft - subject to change) • Behaviours • more than one handler can be registered for a policy • policies do not fire for archive store & version store • policies are now triggered through the type hierarchy • maybe some consolidation & rationalisation • also potentially new policies (to hook into)
  • 45. • Alfresco wiki / forums • Books • Professional Alfresco (Wrox) • Alfresco Developer Guide (Packt Publishing) • Alfresco Training courses • Intensive Developers Course (5 day) • Fundamentals (2 day) – new • Advanced Content Modelling – TBC • and obviously the source code itself J 45 • including modules, such as RM (DOD 5015)
  • 46. 46
  • 48. 48
  • 49. Normal Text Normal Text Normal Text 49
  • 50. 50
  • 51. <?xml version="1.0" encoding="UTF-8"?>! ! <model name="cm:contentmodel" ! 51 xmlns="http://www.alfresco.org/model/dictionary/1.0" ! xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">! ! <description>Alfresco Content Domain Model</description>! <author>Alfresco</author>! <published>2009-06-04</published>! <version>1.1</version>! ! <imports>! <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d"/>! <import uri="http://www.alfresco.org/model/system/1.0" prefix="sys"/>! </imports>! ! <namespaces>! <namespace uri="http://www.alfresco.org/model/content/1.0" prefix="cm"/>! <namespace uri="http://www.alfresco.org/model/rendition/1.0" prefix="rn"/>! <namespace uri="http://www.alfresco.org/model/exif/1.0" prefix="exif"/>! </namespaces>!
  • 52. ! !<type name="cm:cmobject">! 52 <title>Object</title>! <parent>sys:base</parent>! <properties>! <property name="cm:name">! <title>Name</title>! <type>d:text</type>! <mandatory enforced="true">true</mandatory>! ! ! <index enabled="true">! ! ! ! !<atomic>true</atomic>! ! ! ! !<stored>false</stored> ! <tokenised>both</tokenised>! </index>! <constraints>! <constraint ref="cm:filename" />! </constraints>! </property>! </properties>! <mandatory-aspects>! <aspect>cm:auditable</aspect>! </mandatory-aspects>! </type>! !!
  • 53. <type name="cm:folder">! 53 <title>Folder</title>! <parent>cm:cmobject</parent>! <archive>true</archive>! <associations>! <child-association name="cm:contains">! <source>! <mandatory>false</mandatory>! <many>true</many>! </source>! <target>! <class>sys:base</class>! <mandatory>false</mandatory>! <many>true</many>! </target>! <duplicate>false</duplicate>! <propagateTimestamps>true</propagateTimestamps>! </child-association>! </associations>! </type>!

Editor's Notes

  1. Other foundation services include Content Service, Search Service … Other higher-level services include FileFolderService, CheckoutCheckInService, VersionService, CopyService …
  2. ALF-680 - Previously valid content models now fail with CMISAbstractDictionaryService$DictionaryRegistry exception (r20488) CHK-8823 - Dictionary/Constraint improvements (required by MOB-1276) (r15913)
  3. ALF-955 - Deletion of dynamic custom model (Ent 3.2.1 / Com 3.3) ALF-4119 - NodeService: beforeDeleteNode archiving (WIP – targeted for Com 3.4b)
  4. ALF-3885 - Allow multiple policies through type hierarchy (r21253) (Com 3.4.a / Ent 3.4.0) CHK-2720 - Fixed AR-401 Can only have one policy handler (r8698)