SlideShare a Scribd company logo
Using Enterprise Content in Grails!
             Robin Bramley, Ixxus!
Agenda!

 •  Who I am!
 •  Setting the scene!
  •  Grails!
  •  CMIS!
 •  Sample application styles!
  •  Document Management!
  •  Managed web content!
 •  CMIS clients!
  •  Roll your own!
  •  OpenCMIS!
 •  Practicalities!
  •  Alfresco extensions to CMIS!
  •  Performance!
 •  Grails OpenCMIS Plugin!
  •  Alternatives!
My Background!

 •  Senior Architect @ Ixxus!
  •  The UK Platinum partner!
 •  Worked at consultancies for 13 years!
  •  Developing solutions with Alfresco since 0.6!
  •  First UK Alfresco Gold partner!
 •  Around the edges I also write!
  •  GroovyMag author – inc. 4 hands-on Grails articles!
  •  DZone Most Valuable Blogger!
    •     Re-published my series on Grails & Hudson / Jenkins!
  •  Open source contributions!
    •     OpenID support for Acegi / Spring Security!
    •     Codenarc support for Hudson / Jenkins CI Violations plugin!
         •    Presented at the London GGUG!
Grails!

  •  Full-stack web framework!
    •     Embedded Tomcat & database!
    •     Allows for rapid development!
         •    > grails create-application test
         •    > cd test
         •    > grails run-app
  •  Scaffolding from domain classes!
  •  Convention over configuration!
  •  Builds on the shoulders of Giants!
    •     Groovy!
    •     Spring Framework!
    •     Spring MVC!
    •     Hibernate!
  •  Rich plugin ecosystem!
  •  Backed by SpringSource!
CMIS!

 Content Management Interoperability Services standard!
 • Open standard published by OASIS!
   •     Version 1.0 – 1st May 2010!
   •     Alfresco 3.3 was first CMIS 1.0 compliant product launched!
 • ʻSQL for contentʼ!
   •     Query language!
   •     Virtual tables!
        •    Folder!
        •    Document!
        •    Relationship!
        •    Policy!
 • Bindings (ʻJDBC/ODBC equivalentʼ)!
   •     REST / AtomPub!
   •     SOAP Web Services!
   •     Browser binding in CMIS 1.1!
Documents & Folders!

Document                         Folder
  •  Has a set of metadata         •  Has a set of metadata
     properties !                     properties!
    •    Columns!                  •  Can have zero or more
    •    Custom extensions!           children!
  •  May have a content stream       •    Documents or Folders!
     (e.g. an actual file)!
  •  May have renditions!
CMIS Repository Information !

Service Document
    •  3.x CMIS AtomPub binding: /alfresco/service/cmis
    •  4.x CMIS AtomPub binding: /alfresco/cmisatom

<cmisra:repositoryInfo>
 <cmis:repositoryId>ea9c2b9e-2892-4370-8791-4b0049f917f3</cmis:repositoryId>
 <cmis:repositoryName>Main Repository</cmis:repositoryName>
 <cmis:repositoryDescription>Main Repository</cmis:repositoryDescription>
 <cmis:vendorName>Alfresco</cmis:vendorName>
 <cmis:productName>Alfresco Repository (Community)</cmis:productName>
 <cmis:productVersion>4.0.0 (a 3755)</cmis:productVersion>
 <cmis:rootFolderId>workspace://SpacesStore/784b5b19-61ee-4963-a367-
db6164ed43af</cmis:rootFolderId>
CMIS Query Syntax!
SQL like
•  Subset of SQL-92 with some extensions !
  •    SELECT * FROM cmis:document
  •    SELECT * FROM cmis:folder
       WHERE IN_FOLDER(‘folder-id’)
  •    SELECT * FROM cmis:document
       WHERE IN_TREE(‘folder-id’)
  •    SELECT cmis:objectId, cmis:name, cmis:contentStreamLength
       FROM cmis:DOCUMENT
       WHERE contains(‘fox’) OR cmis:name like ‘%fox%’

•  The complete BNF grammar is included in the specification at 

   http://docs.oasis-open.org/cmis/CMIS/v1.0/os/cmis-spec-
   v1.0.html#_Toc243905422 !
CMIS Query Submission!
•  Queries are submitted by POSTing application/cmisquery+xml
  •    Accepted response format e.g. application/atom+xml;type=feed

