SlideShare a Scribd company logo
1 of 74
Download to read offline
Get your content under
control with CMIS and
Apache Chemistry
Florent Guillaume
fg@nuxeo.com
twitter.com/efge
ApacheCon NA, 2010-11-03
Agenda
• CMIS
• Apache Chemistry
• OpenCMIS Client coding
• OpenCMIS Server coding
2
Who am I?
• Florent Guillaume
– fg@nuxeo.com
• Director of R&D at Nuxeo
– http://nuxeo.com
– http://doc.nuxeo.com
• Nuxeo Architect
• Apache Committer
• Member of JSR 283, OASIS CMIS TC
3
Glossary
• CMIS
– Content Management Interop. Services
• CMS, DMS, DAM, WCM, ECM, RM...
– content, document, asset, record...
• Content Stream
– resource / file from a filesystem
• Document
– self-contained, structured metadata
– high-level operations
4
What is CMIS?
• Domain Model
– services
– objects, types, properties
– lowest greatest common denominator
• Transport Protocols
– HTTP-based
• No Language API
– Apache Chemistry
– (although WSDL is actually a language)
5
Interoperability
• Application / Repository
– Client / Server
• Application ↔ Repository
– e.g. photo management
• Repository ↔ Repository
– e.g. archival, publishing
• Repository federation
– central access to heterogenous systems
6
CMIS Implementations
• Product → Client / Repository
• Repositories
– Alfresco, Nuxeo, Microsoft, IBM, SAP,
eXo, Day, Jahia, KnowledgeTree, ...
• Clients
– Adobe, IBM, Microsoft, eZ Publish,
Plone, Drupal, Joomla, ...
7
SharePoint 2010 Connector
8
SharePoint 2010
9
IBM FileNet P8
10
Nuxeo
11
CMIS Workbench
12
CMIS Spaces
13
CMIS Explorer
14
IBM Firefox Plugin
15
Plone
16
Drupal
17
eZ Publish
18
Joomla
19
CMIS Benefits
• Customer benefits
– interoperability between vendors
– common model
– “desilofication”
– “commoditization”
• Vendor benefits
– repository vendors get more apps
– applications vendors get more repos
20
CMIS Domain Model
• Objects: Folders, Documents
• Properties
– scalars, lists
• string, boolean, decimal, integer, datetime, uri, id, html
– binary content stream
• Types
– inheritance, constraints
– standard properties
• id, name, creation, modification, version, ...
21
Folders and Documents
22
Folder
(root)
Folder
foo
Folder
bar
Folder
blah
Folder
stuff
Folder
gee
Doc
123
Doc
456
Doc
789
Doc
001
Document Properties
• 5ba79978-a87f-4146-9dd4-5197c5ac0962
– cmis:objectId: 5ba79978-a87f-4146-9dd4-5197c5ac0962
– cmis:objectTypeId: invoice
– cmis:name: My Document
– cmis:creationDate: 2010-01-25T10:15:07.155-08:00
– cmis:createdBy: florent
– cmis:lastModificationDate: 2010-01-25T10:20:53.286-08:00
– cmis:lastModifiedBy: florent
– cmis:contentStreamFileName: mydocument.pdf
– cmis:contentStreamMimeType: application/pdf
– cmis:isLatestVersion: true
– cmis:versionLabel: v1.5
– keywords: [example, sample, frobs]
– importance: high
23
Type Definition Properties
• invoice
– cmis:objectId: ID
– cmis:objectTypeId: ID
– cmis:name: String
– cmis:creationDate: DateTime (read-only)
– cmis:createdBy: String (read-only)
– cmis:lastModificationDate: DateTime
– cmis:isLatestVersion: Boolean
– keywords: String (multi-valued, not required)
– importance: String (choices: low, medium, high)
24
Type Definition
• invoice
– id: invoice
– localName: t-invoice
– displayName: Invoice
– baseId: cmis:document
– parentId: record
– fileable: true
– queryable: true
– fulltextIndexed: true
– controllableACL: false
25
CMIS Services
• CRUD
• Queries
• Versioning
• Renditions
• Relationships
• Multi-Filing, ACLs, Change Log,
Policies
• Repositories, Types
26
Retrieve
• By ID
• By Path
– ID ≠ name ≠ path segment ≠ file name
• Parent(s) / Children / Tree
• Properties
• Content Stream
• Allowable Actions
• Renditions
27
Retrieve Examples (I)
• By ID
ObjectId  id  =  session.createObjectId(
        "5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962");
CmisObject  object  =  session.getObject(id);
• By Path
Folder  folder  =  (Folder)  session.getObjectByPath(
        "/corporate/invoices/foo");
• Children
for  (CmisObject  child  :  folder.getChildren())  {
        ...
}
28
Retrieve Examples (II)
• Properties
List<String>  kw  =  doc.getPropertyValue("keywords");
• Content Stream
ContentStream  cs  =  doc.getContentStream();
String  filename  =  cs.getFileName();
InputStream  stream  =  cs.getStream();
29
Query
• Retrieve by content
• SQL-like Language
– Type → Table
– Object → Row
– Property → Column
– Multi-Valued, Fulltext + Score, JOIN
• SELECT only
– no UPDATE, DELETE
30
Query Examples
• Query
ItemIterable<QueryResult>  list  =  session.query(
        "SELECT  cmis:objectId  FROM  ...",  true);
for  (QueryResult  qr  :  list)  {
        qr.getPropertyById("cmis:name");
}
• CMISQL
SELECT  cmis:objectId,  cmis:name,  SCORE()  AS  sc
    FROM  cmis:document
    WHERE  importance  =  'high'
        AND  'frobs'  =  ANY  keywords
        AND  IN_TREE('5ba79978-­‐a87f')
        AND  CONTAINS('barack  OR  obama')
    ORDER  BY  sc  DESC
31
Create, Update, Delete
• Create
– may need content stream
– may check in
• Update
– may verify a change token
– may change ID (auto-versioning)
• Delete
– may delete all versions
32
CRUD Examples
• Create
Map<String,  Serializable>  props  =
        new  HashMap<String,  Serializable>();
props.put(PropertyIds.OBJECT_TYPE_ID,  "Note");
props.put(PropertyIds.NAME,  "mynote");
Document  doc  =  folder.createDocument(props,
        contentStream,  null);
