Professional Documents
Culture Documents
OpenCMIS demos
Client
read write
Services
Domain Model
provider
Vendor Mapping
Content
Client Client
Repository
Document Folder
Content Container
Renditions Hierarchy
Version History Filing
Described by
Type Definitions
Relationship Policy
Source Object Target Object
Target Object
Type Definitions
Object Property
Type Id Property Id
Parent Display Name
Display Name
* Type
Queryable Required
Controllable Default Value
Custom Type
Base Properties
Relationships Policies
ID! cmis:sourceId! String! cmis:policyText!
ID! cmis:targetId!
Content Streams
Document * Rendition
Mime Type Kind
Length Mime Type
Content Stream
Stream Id
ACL
Object
ACE
Principal
Permissions
Direct
Permissions
cmis:read
cmis:write
cmis:all
<repository specific>
Document Versioning
Document
Repository Vendor May Support
V1 Version Specific Folder Filing
Minor Query All Versions
Create Minor, Major, PWCs
Version Series
V2 checkout
Major
PWC
V3
checkin
Major
Policies
Retention Security
Client
ly
app
Document
Change Events
Change Event:
Object Id
Change Time
Change Type created, updated, deleted, security
Properties for updated events
WHERE clause
o Restrict returned rows to those that meet all constraints
o Predicates: comparison, in, like, null, any, is null
o Function Predicates: contains(), in_folder(), in_tree()
o Operators: and, or, not
ORDER BY clause
o Order results by one or more columns
SELECT cmis:name
FROM cmis:document
WHERE contains('alfresco')
Discovery
- Issue Query
- Get Change Log Policy Policy
- Get Applied Policies - Apply / Remove
CMIS Cheat Sheet
http://cmis.alfresco.com/cmis-cheatsheet.pdf
CMIS Bindings
Dont bother
There are Open Source libraries for that
Apache Chemistry
TM
Website: http://chemistry.apache.org
Main Objective
Application
CMIS Domain
SQL
Model
Client library
Server framework
OpenCMIS is available
as source code:
https://svn.apache.org/repos/asf/chemistry/opencmis/trunk/
via Maven:
http://chemistry.apache.org/java/developing/dev-use-with-maven.html
Client API
o OO API
You want this API!
o Easy to use
o Build-in caching
ObjectId
0..n
RepositoryInfo Rendition AllowableActions ACL PropertyData
0..n 0..n
0..n loads
ACE
0..n
loads
ContentStream
ChangeEvents
ChangeEvent
ObjectType PropertyDefinition
9..n
1 0..n
OpenCMIS Main Client Interfaces
0..n
ACE
FileableCmisObject
ContentStream
Aspects, Aspects, Aspects
CMIS is stateless!
OpenCMIS caches:
o Repository infos
o Type definitions
o AtomPub links
o CMIS objects
Connect to a repository Variant 1
parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
parameter.put(SessionParameter.ATOMPUB_URL,
"http://cmis.alfresco.com/service/cmis");
parameter.put(SessionParameter.REPOSITORY_ID,
"84ccfe80-b325-4d79-ab4d-080a4bdd045b");
parameter.put(SessionParameter.USER, "admin");
parameter.put(SessionParameter.PASSWORD, "admin");
parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());
parameter.put(SessionParameter.ATOMPUB_URL,
"http://cmis.alfresco.com/service/cmis");
parameter.put(SessionParameter.REPOSITORY_ID,
"84ccfe80-b325-4d79-ab4d-080a4bdd045b");
parameter.put(SessionParameter.USER, "admin");
parameter.put(SessionParameter.PASSWORD, "admin");
RepositoryInfo ri = session.getRepositoryInfo();
String id = ri.getId();
String name = ri.getName();
import org.apache.chemistry.opencmis.commons.*;
import org.apache.chemistry.opencmis.commons.data.*;
import org.apache.chemistry.opencmis.commons.enums.*;
import org.apache.chemistry.opencmis.client.api.*;
// get parents
/*
for(CmisObject parent: object.getParents()) {
String parentName = parent.getName();
println " Parent: ${parentName}"
}
*/
}
Paging
import org.apache.chemistry.opencmis.commons.*;!
import org.apache.chemistry.opencmis.commons.data.*;!
import org.apache.chemistry.opencmis.commons.enums.*;!
import org.apache.chemistry.opencmis.client.api.*;!
!
Folder root = session.getRootFolder();!
!
printList( root.getChildren() )!
!
//printList( root.getChildren().getPage(3) )!
!
//printList( root.getChildren().skipTo(2) )!
!
//printList( root.getChildren().skipTo(2).getPage(3) )!
!
!
!
void printList(ItemIterable<CmisObject> list) {!
list.each { println "${it.name} \t${it.type.id}" }!
!
long numItems = list.getTotalNumItems();!
boolean hasMore = list.getHasMoreItems();!
!
println "--------------------------------------"!
println "Total number: ${numItems}"!
println "Has more: ${hasMore}" !
println "--------------------------------------"!
}!
Properties
import org.apache.chemistry.opencmis.commons.*;
import org.apache.chemistry.opencmis.commons.data.*;
import org.apache.chemistry.opencmis.commons.enums.*;
import org.apache.chemistry.opencmis.client.api.*;
import org.apache.chemistry.opencmis.commons.*;!
import org.apache.chemistry.opencmis.commons.data.*;!
import org.apache.chemistry.opencmis.commons.enums.*;!
import org.apache.chemistry.opencmis.client.api.*;!
!
CmisObject object = session.getObjectByPath("/User Homes/florian/Test Folder/MyText");!
!
if(!(object instanceof Document)) {!
throw new Exception("Not a document!");!
}!
!
Document doc = (Document) object;!
!
ContentStream content = doc.getContentStream();!
!
if(content == null) {!
throw new Exception("Document has no content!");!
}!
!
String filename = content.getFileName();!
String mimeType = content.getMimeType();!
long length = content.getLength();!
InputStream stream = content.getStream();!
!
println "File: ${filename}"!
println "MIME Type: ${mimeType}"!
println "Size: ${length} bytes"!
println "Has stream: " + (stream != null)!
!
Query
import org.apache.chemistry.opencmis.commons.*
import org.apache.chemistry.opencmis.commons.data.*
import org.apache.chemistry.opencmis.commons.enums.*
import org.apache.chemistry.opencmis.client.api.*
println "--------------------------------------"
}
Folders
import org.apache.chemistry.opencmis.commons.*;!
import org.apache.chemistry.opencmis.commons.data.*;!
import org.apache.chemistry.opencmis.commons.enums.*;!
import org.apache.chemistry.opencmis.client.api.*;!
!
Folder root = session.getRootFolder();!
!
// create a new folder!
Map<String, Object> properties = new HashMap<String, Object>();!
properties.put("cmis:objectTypeId", "cmis:folder");!
properties.put("cmis:name", "a new folder");!
!
Folder newFolder = root.createFolder(properties);!
!
printProperties(newFolder);!
!
!
// update properties!
Map<String, Object> updateproperties = new HashMap<String, Object>();!
updateproperties.put("cmis:name", "renamed folder");!
!
newFolder.updateProperties(updateproperties);!
!
newFolder.refresh();!
printProperties(newFolder);!
!
!
// delete folder!
newFolder.deleteTree(true, UnfileObject.DELETE, true);!
!
Documents
import org.apache.chemistry.opencmis.commons.*;
import org.apache.chemistry.opencmis.commons.data.*;
import org.apache.chemistry.opencmis.commons.enums.*;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.*;
import org.apache.chemistry.opencmis.client.api.*;
printProperties(newDoc);
// delete document
newDoc.delete(true);
Alfresco 4.x
o Switch to the OpenCMIS server framework
o Many improvements: speed, memory consumption, compliance
o OpenCMIS client libraries are embedded and available in Web Scripts
o Have a look: http://cmis.alfresco.com