CMIS Blogseries (1)
Sep 8, 2011 | by jgoldhammer | 0 Comments

What is CMIS

Content Management Interoperability Services, short CMIS, is the new buzzword in the ECM world and is also the name for a new ECM standard. CMIS offers a common view and access on ECM repositories in terms of document management. It provides the least common denominator between all vendors which have been involved in the CMIS standardization.

History of CMIS

Figure 1: History of CMIS
(see, slide 5)

CMIS 1.0 as a standard was published in May 2010 by OASIS. It was a long way from beginning in late 2007 (see Figure 1). fme AG was also active with two employees in creation of the specification.

The first two chapters of the specification deal with the domain model and available services. This reference is ideal for developers which want to use CMIS to connect applications to one or more CMIS server.

Additionally, the technical description of the SOAP- and REST- binding is described in chapter 3 and 4. This part is intended to be used by vendors which want to implement CMIS server implementations in products or library developers like the developers behind Apache Chemistry (

The spec can be found here:

The CMIS spec in detail

Figure 2 shows the logicial architecture of CMIS. A consumer (client) wants to access (read, write, update etc.) a content repository. CMIS is the glue between the client and the repository. It defines the services and the domain model which can be used by the client. A vendor mapping connects the CMIS services and domain model with the specific implementation of the content repository. Each Content Repository offers at least one API to connect to the repository, so mostly the implementation of CMIS is based on one of these APIs.

Figure 2: Logical architecture of CMIS
(see, slide 3)

CMIS defines 4 different general object types (see figure 3):

  • document (standalone and elementary information asset)
  • folder (container for other folders and documents)
  • relationship (directional relationship between other object types)
  • policy (policies for other objects like documents and folders, e.g. retention policies)

object types overview

Figure 3: object types overview
(see, slide 5)

Each object type is described (see Figure 4) by:

  • a number of parameters like the type id, the parent type, the display name and some others
  • properties, a set of attributes with unique names. Following data types can be used in cmis- String, Decimal, Integer, Boolean, DateTime, URI, ID, XML and HTML. Properties can have constraints.
  • Each object has a unique object id (cmis:objectId) which will be assigned on creation and which cannot be changed over lifetime.
  • There are common attributes like the object name (cmis:name) or the last modification date (cmis:lastModificationDate) which are built-in (see Figure 5 ).
  • Each custom type can define additional attributes.
  • Documents can have content plus renditions and can be versionable.
  • Folders have a unique path to identify the folder.

object type definition

Figure 4: object type definition
(see, slide 6)

CMIS properties
Figure 5: CMIS properties
(see, slide 7)

Services provide the functionality of the repository. The specification contains all functionalities of the services in detail. The following figure and table should give you a short overview, what is possible with CMIS and to help CMIS beginners to get a start working with it.

CMIS Services overview
Figure 6: CMIS Services overview
(see, slide 15)

service method Description



getRepositories Get a list of repositories that can be accessed from this service endpoint. No authorisation needed.
getRepositoryInfo Get information about the specified repository like product name, product version, supported CMIS version and capabilities of the CMIS implementation

getTypeChildren Get the list of Object-Types defined for the Repository that are children of the specified type.

getTypeDefinition Get the definition of a specified type with all property definitions. Is helpful for reading results of a query to know which property has which datatype.



getChildren Get the child objects which are contained in the specified folder. Paging allowed.

getDescendants Similar to getChildren, but more powerful. It can return all objects from a folder and its subfolders. No paging allowed.

getFolderTree Specialices getDescendants method which returns the folders from a specified folder and its subfolders. No paging allowed.

getCheckedoutDocs Returns the checkedout docs in one repository the current user has access to.

getObjectParents Returns the parent folder(s) for documents.

Returns the parent folder for a folder.



createDocument Creates a document with the specified type in the specified location

createDocument-FromSource Create a new document by copying an existing document.

createFolder Creates a new folder with the specified type in the specified location.


Creates a relationship of the specified type.


Create a policy object of the specified type.


List of allowable actions for an object, e.g. if the user is allowed to checkout the document or apply an acl to the document.


Read the object from the repository and get back properties, relationships, policyIds, renditions, Acls and allowable actions.


Get the list of properties for one object. Can be filtered by the properties which should be returned.


Get an object path by using the human readable path to it, e.g. /folder/subfolder/document.gif


Get the stream for the specified document or the stream for a specified rendition.


Get the renditions associated for a document. Method only returns the properties, content by using getContentStream-method


Update the properties of the specified object.


Moves the specified document/folder from one folder to another.


Deletes the specified object by id.


Deletes the specified folder and all child objects.


Sets the new content for a specified document.


Delethes the content from a specified document.




Add an existing document to a folder.

removeObjectFromFolder Removes the document from a folder or from all folders.




Executes a query in the repository. Query language is based on a SQL-subset plus some new operators for ecm-specific functions (in_folder –operator to allow search in a specific folder).

The CMIS SQL language is read-only! No create, update or delete is possible.


Returns a list of changes of objects.

Versioning Services checkout

Checkout a document (create a private working copy)


Reverts the checkout (removes the private working copy)


Checks in the private working copy


Get the lastest document object in the version series.


Get a subset of the latest Document Objects in the version series.




Get all relationships for a specified object.

Policy Services


Get the list of polices applied for an object.


Apply a policy to an object.


remove a policy from an object.




Return the currently applied acl for a folder or document


Sets a new acl by adding and removing AccessControlEntry

Please be careful by using these services. It is important to mention is that not every CMIS implementation supports everything. Please be careful when developing for different CMIS repositories. Several examples should show some small, but important differences:

  • CMIS for Alfresco has no support for querying the cmis:versionSeriesId-attribute in a CMIS Query. In Documentum, this attribute is the i_chronicle_id, an id which is the same for all versions of an object. The root cause why Alfresco does not support it is that it uses a complete different versioning approach than Documentum. After testing with Documentum at first, my solution does not work in Alfresco and I had to find another solution.
  • CMIS for Documentum has a different approach to get an object by path. Documentum allows to create documents with the same name in one folder. If this make senses or not, it restricts the getObjectByPath-method because the method should return exactly one document. In this case this functionaliy is only working by extending the path element of the document with its id, e.g. /folder/subfolder/1234567890123456_document instead of /folder/subfolder/document
  • CMIS for Documentum 6.7 and Alfresco 3.3 don´t support the method getContentChanges of the Discoveryservice while other systems like Nuxeo already support it.

Available CMIS implementations

Most big ecm vendors have integrated a CMIS implementation into the products. The following table lists some of the products which are supporting CMIS 1.0.

No. Vendor product supports CMIS version Information / evaluation supported binding
1 Alfresco 3.3 1.0

CMIS-Server implementation.

More infos can be found here:

2 EMC 6.7 and earlier 1.0 CMIS-Server implementation is shipped with EMC Documentum 6.7 by default, but also can be used with earlier versions of Documentum (>6.x) SOAP + REST
3 IBM Filenet Content Manager 5.0 1.0 CMIS-Server implementation REST
4 Sharepoint 2010 1.0

CMIS-server and client implementation (to connect to other repositories) with the 2010 Administration Toolkit v2.0


5 Opentext ECM Suite 2010 1.0 CMIS-server and client implementation REST + SOAP
6 Day CRX 2.1 1.0 CMIS Server implementation REST
7 Nuxeo EP 5.4 1.0 CMIS Server implementation

CMIS implementations of ECM vendors


CMIS 1.1 is coming. The current working draft can be found here. At a first glance, it provides a new binding, the JSON binding for browsers, type mutability and secondary types (aspects). The following list describes changes of CMIS I would like to see in future versions due to several reasons – performance, transactions and completeness:

CMIS should operate on multiple objects:
– CMIS SQL should offer create, update and delete for multiple objects
– Change the service interfaces to pass-in multiple cmis:objectIds (e.g. checkout or getObject)

CMIS should handle transactions:
– Built-In transaction handling and manually close/rollback transactions from the client.

CMIS should support getting users and groups.
– Currently there is no way to get users or groups from the repository. In this case, applying an acl to an object is dubious because you don´t know the users or group names

CMIS should allow to pass in an objectpath to in_folder()- and in_tree()-operator , e.g. select cmis:objectId from cmis:document where in_folder(/cabinet/folder).
Currently it is only supported to pass in an cmis:objectId.

CMIS should allow query a supertype of cmis:document AND cmis:folder via CMIS QL in one query.
Example: Select * from cmis:object where in_folder(‚id‘)
It should return folders and documents.

CMIS should return the contentstream for checkout operation or create a new operation edit which allows to checkout and get back the contentstream of a document.

If you want to know, how is CMIS implemented for EMC Documentum, stay tuned and wait for the next blog article „CMIS for Documentum“.

Kommentare sind geschlossen.