• Update
doc.updateProperties(props);
• Delete
doc.delete();
33
Versioning
• Version Series
• Private Working Copy
• Check In, Check Out
• Get All Versions
• (optional feature)
34
Versioning Examples
• Check Out
ObjectId  pwcId  =  doc.checkOut();
• Check In
ObjectId  verId  =  doc.checkIn(true,  null,  true,  "foo");
• Get All Versions
List<Document>  docs  =  doc.getAllVersions();
35
Versioning Variants
• No versioning (no type versionable)
• Auto-versioning
– create new version on each edit
• PWC not updatable
– explicit check in with new changes
• Version-specific filing
• Versions searchable or not
36
Renditions
• Retrieve Only
• Additional Content Streams
– MIME type, kind, title, size
• Various uses
– thumbnail / icon
– transformations
• PDF, HTML
• Multi-Page
• (optional feature)
37
Renditions Examples
• Get Renditions
for  (Rendition  rendition  :  doc.getRenditions())  {
        String  kind  =  rendition.getKind();
        String  title  =  rendition.getTitle();
        String  mimeType  =  rendition.getMimeType();
        ContentStream  cs  =  rendition.getContentStream();
        ...
}
38
Relationships
• Source, Target
• Unfiled, not versionable
• May be queryable, controllable
• May use referential integrity
• (optional feature)
39
Relationships Examples
• Create Relationship
Map<String,  Serializable>  props  =
        new  HashMap<String,  Serializable>();
props.put(PropertyIds.OBJECT_TYPE_ID,  "Depends");
props.put(PropertyIds.SOURCE_ID,  source.getId());
props.put(PropertyIds.TARGET_ID,  target.getId());
ObjectId  relId  =  session.createRelationship(props);
• Get Relationships
for  (Relationship  rel  :  doc.getRelationships())  {
        ...
}
40
Multi-Filing, Unfiling
• Only for documents, not folders
• Zero, one or more parents
• All parents are equivalent
• Different paths
– (if paths are supported)
41
Folders and Documents
42
Folder
(root)
Folder
foo
Folder
bar
Folder
blah
Folder
stuff
Folder
gee
Doc
123
Doc
456
Doc
789
Doc
001
Multi-Filing, Unfiling
43
Folder
(root)
Folder
foo
Folder
bar
Folder
blah
Folder
stuff
Folder
gee
Doc
123
Doc
456
Doc
789
Doc
333
Doc
001
Multi-Filing Example
• Multi-Filing
doc.addToFolder(folderId,  false);
• Unfiling
doc.removeFromFolder(folderId);
44
ACLs
• Basic Read & Write permissions
• Repository-specific permissions
• Can be inherited along folder hierarchy
• Can be updated
• Mapping to Allowable Actions
– ACL: bob has Read / Write here
– AA: bob canMoveObject here
– canMoveObject (on Object + Source +
Target)
45
Change Log
• List of chronological changes to the
repository
– create, update, delete
– ID of object
– optionally properties, ACLs, policies
• Since a given date (change log token)
• May not be available since “forever”
46
Change Log Examples
• Get Content Changes
ChangeEvents  events  =  session.getContentChanges(
        token,  includeProperties,  1000);
for  (ChangeEvent  ev  :  events.getChangeEvents())  {
        ObjectId  id  =  ev.getObjectId();
        Calendar  time  =  ev.getChangeTime();
        if  (ev.getChangeType()  ==  ChangeType.UPDATED)  {
                props  =  ev.getProperties();
                ...
        }
}
if  (events.getHasMoreItems())  {
        token  =  events.getLatestChangeLogToken();
}
...
47
Policies
• Attach policies to controllable objects
• Repository-specific
• Security policies
• Aspects / Facets / Mixins
• RM: Retention, Legal Hold
48
Repositories
• When connecting, list repositories
• Find out repository capabilities
– implemented services, tree-based
navigation, multi-filing, unfiling, query
capabilities, ...
• Get repository-wide information
– description, vendor, CMIS version, ...
– root folder ID
– latest change log token
49
CMIS Bindings
• AtomPub
– ReST base
– URI templates
• SOAP
– Common Web Services
• Browser Bindings
– JSON-based (work in progress)
• ... more possible
50
AtomPub
51
GET  http://cmisexample.oasis-­‐open.org/rep1/5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962  HTTP/1.0
HTTP/1.1  200  Ok
Content-­‐Type:  application/atom+xml;type=entry
<atom:entry>
        <atom:content  src="..."/>
        <atom:id>urn:uuid:5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962</atom:id>
        <atom:title  type="text">CMIS  Example  Document</atom:title>
        <atom:updated>2010-­‐01-­‐25T10:20:53.286-­‐08:00</atom:updated>
        <atom:link  rel="self"  href="..."/>
        <atom:link  rel="edit"  href="..."/>
        <atom:link  type="application/atom+xml;type=entry"  rel="describedby"  href="..."/>
        <atom:link  type="application/atom+xml;type=feed"  rel="up"  href="..."/>
        <atom:link  type="application/atom+xml;type=feed"  rel="version-­‐history"  href="..."/>
        <cmisra:object>
                <cmis:allowableActions>...</cmis:allowableActions>
                <cmis:properties>
                        ...
                </cmis:properties>
        </cmisra:object>
</atom:entry>
Non-ReST AtomPub
• URI templates
52
http://example.com/rep1/objectbyid/{id}
?filter={filter}
&includeAllowableActions={includeAllowableActions}
&includePolicyIds={includePolicyIds}
&includeRelationships={includeRelationships}
&includeACL={includeACL}
SOAP
53
<S:Envelope>
        <S:Body>
                <cmism:getProperties>
                        <cmism:repositoryId>rep1</cmism:repositoryId>
                        <cmism:objectId>
                                5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962
                        </cmism:objectId>
                </cmism:getProperties>
        </S:Body>
</S:Envelope>
<S:Envelope>
        <S:Body>
                <cmism:getPropertiesResponse>
                        <cmism:properties>
                                ...
                        </cmism:properties>
                </cmism:getPropertiesResponse>
        </S:Body>
</S:Envelope>
XML Payload
54
<cmis:properties>
        <cmis:propertyId  propertyDefinitionId="cmis:objectId">
                <cmis:value>5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962</cmis:value>
        </cmis:propertyId>
        <cmis:propertyId  propertyDefinitionId="cmis:objectTypeId">
                <cmis:value>invoice</cmis:value>
        </cmis:propertyId>
        <cmis:propertyString  propertyDefinitionId="cmis:name">
                <cmis:value>My  Document</cmis:value>
        </cmis:propertyString>
        <cmis:propertyDateTime  propertyDefinitionId="cmis:creationDate">
                <cmis:value>2010-­‐01-­‐25T10:20:53.364-­‐08:00</cmis:value>
        </cmis:propertyDateTime>
        <cmis:propertyString  propertyDefinitionId="cmis:contentStreamFileName">
                <cmis:value>mydocument.pdf</cmis:value>
        </cmis:propertyString>
        <cmis:propertyString  propertyDefinitionId="cmis:contentStreamMimeType">
                <cmis:value>application/pdf</cmis:value>
        </cmis:propertyString>
        <cmis:propertyString  propertyDefinitionId="keywords">
                <cmis:value>example</cmis:value>
                <cmis:value>sample</cmis:value>
                <cmis:value>frobs</cmis:value>
        </cmis:propertyString>