<cmis:query xmlns:cmis=’http://docs.oasis-open.org/ns/cmis/core/200908/’>
  <cmis:statement>SELECT * FROM cmis:document</cmis:statement>
  <cmis:searchAllVersions>false</cmis:searchAllVersions>
  <cmis:includeAllowableActions>false<cmis:includeAllowableActions>
  <cmis:includeRelationships>none</cmis:includeRelationships>
  <cmis:renditionFilter>*</cmis:renditionFilter>
  <cmis:maxItems>-1</cmis:maxItems>
  <cmis:pageSize>-1</cmis:pageSize>
  <cmis:skipCount>0</cmis:skipCount>
</cmis:query>
Atom response!
Atom response – feed metadata!


                       <author><name>System</name></author>
                       <generator version="4.0.0">Alfresco</generator>
                       <icon>http://localhost:8080/alfresco/images/logo/
                       <id>urn:uuid:784b5b19-61ee-4963-a367-db6164ed43af
                       <title>Company Home Children</title>
                       <updated>2011-11-01T18:54:14.541Z</updated>
                       <opensearch:totalResults>5</opensearch:totalResul
                       <opensearch:startIndex>0</opensearch:startIndex>
                       <opensearch:itemsPerPage>-1</opensearch:itemsPerP
                       <cmisra:numItems>5</cmisra:numItems>
Atom response – entry!

                         <author><name>admin</name></author>
                         <content src="http://localhost:8080/alfresco/serv
                         <published>2011-11-01T18:54:14.529Z</published>
                         <summary></summary>
                         <title>Projects</title>
                         <updated>2011-11-01T18:54:38.831Z</updated>
                         <app:edited>2011-11-01T18:54:38.831Z</app:edited>
                         <alf:icon>http://localhost:8080/alfresco/images/i
                         <cmisra:object>
                          <cmis:properties>
                           <cmis:propertyId propertyDefinitionId="cmis:all
                           <cmis:propertyId propertyDefinitionId="cmis:obj
                           <cmis:propertyString propertyDefinitionId="cmis
                           <cmis:propertyString propertyDefinitionId="cmis
                           <cmis:propertyDateTime propertyDefinitionId="cm
                           <cmis:propertyString propertyDefinitionId="cmis
                           <cmis:propertyString propertyDefinitionId="cmis
                           <cmis:propertyId propertyDefinitionId="cmis:obj
                           <cmis:propertyDateTime propertyDefinitionId="cm
                           <cmis:propertyId propertyDefinitionId="cmis:par
                          </cmis:properties>
                         </cmisra:object>
                         <cmisra:pathSegment>Projects</cmisra:pathSegment>
Links!
Folder Tree Navigation
•  Can be achieved through queries!
  •     Specifying attributes means you can pull back less data!
  •     Can also apply criteria!

•  Atom entries also feature links including:!
  •     children (immediate)!
       •    <link rel=”down” href=”http://cmis.alfresco. com:80/service/cmis/s/
            workspace:SpacesStore/ i/2dfb66de-9cb5-4e60-a786-5ea2ad8740d6/
            children” type=”application/atom+xml;type=feed”/> !
Links!
Folder Tree Navigation
•  Atom entries links also including:!
  •     descendants (note type is cmistree)
       •    <link rel=”down” href=”http://cmis.alfresco. com:80/service/cmis/s/
            workspace:SpacesStore/ i/2dfb66de-9cb5-4e60-a786-5ea2ad8740d6/
            descendants” type=”application/cmistree+xml”/> !


  •     tree
       •    <link rel=”http://docs.oasis-open.org/ns/cmis/ link/200908/
            foldertree” href=”http://cmis.alfresco. com:80/service/cmis/s/
            workspace:SpacesStore/ i/2dfb66de-9cb5-4e60-a786-5ea2ad8740d6/tree”
            type=”application/atom+xml;type=feed”/> !


  •     Can apply depth control to these two!
Enough Theory?!
Application styles: Document Management!
Simple repository client
  •  First phase provided browse-search-retrieve!
  •  Intended for mobile usage (as featured in Alfresco 3 Business
     Solutions by Martin Bergljung of Ixxus)!
  •  Uses an in-house roll your own Grails CMIS plugin!
  •  Authenticates users against Alfresco!
Application styles: Document Management!
Simple repository client
Application styles: Web Content!

