Apache Chemistry

From Bauman National Library
This page was last modified on 17 January 2019, at 14:38.
Apache Chemistry
Chemistry big transparent.png
Developer(s) Apache Foundation
Initial release 10 February 2010; 12 years ago (2010-02-10)
Stable release
ObjectiveCMIS 0.6 / 31 July 2017; 5 years ago (2017-07-31)
Repository {{#property:P1324}}
Written in Java
Standard(s) CMIS
License Apache
Website chemistry.apache.org

Apache Chemistry is an Open Source implementation of the OASIS CMIS (Content Management Interoperability Services) standard. The project provides an interoperable API to CMIS repositories such as Alfresco, EMC Documentum, IBM FileNet, Microsoft SharePoint, Nuxeo, OpenText Enterprise Library Services, and other CMIS-compliant content repositories. It also provides libraries to build CMIS-compliant repository connectors.

Apache Chemistry has graduated from the Apache Incubator as a Top-Level Project (TLP). This signifies that the Apache Chemistry community and products have been well-governed under the ASF's meritocratic, consensus-driven process and principles.[Reference 1]

About CMIS

CMIS (Content Management Interoperability Services) is a vendor-neutral OASIS Web services interface specification that enables interoperability between Enterprise Content Management (ECM) systems. CMIS allows rich information to be shared across Internet protocols in vendor-neutral formats, among document systems, publishers and repositories, in a single enterprise and between companies.[Reference 2]

The CMIS Domain Model

CMIS defines a domain model. A client will access a CMIS service endpoint described by a URL. A service endpoint must have at least one repository. A repository is a data store and contains content. Each item of content is an object such as a folder, or a document. A repository is identified by its ID, and has a set of capabilities which describe what optional CMIS functionality the repository supports.

An object has an ID, has a type, and has set of properties for that type. There are four base types for a CMIS object:

  • Document - is an item of content. The document may have a content stream, which is the actual file associated with the document. A content stream exists only as part of its containing document object. A content stream has a mimetype associated with it. A document object may contain one or more renditions, which are alternate views of the content. Documents objects are the only objects that are versionable. Each version of a document has its own object ID. All the versions of a document make up a version series and share a version series ID. You can create, read, update and delete documents using OpenCMIS methods.
  • Folder - is a container used to organize the document objects. A repository had one root folder. All other folder objects have one parent folder. A folder has a folder path representing its place in the repository's folder hierarchy. A folder object can have renditions. For example, a folder can have a thumbnail as a rendition representing the contents of the folder.
  • Relationship - define relationships between a source object and a target object. Creating, changing and deleting relationships do not change the source or target objects themselves. Relationship objects are optional. A CMIS repository may not support relationship objects.
  • Policy - are optional repository-specific objects that can be applied to controllable objects. The behavior of policies are not modeled by the CMIS specification. A policy object may be applied to multiple controllable objects and a controllable object may have multiple policies applied to it. A policy object can not be deleted if it is currently applied to one or more controllable objects.

There can be other object types in the repository, defined in a repository as subtypes of these base types. CMIS services are provided for the discovery of object-types that are defined in a repository, but for the moment folders and documents are the main objects you will be concerned with for the first 2 parts of this document.

CMIS Services

The CMIS specification describes a set of services that act on repositories. The CMIS services are:

  • Repository services - let you discover available repositories, get the capabilities of these repositories, and provide basic Data Dictionary information of what types are available in the repository.
  • Navigation services - let you navigate the repository by accessing the folder tree and traversing the folder/child hierarchy. You can use these services to get both children and parents of an object.
  • Object services - provide the basic CRUD (Create, Read, Update, Delete) and Control services on any object, including document, folder, policy, and relationship objects. For document objects, this includes setting and getting of properties, policies, and content streams. Object services retrieve objects by path or object ID. Applications may also discover what actions users are allowed to perform.
  • Multi-filing services - let you establish the hierarchy by adding or removing an object to or from a folder.
  • Discovery services - provide Query and Change services, and a means of paging the results of the query.
  • Change services - let you discover what content has changed since the last time checked, as specified by a special token. You can use Change services for external search indexing and replication services.
  • Versioning services - control concurrent operation of the Object services by providing Check In and Check Out services. Version services also provide version histories for objects that are versioned.
  • Relationship services - let you create, manage, and access relationships or associations between objects as well as allow an application to traverse those associations.
  • Policy services - apply policies on document objects. Policies are free-form objects and can be used by implementations for security, record, or control policies.
  • ACL services - let you create, manage, and access Access Control Lists to control who can perform certain operations on an object.


Originally submitted to the Apache Incubator in May 2009 as a single, Java-focused project, Apache Chemistry today comprises the following sub-projects:

  • OpenCMIS - CMIS client and server libraries for Java
  • cmislib - CMIS client library for Python
  • phpclient - CMIS client library for PHP
  • DotCMIS - CMIS client library for .NET
  • ObjectiveCMIS - CMIS client library for Objective-C


Apache Chemistry OpenCMIS is a collection of Java libraries, frameworks and tools around the CMIS 1.0 and CMIS 1.1 specifications.[Reference 3]

The goal of OpenCMIS is to make CMIS simple for Java client and server developers. It hides the binding details and provides APIs and SPIs on different abstraction levels. It also includes test tools for content repository developers and client application developers.

Projects using OpenCMIS

Client API

Server framework


Apache Chemistry cmislib is a CMIS client library for Python.

The goal of this library is to provide an interoperable API to CMIS repositories such as Alfresco, Nuxeo, KnowledgeTree, MS SharePoint, OpenText Documentum, and any other content repository that is CMIS-compliant.[Reference 4]

The library is being developed with the following guidelines:

  • Developers using this API should be able to work with CMIS domain objects without having to worry about the underlying implementation details.
  • The library will use the Resftul AtomPub Binding and the Browser Binding (added with CMIS 1.1).
  • The library will conform to the CMIS spec as closely as possible. Several public CMIS repositories are being used to test the API.
  • The library should have no hard-coded URL’s. It should be able to get everything it needs regarding how to work with the CMIS service from the CMIS service URL response and subsequent calls.
  • There shouldn’t have to be a vendor-specific version of this library. The goal is for it to be interoperable with CMIS-compliant providers.

Quick Example:

This should give you an idea of how easy and natural it is to work with the API:

cmisClient = cmislib.CmisClient('http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom', 'admin', 'admin')
repo = cmisClient.defaultRepository
rootFolder = repo.rootFolder
children = rootFolder.getChildren()
newFolder = rootFolder.createFolder('testDeleteFolder folder')
 props = newFolder.properties


Apache Chemistry CMIS PHP Client is a CMIS client library for PHP.[Reference 5]

To Run this example execute the following:

$ php -f cmis_ls.php <rest-endpoint> <username> <password> <folderpath> [debug option 1](2.html)


  • If the folder path has spaces in it you must URL encode the folder path i.e. /Data Dictionary --> /Data+Dictionary
  • The debug option can be omitted. If it is 1 the program will display all of the arrays associated with the objects that

are returned. If the debug option is 2 or more, then the XML returned will also be displayed.

  • This will not work on Pre CMIS-1.0 repositories.
  • There is virtually no error checking.
  • Your version of php must support DOMDocument and curl.

Example Runs:

$ php -f cmis_ls.php http://cmis.alfresco.com/service/api/cmis admin admin /
$ php -f cmis_ls.php http://cmis.alfresco.com/service/api/cmis admin admin /Data+Dictionary 1

The cmis_repository_wrapper.php library provided the following functionality:

  • Encapsulates access to a CMIS 1.0 compliant repository.
  • Provides utilities for getting information out of: Workspace (the repositoryInfo), Object Entries, Non-Hierarchical Object feeds.

DotCMIS and PortCMIS

Apache Chemistry DotCMIS and PortCMIS are CMIS client libraries for .NET. They are loosely based on the OpenCMIS client architecture.

The APIs of DotCMIS and PortCMIS are very similar.

These are the main differences:[Reference 6]

Required Framework .NET Framework 3.5 .NET Standard 1.1
Windows Store App support No Yes
Windows Phone support No Yes
CMIS 1.0 Web Services Yes No
CMIS 1.1 Web Services No No
CMIS 1.0 AtomPub Yes Yes
CMIS 1.1 AtomPub No Yes
CMIS 1.1 Browser Binding No Yes


Apache Chemistry ObjectiveCMIS is a CMIS client library for Objective-C language.

The library is primarily targeted at iOS application development and aims to provide an interoperability API to CMIS based repositories. However, as the base library is built on the Foundation. Framework it can be used for developing Mac OSX applications as well.[Reference 7]

The ObjectiveCMIS library is distributed as a ZIP file containing:

  • the library: libObjectiveCMIS.a
  • public header files: contained in the ObjectiveCMIS folder
  • documentation: provided as a docset (generated using appledocs).

Minimum Requirements

The library is making use of Objective-C automated reference counting (ARC). Therefore the library is compatible with iOS SDK v5.x or later.

How to include the library on your XCode project

The easiest way to include the ObjectiveCMIS library into your project is to unzip the ObjectiveCMIS ZIP file. Then go to the 'File' menu in XCode and select the 'Add Files to…' option. Add the headers and library files contained in the ZIP distribution to your project:

  • Make sure that the library is included in the list of frameworks/libraries. Select the build target and go to Build Phases. libObjectiveCMIS.a should be listed in the Link Binary with Libraries option.
  • The CMIS headers should be included in the 'Copy Headers' section of Build Phases for your build target.


  1. The Apache Software Foundation Announces Apache Chemistry as a Top-Level Project // The Apache Software Foundation. Blogging in Action. Updated on: 23.02.2011. URL: https://blogs.apache.org/foundation/entry/the_apache_software_foundation_announces11 (retrieved: 11.17.2018).
  2. OpenCMIS Client API Developer's Guide // Apache Chemistry. [2010—2017]. Updated on: 08.30.2016. URL: http://chemistry.apache.org/java/developing/guide.html (retrieved: 11.19.2018).
  3. CMIS for Java // Apache Chemistry. [2010—2017]. Updated on: 11.17.2018. URL: https://chemistry.apache.org/java/opencmis.html (retrieved: 11.19.2018).
  4. About Apache Chemistry cmislib // Apache Chemistry [2010—2017]. Updated on: 08.31.2017. URL: https://chemistry.apache.org/python/docs/about.html (retrieved: 19.11.2018).
  5. CMIS PHP Client // Apache Chemistry [2010—2017]. Updated on: 08.30.2016. URL: https://chemistry.apache.org/php/phpclient.html (retrieved: 11.19.2018).
  6. Differences between DotCMIS and PortCMIS // Apache Chemistry [2010—2017]. Updated on: 07.25.2017. URL: https://chemistry.apache.org/dotnet/dotcmis-vs-portcmis.html (retrieved: 11.19.2018).
  7. Welcome to Apache ObjectiveCMIS // Apache Chemistry [2010—2017]. Updated on: 07.31.2017. URL: https://chemistry.apache.org/objective-c/objectivecmis.html (retrieved: 11.19.2018).

External links