</cmis:properties>
CMIS Miscellanea
• Stateless
• Transaction-less
• Authentication left to repository
– HTTP Basic Auth, WS-Security +
Username Token
55
History of CMIS (I)
• Founding members (from iECM) work
on a new standard
– 2006
– EMC, IBM, Microsoft
• Contributing members invited for
review
– Aug 2007
– Alfresco, Open Text, Oracle, SAP
56
History of CMIS (II)
• Draft spec submitted to OASIS
– September 2008
• OASIS committee formed
– November 2008
• First public draft released
– October 2009
• CMIS 1.0 standard approved
– May 2010
57
History of CMIS (III)
• OASIS TC members
– Adobe, Adullact, Alfresco, ASG Software
Solutions, Booz Allen Hamilton, Citytech,
Content Technologies, Day, dotCMS, Ektron,
EMC, Entropysoft, Exalead, FatWire, Fidelity
Investments, Flatirons Solutions, fme, Genus
Technologies, Greenbytes, Harris Corp, IBM,
Magnolia, Microsoft, Nuxeo, Open Text,
Oracle, Pearson, Quark, SAP, Saperion,
Structured Software Systems, Sun, Vamosa,
Vignette, WeWebU
58
Future of CMIS
• CMIS 1.1
– late 2011
– errata, clarifications
– additional bindings
– type mutability?
• CMIS 2.0
– late 2012?
– bigger features or non-backward compat
• Transactions, Hierarchical/complex properties, Mixin types, WebDAV binding, Batch, Multiple content
streams, Internationalization, More explicit exceptions, Better exposure of renditions, RepositoryInfo
Property types support, AtomPub expressibility and clean-up, Type management, Records Management,
Pessimistic locking, Workflow, Content Tagging, Content Recommendations, Commenting, Social
– 59
Other Standards
• ODMA
– desktop-oriented
• WebDAV, DeltaV
– filesystem-oriented
• RSS, AtomPub
– limited domain model
• JCR (JSR-170, JSR-283)
– Java-specific
60
Apache Chemistry
• Incubating project
– started in 2009
– http://incubator.apache.org/chemistry/
• Implement whole CMIS spec
• Client-side
– Java (OpenCMIS)
– Python, PHP, JavaScript
• Server-side
– Java (OpenCMIS)
61
Chemistry / OpenCMIS History
• Original Chemistry project
– Day, Nuxeo in 2009
• OpenCMIS started privately
– Alfresco, Open Text, SAP
– Proposed to Apache in December 2009
• Chemistry and OpenCMIS merge
– 3 days of meetings in April 2010
• OpenCMIS 0.1.0 released Sept. 2010
62
OpenCMIS Facts
• 90k lines of Java
– OSGi bundles
– 5 JARs needed for a client
– Built with Maven
• Covers all aspects of the spec
• Extensible
• Lots of tests
• Contributors
– Alfresco, Day, Nuxeo, Open Text, SAP...
63
OpenCMIS Components
• Client API
• Client implementation
– CMIS Workbench
• Server SPI
• Server implementations
– filesystem
– in-memory
• Transport protocol bindings
– AtomPub, SOAP, JSON
64
CMIS Workbench
65
CMIS Workbench
66
CMIS Workbench Console
67
Clients using OpenCMIS
• Spring Surf CMIS Application Browser
• Confluence CMIS Plugin
• CMIS Explorer
• CMIS connectivity for SAP
Applications (upcoming)
• Struts2CmisExplorer
• CMIS Workbench
• Alfresco Web Quick Start
68
Servers using OpenCMIS
• Open Text Enterprise Library CMIS
Connector
• OpenWGA CMIS Connectivity Plugin
• Alfresco CMIS Preview
• Nuxeo CMIS Connector
69
OpenCMIS – Client coding
70
• See above :)
OpenCMIS – Server coding
• Define model mapping
– types, property types
– ids, path segments, names
– files, filenames
– versioning, locking, content log
• Implement the SPI
– CmisService
• Bindings are taken care of for you!
71
OpenCMIS – Server coding
72
SPI
73
Questions?
• http://www.oasis-open.org/
committees/cmis/
• http://docs.oasis-open.org/cmis/
CMIS/v1.0/cs01/cmis-spec-v1.0.html
• http://incubator.apache.org/chemistry/
• http://doc.nuxeo.com/
74

More Related Content

What's hot

Credential store using HashiCorp Vault
Credential store using HashiCorp VaultCredential store using HashiCorp Vault
Credential store using HashiCorp VaultMayank Patel
 
Red Hat Openshift Fundamentals.pptx
Red Hat Openshift Fundamentals.pptxRed Hat Openshift Fundamentals.pptx
Red Hat Openshift Fundamentals.pptxssuser18b1c6
 
How Netflix Tunes EC2 Instances for Performance
How Netflix Tunes EC2 Instances for PerformanceHow Netflix Tunes EC2 Instances for Performance
How Netflix Tunes EC2 Instances for PerformanceBrendan Gregg
 
Secret Management with Hashicorp Vault and Consul on Kubernetes
Secret Management with Hashicorp Vault and Consul on KubernetesSecret Management with Hashicorp Vault and Consul on Kubernetes
Secret Management with Hashicorp Vault and Consul on KubernetesAn Nguyen
 
Container Security Deep Dive & Kubernetes
Container Security Deep Dive & Kubernetes Container Security Deep Dive & Kubernetes
Container Security Deep Dive & Kubernetes Aqua Security
 
Keeping a Secret with HashiCorp Vault
Keeping a Secret with HashiCorp VaultKeeping a Secret with HashiCorp Vault
Keeping a Secret with HashiCorp VaultMitchell Pronschinske
 
Overview of secret management solutions and architecture
Overview of secret management solutions and architectureOverview of secret management solutions and architecture
Overview of secret management solutions and architectureYuechuan (Mike) Chen
 
Best practices for ansible
Best practices for ansibleBest practices for ansible
Best practices for ansibleGeorge Shuklin
 
DevOps Meetup ansible
DevOps Meetup   ansibleDevOps Meetup   ansible
DevOps Meetup ansiblesriram_rajan
 
Hashicorp Terraform Open Source vs Enterprise
Hashicorp Terraform Open Source vs EnterpriseHashicorp Terraform Open Source vs Enterprise
Hashicorp Terraform Open Source vs EnterpriseStenio Ferreira
 
Applications secure by default
Applications secure by defaultApplications secure by default
Applications secure by defaultSecuRing
 
Vanrish Mulesoft Integration architect ppt
Vanrish Mulesoft Integration architect pptVanrish Mulesoft Integration architect ppt
Vanrish Mulesoft Integration architect pptRajnish Kumar
 