Blurb-style WCM
  •  Featured in!
    •    Code requested by NASA !
  •  Taglib to embed identified
     content!
    •    Backed by a service!
  •  Uses OpenCMIS!
  •  Application level
     credentials!
Application styles: Web Content!
Associated documents
  •  Web applications commonly have a
     need for associated documents!
    •     E.g. case studies!
  •  This can be achieved by linking a
     record to an Alfresco node reference!
    •     To zero to many documents!
    •     Or a folder!
  •  An application built for one customer
     featured a folder picker for the admins!
    •     Built as a taglib using AJAX with jQuery
          and jQuery UI components:!
         •    dialog!
         •    treeview + treeview.async!
CMIS clients!

Roll your own                              OpenCMIS
  •  Easy with
                              •  Java CMIS client and server
                                                libraries!
    •    Commons HttpClient!                 •  Part of!
    •    XmlSlurper / GPath!                   •    Graduated from incubator in
    •    MarkupBuilder!                             February!
  •  Can add caching in Grails                 •    Currently at version 0.5!
     using Spring Modules                    •  Provides session-level
     Caching!                                   caching!
  •  Flexible!                               •  Used by Alfresco!
    •    Can easily get alf:icon etc.!       •  Doesnʼt support Alfresco
  •  Arguably higher                            CMIS extensions*!
     maintenance!
    •    Minimal changes from
         3.1.1/3.2  3.3/3.4 and then to
         4.0!
Practicalities: Alfresco CMIS extensions!
Aspects
  •  Alfresco uses the CMIS extension mechanism to allow for usage of
     Aspects!
    •    E.g.!
           <alf:aspects>
            <alf:appliedAspects>P:cm:titled</alf:appliedAspects>
            <alf:properties>
             <cmis:propertyString propertyDefinitionId="cm:description"
           displayName="Description" queryName="cm:description">
              <cmis:value></cmis:value></cmis:propertyString>
             <cmis:propertyString propertyDefinitionId="cm:title" displayName="Title"
           queryName="cm:title">
              <cmis:value></cmis:value></cmis:propertyString>
            </alf:properties>
           </alf:aspects>
  •  There is also an Alfresco OpenCMIS Extension!
    •    http://code.google.com/a/apache-extras.org/p/alfresco-opencmis-extension/ !
    •    Custom aspect-aware ObjectFactory implementation!
    •    0.2 POM depends on OpenCMIS Client Impl 0.3!
