The CMIS specification prescribes:
Domain model
Services
The CMIS Domain Model defines a repository as a container and an entry point to the objects that is quite simple and non-restrictive. The followings are some of the common entities of the domain model.
Repository is a container of objects with a set of "capabilities" which may be different depending on implementation.
Object is the entity managed by a CMIS repository.
Object Type is a classification related to an object. It specifies a fixed and non-hierarchical set of properties ("schema") that all objects of that type have.
Document Object is an elementary information entity.
Folder Object is a collection of fileable objects.
Relationship Object is used to describe a dependent object semantically.
Policy Object represents an administrative policy applied to an object.
Access Object defines permissions.
Versioning is to support versioning for Document objects.
Query is type-based in a simplified SQL SELECT statement.
Change Log is a mechanism which enables applications to discover changes to the objects stored.
CMIS specifies a query language based on the SQL-92 standard, plus the extensions, in conjunction with the model mapping defined by the CMIS's relational view.
All objects are classified by an Object Type which declares that all objects of the given type have some sets of properties in common. Each property consists of a set of attributes, such as the TypeID, the property ID, its display name, its query name, and more). There are only four base types, including Document, Folder, Relationship, and Policy. Also, you can extend those basic types of modifying a set of their properties.
Document Object and Folder Object are self-explanatory. Document Object has properties to hold document metadata, such as the document author, modification date and custom properties. It can also contain a content stream whether it is required, and renditions, such as a thumbnail view of document. Folder is used to contain objects. Apart from the default hierarchical structure, CMIS can optionally store objects in multiple folders or in no folders at all (so-called multifiling and unfiling capabilities). Relationship Object denotes the connection between two objects (target and source). An object can have multiple relationships with other objects. Policy Object is a way to define administrative policies in managing objects. For example, you can use a CMIS policy to define which documents are subject to retention policies.
CMIS provides a set of services to access and manage the content or repository. These services include:
Repository Services: To discover information about the repository and the object types defined for the repository.
Navigation Services: To traverse the folder hierarchy in a CMIS repository, and to locate documents which are checked out.
Object Services: To execute ID-based CRUD functions (Create, Retrieve, Update, Delete) on objects in a repository.
Multi-filing Services (optional): To put an object in more than one folder (multi-filing) or outside the folder hierarchy (unfiling).
Discovery Services: To search for queryable objects in a repository.
Versioning Services: To check out, navigate to documents or update a Document Version Series (checkOut, cancelCheckOut, getPropertiesOfLatestVersion, getAllVersions, deleteAllVersions).
Relationship Services (optional): To retrieve an object for its relationships.
Policy Services (optional): To apply, remove, or query for policies.
ACL Services: To return and manage the Access Control List (ACL) of an object. ACL Services are not supported by all repositories.
Some repositories might not implement certain optional capabilities, but they are still considered CMIS-compliant. Each service has binding which defines the way messages will be serialized and wired. Binding are based on HTTP and uses the Atom Publishing Protocol.
eXo Web Content Management (WCM) system provides CMIS access to its content storage features:
WCM drives
Document files and folders
Symlinks
Categories
To expose WCM drives as CMIS repositories there is special extension of CmisRegistry. Read admin guide for configuration of org.exoplatform.ecms.xcmis.sp.jcr.exo.DriveCmisRegistry component.
Work with CMIS is based on reference documents returned by services. Each CMIS service returns response containing links to other services describing the Document or operations on it. In most cases a Document will be asked by its ID. Some services accepts a Document path.
Notes for use cases: To access the eXo CMIS services from the client side, use the Curl tool [http://curl.haxx.se/download.html]. CMIS AtomPub binding which is based upon the Atom (RFC4287) and Atom Publishing Protocol (RFC5023) will be used.
SOAP binding is not implemented in the eXo Platform 3.x.
eXo CMIS uses special JCR namespaces cmis and xcmis internally.
To expose drives content following nodetypes supported:
nt:file nodetype for representation of cmis:documents
nt:folder for representation of cmis:folder
Since CMIS specification not allows to have more root types except of described above (cmis:documents and cmis:folder), those two (nt:file and nt:folder) are mapped to CMIS types.
There is two more node types which are used: cmis:policy and cmis:relationship which represent CMIS types with corresponded (see Services description for details).
Additionally nodetypes used in WCM are mapped as follow:
nt:unstructured + extentions as cmis:folder
exo:taxonomy + extentions as cmis:folder
In other words only nodetypes extending nt:file, nt:folder, nt:unstructured and exo:taxonomy will be exposed correctly via CMIS API.
WCM's nodetype exo:article isn't supported by eXo CMIS due to not compliant structure to nt:file.
The WCM drive is used to expose as an isolated repository via the CMIS service. Operations on the repository will reflect the drive immediately.
Working with CMIS repositories it's important understand that a repository reflects a WCM Drive, which is a sub-tree in JCR workspace. And two or more drives can be mapped to a same workspace or a sub-tree. As a result changes in one repository can affect others. Consult with WCM drives mappings to know actual location of a content you'll access or change.
Login to the website as a user with the developer role.
Open Group | Sites Explorer, you can see the drives set of WCM, such as Sites Management, DMS Administration.
Get the list of these WCM drives via CMIS using Curl, asking getRepositories service:
curl -o getrepos.xml -u root:gtn http://localhost:8080/rest/private/cmisatom/
The requested file (getrepos.xml) contains the set of Repositories in the AtomPub format. The root element represents the set of workspaces representing WCM drives related to resources, for example for DMS Administration the response will contains data like:
<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
<workspace>
<atom:title type="text">DMS Administration</atom:title>
<cmisra:repositoryInfo xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/">
<cmis:repositoryId>DMS Administration</cmis:repositoryId>
<cmis:repositoryName>DMS Administration</cmis:repositoryName>
</cmisra:repositoryInfo>
<collection href="http://localhost:8080/rest/private/cmisatom/DMS%20Administration/query">
<atom:title type="text">Query</atom:title>
<cmisra:collectionType>query</cmisra:collectionType>
</collection>
<collection href="http://localhost:8080/rest/private/cmisatom/DMS%20Administration/children/00exo0jcr0root0uuid0000000000000">
<atom:title type="text">Folder Children</atom:title>
<cmisra:collectionType>root</cmisra:collectionType>
</collection>
<collection href="http://localhost:8080/rest/private/cmisatom/DMS%20Administration/checkedout">
<atom:title type="text">Checkedout collection</atom:title>
<cmisra:collectionType>checkedout</cmisra:collectionType>
</collection>
<collection href="http://localhost:8080/rest/private/cmisatom/DMS%20Administration/unfiled">
<atom:title type="text">Unfiled collection</atom:title>
<cmisra:collectionType>unfiled</cmisra:collectionType>
</collection>
<collection href="http://localhost:8080/rest/private/cmisatom/DMS%20Administration/types">
<atom:title type="text">Types Children</atom:title>
<cmisra:collectionType>types</cmisra:collectionType>
</collection>
<cmisra:uritemplate>
<cmisra:template>http://localhost:8080/rest/private/cmisatom/DMS%20Administration/object/{id}?filter={filter}&includeAllowableActions={includeAllowableActions}&includePolicyIds={includePolicyIds}&includeRelationships={includeRelationships}&includeACL={includeACL}&renditionFilter={renditionFilter}
</cmisra:template>
<cmisra:type>objectbyid</cmisra:type>
<cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
</cmisra:uritemplate>
<cmisra:uritemplate>
<cmisra:template>http://localhost:8080/rest/private/cmisatom/DMS%20Administration/objectbypath?path={path}&filter={filter}&includeAllowableActions={includeAllowableActions}&includePolicyIds={includePolicyIds}&includeRelationships={includeRelationships}&includeACL={includeACL}&renditionFilter={renditionFilter}
</cmisra:template>
<cmisra:type>objectbypath</cmisra:type>
<cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
</cmisra:uritemplate>
<cmisra:uritemplate>
<cmisra:template>http://localhost:8080/rest/private/cmisatom/DMS%20Administration/query?q={q}&searchAllVersions={searchAllVersions}&maxItems={maxItems}&skipCount={skipCount}&includeAllowableActions={includeAllowableActions}=&includeRelationships={includeRelationships}
</cmisra:template>
<cmisra:type>query</cmisra:type>
<cmisra:mediatype>application/atom+xml;type=feed</cmisra:mediatype>
</cmisra:uritemplate>
<cmisra:uritemplate>
<cmisra:template>http://localhost:8080/rest/private/cmisatom/DMS%20Administration/typebyid/{id}
</cmisra:template>
<cmisra:type>typebyid</cmisra:type>
<cmisra:mediatype>application/atom+xml;type=entry</cmisra:mediatype>
</cmisra:uritemplate>
</workspace>
</service>
Here are the collection of services and predefined templates which can be used from the client side to request resources related to this repository. For example, to get the WCM node of DMS Administration drive by path, the objectbypath template can be used:
http://localhost:8080/rest/private/cmisatom/DMS%20Administration/objectbypath?path={path}&filter={filter}&includeAllowableActions={includeAllowableActions}&includePolicyIds={includePolicyIds}&includeRelationships={includeRelationships}&includeACL={includeACL}&renditionFilter={renditionFilter}
where parameters include:
Required:
ID repositoryId: The identifier for the repository.
String path: The path to the object.
Optional:
String filter
Boolean includeAllowableActions
Enum includeRelationships
String renditionFilter
Boolean includePolicyIds
Boolean includeACL
Find full description of all sepcefied services in the CMIS specefication.
Symlinks are used to organize the virtual access to documents in WCM, which is implemented like links in Unix/Linux/Mac OS (refer to ln command for more details).
JCR exo:symlink nodetype used for such type nodes.
Login to the acme website as a user with the developer role.
Open Group | Sites Explorer, select Sites Management, go to folder /acme/documents.
Upload any file (e.g. test.txt) /acme/documents
Add this file to acme/News category. It will create symlink to /acme/documents/test.txt in /acme/categories/acme/News
Get content of folder /acme/categories/acme/News via CMIS:
curl -o news.xml -u root:gtn http://localhost:8080/rest/private/cmisatom/Managed%20Sites/objectbypath?path=/acme/categories/acme/News
The requested file (products.xml) contains the entry with information about the folder.
The list of properties for the object (such as node Id or type).
Allowable Actions can be performed on the document; for example, requesting the childrens list.
ACL and policies information.
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
<id>f59a3539c0a80003625790bdadf566c5</id>
<published>2010-09-09T18:11:57.707Z</published>
<updated>2010-09-09T18:11:57.707Z</updated>
<summary type="text"/>
<author>
<name>system</name>
</author>
<title type="text">News</title>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites" rel="service" type="application/atomsvc+xml"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/object/f59a3539c0a80003625790bdadf566c5" rel="self"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/object/f59a3539c0a80003625790bdadf566c5" rel="edit"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/typebyid/exo%3Ataxonomy" rel="describedby" type="application/atom+xml; type=entry"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/allowableactions/f59a3539c0a80003625790bdadf566c5" rel="http://docs.oasis-open.org/ns/cmis/link/200908/allowableactions" type="application/cmis+xml; type=allowableActions"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/relationships/f59a3539c0a80003625790bdadf566c5" rel="http://docs.oasis-open.org/ns/cmis/link/200908/relationships" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/policies/f59a3539c0a80003625790bdadf566c5" rel="http://docs.oasis-open.org/ns/cmis/link/200908/policies" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/objacl/f59a3539c0a80003625790bdadf566c5" rel="http://docs.oasis-open.org/ns/cmis/link/200908/acl" type="application/cmisacl+xml"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/children/f59a3539c0a80003625790bdadf566c5" rel="down" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/descendants/f59a3539c0a80003625790bdadf566c5" rel="down" type="application/cmistree+xml"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/foldertree/f59a3539c0a80003625790bdadf566c5" rel="http://docs.oasis-open.org/ns/cmis/link/200908/foldertree" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/object/f59a3533c0a8000339af97059f243a25" rel="up" type="application/atom+xml; type=entry"/>
<content type="text">News</content>
<cmisra:object xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/">
<cmis:properties>
<cmis:propertyId displayName="cmis:allowedChildObjectTypeIds" localName="cmis:allowedChildObjectTypeIds" propertyDefinitionId="cmis:allowedChildObjectTypeIds" queryName="cmis:allowedChildObjectTypeIds"/>
<cmis:propertyString displayName="cmis:path" localName="cmis:path" propertyDefinitionId="cmis:path" queryName="cmis:path">
<cmis:value>/acme/categories/acme/News</cmis:value>
</cmis:propertyString>
<cmis:propertyId displayName="cmis:objectTypeId" localName="cmis:objectTypeId" propertyDefinitionId="cmis:objectTypeId" queryName="cmis:objectTypeId">
<cmis:value>exo:taxonomy</cmis:value>
</cmis:propertyId>
<cmis:propertyString displayName="cmis:lastModifiedBy" localName="cmis:lastModifiedBy" propertyDefinitionId="cmis:lastModifiedBy" queryName="cmis:lastModifiedBy"/>
<cmis:propertyString displayName="cmis:name" localName="cmis:name" propertyDefinitionId="cmis:name" queryName="cmis:name">
<cmis:value>News</cmis:value>
</cmis:propertyString>
<cmis:propertyString displayName="cmis:createdBy" localName="cmis:createdBy" propertyDefinitionId="cmis:createdBy" queryName="cmis:createdBy"/>
<cmis:propertyId displayName="cmis:objectId" localName="cmis:objectId" propertyDefinitionId="cmis:objectId" queryName="cmis:objectId">
<cmis:value>f59a3539c0a80003625790bdadf566c5</cmis:value>
</cmis:propertyId>
<cmis:propertyDateTime displayName="cmis:creationDate" localName="cmis:creationDate" propertyDefinitionId="cmis:creationDate" queryName="cmis:creationDate"/>
<cmis:propertyString displayName="cmis:changeToken" localName="cmis:changeToken" propertyDefinitionId="cmis:changeToken" queryName="cmis:changeToken"/>
<cmis:propertyId displayName="cmis:baseTypeId" localName="cmis:baseTypeId" propertyDefinitionId="cmis:baseTypeId" queryName="cmis:baseTypeId">
<cmis:value>cmis:folder</cmis:value>
</cmis:propertyId>
<cmis:propertyId displayName="cmis:parentId" localName="cmis:parentId" propertyDefinitionId="cmis:parentId" queryName="cmis:parentId">
<cmis:value>f59a3533c0a8000339af97059f243a25</cmis:value>
</cmis:propertyId>
<cmis:propertyDateTime displayName="cmis:lastModificationDate" localName="cmis:lastModificationDate" propertyDefinitionId="cmis:lastModificationDate" queryName="cmis:lastModificationDate"/>
</cmis:properties>
<cmis:acl/>
<cmis:exactACL>false</cmis:exactACL>
<cmis:policyIds/>
<cmis:rendition/>
</cmisra:object>
</entry>
To get the file which has uploaded above, use the children service to get the list of child nodes of /acme/documents. Find this service URL in the response XML above:
curl -o childs.xml -u root:gtn http://localhost:8080/rest/private/cmisatom/Managed%20Sites/children/f59a3539c0a80003625790bdadf566c5
In the requested file (childs.xml), find the entry related to test.txt file uploaded via Sites Explorer. Find by title for name "test.txt".
<entry xmlns:cmisra="http://docs.oasis-open.org/ns/cmis/restatom/200908/">
<id>f708e208c0a80003554babb97bd934ba</id>
<published>2010-09-09T18:06:31.987Z</published>
<updated>2010-09-09T18:06:31.987Z</updated>
<summary type="text"/>
<author>
<name>system</name>
</author>
<title type="text">test.txt</title>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites" rel="service" type="application/atomsvc+xml"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/object/f708e208c0a80003554babb97bd934ba" rel="self"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/object/f708e208c0a80003554babb97bd934ba" rel="edit"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/typebyid/cmis%3Adocument" rel="describedby" type="application/atom+xml; type=entry"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/allowableactions/f708e208c0a80003554babb97bd934ba" rel="http://docs.oasis-open.org/ns/cmis/link/200908/allowableactions" type="application/cmis+xml; type=allowableActions"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/relationships/f708e208c0a80003554babb97bd934ba" rel="http://docs.oasis-open.org/ns/cmis/link/200908/relationships" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/policies/f708e208c0a80003554babb97bd934ba" rel="http://docs.oasis-open.org/ns/cmis/link/200908/policies" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/objacl/f708e208c0a80003554babb97bd934ba" rel="http://docs.oasis-open.org/ns/cmis/link/200908/acl" type="application/cmisacl+xml"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/versions/f708a0f1c0a8000333e3681f99fab760" rel="version-history" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/object/f708e208c0a80003554babb97bd934ba?returnVersion=latest" rel="current-version" type="application/atom+xml; type=entry"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/parents/f708e208c0a80003554babb97bd934ba" rel="up" type="application/atom+xml; type=feed"/>
<link href="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/file/f708e208c0a80003554babb97bd934ba" rel="edit-media"/>
<content src="http://localhost:8080/rest/private/cmisatom/Managed%20Sites/file/f708e208c0a80003554babb97bd934ba" type="text/plain"/>
<cmisra:object xmlns:cmis="http://docs.oasis-open.org/ns/cmis/core/200908/">
<cmis:properties>
<cmis:propertyBoolean displayName="cmis:isLatestMajorVersion" localName="cmis:isLatestMajorVersion" propertyDefinitionId="cmis:isLatestMajorVersion" queryName="cmis:isLatestMajorVersion">
<cmis:value>false</cmis:value>
</cmis:propertyBoolean>
<cmis:propertyInteger displayName="cmis:contentStreamLength" localName="cmis:contentStreamLength" propertyDefinitionId="cmis:contentStreamLength" queryName="cmis:contentStreamLength">
<cmis:value>38</cmis:value>
</cmis:propertyInteger>
<cmis:propertyId displayName="cmis:contentStreamId" localName="cmis:contentStreamId" propertyDefinitionId="cmis:contentStreamId" queryName="cmis:contentStreamId">
<cmis:value>f708a0c2c0a800033bedeb35caddeed1</cmis:value>
</cmis:propertyId>
<cmis:propertyId displayName="cmis:objectTypeId" localName="cmis:objectTypeId" propertyDefinitionId="cmis:objectTypeId" queryName="cmis:objectTypeId">
<cmis:value>cmis:document</cmis:value>
</cmis:propertyId>
<cmis:propertyString displayName="cmis:versionSeriesCheckedOutBy" localName="cmis:versionSeriesCheckedOutBy" propertyDefinitionId="cmis:versionSeriesCheckedOutBy" queryName="cmis:versionSeriesCheckedOutBy"/>
<cmis:propertyId displayName="cmis:versionSeriesCheckedOutId" localName="cmis:versionSeriesCheckedOutId" propertyDefinitionId="cmis:versionSeriesCheckedOutId" queryName="cmis:versionSeriesCheckedOutId"/>
<cmis:propertyString displayName="cmis:name" localName="cmis:name" propertyDefinitionId="cmis:name" queryName="cmis:name">
<cmis:value>test.txt</cmis:value>
</cmis:propertyString>
<cmis:propertyString displayName="cmis:contentStreamMimeType" localName="cmis:contentStreamMimeType" propertyDefinitionId="cmis:contentStreamMimeType" queryName="cmis:contentStreamMimeType">
<cmis:value>text/plain</cmis:value>
</cmis:propertyString>
<cmis:propertyId displayName="cmis:versionSeriesId" localName="cmis:versionSeriesId" propertyDefinitionId="cmis:versionSeriesId" queryName="cmis:versionSeriesId">
<cmis:value>f708a0f1c0a8000333e3681f99fab760</cmis:value>
</cmis:propertyId>
<cmis:propertyDateTime displayName="cmis:creationDate" localName="cmis:creationDate" propertyDefinitionId="cmis:creationDate" queryName="cmis:creationDate">
<cmis:value>2010-09-09T18:06:31.987Z</cmis:value>
</cmis:propertyDateTime>
<cmis:propertyString displayName="cmis:changeToken" localName="cmis:changeToken" propertyDefinitionId="cmis:changeToken" queryName="cmis:changeToken"/>
<cmis:propertyBoolean displayName="cmis:isLatestVersion" localName="cmis:isLatestVersion" propertyDefinitionId="cmis:isLatestVersion" queryName="cmis:isLatestVersion">
<cmis:value>true</cmis:value>
</cmis:propertyBoolean>
<cmis:propertyString displayName="cmis:versionLabel" localName="cmis:versionLabel" propertyDefinitionId="cmis:versionLabel" queryName="cmis:versionLabel">
<cmis:value>latest</cmis:value>
</cmis:propertyString>
<cmis:propertyBoolean displayName="cmis:isVersionSeriesCheckedOut" localName="cmis:isVersionSeriesCheckedOut" propertyDefinitionId="cmis:isVersionSeriesCheckedOut" queryName="cmis:isVersionSeriesCheckedOut">
<cmis:value>false</cmis:value>
</cmis:propertyBoolean>
<cmis:propertyString displayName="cmis:lastModifiedBy" localName="cmis:lastModifiedBy" propertyDefinitionId="cmis:lastModifiedBy" queryName="cmis:lastModifiedBy"/>
<cmis:propertyString displayName="cmis:createdBy" localName="cmis:createdBy" propertyDefinitionId="cmis:createdBy" queryName="cmis:createdBy"/>
<cmis:propertyString displayName="cmis:checkinComment" localName="cmis:checkinComment" propertyDefinitionId="cmis:checkinComment" queryName="cmis:checkinComment"/>
<cmis:propertyId displayName="cmis:objectId" localName="cmis:objectId" propertyDefinitionId="cmis:objectId" queryName="cmis:objectId">
<cmis:value>f708e208c0a80003554babb97bd934ba</cmis:value>
</cmis:propertyId>
<cmis:propertyBoolean displayName="cmis:isImmutable" localName="cmis:isImmutable" propertyDefinitionId="cmis:isImmutable" queryName="cmis:isImmutable">
<cmis:value>false</cmis:value>
</cmis:propertyBoolean>
<cmis:propertyBoolean displayName="cmis:isMajorVersion" localName="cmis:isMajorVersion" propertyDefinitionId="cmis:isMajorVersion" queryName="cmis:isMajorVersion">
<cmis:value>false</cmis:value>
</cmis:propertyBoolean>
<cmis:propertyId displayName="cmis:baseTypeId" localName="cmis:baseTypeId" propertyDefinitionId="cmis:baseTypeId" queryName="cmis:baseTypeId">
<cmis:value>cmis:document</cmis:value>
</cmis:propertyId>
<cmis:propertyString displayName="cmis:contentStreamFileName" localName="cmis:contentStreamFileName" propertyDefinitionId="cmis:contentStreamFileName" queryName="cmis:contentStreamFileName">
<cmis:value>test.txt</cmis:value>
</cmis:propertyString>
<cmis:propertyDateTime displayName="cmis:lastModificationDate" localName="cmis:lastModificationDate" propertyDefinitionId="cmis:lastModificationDate" queryName="cmis:lastModificationDate">
<cmis:value>2010-09-09T18:06:31.987Z</cmis:value>
</cmis:propertyDateTime>
</cmis:properties>
<cmis:acl/>
<cmis:exactACL>false</cmis:exactACL>
<cmis:policyIds/>
<cmis:rendition/>
</cmisra:object>
</entry>
Then, get the test.txt file content via CMIS by using the file service and id of the file "test.txt" from childs.xml:
curl -o test.txt -u root:gtn http://localhost:8080/rest/private/cmisatom/Managed%20Sites/file/f708e208c0a80003554babb97bd934ba
Get results in the test.txt file in the local folder. In this way we got file stored in Sites Explorer to folder /acme/documents/test.txt via eXo CMIS by symlink path /acme/categories/acme/News/test.txt. As it seen file's actual content referenced by id in CMIS. Path has no matter for content read or change.
Upload the modified local file using the command with id of the file stored in WCM (it's jcr:uuid of the file in JCR Workspace). Note that you should run this command from the folder where the local file is stored.
To update any file via CMIS, use the file service and the PUT request. Use the same file as in the previous usecase (/acme/documents/test.txt, id:f708e208c0a80003554babb97bd934ba).
curl -T test.txt -X PUT -H "Content-Type:text/plain; charset=UTF-8" -u root:gtn http://localhost:8080/rest/private/cmisatom/Managed%20Sites/file/f708e208c0a80003554babb97bd934ba
Go to the Sites Explorer and see changes applied from the local file in /acme/documents/test.txt.