Secret Management with Hashicorp’s Vault
Secret Management with Hashicorp’s VaultSecret Management with Hashicorp’s Vault
Secret Management with Hashicorp’s VaultAWS Germany
 
Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...
Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...
Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...Vietnam Open Infrastructure User Group
 
Encryption and Key Management in AWS
Encryption and Key Management in AWSEncryption and Key Management in AWS
Encryption and Key Management in AWSAmazon Web Services
 
aclpwn - Active Directory ACL exploitation with BloodHound
aclpwn - Active Directory ACL exploitation with BloodHoundaclpwn - Active Directory ACL exploitation with BloodHound
aclpwn - Active Directory ACL exploitation with BloodHoundDirkjanMollema
 

What's hot (20)

AWS WAF
AWS WAFAWS WAF
AWS WAF
 
Credential store using HashiCorp Vault
Credential store using HashiCorp VaultCredential store using HashiCorp Vault
Credential store using HashiCorp Vault
 
Red Hat Openshift Fundamentals.pptx
Red Hat Openshift Fundamentals.pptxRed Hat Openshift Fundamentals.pptx
Red Hat Openshift Fundamentals.pptx
 
How Netflix Tunes EC2 Instances for Performance
How Netflix Tunes EC2 Instances for PerformanceHow Netflix Tunes EC2 Instances for Performance
How Netflix Tunes EC2 Instances for Performance
 
Secret Management with Hashicorp Vault and Consul on Kubernetes
Secret Management with Hashicorp Vault and Consul on KubernetesSecret Management with Hashicorp Vault and Consul on Kubernetes
Secret Management with Hashicorp Vault and Consul on Kubernetes
 
Container Security Deep Dive & Kubernetes
Container Security Deep Dive & Kubernetes Container Security Deep Dive & Kubernetes
Container Security Deep Dive & Kubernetes
 
Keeping a Secret with HashiCorp Vault
Keeping a Secret with HashiCorp VaultKeeping a Secret with HashiCorp Vault
Keeping a Secret with HashiCorp Vault
 
Intro to kubernetes
Intro to kubernetesIntro to kubernetes
Intro to kubernetes
 
Vault
VaultVault
Vault
 
Overview of secret management solutions and architecture
Overview of secret management solutions and architectureOverview of secret management solutions and architecture
Overview of secret management solutions and architecture
 
Best practices for ansible
Best practices for ansibleBest practices for ansible
Best practices for ansible
 
DevOps Meetup ansible
DevOps Meetup   ansibleDevOps Meetup   ansible
DevOps Meetup ansible
 
Hashicorp Terraform Open Source vs Enterprise
Hashicorp Terraform Open Source vs EnterpriseHashicorp Terraform Open Source vs Enterprise
Hashicorp Terraform Open Source vs Enterprise
 
Amazon API Gateway
Amazon API GatewayAmazon API Gateway
Amazon API Gateway
 
Applications secure by default
Applications secure by defaultApplications secure by default
Applications secure by default
 
Vanrish Mulesoft Integration architect ppt
Vanrish Mulesoft Integration architect pptVanrish Mulesoft Integration architect ppt
Vanrish Mulesoft Integration architect ppt
 
Secret Management with Hashicorp’s Vault
Secret Management with Hashicorp’s VaultSecret Management with Hashicorp’s Vault
Secret Management with Hashicorp’s Vault
 
Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...
Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...
Room 3 - 6 - Nguyễn Văn Thắng & Dzung Nguyen - Ứng dụng openzfs làm lưu trữ t...
 
Encryption and Key Management in AWS
Encryption and Key Management in AWSEncryption and Key Management in AWS
Encryption and Key Management in AWS
 
aclpwn - Active Directory ACL exploitation with BloodHound
aclpwn - Active Directory ACL exploitation with BloodHoundaclpwn - Active Directory ACL exploitation with BloodHound
aclpwn - Active Directory ACL exploitation with BloodHound
 

Viewers also liked

Nuxeo World Session: CMIS - What's Next?
Nuxeo World Session: CMIS - What's Next?Nuxeo World Session: CMIS - What's Next?
Nuxeo World Session: CMIS - What's Next?Nuxeo
 
PLAT-1 CMIS in the Real World
PLAT-1 CMIS in the Real WorldPLAT-1 CMIS in the Real World
PLAT-1 CMIS in the Real WorldAlfresco Software
 
The ECM world from the point of view of Alfresco - Linux Day 2013 - Rome
The ECM world from the point of view of Alfresco - Linux Day 2013 - RomeThe ECM world from the point of view of Alfresco - Linux Day 2013 - Rome
The ECM world from the point of view of Alfresco - Linux Day 2013 - RomePiergiorgio Lucidi
 
0910 cagliari- spring surf and cmis - the dynamic duo
0910 cagliari- spring surf and cmis - the dynamic duo0910 cagliari- spring surf and cmis - the dynamic duo
0910 cagliari- spring surf and cmis - the dynamic duoSymphony Software Foundation
 
The Point Of The Content Interoperability Services (CMIS) Standard
The Point Of The Content Interoperability Services (CMIS) StandardThe Point Of The Content Interoperability Services (CMIS) Standard
The Point Of The Content Interoperability Services (CMIS) StandardLaurence Hart
 
How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0
How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0
How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0CA Technologies
 
Alfresco: What every developer should know
Alfresco: What every developer should knowAlfresco: What every developer should know
Alfresco: What every developer should knowJeff Potts
 
Digital dark age - Are we doing enough to preserve our website heritage?
Digital dark age - Are we doing enough to preserve our website heritage?Digital dark age - Are we doing enough to preserve our website heritage?
Digital dark age - Are we doing enough to preserve our website heritage?Olivier Dobberkau
 
Case Study: SunTrust’s Next Gen QA and Release Services Transformation Journey
Case Study: SunTrust’s Next Gen QA and Release Services Transformation JourneyCase Study: SunTrust’s Next Gen QA and Release Services Transformation Journey
Case Study: SunTrust’s Next Gen QA and Release Services Transformation JourneyCA Technologies
 
Apache Chemistry: The Alfresco Open Source Implementation of CMIS
Apache Chemistry: The Alfresco Open Source Implementation of CMISApache Chemistry: The Alfresco Open Source Implementation of CMIS
Apache Chemistry: The Alfresco Open Source Implementation of CMISAlfresco Software
 
Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012Toni de la Fuente
 
Building Content-Rich Java Apps in the Cloud with the Alfresco API
Building Content-Rich Java Apps in the Cloud with the Alfresco APIBuilding Content-Rich Java Apps in the Cloud with the Alfresco API
Building Content-Rich Java Apps in the Cloud with the Alfresco APIJeff Potts
 
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
 
