Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 32

First Steps with CMIS &

Alfresco
Jeff Potts
@jeffpotts01
http://ecmarchitect.com

#SummitNo
w

Youve been handed a project


Your Favorite Language/Framework

What Goes Here?

#SummitNo
#SummitNo
w w

Youve been handed a project


Your Favorite Language/Framework

#SummitNo
#SummitNo
w w

CMIS gives developers a


standard API for working with
content repositories like Alfresco

#SummitNo
#SummitNo
w w

Why CMIS?
Preferred API for working with Alfresco
Open standard, managed by OASIS
Many vendors support it
Plenty of examples
Client libraries for many languages
Java, Python, .NET, PHP, Objective-C,
Android
#SummitNo
#SummitNo
w w

http://chemistry.apache.org
#SummitNo
#SummitNo
w w

Start with the Workbench

#SummitNo
#SummitNo
w w

Connect with CMIS Workbench

#SummitNo
#SummitNo
w w

Explore the Alfresco repo


CRUD objects
Inspect/change properties
Run queries
Run scripts using the Groovy console
See the content model

#SummitNo
#SummitNo
w w

The Workbench is great


for

Testing queries
Inspecting the data dictionary
Including whether or not a property
is read/write or queryable
Can I do _____________ with CMIS?

#SummitNo
#SummitNo
w w

Alfresco CMIS Service URLs by Version


Alfresco
Version

CMIS Service URL

3.2r2 3.4

http://localhost:8080/alfresco/service/cmis (ATOM)
http://localhost:8080/alfresco/cmis (SOAP)

4.0

http://localhost:8080/alfresco/cmisatom
http://localhost:8080/alfresco/cmis (SOAP)

4.2.d/4.2
http://localhost:8080/alfresco/api/-default-/cmis/versions/1.0/
Enterprise atom
http://localhost:8080/alfresco/api/-default-/cmis/versions/1.1/
atom
http://localhost:8080/alfresco/api/-default-/cmis/versions/1.1/
browser
http://localhost:8080/alfresco/cmis (SOAP)
#SummitNo
#SummitNo
w w

Set Up Your Dev


Environment

#SummitNo
#SummitNo
w w

Lets set up your


environment

Could use curl or any other HTTP


client, but why?
Grab OpenCMIS from Apache
Chemistry
MavenGroup:
makes
it easy
org.apache.chemistry.opencmis
Artifact: chemistry-opencmis-client-impl
Version: 0.10.0

#SummitNo
#SummitNo
w w

File Loader Example


Lets load some images into Alfresco
on-premise
Get a session
Create a folder
Check-in some documents
Set some properties

https://code.google.com/p/alfresco-api-java

#SummitNo
#SummitNo
w w

CMIS Works in the Cloud


Too!

Lets load some images into Alfresco in


the cloud
Same CMIS calls, different
authentication
Register for an API key
http://www.alfresco.com/develop

#SummitNo
#SummitNo
w w

Watch Out for


Gotchas/Limitations

#SummitNo
#SummitNo
w w

CMIS object IDs are opaque

Best not to
even look at
one!

#SummitNo
#SummitNo
w w

Queries
CMIS queries are read-only
Do you really need everything?
select * from cmis:document
Do you really need all rows?
Use OperationContext to limit

#SummitNo
#SummitNo
w w

Working with Aspects


CMIS 1.0 doesnt know what an aspect
is
Must use OpenCMIS Extension
CMIS 1.1 calls aspects secondary types
Add/remove aspects by setting
cmis:secondaryObjectTypeIds
For queries, use a join
#SummitNo
#SummitNo
w w

Adding an aspect (CMIS 1.0)


parameter.put(SessionParameter.OBJECT_FACTORY_CLASS,
"org.alfresco.cmis.client.impl.AlfrescoObjectFactoryImpl");

if (!doc.hasAspect("P:cm:geographic")) {
doc.addAspect("P:cm:geographic");
System.out.println("Added aspect");
} else {
System.out.println("Doc already had aspect");
}
HashMap<String, Object> props = new HashMap<String,
Object>();
props.put("cm:latitude", 52.513871);
props.put("cm:longitude", 13.391106);
#SummitNo
doc.updateProperties(props);
#SummitNo
w

Adding an aspect (CMIS 1.1)


List<Object> aspects =
doc.getProperty("cmis:secondaryObjectTypeIds").getValues();
if (!aspects.contains("P:cm:geographic")) {
aspects.add("P:cm:geographic");
HashMap<String, Object> props = new HashMap<String,
Object>();
props.put("cmis:secondaryObjectTypeIds", aspects);
doc.updateProperties(props);
System.out.println("Added aspect");
} else {
System.out.println("Doc already had aspect");
}
HashMap<String, Object> props = new HashMap<String,
Object>();
props.put("cm:latitude", 52.513871);
props.put("cm:longitude", 13.391106);
#SummitNo
#SummitNo
w w
doc.updateProperties(props);

Query for aspect-based


props
SELECT D.cmis:name, G.cm:latitude, G.cm:longitude
FROM cmis:document as D
JOIN cm:geographic as G
ON D.cmis:objectId = G.cmis:objectId

#SummitNo
#SummitNo
w w

Working with Relationships


Peer associations only
Both sides must be instances of
cmis:folder or cmis:document or a
descendant type

#SummitNo
#SummitNo
w w

Working with ACLs


Can manage ACLs
Cannot set or un-set ACL inheritance

#SummitNo
#SummitNo
w w

Other Limitations
Can only access objects that are
descendants of cm:content or
cm:folder
Cannot create users/groups
Cannot create or change types through
the API (yet)
Cannot work with categories or tags
#SummitNo
#SummitNo
w w

A Word About
Interoperability

Pay attention to RepositoryInfo


Multifiling, search, ACL, etc. may
differ between repository vendors
Inspect getAllowableActions
Look at the type definitions
Not all repositories name types the
same way
#SummitNo
#SummitNo
w w

Example Apps & Additional


Learning Resources

#SummitNo
#SummitNo
w w

Read the Book


Everything you need to
know about CMIS 1.0 & 1.1
Lots of Groovy and Java
examples
Also covers Python, .NET,
PHP, Android, & iOS
37%-off: 12cmisal
#SummitNo
#SummitNo
w w

Quick Look at The Blend

#SummitNo
#SummitNo
w w

Ask questions in the


Alfresco API forum!

#SummitNo
#SummitNo
w w

First Steps with CMIS


1. Choose CMIS as your preferred API
2. Use the OpenCMIS Workbench as a
learning tool
3. Set up your development
environment
4. Watch out for gotchas/limitations
5. Take advantage of additional
learning resources
#SummitNo
#SummitNo
w w

#SummitNo
w

You might also like