Grails is revolutionizing web development in many corporate Java environments. However, leveraging managed content isn’t straight forward with the myriad of incompatible ECM systems prevalent in businesses. The Content Management Interoperability Services (CMIS) standard allows for products or applications to be built independently of the underlying content repository. CMIS and Grails is a powerful combination for handling document management activities and displaying web content assets within custom web applications. This session will explore: How to integrate a CMIS repository with Grails applications, Apache Chemistry OpenCMIS vs. roll your own, Authentication models, Practical considerations, Alfresco extensions to CMIS and OpenCMIS. The concepts will be presented before diving into a hands-on session with Grails.
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!
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>
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!
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) !
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!