EclipseCon Eu 2015 - Breathe life into your Designer!
EclipseCon Eu 2015 - Breathe life into your Designer!EclipseCon Eu 2015 - Breathe life into your Designer!
EclipseCon Eu 2015 - Breathe life into your Designer!melbats
 
Alfresco As SharePoint Alternative - Architecture Overview
Alfresco As SharePoint Alternative - Architecture OverviewAlfresco As SharePoint Alternative - Architecture Overview
Alfresco As SharePoint Alternative - Architecture OverviewAlfresco Software
 
Developer’s intro to the alfresco platform
Developer’s intro to the alfresco platformDeveloper’s intro to the alfresco platform
Developer’s intro to the alfresco platformAlfresco Software
 

Viewers also liked (20)

CMIS REST HTTP
CMIS REST HTTPCMIS REST HTTP
CMIS REST HTTP
 
Nuxeo World Session: CMIS - What's Next?
Nuxeo World Session: CMIS - What's Next?Nuxeo World Session: CMIS - What's Next?
Nuxeo World Session: CMIS - What's Next?
 
PLAT-1 CMIS in the Real World
PLAT-1 CMIS in the Real WorldPLAT-1 CMIS in the Real World
PLAT-1 CMIS in the Real World
 
The ECM world from the point of view of Alfresco - Linux Day 2013 - Rome
The ECM world from the point of view of Alfresco - Linux Day 2013 - RomeThe ECM world from the point of view of Alfresco - Linux Day 2013 - Rome
The ECM world from the point of view of Alfresco - Linux Day 2013 - Rome
 
CMIS Introduction
CMIS IntroductionCMIS Introduction
CMIS Introduction
 
0910 cagliari- spring surf and cmis - the dynamic duo
0910 cagliari- spring surf and cmis - the dynamic duo0910 cagliari- spring surf and cmis - the dynamic duo
0910 cagliari- spring surf and cmis - the dynamic duo
 
The Point Of The Content Interoperability Services (CMIS) Standard
The Point Of The Content Interoperability Services (CMIS) StandardThe Point Of The Content Interoperability Services (CMIS) Standard
The Point Of The Content Interoperability Services (CMIS) Standard
 
TYPO3 and CMIS
TYPO3 and CMISTYPO3 and CMIS
TYPO3 and CMIS
 
How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0
How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0
How to Leverage the Most Modern Print Management Features in CA Spool™ 12.0
 
Alfresco: What every developer should know
Alfresco: What every developer should knowAlfresco: What every developer should know
Alfresco: What every developer should know
 
Digital dark age - Are we doing enough to preserve our website heritage?
Digital dark age - Are we doing enough to preserve our website heritage?Digital dark age - Are we doing enough to preserve our website heritage?
Digital dark age - Are we doing enough to preserve our website heritage?
 
Case Study: SunTrust’s Next Gen QA and Release Services Transformation Journey
Case Study: SunTrust’s Next Gen QA and Release Services Transformation JourneyCase Study: SunTrust’s Next Gen QA and Release Services Transformation Journey
Case Study: SunTrust’s Next Gen QA and Release Services Transformation Journey
 
Apache Chemistry: The Alfresco Open Source Implementation of CMIS
Apache Chemistry: The Alfresco Open Source Implementation of CMISApache Chemistry: The Alfresco Open Source Implementation of CMIS
Apache Chemistry: The Alfresco Open Source Implementation of CMIS
 
Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012Alfresco Security Best Practices 2012
Alfresco Security Best Practices 2012
 
Building Content-Rich Java Apps in the Cloud with the Alfresco API
Building Content-Rich Java Apps in the Cloud with the Alfresco APIBuilding Content-Rich Java Apps in the Cloud with the Alfresco API
Building Content-Rich Java Apps in the Cloud with the Alfresco API
 
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 ...
 
EclipseCon Eu 2015 - Breathe life into your Designer!
EclipseCon Eu 2015 - Breathe life into your Designer!EclipseCon Eu 2015 - Breathe life into your Designer!
EclipseCon Eu 2015 - Breathe life into your Designer!
 
Alfresco As SharePoint Alternative - Architecture Overview
Alfresco As SharePoint Alternative - Architecture OverviewAlfresco As SharePoint Alternative - Architecture Overview
Alfresco As SharePoint Alternative - Architecture Overview
 
Developer’s intro to the alfresco platform
Developer’s intro to the alfresco platformDeveloper’s intro to the alfresco platform
Developer’s intro to the alfresco platform
 
Spring In Alfresco Ecm
Spring In Alfresco EcmSpring In Alfresco Ecm
Spring In Alfresco Ecm
 

Similar to Get content under control with CMIS and Apache Chemistry

Connecting Content Management Apps with CMIS
Connecting Content Management Apps with CMISConnecting Content Management Apps with CMIS
Connecting Content Management Apps with CMISJeff Potts
 
Connecting Content Management Applications with CMIS
Connecting Content Management Applications with CMISConnecting Content Management Applications with CMIS
Connecting Content Management Applications with CMISNuxeo
 
Django introduction @ UGent
Django introduction @ UGentDjango introduction @ UGent
Django introduction @ UGentkevinvw
 
Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)
Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)
Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)Globus
 
Webinar: Building Your First Application with MongoDB
Webinar: Building Your First Application with MongoDBWebinar: Building Your First Application with MongoDB
Webinar: Building Your First Application with MongoDBMongoDB
 
From SQL to MongoDB
From SQL to MongoDBFrom SQL to MongoDB
From SQL to MongoDBNuxeo
 
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...Peter Keane
 
AWS Česko-Slovenský Webinár 03: Vývoj v AWS
AWS Česko-Slovenský Webinár 03: Vývoj v AWSAWS Česko-Slovenský Webinár 03: Vývoj v AWS
AWS Česko-Slovenský Webinár 03: Vývoj v AWSVladimir Simek
 
Leveraging the Globus Platform (GlobusWorld Tour - UCSD)
Leveraging the Globus Platform (GlobusWorld Tour - UCSD)Leveraging the Globus Platform (GlobusWorld Tour - UCSD)
Leveraging the Globus Platform (GlobusWorld Tour - UCSD)Globus
 
Full stack visibility with elastic, KubeCon 2017
Full stack visibility with elastic, KubeCon 2017Full stack visibility with elastic, KubeCon 2017
Full stack visibility with elastic, KubeCon 2017Carlos Pérez-Aradros
 
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 dojoFu Cheng
 
Datomic – A Modern Database - StampedeCon 2014
Datomic – A Modern Database - StampedeCon 2014Datomic – A Modern Database - StampedeCon 2014
Datomic – A Modern Database - StampedeCon 2014StampedeCon
 
Context Information Management in IoT enabled smart systems - the basics
Context Information Management in IoT enabled smart systems - the basicsContext Information Management in IoT enabled smart systems - the basics
Context Information Management in IoT enabled smart systems - the basicsFernando Lopez Aguilar
 