Practicalities: Performance!
Tips
  •  Filter!
   •  Donʼt ask for more data than you need!
     •    Specify columns on queries (the wildcard is lazy)!
     •    Use the OperationContext filter!

  •  Cache!
   •  Donʼt repeat yourself requests!
     •    Use OpenCMIS session-level caching!
     •    Use Spring Modules application level caching if appropriate!
     •    Consider reverse proxy caches such as Varnish!

  •  Compress!
   •  Donʼt waste bandwidth!
     •    Compress the XML data types if the clients can handle it

          (see http://wiki.alfresco.com/wiki/CMIS#Compression) !
Time to crack open the code!
Grails OpenCMIS Plugin!
 •  What happened to it?!
  •  I jokingly blame Marc Palmer and his advice to plugin authors…!
    •     Distilled guidance: “Make it work, make it simple, make it magic”!
    •     Though he didnʼt want people to not put a 0.1 out there!
  •  But in reality the sponsoring project got delayed!
 •  So what magic is being considered for the road map?!
  •  Content-centric DSL !
    •     Primarily around OpenCMIS API!
  •  GORM domain mapWith / mapping magic!
    •     Could join the data mapping project as datastore-cmis!
    •     static mapWith = “cmis”
    •     Dynamic finders / criteria could use CMIS QL!
    •     But need to work out how feasible associative documents are!
         •    E.g. only persist certain properties to CMIS

              byte[] document
              static mapping = { document mapWith:’cmis’ }
  •  Plus taglibs, service, implementing the Alfresco extensions as a
     child plugin etc.!
Alternative Plugins!

Other possible solutions
 •  Plugins that use the RivetLogic APIs!
   • http://www.grails.org/plugin/alfresco!
     •    Last release 0.4 for Grails 1.1.1 in Feb 2010!
     •    Bundles old Alfresco core/repository jars and CMA 1.11!


   • https://github.com/fix/grails-alfresco-plugin - uses Remote Access API rivet !

   • RivetLogicʼs Crafter rivet for Grails!
     •    June 2010!

 •  GORM JCR datastore!
   • Had dependencies on Jackrabbit!
Twitter: @rbramley

 GitHub: https://github.com/rbramley 

Blog: http://leanjavaengineering.com/ 

     Web: http://www.ixxus.com !

More Related Content

PDF
BP-6 Repository Customization Best Practices
KEY
SOA on Rails
PDF
Padrino - the Godfather of Sinatra
PDF
Super Fast Application development with Mura CMS
KEY
RESTful Api practices Rails 3
PDF
遇見 Ruby on Rails
PDF
Ruby on Rails Security
KEY
Flash And Dom
BP-6 Repository Customization Best Practices
SOA on Rails
Padrino - the Godfather of Sinatra
Super Fast Application development with Mura CMS
RESTful Api practices Rails 3
遇見 Ruby on Rails
Ruby on Rails Security
Flash And Dom

What's hot (20)

PDF
CUST-2 New Client Configuration & Extension Points in Share
KEY
ClubAJAX Basics - Server Communication
PPT
Build Your Own CMS with Apache Sling
PDF
FITC - Here Be Dragons: Advanced JavaScript Debugging
PDF
RESTful Web Applications with Apache Sling
PDF
Riding rails for 10 years
PDF
Service-Oriented Design and Implement with Rails3
PDF
JSON REST API for WordPress
PDF
Hey My Web App is Slow Where is the Problem
PPT
Node and Azure
PDF
4 JVM Web Frameworks
PDF
Polyglot Messaging with Apache ActiveMQ
PDF
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
PDF
ActiveMQ Performance Tuning
PPTX
Best Practices for Building WordPress Applications
PPTX
Hybrid Mobile Development with Apache Cordova and
KEY
Supa fast Ruby + Rails
PPTX
Java script nirvana in netbeans [con5679]
PPTX
Ruby on Rails Penetration Testing
PPTX
Developing in the Cloud
CUST-2 New Client Configuration & Extension Points in Share
ClubAJAX Basics - Server Communication
Build Your Own CMS with Apache Sling
FITC - Here Be Dragons: Advanced JavaScript Debugging
RESTful Web Applications with Apache Sling
Riding rails for 10 years
Service-Oriented Design and Implement with Rails3
JSON REST API for WordPress
Hey My Web App is Slow Where is the Problem
Node and Azure
4 JVM Web Frameworks
Polyglot Messaging with Apache ActiveMQ
In The Trenches With Tomster, Upgrading Ember.js & Ember Data
ActiveMQ Performance Tuning
Best Practices for Building WordPress Applications
Hybrid Mobile Development with Apache Cordova and
Supa fast Ruby + Rails
Java script nirvana in netbeans [con5679]
Ruby on Rails Penetration Testing
Developing in the Cloud
Ad

Similar to PLAT-16 Using Enterprise Content in Grails (20)

PDF
PLAT-1 CMIS in the Real World
PDF
PLAT-3 CMIS — What’s coming next?
PDF
Tech talk live alfresco cmis
PPTX
PowerPoint Presentation
PDF
Nuxeo World Session: CMIS - What's Next?
PPTX
Getting Started with CMIS
PDF
OpenCms Days 2012 - OpenCms 8.5: Accessing the VFS repository using CMIS
PPTX
CMIS Introduction
PPTX
Connecting Content Management Apps with CMIS
PPTX
Alfresco CMIS
PDF
Connecting Content Management Applications with CMIS
PDF
PLAT-2 CMIS - What’s coming next?
PDF
Cmis Virtual Training Webinar 24 Nov09
PDF
CMIS is here, did you know?
PPTX
Relational Won't Cut It: Architecting Content Centric Apps
PDF
CMIS Plugfest Basel 2009
PDF
CMIS and Apache Chemistry (ApacheCon 2010)
PDF
PLAT-17 Alfresco iOS Mobile Application Details and Design
PDF
Apache Chemistry: The Alfresco Open Source Implementation of CMIS
PDF
Optaros Surf Code Camp Lab 4
PLAT-1 CMIS in the Real World
PLAT-3 CMIS — What’s coming next?
Tech talk live alfresco cmis
PowerPoint Presentation
Nuxeo World Session: CMIS - What's Next?
Getting Started with CMIS
OpenCms Days 2012 - OpenCms 8.5: Accessing the VFS repository using CMIS
CMIS Introduction
Connecting Content Management Apps with CMIS
Alfresco CMIS
Connecting Content Management Applications with CMIS
PLAT-2 CMIS - What’s coming next?
Cmis Virtual Training Webinar 24 Nov09
CMIS is here, did you know?
Relational Won't Cut It: Architecting Content Centric Apps
CMIS Plugfest Basel 2009
CMIS and Apache Chemistry (ApacheCon 2010)
PLAT-17 Alfresco iOS Mobile Application Details and Design
Apache Chemistry: The Alfresco Open Source Implementation of CMIS
Optaros Surf Code Camp Lab 4
Ad

More from Alfresco Software (20)

PPTX
Alfresco Day Benelux Inholland studentendossier
PPTX
Alfresco Day Benelux Hogeschool Inholland Records Management application
PPTX
Alfresco Day BeNelux: Customer Success Showcase - Saxion Hogescholen
PPTX
Alfresco Day BeNelux: Customer Success Showcase - Gemeente Amsterdam
PPTX
Alfresco Day BeNelux: The success of Alfresco
PDF
Alfresco Day BeNelux: Customer Success Showcase - Credendo Group
PDF
Alfresco Day BeNelux: Digital Transformation - It's All About Flow
PDF
Alfresco Day Vienna 2016: Activiti – ein Katalysator für die DMS-Strategie be...
PDF
Alfresco Day Vienna 2016: Elektronische Geschäftsprozesse auf Basis von Alfre...
PDF
Alfresco Day Vienna 2016: Alfrescos neue Rest API
PDF
Alfresco Day Vienna 2016: Support Tools für die Admin-Konsole
PDF
Alfresco Day Vienna 2016: Entwickeln mit Alfresco
PDF
Alfresco Day Vienna 2016: Activiti goes enterprise: Die Evolution der BPM Sui...
PDF
Alfresco Day Vienna 2016: Partner Lightning Talk: Westernacher
PDF
Alfresco Day Vienna 2016: Bringing Content & Process together with the App De...
PDF
Alfresco Day Vienna 2016: Partner Lightning Talk - it-novum
PDF
Alfresco Day Vienna 2016: How to Achieve Digital Flow in the Enterprise - Joh...
PDF
Alfresco Day Warsaw 2016 - Czy możliwe jest spełnienie wszystkich regulacji p...
PDF
Alfresco Day Warsaw 2016: Identyfikacja i podpiselektroniczny - Safran
PDF
Alfresco Day Warsaw 2016: Advancing the Flow of Digital Business
Alfresco Day Benelux Inholland studentendossier
Alfresco Day Benelux Hogeschool Inholland Records Management application
Alfresco Day BeNelux: Customer Success Showcase - Saxion Hogescholen
Alfresco Day BeNelux: Customer Success Showcase - Gemeente Amsterdam
Alfresco Day BeNelux: The success of Alfresco
Alfresco Day BeNelux: Customer Success Showcase - Credendo Group
Alfresco Day BeNelux: Digital Transformation - It's All About Flow
Alfresco Day Vienna 2016: Activiti – ein Katalysator für die DMS-Strategie be...
Alfresco Day Vienna 2016: Elektronische Geschäftsprozesse auf Basis von Alfre...
Alfresco Day Vienna 2016: Alfrescos neue Rest API
Alfresco Day Vienna 2016: Support Tools für die Admin-Konsole
Alfresco Day Vienna 2016: Entwickeln mit Alfresco
Alfresco Day Vienna 2016: Activiti goes enterprise: Die Evolution der BPM Sui...
Alfresco Day Vienna 2016: Partner Lightning Talk: Westernacher
Alfresco Day Vienna 2016: Bringing Content & Process together with the App De...
Alfresco Day Vienna 2016: Partner Lightning Talk - it-novum
Alfresco Day Vienna 2016: How to Achieve Digital Flow in the Enterprise - Joh...
Alfresco Day Warsaw 2016 - Czy możliwe jest spełnienie wszystkich regulacji p...
Alfresco Day Warsaw 2016: Identyfikacja i podpiselektroniczny - Safran
Alfresco Day Warsaw 2016: Advancing the Flow of Digital Business

Recently uploaded (20)

PPT
Teaching material agriculture food technology
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
KodekX | Application Modernization Development
PDF
Approach and Philosophy of On baking technology
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Cloud computing and distributed systems.
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Teaching material agriculture food technology
“AI and Expert System Decision Support & Business Intelligence Systems”
Diabetes mellitus diagnosis method based random forest with bat algorithm
KodekX | Application Modernization Development
Approach and Philosophy of On baking technology
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Understanding_Digital_Forensics_Presentation.pptx
MYSQL Presentation for SQL database connectivity
20250228 LYD VKU AI Blended-Learning.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
Cloud computing and distributed systems.
Unlocking AI with Model Context Protocol (MCP)
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Building Integrated photovoltaic BIPV_UPV.pdf
sap open course for s4hana steps from ECC to s4
Chapter 3 Spatial Domain Image Processing.pdf
Network Security Unit 5.pdf for BCA BBA.
Review of recent advances in non-invasive hemoglobin estimation
Dropbox Q2 2025 Financial Results & Investor Presentation
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows

PLAT-16 Using Enterprise Content in Grails

  • 1. Using Enterprise Content in Grails! Robin Bramley, Ixxus!
  • 2. Agenda! •  Who I am! •  Setting the scene! •  Grails! •  CMIS! •  Sample application styles! •  Document Management! •  Managed web content! •  CMIS clients! •  Roll your own! •  OpenCMIS! •  Practicalities! •  Alfresco extensions to CMIS! •  Performance! •  Grails OpenCMIS Plugin! •  Alternatives!
  • 3. My Background! •  Senior Architect @ Ixxus! •  The UK Platinum partner! •  Worked at consultancies for 13 years! •  Developing solutions with Alfresco since 0.6! •  First UK Alfresco Gold partner! •  Around the edges I also write! •  GroovyMag author – inc. 4 hands-on Grails articles! •  DZone Most Valuable Blogger! •  Re-published my series on Grails & Hudson / Jenkins! •  Open source contributions! •  OpenID support for Acegi / Spring Security! •  Codenarc support for Hudson / Jenkins CI Violations plugin! •  Presented at the London GGUG!
  • 4. Grails! •  Full-stack web framework! •  Embedded Tomcat & database! •  Allows for rapid development! •  > grails create-application test •  > cd test •  > grails run-app •  Scaffolding from domain classes! •  Convention over configuration! •  Builds on the shoulders of Giants! •  Groovy! •  Spring Framework! •  Spring MVC! •  Hibernate! •  Rich plugin ecosystem! •  Backed by SpringSource!
  • 5. CMIS! Content Management Interoperability Services standard! • Open standard published by OASIS! •  Version 1.0 – 1st May 2010! •  Alfresco 3.3 was first CMIS 1.0 compliant product launched! • ʻSQL for contentʼ! •  Query language! •  Virtual tables! •  Folder! •  Document! •  Relationship! •  Policy! • Bindings (ʻJDBC/ODBC equivalentʼ)! •  REST / AtomPub! •  SOAP Web Services! •  Browser binding in CMIS 1.1!
  • 6. Documents & Folders! Document Folder •  Has a set of metadata •  Has a set of metadata properties ! properties! •  Columns! •  Can have zero or more •  Custom extensions! children! •  May have a content stream •  Documents or Folders! (e.g. an actual file)! •  May have renditions!
  • 7. CMIS Repository Information ! Service Document •  3.x CMIS AtomPub binding: /alfresco/service/cmis •  4.x CMIS AtomPub binding: /alfresco/cmisatom <cmisra:repositoryInfo> <cmis:repositoryId>ea9c2b9e-2892-4370-8791-4b0049f917f3</cmis:repositoryId> <cmis:repositoryName>Main Repository</cmis:repositoryName> <cmis:repositoryDescription>Main Repository</cmis:repositoryDescription> <cmis:vendorName>Alfresco</cmis:vendorName> <cmis:productName>Alfresco Repository (Community)</cmis:productName> <cmis:productVersion>4.0.0 (a 3755)</cmis:productVersion> <cmis:rootFolderId>workspace://SpacesStore/784b5b19-61ee-4963-a367- db6164ed43af</cmis:rootFolderId>
  • 8. CMIS Query Syntax! SQL like •  Subset of SQL-92 with some extensions ! •  SELECT * FROM cmis:document •  SELECT * FROM cmis:folder WHERE IN_FOLDER(‘folder-id’) •  SELECT * FROM cmis:document WHERE IN_TREE(‘folder-id’) •  SELECT cmis:objectId, cmis:name, cmis:contentStreamLength FROM cmis:DOCUMENT WHERE contains(‘fox’) OR cmis:name like ‘%fox%’ •  The complete BNF grammar is included in the specification at 
 http://docs.oasis-open.org/cmis/CMIS/v1.0/os/cmis-spec- v1.0.html#_Toc243905422 !
  • 9. CMIS Query Submission! •  Queries are submitted by POSTing application/cmisquery+xml •  Accepted response format e.g. application/atom+xml;type=feed <cmis:query xmlns:cmis=’http://docs.oasis-open.org/ns/cmis/core/200908/’> <cmis:statement>SELECT * FROM cmis:document</cmis:statement> <cmis:searchAllVersions>false</cmis:searchAllVersions> <cmis:includeAllowableActions>false<cmis:includeAllowableActions> <cmis:includeRelationships>none</cmis:includeRelationships> <cmis:renditionFilter>*</cmis:renditionFilter> <cmis:maxItems>-1</cmis:maxItems> <cmis:pageSize>-1</cmis:pageSize> <cmis:skipCount>0</cmis:skipCount> </cmis:query>
  • 11. Atom response – feed metadata! <author><name>System</name></author> <generator version="4.0.0">Alfresco</generator> <icon>http://localhost:8080/alfresco/images/logo/ <id>urn:uuid:784b5b19-61ee-4963-a367-db6164ed43af <title>Company Home Children</title> <updated>2011-11-01T18:54:14.541Z</updated> <opensearch:totalResults>5</opensearch:totalResul <opensearch:startIndex>0</opensearch:startIndex> <opensearch:itemsPerPage>-1</opensearch:itemsPerP <cmisra:numItems>5</cmisra:numItems>
  • 12. Atom response – entry! <author><name>admin</name></author> <content src="http://localhost:8080/alfresco/serv <published>2011-11-01T18:54:14.529Z</published> <summary></summary> <title>Projects</title> <updated>2011-11-01T18:54:38.831Z</updated> <app:edited>2011-11-01T18:54:38.831Z</app:edited> <alf:icon>http://localhost:8080/alfresco/images/i <cmisra:object> <cmis:properties> <cmis:propertyId propertyDefinitionId="cmis:all <cmis:propertyId propertyDefinitionId="cmis:obj <cmis:propertyString propertyDefinitionId="cmis <cmis:propertyString propertyDefinitionId="cmis <cmis:propertyDateTime propertyDefinitionId="cm <cmis:propertyString propertyDefinitionId="cmis <cmis:propertyString propertyDefinitionId="cmis <cmis:propertyId propertyDefinitionId="cmis:obj <cmis:propertyDateTime propertyDefinitionId="cm <cmis:propertyId propertyDefinitionId="cmis:par </cmis:properties> </cmisra:object> <cmisra:pathSegment>Projects</cmisra:pathSegment>
  • 13. Links! Folder Tree Navigation •  Can be achieved through queries! •  Specifying attributes means you can pull back less data! •  Can also apply criteria! •  Atom entries also feature links including:! •  children (immediate)! •  <link rel=”down” href=”http://cmis.alfresco. com:80/service/cmis/s/ workspace:SpacesStore/ i/2dfb66de-9cb5-4e60-a786-5ea2ad8740d6/ children” type=”application/atom+xml;type=feed”/> !
  • 14. Links! Folder Tree Navigation •  Atom entries links also including:! •  descendants (note type is cmistree) •  <link rel=”down” href=”http://cmis.alfresco. com:80/service/cmis/s/ workspace:SpacesStore/ i/2dfb66de-9cb5-4e60-a786-5ea2ad8740d6/ descendants” type=”application/cmistree+xml”/> ! •  tree •  <link rel=”http://docs.oasis-open.org/ns/cmis/ link/200908/ foldertree” href=”http://cmis.alfresco. com:80/service/cmis/s/ workspace:SpacesStore/ i/2dfb66de-9cb5-4e60-a786-5ea2ad8740d6/tree” type=”application/atom+xml;type=feed”/> ! •  Can apply depth control to these two!
  • 16. Application styles: Document Management! Simple repository client •  First phase provided browse-search-retrieve! •  Intended for mobile usage (as featured in Alfresco 3 Business Solutions by Martin Bergljung of Ixxus)! •  Uses an in-house roll your own Grails CMIS plugin! •  Authenticates users against Alfresco!
  • 17. Application styles: Document Management! Simple repository client
  • 18. Application styles: Web Content! Blurb-style WCM •  Featured in! •  Code requested by NASA ! •  Taglib to embed identified content! •  Backed by a service! •  Uses OpenCMIS! •  Application level credentials!
  • 19. Application styles: Web Content! Associated documents •  Web applications commonly have a need for associated documents! •  E.g. case studies! •  This can be achieved by linking a record to an Alfresco node reference! •  To zero to many documents! •  Or a folder! •  An application built for one customer featured a folder picker for the admins! •  Built as a taglib using AJAX with jQuery and jQuery UI components:! •  dialog! •  treeview + treeview.async!
  • 20. CMIS clients! Roll your own OpenCMIS •  Easy with
 •  Java CMIS client and server libraries! •  Commons HttpClient! •  Part of! •  XmlSlurper / GPath! •  Graduated from incubator in •  MarkupBuilder! February! •  Can add caching in Grails •  Currently at version 0.5! using Spring Modules •  Provides session-level Caching! caching! •  Flexible! •  Used by Alfresco! •  Can easily get alf:icon etc.! •  Doesnʼt support Alfresco •  Arguably higher CMIS extensions*! maintenance! •  Minimal changes from 3.1.1/3.2  3.3/3.4 and then to 4.0!
  • 21. Practicalities: Alfresco CMIS extensions! Aspects •  Alfresco uses the CMIS extension mechanism to allow for usage of Aspects! •  E.g.! <alf:aspects> <alf:appliedAspects>P:cm:titled</alf:appliedAspects> <alf:properties> <cmis:propertyString propertyDefinitionId="cm:description" displayName="Description" queryName="cm:description"> <cmis:value></cmis:value></cmis:propertyString> <cmis:propertyString propertyDefinitionId="cm:title" displayName="Title" queryName="cm:title"> <cmis:value></cmis:value></cmis:propertyString> </alf:properties> </alf:aspects> •  There is also an Alfresco OpenCMIS Extension! •  http://code.google.com/a/apache-extras.org/p/alfresco-opencmis-extension/ ! •  Custom aspect-aware ObjectFactory implementation! •  0.2 POM depends on OpenCMIS Client Impl 0.3!
  • 22. Practicalities: Performance! Tips •  Filter! •  Donʼt ask for more data than you need! •  Specify columns on queries (the wildcard is lazy)! •  Use the OperationContext filter! •  Cache! •  Donʼt repeat yourself requests! •  Use OpenCMIS session-level caching! •  Use Spring Modules application level caching if appropriate! •  Consider reverse proxy caches such as Varnish! •  Compress! •  Donʼt waste bandwidth! •  Compress the XML data types if the clients can handle it
 (see http://wiki.alfresco.com/wiki/CMIS#Compression) !
  • 23. Time to crack open the code!
  • 24. Grails OpenCMIS Plugin! •  What happened to it?! •  I jokingly blame Marc Palmer and his advice to plugin authors…! •  Distilled guidance: “Make it work, make it simple, make it magic”! •  Though he didnʼt want people to not put a 0.1 out there! •  But in reality the sponsoring project got delayed! •  So what magic is being considered for the road map?! •  Content-centric DSL ! •  Primarily around OpenCMIS API! •  GORM domain mapWith / mapping magic! •  Could join the data mapping project as datastore-cmis! •  static mapWith = “cmis” •  Dynamic finders / criteria could use CMIS QL! •  But need to work out how feasible associative documents are! •  E.g. only persist certain properties to CMIS
 byte[] document static mapping = { document mapWith:’cmis’ } •  Plus taglibs, service, implementing the Alfresco extensions as a child plugin etc.!
  • 25. Alternative Plugins! Other possible solutions •  Plugins that use the RivetLogic APIs! • http://www.grails.org/plugin/alfresco! •  Last release 0.4 for Grails 1.1.1 in Feb 2010! •  Bundles old Alfresco core/repository jars and CMA 1.11! • https://github.com/fix/grails-alfresco-plugin - uses Remote Access API rivet ! • RivetLogicʼs Crafter rivet for Grails! •  June 2010! •  GORM JCR datastore! • Had dependencies on Jackrabbit!
  • 26. Twitter: @rbramley
 GitHub: https://github.com/rbramley 
 Blog: http://leanjavaengineering.com/ 
 Web: http://www.ixxus.com !