API Testing. Streamline your testing process.
API Testing. Streamline your testing process.API Testing. Streamline your testing process.
API Testing. Streamline your testing process.Andrey Oleynik
 
General Method of HTTP Messages Authentication Based on Hash Functions in Web...
General Method of HTTP Messages Authentication Based on Hash Functions in Web...General Method of HTTP Messages Authentication Based on Hash Functions in Web...
General Method of HTTP Messages Authentication Based on Hash Functions in Web...Denis Kolegov
 

Similar to Get content under control with CMIS and Apache Chemistry (20)

Connecting Content Management Apps with CMIS
Connecting Content Management Apps with CMISConnecting Content Management Apps with CMIS
Connecting Content Management Apps with CMIS
 
Connecting Content Management Applications with CMIS
Connecting Content Management Applications with CMISConnecting Content Management Applications with CMIS
Connecting Content Management Applications with CMIS
 
Introduction to Monsoon PHP framework
Introduction to Monsoon PHP frameworkIntroduction to Monsoon PHP framework
Introduction to Monsoon PHP framework
 
Django introduction @ UGent
Django introduction @ UGentDjango introduction @ UGent
Django introduction @ UGent
 
Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)
Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)
Leveraging the Globus Platform (GlobusWorld Tour - Columbia University)
 
Webinar: Building Your First Application with MongoDB
Webinar: Building Your First Application with MongoDBWebinar: Building Your First Application with MongoDB
Webinar: Building Your First Application with MongoDB
 
04 standard class library c#
04 standard class library c#04 standard class library c#
04 standard class library c#
 
Document db
Document dbDocument db
Document db
 
Elasticsearch Introduction at BigData meetup
Elasticsearch Introduction at BigData meetupElasticsearch Introduction at BigData meetup
Elasticsearch Introduction at BigData meetup
 
From SQL to MongoDB
From SQL to MongoDBFrom SQL to MongoDB
From SQL to MongoDB
 
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
The Role of Atom/AtomPub in Digital Archive Services at The University of Tex...
 
Azure DocumentDB
Azure DocumentDBAzure DocumentDB
Azure DocumentDB
 
AWS Česko-Slovenský Webinár 03: Vývoj v AWS
AWS Česko-Slovenský Webinár 03: Vývoj v AWSAWS Česko-Slovenský Webinár 03: Vývoj v AWS
AWS Česko-Slovenský Webinár 03: Vývoj v AWS
 
Leveraging the Globus Platform (GlobusWorld Tour - UCSD)
Leveraging the Globus Platform (GlobusWorld Tour - UCSD)Leveraging the Globus Platform (GlobusWorld Tour - UCSD)
Leveraging the Globus Platform (GlobusWorld Tour - UCSD)
 
Full stack visibility with elastic, KubeCon 2017
Full stack visibility with elastic, KubeCon 2017Full stack visibility with elastic, KubeCon 2017
Full stack visibility with elastic, KubeCon 2017
 
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
 
Datomic – A Modern Database - StampedeCon 2014
Datomic – A Modern Database - StampedeCon 2014Datomic – A Modern Database - StampedeCon 2014
Datomic – A Modern Database - StampedeCon 2014
 
Context Information Management in IoT enabled smart systems - the basics
Context Information Management in IoT enabled smart systems - the basicsContext Information Management in IoT enabled smart systems - the basics
Context Information Management in IoT enabled smart systems - the basics
 
API Testing. Streamline your testing process.
API Testing. Streamline your testing process.API Testing. Streamline your testing process.
API Testing. Streamline your testing process.
 
General Method of HTTP Messages Authentication Based on Hash Functions in Web...
General Method of HTTP Messages Authentication Based on Hash Functions in Web...General Method of HTTP Messages Authentication Based on Hash Functions in Web...
General Method of HTTP Messages Authentication Based on Hash Functions in Web...
 

Recently uploaded

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 

Recently uploaded (20)

Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 

Get content under control with CMIS and Apache Chemistry

  • 1. Get your content under control with CMIS and Apache Chemistry Florent Guillaume fg@nuxeo.com twitter.com/efge ApacheCon NA, 2010-11-03
  • 2. Agenda • CMIS • Apache Chemistry • OpenCMIS Client coding • OpenCMIS Server coding 2
  • 3. Who am I? • Florent Guillaume – fg@nuxeo.com • Director of R&D at Nuxeo – http://nuxeo.com – http://doc.nuxeo.com • Nuxeo Architect • Apache Committer • Member of JSR 283, OASIS CMIS TC 3
  • 4. Glossary • CMIS – Content Management Interop. Services • CMS, DMS, DAM, WCM, ECM, RM... – content, document, asset, record... • Content Stream – resource / file from a filesystem • Document – self-contained, structured metadata – high-level operations 4
  • 5. What is CMIS? • Domain Model – services – objects, types, properties – lowest greatest common denominator • Transport Protocols – HTTP-based • No Language API – Apache Chemistry – (although WSDL is actually a language) 5
  • 6. Interoperability • Application / Repository – Client / Server • Application ↔ Repository – e.g. photo management • Repository ↔ Repository – e.g. archival, publishing • Repository federation – central access to heterogenous systems 6
  • 7. CMIS Implementations • Product → Client / Repository • Repositories – Alfresco, Nuxeo, Microsoft, IBM, SAP, eXo, Day, Jahia, KnowledgeTree, ... • Clients – Adobe, IBM, Microsoft, eZ Publish, Plone, Drupal, Joomla, ... 7
  • 20. CMIS Benefits • Customer benefits – interoperability between vendors – common model – “desilofication” – “commoditization” • Vendor benefits – repository vendors get more apps – applications vendors get more repos 20
  • 21. CMIS Domain Model • Objects: Folders, Documents • Properties – scalars, lists • string, boolean, decimal, integer, datetime, uri, id, html – binary content stream • Types – inheritance, constraints – standard properties • id, name, creation, modification, version, ... 21
  • 23. Document Properties • 5ba79978-a87f-4146-9dd4-5197c5ac0962 – cmis:objectId: 5ba79978-a87f-4146-9dd4-5197c5ac0962 – cmis:objectTypeId: invoice – cmis:name: My Document – cmis:creationDate: 2010-01-25T10:15:07.155-08:00 – cmis:createdBy: florent – cmis:lastModificationDate: 2010-01-25T10:20:53.286-08:00 – cmis:lastModifiedBy: florent – cmis:contentStreamFileName: mydocument.pdf – cmis:contentStreamMimeType: application/pdf – cmis:isLatestVersion: true – cmis:versionLabel: v1.5 – keywords: [example, sample, frobs] – importance: high 23
  • 24. Type Definition Properties • invoice – cmis:objectId: ID – cmis:objectTypeId: ID – cmis:name: String – cmis:creationDate: DateTime (read-only) – cmis:createdBy: String (read-only) – cmis:lastModificationDate: DateTime – cmis:isLatestVersion: Boolean – keywords: String (multi-valued, not required) – importance: String (choices: low, medium, high) 24
  • 25. Type Definition • invoice – id: invoice – localName: t-invoice – displayName: Invoice – baseId: cmis:document – parentId: record – fileable: true – queryable: true – fulltextIndexed: true – controllableACL: false 25
  • 26. CMIS Services • CRUD • Queries • Versioning • Renditions • Relationships • Multi-Filing, ACLs, Change Log, Policies • Repositories, Types 26
  • 27. Retrieve • By ID • By Path – ID ≠ name ≠ path segment ≠ file name • Parent(s) / Children / Tree • Properties • Content Stream • Allowable Actions • Renditions 27
  • 28. Retrieve Examples (I) • By ID ObjectId  id  =  session.createObjectId(        "5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962"); CmisObject  object  =  session.getObject(id); • By Path Folder  folder  =  (Folder)  session.getObjectByPath(        "/corporate/invoices/foo"); • Children for  (CmisObject  child  :  folder.getChildren())  {        ... } 28
  • 29. Retrieve Examples (II) • Properties List<String>  kw  =  doc.getPropertyValue("keywords"); • Content Stream ContentStream  cs  =  doc.getContentStream(); String  filename  =  cs.getFileName(); InputStream  stream  =  cs.getStream(); 29
  • 30. Query • Retrieve by content • SQL-like Language – Type → Table – Object → Row – Property → Column – Multi-Valued, Fulltext + Score, JOIN • SELECT only – no UPDATE, DELETE 30
  • 31. Query Examples • Query ItemIterable<QueryResult>  list  =  session.query(        "SELECT  cmis:objectId  FROM  ...",  true); for  (QueryResult  qr  :  list)  {        qr.getPropertyById("cmis:name"); } • CMISQL SELECT  cmis:objectId,  cmis:name,  SCORE()  AS  sc    FROM  cmis:document    WHERE  importance  =  'high'        AND  'frobs'  =  ANY  keywords        AND  IN_TREE('5ba79978-­‐a87f')        AND  CONTAINS('barack  OR  obama')    ORDER  BY  sc  DESC 31
  • 32. Create, Update, Delete • Create – may need content stream – may check in • Update – may verify a change token – may change ID (auto-versioning) • Delete – may delete all versions 32
  • 33. CRUD Examples • Create Map<String,  Serializable>  props  =        new  HashMap<String,  Serializable>(); props.put(PropertyIds.OBJECT_TYPE_ID,  "Note"); props.put(PropertyIds.NAME,  "mynote"); Document  doc  =  folder.createDocument(props,        contentStream,  null); • Update doc.updateProperties(props); • Delete doc.delete(); 33
  • 34. Versioning • Version Series • Private Working Copy • Check In, Check Out • Get All Versions • (optional feature) 34
  • 35. Versioning Examples • Check Out ObjectId  pwcId  =  doc.checkOut(); • Check In ObjectId  verId  =  doc.checkIn(true,  null,  true,  "foo"); • Get All Versions List<Document>  docs  =  doc.getAllVersions(); 35
  • 36. Versioning Variants • No versioning (no type versionable) • Auto-versioning – create new version on each edit • PWC not updatable – explicit check in with new changes • Version-specific filing • Versions searchable or not 36
  • 37. Renditions • Retrieve Only • Additional Content Streams – MIME type, kind, title, size • Various uses – thumbnail / icon – transformations • PDF, HTML • Multi-Page • (optional feature) 37
  • 38. Renditions Examples • Get Renditions for  (Rendition  rendition  :  doc.getRenditions())  {        String  kind  =  rendition.getKind();        String  title  =  rendition.getTitle();        String  mimeType  =  rendition.getMimeType();        ContentStream  cs  =  rendition.getContentStream();        ... } 38
  • 39. Relationships • Source, Target • Unfiled, not versionable • May be queryable, controllable • May use referential integrity • (optional feature) 39
  • 40. Relationships Examples • Create Relationship Map<String,  Serializable>  props  =        new  HashMap<String,  Serializable>(); props.put(PropertyIds.OBJECT_TYPE_ID,  "Depends"); props.put(PropertyIds.SOURCE_ID,  source.getId()); props.put(PropertyIds.TARGET_ID,  target.getId()); ObjectId  relId  =  session.createRelationship(props); • Get Relationships for  (Relationship  rel  :  doc.getRelationships())  {        ... } 40
  • 41. Multi-Filing, Unfiling • Only for documents, not folders • Zero, one or more parents • All parents are equivalent • Different paths – (if paths are supported) 41
  • 44. Multi-Filing Example • Multi-Filing doc.addToFolder(folderId,  false); • Unfiling doc.removeFromFolder(folderId); 44
  • 45. ACLs • Basic Read & Write permissions • Repository-specific permissions • Can be inherited along folder hierarchy • Can be updated • Mapping to Allowable Actions – ACL: bob has Read / Write here – AA: bob canMoveObject here – canMoveObject (on Object + Source + Target) 45
  • 46. Change Log • List of chronological changes to the repository – create, update, delete – ID of object – optionally properties, ACLs, policies • Since a given date (change log token) • May not be available since “forever” 46
  • 47. Change Log Examples • Get Content Changes ChangeEvents  events  =  session.getContentChanges(        token,  includeProperties,  1000); for  (ChangeEvent  ev  :  events.getChangeEvents())  {        ObjectId  id  =  ev.getObjectId();        Calendar  time  =  ev.getChangeTime();        if  (ev.getChangeType()  ==  ChangeType.UPDATED)  {                props  =  ev.getProperties();                ...        } } if  (events.getHasMoreItems())  {        token  =  events.getLatestChangeLogToken(); } ... 47
  • 48. Policies • Attach policies to controllable objects • Repository-specific • Security policies • Aspects / Facets / Mixins • RM: Retention, Legal Hold 48
  • 49. Repositories • When connecting, list repositories • Find out repository capabilities – implemented services, tree-based navigation, multi-filing, unfiling, query capabilities, ... • Get repository-wide information – description, vendor, CMIS version, ... – root folder ID – latest change log token 49
  • 50. CMIS Bindings • AtomPub – ReST base – URI templates • SOAP – Common Web Services • Browser Bindings – JSON-based (work in progress) • ... more possible 50
  • 51. AtomPub 51 GET  http://cmisexample.oasis-­‐open.org/rep1/5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962  HTTP/1.0 HTTP/1.1  200  Ok Content-­‐Type:  application/atom+xml;type=entry <atom:entry>        <atom:content  src="..."/>        <atom:id>urn:uuid:5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962</atom:id>        <atom:title  type="text">CMIS  Example  Document</atom:title>        <atom:updated>2010-­‐01-­‐25T10:20:53.286-­‐08:00</atom:updated>        <atom:link  rel="self"  href="..."/>        <atom:link  rel="edit"  href="..."/>        <atom:link  type="application/atom+xml;type=entry"  rel="describedby"  href="..."/>        <atom:link  type="application/atom+xml;type=feed"  rel="up"  href="..."/>        <atom:link  type="application/atom+xml;type=feed"  rel="version-­‐history"  href="..."/>        <cmisra:object>                <cmis:allowableActions>...</cmis:allowableActions>                <cmis:properties>                        ...                </cmis:properties>        </cmisra:object> </atom:entry>
  • 52. Non-ReST AtomPub • URI templates 52 http://example.com/rep1/objectbyid/{id} ?filter={filter} &includeAllowableActions={includeAllowableActions} &includePolicyIds={includePolicyIds} &includeRelationships={includeRelationships} &includeACL={includeACL}
  • 53. SOAP 53 <S:Envelope>        <S:Body>                <cmism:getProperties>                        <cmism:repositoryId>rep1</cmism:repositoryId>                        <cmism:objectId>                                5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962                        </cmism:objectId>                </cmism:getProperties>        </S:Body> </S:Envelope> <S:Envelope>        <S:Body>                <cmism:getPropertiesResponse>                        <cmism:properties>                                ...                        </cmism:properties>                </cmism:getPropertiesResponse>        </S:Body> </S:Envelope>
  • 54. XML Payload 54 <cmis:properties>        <cmis:propertyId  propertyDefinitionId="cmis:objectId">                <cmis:value>5ba79978-­‐a87f-­‐4146-­‐9dd4-­‐5197c5ac0962</cmis:value>        </cmis:propertyId>        <cmis:propertyId  propertyDefinitionId="cmis:objectTypeId">                <cmis:value>invoice</cmis:value>        </cmis:propertyId>        <cmis:propertyString  propertyDefinitionId="cmis:name">                <cmis:value>My  Document</cmis:value>        </cmis:propertyString>        <cmis:propertyDateTime  propertyDefinitionId="cmis:creationDate">                <cmis:value>2010-­‐01-­‐25T10:20:53.364-­‐08:00</cmis:value>        </cmis:propertyDateTime>        <cmis:propertyString  propertyDefinitionId="cmis:contentStreamFileName">                <cmis:value>mydocument.pdf</cmis:value>        </cmis:propertyString>        <cmis:propertyString  propertyDefinitionId="cmis:contentStreamMimeType">                <cmis:value>application/pdf</cmis:value>        </cmis:propertyString>        <cmis:propertyString  propertyDefinitionId="keywords">                <cmis:value>example</cmis:value>                <cmis:value>sample</cmis:value>                <cmis:value>frobs</cmis:value>        </cmis:propertyString> </cmis:properties>
  • 55. CMIS Miscellanea • Stateless • Transaction-less • Authentication left to repository – HTTP Basic Auth, WS-Security + Username Token 55
  • 56. History of CMIS (I) • Founding members (from iECM) work on a new standard – 2006 – EMC, IBM, Microsoft • Contributing members invited for review – Aug 2007 – Alfresco, Open Text, Oracle, SAP 56
  • 57. History of CMIS (II) • Draft spec submitted to OASIS – September 2008 • OASIS committee formed – November 2008 • First public draft released – October 2009 • CMIS 1.0 standard approved – May 2010 57
  • 58. History of CMIS (III) • OASIS TC members – Adobe, Adullact, Alfresco, ASG Software Solutions, Booz Allen Hamilton, Citytech, Content Technologies, Day, dotCMS, Ektron, EMC, Entropysoft, Exalead, FatWire, Fidelity Investments, Flatirons Solutions, fme, Genus Technologies, Greenbytes, Harris Corp, IBM, Magnolia, Microsoft, Nuxeo, Open Text, Oracle, Pearson, Quark, SAP, Saperion, Structured Software Systems, Sun, Vamosa, Vignette, WeWebU 58
  • 59. Future of CMIS • CMIS 1.1 – late 2011 – errata, clarifications – additional bindings – type mutability? • CMIS 2.0 – late 2012? – bigger features or non-backward compat • Transactions, Hierarchical/complex properties, Mixin types, WebDAV binding, Batch, Multiple content streams, Internationalization, More explicit exceptions, Better exposure of renditions, RepositoryInfo Property types support, AtomPub expressibility and clean-up, Type management, Records Management, Pessimistic locking, Workflow, Content Tagging, Content Recommendations, Commenting, Social – 59
  • 60. Other Standards • ODMA – desktop-oriented • WebDAV, DeltaV – filesystem-oriented • RSS, AtomPub – limited domain model • JCR (JSR-170, JSR-283) – Java-specific 60
  • 61. Apache Chemistry • Incubating project – started in 2009 – http://incubator.apache.org/chemistry/ • Implement whole CMIS spec • Client-side – Java (OpenCMIS) – Python, PHP, JavaScript • Server-side – Java (OpenCMIS) 61
  • 62. Chemistry / OpenCMIS History • Original Chemistry project – Day, Nuxeo in 2009 • OpenCMIS started privately – Alfresco, Open Text, SAP – Proposed to Apache in December 2009 • Chemistry and OpenCMIS merge – 3 days of meetings in April 2010 • OpenCMIS 0.1.0 released Sept. 2010 62
  • 63. OpenCMIS Facts • 90k lines of Java – OSGi bundles – 5 JARs needed for a client – Built with Maven • Covers all aspects of the spec • Extensible • Lots of tests • Contributors – Alfresco, Day, Nuxeo, Open Text, SAP... 63
  • 64. OpenCMIS Components • Client API • Client implementation – CMIS Workbench • Server SPI • Server implementations – filesystem – in-memory • Transport protocol bindings – AtomPub, SOAP, JSON 64
  • 68. Clients using OpenCMIS • Spring Surf CMIS Application Browser • Confluence CMIS Plugin • CMIS Explorer • CMIS connectivity for SAP Applications (upcoming) • Struts2CmisExplorer • CMIS Workbench • Alfresco Web Quick Start 68
  • 69. Servers using OpenCMIS • Open Text Enterprise Library CMIS Connector • OpenWGA CMIS Connectivity Plugin • Alfresco CMIS Preview • Nuxeo CMIS Connector 69
  • 70. OpenCMIS – Client coding 70 • See above :)
  • 71. OpenCMIS – Server coding • Define model mapping – types, property types – ids, path segments, names – files, filenames – versioning, locking, content log • Implement the SPI – CmisService • Bindings are taken care of for you! 71
  • 72. OpenCMIS – Server coding 72