Content is a fully integrated content management solution inside eXo Platform. Basically, in eXo Platform, the extension mechanism is used to add content features. To have more information about the extension mechanism, refer to the GateIn Reference Guide.
This integrated solution provides users with a comprehensive platform about integrating applications, managing and publishing content - all from a single, familiar console.
When starting a new project, you can see Content as a Java developer platform.
This document will give you guidelines related to building stable applications using Content from the inside. The document consists of the following main contents:
Applications describes portlet applications included in Content.
Configuration provides you the comprehensive knowledge about the configuration with a large range of configuration parameters declared in Content.
Developer References describes about extension, public APIs, Java APIs, FAQs and related others in Content.
All package actions in Content are started from the _delivery_ folder, so you should go to this folder first.
$ cd ecms/delivery
Package WCM standalone version - Tomcat bundle
$ cd wcm/assembly
$ mvn clean install
Package WCM with workflow enabled - Tomcat bundle
$ cd wkf-wcm/assembly
$ mvn clean install
Make WCM EAR packages to run with jBoss
$ cd wcm/assembly
$ mvn clean install
Make WCM extension EAR
$ cd packaging/wcm/ear
$ mvn clean install
Make WCM demo sites EAR
$ cd packaging/ecmdemo/ear
$ mvn clean install
Make workflow EAR
$ cd packaging/workflow/ear
$ mvn clean install
This chapter provides you a comprehensive view about portlet applications of Content, including:
These portlet applications are packaged as Web application archives (WARs).
Also, you can specify the package of each portlet and its available preferences that allow you to extend the configuration choices for standard preferences defined in portlet.xml.
The Content Detail portlet allows users to view the detail of a specific content.
This is an example of the Content Detail portlet used in Content:

Packaging: This portlet is packaged in the presentation.war file.
The portlet class name: org.exoplatform.wcm.webui.scv.UISingleContentViewerPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| repository | String | repository | The repository where data are stored and maintained. |
| workspace | String | collaboration | The workspace where content is stored. |
| nodeIdentifier | String | N/A | The UUID or the path of content that you want to show. |
| ShowTitle | Boolean | true | Show the content title on the top of the portlet. |
| ShowDate | Boolean | false | Show the content date on the top of the portlet. |
| ShowOptionBar | Boolean | false | Show a bar with some actions (Print, Back). |
| ContextEnable | Boolean | false | Define if the portlet will use the parameter on URL as the path to content to display or not. |
| ParameterName | String | content-id | Define which parameter will be used to get the content's path. |
| ShowVote | Boolean | false | Show the result of voting for the displayed content. |
| ShowComments | Boolean | false | Show the existing comments of this content (if any). |
| sharedCache | Boolean | true | Define if the portlet will cache the displayed contents. |
<portlet-preferences>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
<preference>
<name>workspace</name>
<value>collaboration</value>
<read-only>false</read-only>
</preference>
<preference>
<name>nodeIdentifier</name>
<value>/myfolder/mycontent</value>
<read-only>false</read-only>
</preference>
<preference>
<name>ShowTitle</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>ShowDate</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>ShowOptionBar</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>ShowPrintAction</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>isQuickCreate</name>
<value>false</value>
<read-only>true</read-only>
</preference>
<preference>
<name>ContextEnable</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>ParameterName</name>
<value>content-id</value>
<read-only>false</read-only>
</preference>
<preference>
<name>sharedCache</name>
<value>true</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
In Content 2.3.0, some preferences are no longer used, for example, the ShowPrintAction preference.
The Content List portlet shows a list of contents which already exist in the system.
This is an example of the Content List portlet used in Content:

Packaging: This porlet is packaged in the presentation.war file.
The portlet class name: org.exoplatform.wcm.webui.clv.UICLVPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| mode | String | AutoViewerMode | The mode for displaying content of the portlet: all contents in a specific folder or all specific contents in the portlet. |
| folderPath | String | The path to the folder whose contents are displayed by this portlet. | |
| orderBy | String | publication:liveDate | The property by which all the contents in the portlet are sorted. |
| orderType | String | DESC | The type of the content sort method: ascending or descending. |
| header | String | The header of the portlet which is displayed at the top of the portlet. | |
| automaticDetection | Boolean | true | This value indicates whether the header of the portlet is selected to be the title of the folder given in the folderPath parameter (true value) or the value given in the header parameter above. |
| formViewTemplatePath | String | /exo:ecm/views/templates/content-list-viewer/list/UIContentListPresentationDefault.gtmpl | The path to the template used to display the contents in this portlet. |
| paginatorTemplatePath | String | /exo:ecm/views/templates/content-list-viewer/paginators/UIPaginatorDefault.gtmpl | The path to the paginator used to display the contents in this portlet. |
| itemsPerPage | Integer | 10 | The number of contents displayed in every "page" of the portlet. |
| showThumbnailsView | Boolean | true | This value indicates whether the content image in this portlet is shown or not. |
| showTitle | Boolean | true | This value indicates whether the content title in this portlet is shown or not. |
| showHeader | Boolean | true | This value indicates whether the content header in this portlet is shown or not. |
| showRefreshButton | Boolean | false | This value indicates whether the Refresh button is shown in this portlet or not. |
| showDateCreated | Boolean | true | This value indicates whether the content created date in this portlet is shown or not. |
| showReadmore | Boolean | true | This value indicates whether the Read more button is shown in every content of the portlet or not. After clicking this button, the user can read the whole text of the content. |
| showSummary | Boolean | true | This value indicates whether the content summary in this portlet is shown or not. |
| showLink | Boolean | true | If this value is true, the header of every content is also the link to view this content fully. If the value is false, the header is considered as a simple text. |
| showRssLink | Boolean | true | Show the RSS link of this portlet. |
| basePath | String | detail | Show the page in which the full content is displayed when the user clicks to the Read more button. |
| contextualFolder | String | contextualDisable | Enable/disable the contextual mode of the portlet. If enabled, the portlet can take the folder path indicated in the URL to display contents. |
| showScvWith | String | content-id | The parameter name which shows the folder path in URL when the Read more button is clicked. |
| showClvBy | String | folder-id | The parameter name which shows the folder path in URL. |
| sharedCache | Boolean | true | Define if the portlet will cache the displayed contents. |
<portlet-preferences>
<preference>
<name>mode</name>
<value>AutoViewerMode</value>
<read-only>false</read-only>
</preference>
<preference>
<name>folderPath</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>orderBy</name>
<value>publication:liveDate</value>
<read-only>false</read-only>
</preference>
<preference>
<name>orderType</name>
<value>DESC</value>
<read-only>false</read-only>
</preference>
<preference>
<name>header</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>automaticDetection</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>formViewTemplatePath</name>
<value>/exo:ecm/views/templates/content-list-viewer/list/UIContentListPresentationDefault.gtmpl</value>
<read-only>false</read-only>
</preference>
<preference>
<name>paginatorTemplatePath</name>
<value>/exo:ecm/views/templates/content-list-viewer/paginators/UIPaginatorDefault.gtmpl</value>
<read-only>false</read-only>
</preference>
<preference>
<name>itemsPerPage</name>
<value>10</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showThumbnailsView</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showTitle</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showHeader</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showRefreshButton</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showDateCreated</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showReadmore</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showSummary</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showLink</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showRssLink</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>basePath</name>
<value>detail</value>
<read-only>false</read-only>
</preference>
<preference>
<name>contextualFolder</name>
<value>contextualDisable</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showScvWith</name>
<value>content-id</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showClvBy</name>
<value>folder-id</value>
<read-only>false</read-only>
</preference>
<preference>
<name>sharedCache</name>
<value>true</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
The Search portlet allows users to do a search with any string. In Content, there are three types of search: quick search, advanced search and search with saved queries.
The users can find this porlet in the front page. This is an example of the Search portlet used in Content:

Packaging: This portlet is packaged in the searches.war file.
The portlet class name: org.exoplatform.wcm.webui.search.UIWCMSearchPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| repository | string | repository | The place where data are stored and maintained. |
| workspace | string | collaboration | The workspace where the content is stored. |
| searchFormTemplatePath | string | /exo:ecm/views/templates/WCM Advance Search/search-form/UIDefaultSearchForm.gtmpl | The path to the search form template. |
| searchResultTemplatePath | string | /exo:ecm/views/templates/WCM Advance Search/search-result/UIDefaultSearchResult.gtmpl | The path to the search result template. |
| searchPaginatorTemplatePath | string | /exo:ecm/views/templates/WCM Advance Search/search-paginator/UIDefaultSearchPaginator.gtmpl | The path to the search paginator template. |
| searchPageLayoutTemplatePath | string | /exo:ecm/views/templates/WCM Advance Search/search-page-layout/UISearchPageLayoutDefault.gtmpl | The path to the search page template. |
| itemsPerPage | Integer | 5 | The number of items for each page. |
| showQuickEditButton | boolean | true | Show or hide the quick edit icon. |
| basePath | string | parameterizedviewer | The page which is used to display the search result. |
<portlet-preferences>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
<preference>
<name>workspace</name>
<value>collaboration</value>
<read-only>false</read-only>
</preference>
<preference>
<name>searchFormTemplatePath</name>
<value>/exo:ecm/views/templates/WCM Advance Search/search-form/UIDefaultSearchForm.gtmpl</value>
<read-only>false</read-only>
</preference>
<preference>
<name>searchResultTemplatePath</name>
<value>/exo:ecm/views/templates/WCM Advance Search/search-result/UIDefaultSearchResult.gtmpl</value>
<read-only>false</read-only>
</preference>
<preference>
<name>searchPaginatorTemplatePath</name>
<value>/exo:ecm/views/templates/WCM Advance Search/search-paginator/UIDefaultSearchPaginator.gtmpl</value>
<read-only>false</read-only>
</preference>
<preference>
<name>searchPageLayoutTemplatePath</name>
<value>/exo:ecm/views/templates/WCM Advance Search/search-page-layout/UISearchPageLayoutDefault.gtmpl</value>
<read-only>false</read-only>
</preference>
<preference>
<name>itemsPerPage</name>
<value>5</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showQuickEditButton</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>basePath</name>
<value>parameterizedviewer</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
The Sites Explorer portlet is used to manage all documents in different drives. With this portlet, users can do many different actions depending on their roles, such as adding/deleting a category and a document, showing/hiding a node, managing publication, and more.
This is an example of the Sites Explorer portlet used in Content:

Packaging: The porlet is packaged in the ecmexplorer.war file.
The portlet class name: org.exoplatform.ecm.webui.component.explorer.UIJCRExplorerPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| repository | string | repository | The repository name which is used in an instance of Sites Explorer. |
| workspace | string | N/A | Not in use. The workspace name was included in the Drive. |
| path | string | N/A | The path of the node. This preference will be used when the selected usecase is Parameterize. |
| drive | string | N/A | Not in use. Replaced by the driveName preference. |
| views | string | N/A | Not in use. The views will be displayed basing on the Drive which the user has the access permission. |
| allowCreateFolders | string | N/A | Allow creating a folder by type. When you do not specify the value, the default value will be nt:unstructured, nt:folder. |
| categoryMandatoryWhenFileUpload | boolean | false | Force a user to add a category when uploading or creating a document. |
| uploadFileSizeLimitMB | float | 150 | The maximum size of a file that is uploaded to the system (MB). |
| usecase | string | selection | The behavior to access Sites Explorer. By default, the "selection" option is configured. Besides "selection", there are four other ways to configure the Sites Explorer: Jailed, Personal, Social, Parameterize. |
| driveName | string | private | The name of drive which the user wants to access. |
| trashHomeNodePath | string | /Trash | The location to store the deleted nodes. |
| trashRepository | string | repository | The name of the repository where stores the deleted nodes. |
| trashWorkspace | string | collaboration | The name of the workspace where stores the deleted nodes. |
| editInNewWindow | boolean | false | Allow editing documents with or without a window popup. |
| showTopBar | boolean | true | Allow showing the Top bar or not. |
| showActionBar | boolean | true | Allow showing the Action bar or not. |
| showSideBar | boolean | true | Allow showing the Side bar or not. |
| showFilterBar | boolean | true | Allow showing the Filter bar or not. |
<portlet-preferences>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
<preference>
<name>workspace</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>path</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>drive</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>views</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>allowCreateFolders</name>
<value/>
<read-only>false</read-only>
</preference>
<preference>
<name>categoryMandatoryWhenFileUpload</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>uploadFileSizeLimitMB</name>
<value>150</value>
<read-only>false</read-only>
</preference>
<preference>
<name>usecase</name>
<value>selection</value>
<read-only>false</read-only>
</preference>
<preference>
<name>driveName</name>
<value>Private</value>
<read-only>false</read-only>
</preference>
<preference>
<name>trashHomeNodePath</name>
<value>/Trash</value>
<read-only>false</read-only>
</preference>
<preference>
<name>trashRepository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
<preference>
<name>trashWorkspace</name>
<value>collaboration</value>
<read-only>false</read-only>
</preference>
<preference>
<name>editInNewWindow</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showTopBar</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showActionBar</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showSideBar</name>
<value>true</value>
<read-only>false</read-only>
</preference>
<preference>
<name>showFilterBar</name>
<value>true</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
The Administration portlet is used to manage the main ECM functions, including categories and tags, content presentation, types of content and advanced configuration.
This is an example of the Administration portlet used in Content:

Packaging: This portlet is packaged in the ecmadmin.war file.
The portlet class name: org.exoplatform.ecm.webui.component.admin.UIECMAdminPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| repository | string | Repository | The name of the current repository. |
<portlet-preferences>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
The Fast Content Creator portlet consists of two modes: Standard Content Creator and Basic Content Creator. This portlet allows users to quickly create contents without accessing the Sites Explorer portlet.
This is an example of the Fast Content Creator portlet used in Content:

By default, this porlet is applied for the Contact Us portlet in Content.
Packaging: This portlet is packaged in the formgenerator.war file.
The portlet class name: org.exoplatform.wcm.webui.fastcontentcreator.UIFCCPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| mode | string | basic | The default mode of the Fast Content Creator portlet. |
| repository | string | repository | The name of the current repository. |
| workspace | string | collaboration | The workspace where the content is stored. |
| path | string | /Groups/platform/users/Documents | The destination path where the content is stored. |
| type | string | exo:article | The node type of document which is shown on the dialog form. |
| saveButton | string | Save | The custom button: Save. |
| saveMessage | string | This node has been saved successfully | The custom message when the user clicks the Save button. |
| isRedirect | boolean | false | Specify whether redirecting to another page or not. |
| redirectPath | string | http://www.google.com.vn | The path to which the page will redirect. |
| isActionNeeded | boolean | true | Specify whether an action is needed to save to the configuration or not. |
<portlet-preferences>
<preference>
<name>mode</name>
<value>basic</value>
<read-only>true</read-only>
</preference>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
<preference>
<name>workspace</name>
<value>collaboration</value>
<read-only>false</read-only>
</preference>
<preference>
<name>path</name>
<value>/Groups/platform/users/Documents</value>
<read-only>false</read-only>
</preference>
<preference>
<name>type</name>
<value>exo:article</value>
<read-only>false</read-only>
</preference>
<preference>
<name>saveButton</name>
<value>Save</value>
<read-only>false</read-only>
</preference>
<preference>
<name>saveMessage</name>
<value>This node has been saved successfully</value>
<read-only>false</read-only>
</preference>
<preference>
<name>isRedirect</name>
<value>false</value>
<read-only>false</read-only>
</preference>
<preference>
<name>redirectPath</name>
<value>http://www.google.com.vn</value>
<read-only>false</read-only>
</preference>
<preference>
<name>isActionNeeded</name>
<value>true</value>
<read-only>true</read-only>
</preference>
</portlet-preferences>
The Form Builder portlet and its services are deprecated. It remains fully supported for eXo customers, however it will not receive any enhancement and will be removed from the product scope in the future.
The Form Builder portlet allows users to create node types and document templates for node types.
This is an example of the Form Builder portlet used in Content:

Packaging: This porlet is packaged in the formgenerator.war file.
The portlet class name: org.exoplatform.wcm.webui.formgenerator.UIFormGeneratorPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| repository | string | repository | The current repository name which is always "repository". |
<portlet-preferences>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
The Authoring portlet allows users to manage contents in draft and ones which need to be approved or published.
This is an example of the Authoring portlet used in Content:

Packaging: This porlet is packaged in the authoring-apps.war file.
The portlet class name: org.exoplatform.wcm.webui.authoring.UIWCMDashboardPortlet
| Preference | Type | Value | Description |
|---|---|---|---|
| repository | string | Repository | The name of the repository. |
| workspace | string | Collaboration | The name of the workspace. |
| drive | string | Collaboration | The name of the drive. |
<portlet-preferences>
<preference>
<name>repository</name>
<value>repository</value>
<read-only>true</read-only>
</preference>
<preference>
<name>workspace</name>
<value>collaboration</value>
<read-only>false</read-only>
</preference>
<preference>
<name>drive</name>
<value>collaboration</value>
<read-only>false</read-only>
</preference>
</portlet-preferences>
The Newsletter portlet and its services are deprecated. It remains fully supported for eXo customers, however it will not receive any enhancement and will be removed from the product scope in the future.
The Newsletter portlet is used to help users quickly get the updated newsletter from a site.
This is an example of the Newsletter portlet used in Content:

Packaging: This portlet is packaged in the newsletter.war file.
The portlet class name: org.exoplatform.wcm.webui.newsletter.manager.UINewsletterManagerPortlet
The SEO portlet allows users to manage SEO data of web content and web pages, so they can maximize their website position on search engines.
This is an example of the SEO portlet used in Content:

Packaging: This porlet is packaged in the seo.war file.
The portlet class name: org.exoplatform.wcm.webui.seo.UISEOToolbarPortlet
This chapter will help you understand what CMIS is, how it is extended in WCM, and its features via the following topics:
eXo Platform provides CMIS support using the xCMIS project and the WCM Storage provider.
The CMIS standard aims at defining a common content management web services interface that can be applied in content repositories and bring about the interoperability across repositories. The formal specification of CMIS standard is approved by the Organization for the Advancement of Structured Information Standards (OASIS) technical committee, who drives the development, convergence and adoption of global information society. With CMIS, enterprises now can deploy systems independently, and create specialized applications running over a variety of content management systems.
To see the advantages of content interoperability and the significance of CMIS as a whole, it is necessary to learn about mutual targets which caused the appearance of specification first.
Content integration: With CMIS, integrating content among various repositories, even those created by different vendors in a single application, becomes faster, simpler and more effective. CMIS makes it possible for customers to integrate content management systems into their key business processes across business departments and vendor implementations.
Access unification: CMIS enables different applications and manufacturers to be connected to a CMIS-enabled content repository simply. With CMIS, a business application's developer can focus on the application's business logic, rather than issues related to the compatibility or content migration.
The xCMIS project, which is initially contributed to the Open Source community by eXo Platform, is an Open Source implementation of the Content Management Interoperability Services (CMIS) specification. xCMIS supports all the features stated in the CMIS core definition and both REST AtomPub and Web Services (SOAP/WSDL) protocol bindings.
To learn more about xCMIS, visit:
eXo CMIS is built on the top of xCMIS embedded in eXo Platform to expose the WCM drives as the CMIS repositories. The CMIS features are implemented as a set of components deployed on the eXo Container using XML files to describe the service configuration.
SOAP protocol binding is not implemented in eXo CMIS.

Figure: How eXo CMIS works
WCM drives exposure is implemented as a WCM storage provider to the xCMIS SPI. The storage provider uses mappings from the WCM's ManageDriveService to actual JCR nodes. AtomPub bindings makes WCM structure available via CMIS standard API.
This is related to Content Management Interoperability Services (CMIS) Version 1.0 OASIS Standard 1 May 2010
http://en.wikipedia.org/wiki/Content_Management_Interoperability_Services
The CMIS interface is designed to be layered on top of existing Content Management systems and their existing programmatic interfaces. It is intended to expose all of the CM systems capabilities through the CMIS interfaces exhaustively. The CMIS specification defines the followings:
A standard "domain model" for an ECM system - a set of core concepts included in all modern ECM systems, such as Object Types, properties, folders, documents, versions, and relationships; and a set of operations performed on those concepts, such as updating documents, or navigating via a folder hierarchy.
The way to bind the CMIS domain model to two different web service protocols, including the Simple Object Access Protocol (SOAP) used in many ECM systems, and the Atom used in many Web 2.0 applications.
The SOAP protocol is not implemented in eXo CMIS.
The CMIS specification provides a Web services interface which can:
Work over existing repositories, enabling customers to build and leverage applications against multiple repositories.
Decouple Web services and content from the content management repository, enabling customers to manage content independently.
Provide common Web services and Web 2.0 interfaces to dramatically simplify the application development.
Build the development platform and language agnostic.
Support the composite application development and mashups by the business or IT analysts.
xCMIS includes the client side frameworks for integrating content from different enterprise repositories, according to CMIS standard.
The project is to make joining Enterprise Content repositories simpler by offering CMIS abilities and exposing them to language-independent CMIS clients via the most convenient protocol.
xCMIS project:
Is embedded, packaged as the J2EE Web archive (WAR) and prepared "download and go" Tomcat bundle.
Has a live demo with the full-featured CMIS Expert client, which is accessible via xcmis.org site and with prepared "download and go" Tomcat bundle (the client is accessible as the remote gadget).
Is embedded in eXo Platform to create the special xCMIS jcr repository and access it with any CMIS client.
Tested with third-party CMIS clients, such as IBM CMIS Firefox Connector and CMIS Spaces Flex+AIR client. Either local repository (as described here), or can be used as a CMIS repository's endpoint URL for these, or other types of clients.
Benefits of xCMIS:
xCMIS is an open source, server side Java CMIS implementation, enabling to expose content in the existing content repositories according to the protocols defined in the CMIS specification.
xCMIS will give developers a way to make their content repositories "pluggable" on the server side based on the internal Storage Provider Interface and additional protocol on-demand bindings.
xCMIS will provide (several) CMIS client frameworks for repository-application and repository-repository interactions. The programming language and supported protocol can be selected by users. For example, the reasonable choice for using web applications, gadgets, and/or mashups is JavaScript, or GWT over REST AtomPub, while for inter-repository exchange, it may be Java over Web Services like WSDL/SOAP.
Both the server and client sides of xCMIS are easily integrated in eXo Platform 3.0 infrastructure. In particular, xCMIS exposes the eXo JCR content repository and provides a framework for building web applications and gadgets for the GateIn portal.
The xCMIS project is distributed under the LGPL license. You can download sources on Google code, or visit Community Wiki for more information.
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 a special extension of CmisRegistry. Read the admin guide for the 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. The CMIS AtomPub binding which is based upon the Atom (RFC4287) and Atom Publishing Protocol (RFC5023) will be used.
SOAP binding is not implemented in eXo Platform 3.x.
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 the CMIS specification does not allow having more root types except ones described above (cmis:documents and cmis:folder), those two (nt:file and nt:folder) are mapped to CMIS types.
There are two more nodetypes 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 + extensions as cmis:folder
exo:taxonomy + extensions 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 is not supported by eXo CMIS due to uncompliant 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.
When working with CMIS repositories, it is important to understand that a repository reflects a WCM Drive, which is a sub-tree in JCR workspace. 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. Refer to the WCM drives mappings to know actual location of a content you will 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 contain 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 the 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 specified services in the CMIS specification.
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 is used for such nodetypes.
1. Login to the ACME website as a user with the developer role.
2. Open Group --> Sites Explorer --> Sites Management, go to the folder /acme/documents.
3. Upload any file (for example test.txt) to /acme/documents.
4. Add this file to the acme/News category. It will create a symlink to /acme/documents/test.txt in /acme/categories/acme/News.
5. 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 children 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 been 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 the Sites Explorer. Search for the "test.txt" name by title.
<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, you will get file stored in the Sites Explorer to folder /acme/documents/test.txt via eXo CMIS by symlink path /acme/categories/acme/News/test.txt. As file's actual content referenced by id in CMIS, the 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 is 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 use case (/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 to see changes applied from the local file in /acme/documents/test.txt.
CMIS provides a type-based query service for discovering objects that match specified criteria by defining a read-only projection of the CMIS data model into a Relational View.
CMIS query languages are based on a subset of the SQL-92 grammar. CMIS-specific language extensions to SQL-92 are called out explicitly. The basic structure of a CMIS query is a SQL statement that MUST include the following clauses:
SELECT (virtual columns): This clause identifies the set of virtual columns that will be included in the query results for each row.
FROM (Virtual Table Names): This clause identifies which Virtual Table(s) the query will run against.
Additionally, a CMIS query MAY include the following clauses:
WHERE (conditions): This clause identifies the constraints that rows MUST satisfy to be considered a result for the query.
ORDER BY (sort specification): This clause identifies the order in which the result rows MUST be sorted in the result row set.
Each CMIS ObjectType definition has the following query attributes:
| Name | Description |
|---|---|
| query name (String) | Used for query operations on object types. In our SQL statement examples, all objecttypes is a queryName. For example, the given queryName matches the specific type of document. For example, in query like "SELECT * FROM cmis:document" ,"cmis:document" is queryName preconfigured in Document object type definition. |
| queryable (Boolean) | Indicate whether or not this object type is queryable. A non-queryable object type is not visible through the relational view that is used for query, and can not appear in the FROM clause of a query statement. |
| fulltextIndexed (Boolean) | Indicate whether objects of this type are full-text indexed for querying via the CONTAINS() query predicate. |
| includedInSupertypeQuery (Boolean) | Indicate whether this type and its subtypes appear in a query of this type's ancestor types. For example, if Invoice is a sub-type of Document, and its value is TRUE for a query on Document type, the matched instances of Invoice will be returned. If this attribute is FALSE, no instances (including matched ones) of Invoice will be returned. |
Property definition also contains queryName and queryable attributes with the same usage.
This section gives query examples for each specific case, including:
Query: Select all cmis:document.
SELECT * FROM cmis:document
Query result:
All documents from the Apollo program.
Query: Select all documents where apollo:propertyBooster is 'Saturn V' and apollo:propertyCommander is Frank F. Borman, II or James A. Lovell, Jr.
Initial data:
document1: apollo:propertyBooster - Saturn 1B, apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyBooster - Saturn V, apollo:propertyCommander - Frank F. Borman, II
document3: apollo:propertyBooster - Saturn V, apollo:propertyCommander - James A. Lovell, Jr.
SELECT * FROM cmis:document WHERE apollo:propertyBooster = 'Saturn V' AND (apollo:propertyCommander = 'Frank F. Borman, II' OR apollo:propertyCommander = 'James A. Lovell, Jr.')
Query result:
document2 and document3.
Query: Select all documents that contains the "here" word.
Initial data:
document1: content - "There must be test word"
document2: content - "Test word is not here"
SELECT * FROM cmis:document WHERE CONTAINS('here')
Query result:
document2.
Query: Select all documents that contains "There must" phrase and do not contain the "check-word" term.
Initial data:
document1: content - "There must be test word."
document2: content - "Test word is not here. Another check-word."
document3: content - "There must be check-word."
SELECT * FROM cmis:document WHERE CONTAINS("There must" - "check-word")
Query result:
document1.
Query: Select all documents where cmis:lastModificationDate is more than 2007-01-01.
Initial data:
document1: cmis:lastModificationDate - 2006-08-08
document2: cmis:lastModificationDate - 2009-08-08
SELECT * FROM cmis:document WHERE (cmis:lastModificationDate >= TIMESTAMP '2007-01-01T00:00:00.000Z')"
Query result:
document2.
Query: Select all documents where property apollo:someProperty equals to false.
Initial data:
document1: apollo:someProperty - true
document2: apollo:someProperty - false
SELECT * FROM cmis:document WHERE (apollo:someProperty = FALSE)
Query result:
document2.
Query: Select all documents where apollo:propertyCommander is in set {'Virgil I. Grissom', 'Frank F. Borman, II', 'James A. Lovell, Jr.'}.
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander - Frank F. Borman, II
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander - Eugene A. Cernan
SELECT * FROM cmis:document WHERE apollo:propertyCommander IN ('Virgil I. Grissom', 'Frank F. Borman, II', 'James A. Lovell, Jr.')
Query result:
document2, document3.
Query: Select all documents where apollo:propertyCommander property is not in set {'Walter M. Schirra', 'James A. Lovell, Jr.'}.
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander - Frank F. Borman, II
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander - Eugene A. Cerna
SELECT * FROM cmis:document WHERE apollo:PropertyCommander NOT IN ('Walter M. Schirra', 'James A. Lovell, Jr.')
Query result:
document2, document4.
Query: Select all documents where apollo:propertyCommander_ property is not in set {'James A. Lovell, Jr.'}.
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander - Frank F. Borman, II
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander - Eugene A. Cerna
SELECT * FROM cmis:document WHERE NOT (apollo:propertyCommander NOT IN ('James A. Lovell, Jr.'))
Query result:
document3.
Query: Select all folders that are in folder1.
Initial data:
folder1: id - 123456789
document1: Title - node1
folder3:
folder4:
folder2:
document2: Title - node2
SELECT * FROM cmis:folder WHERE IN_FOLDER('123456789')
Query result:
folder3.
Query: Select all documents that are in folder1.
Initial data:
folder1: id - 123456789
document1: Title - node1
folder2:
document2: Title - node2
SELECT * FROM cmis:document WHERE IN_FOLDER('123456789')
Query result:
document1.
Initial data:
testRoot: id - 123456789
document1: Title - node1 typeID - cmis:article-sports
document2: Title - node2 typeID - cmis:article-animals
SELECT * FROM cmis:article WHERE IN_FOLDER('123456789')
Query result:
document1, document2.
Query: Select all documents that are in the tree of folder1.
Initial data:
folder1: id - 123456789
document1
folder2:
document2
SELECT * FROM cmis:document WHERE IN_TREE('123456789')
Query result:
document1, document2.
Query: Select all documents where apollo:propertyCommander begins with "James".
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander - Frank F. James, II
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander - Eugene A. James
SELECT * FROM cmis:document AS doc WHERE apollo:PropertyCommander LIKE 'James%'
Query result:
document3.
Query: Select all documents where apollo:someProperty like 'ad%min%'.
Initial data:
document1: Title - node1, apollo:someProperty - ad%min master
document2: Title - node2, apollo:someProperty - admin operator
document3: Title - node2, apollo:someProperty - radmin
SELECT * FROM cmis:document AS doc WHERE apollo:someProperty LIKE 'ad%min%'
Query result:
document1.
Query: Select all documents that do not contain the "world" word.
Initial data:
document1: Title - node1, content - hello world
document2: Title - node2, content - hello
SELECT * FROM cmis:document WHERE NOT CONTAINS('world')
Query result:
document2.
Query: Select all documents that has apollo:propertyCommander property is NOT NULL.
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander -
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander -
SELECT * FROM cmis:document WHERE apollo:propertyCommander is NOT NULL
Query result:
document1, document3.
Query: Select all documents in default order (by document name).
Initial data:
document1: Title - Apollo 7
document2: Title - Apollo 8
document3: Title - Apollo 13
document4: Title - Apollo 17
SELECT cmis:lastModifiedBy, cmis:objectId, cmis:lastModificationDate FROM cmis:document
Query result:
document3, document4, document1, document2.
Query: Order by apollo:propertyCommander property value (in ascending order).
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander - Frank F. Borman, II
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander - Eugene A. Cerna
SELECT cmis:lastModifiedBy, cmis:objectId, cmis:lastModificationDate FROM cmis:document ORDER BY apollo:propertyCommander
Query result:
document4, document2, document3, document1.
Query: Order by apollo:propertyCommander property value (in descending order).
Initial data:
document1: apollo:propertyCommander - Walter M. Schirra
document2: apollo:propertyCommander - Frank F. James, II
document3: apollo:propertyCommander - James A. Lovell, Jr.
document4: apollo:propertyCommander - Eugene A. James
SELECT cmis:lastModifiedBy, cmis:objectId, cmis:lastModificationDate FROM cmis:document ORDER BY cmis:propertyCommander DESC
Query result:
document1, document3, document2, document4.
Query: Select all documents which contains word "moon" ordered by score.
Initial data:
document1: content - "Earth-orbital mission, the first manned launch"
document2: content - "from another celestial body - Earth's Moon"
document3: content - "NASA intended to land on the Moon, but a mid-mission technical"
document4: content - "It was the first night launch of a U.S. human"
SELECT cmis:lastModifiedBy, cmis:objectId, cmis:lastModificationDate FROM cmis:document WHERE CONTAINS('moon') ORDER BY SCORE()
Query result:
document2, document3.
Query: Select all documents which have apollo:propertyBooster peroperty that does not equal to 3.
Initial data:
document1: Title - node1, apollo:propertyBooster - 3
document2: Title - node2, apollo:propertyBooster - 15
SELECT * FROM cmis:document WHERE apollo:propertyBooster <> 3
Query result:
document2.
Query: Select all documents property apollo:someProperty that does not equals to "test word second".
Initial data:
document1: apollo:someProperty - "test word first"
document2: apollo:someProperty - "test word second"
SELECT * FROM cmis:document WHERE apollo:someProperty <> 'test word second'
Query result:
document1.
Query: Select all documents wihch have apollo:propertyBooster property which is more than 5.
Initial data:
document1: apollo:propertyBooster - 3
document2: apollo:propertyBooster - 15
SELECT * FROM cmis:document WHERE apollo:propertyBooster > 5
Query result:
document2.
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 the 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 by 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:
| Name | Description |
|---|---|
| Repository Services | Discover information about the repository and the object types defined for the repository. |
| Navigation Services | Traverse the folder hierarchy in a CMIS repository, and to locate documents which are checked out. |
| Object Services | Execute ID-based CRUD functions (Create, Retrieve, Update, Delete) on objects in a repository. |
| Multi-filing Services (optional) | Put an object in more than one folder (multi-filing), or outside the folder hierarchy (unfiling). |
| Discovery Services | Search for queryable objects in a repository. |
| Versioning Services | Check out, navigate to documents, or update a Document Version Series (checkOut, cancelCheckOut, getPropertiesOfLatestVersion, getAllVersions, deleteAllVersions). |
| Relationship Services (optional) | Retrieve an object for its relationships. |
| Policy Services (optional) | Apply, remove, or query for policies. |
| ACL Services | 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 as CMIS-compliant. Each service has binding which defines the way messages will be serialized and wired. Binding is based on HTTP and uses the Atom Publishing Protocol.
JCRs are listed below for the informational purpose only. For example, if the customer application needs to use the same third-parties used by eXo CMIS but with another version. All files are delivered in eXo Platform 3.5 distribution.
eXo CMIS consists of JAR files below:
xCMIS project files (for xCMIS 1.2.x)
xcmis-renditions-X.X.X.jar
xcmis-restatom-X.X.X.jar
xcmis-search-model-X.X.X.jar
xcmis-search-parser-cmis-X.X.X.jar
xcmis-search-service-X.X.X.jar
xcmis-spi-X.X.X.jar
eXo WCM Storage Provider for xCMIS SPI (uses the same version as the WCM/ECMS system)
exo-ecms-ext-xcmis-sp-Y.Y.Y.jar
Third-party dependencies (for xCMIS 1.2.x)
abdera-client-0.4.0-incubating.jar
abdera-core-0.4.0-incubating.jar
abdera-i18n-0.4.0-incubating.jar
abdera-parser-0.4.0-incubating.jar
abdera-server-0.4.0-incubating.jar
antlr-runtime-3.1.3.jar
axiom-api-1.2.5.jar
axiom-impl-1.2.5.jar
jaxen-1.1.1.jar
lucene-regex-2.4.1.jar
This chapter describes configurations used in Content. It consists of the following main sections:
This section describes services which provide low-level functionality for UI components.
The ActionServiceContainer component is used to manage actions (adding, removing, or executing actions, and more) in the system. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.actions.ActionServiceContainer</key>
<type>org.exoplatform.services.cms.actions.impl.ActionServiceContainerImpl</type>
<init-params>
<value-param>
<name>workspace</name>
<value>system</value>
</value-param>
<value-param>
<name>repository</name>
<value>repository</value>
</value-param>
</init-params>
</component>
Details:
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| workspace | string |
system
| The workspace name. |
| repository | string |
repository
| The repository name. |
The ApplicationTemplateManagerService component is used to manage dynamic Groovy templates for WCM-based products. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.views.ApplicationTemplateManagerService</key>
<type>org.exoplatform.services.cms.views.impl.ApplicationTemplateManagerServiceImpl</type>
<init-params>
<properties-param>
<name>storedLocations</name>
<property name="repository" value="system"/>
</properties-param>
</init-params>
</component>
Details:
Properties-param:
| Name | Property name | Type | Value | Description |
|---|---|---|---|---|
| storedLocations | repository | string | system | The repository name. |
The FragmentCacheService component is used to cache the response fragments which are sent to end-users.
The configuration of this component is found in core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/wcm-configuration.xml.
<component>
<key>org.exoplatform.services.portletcache.FragmentCacheService</key>
<type>org.exoplatform.services.portletcache.FragmentCacheService</type>
<init-params>
<value-param>
<name>cleanup-cache</name>
<description>The cleanup cache period in seconds</description>
<value>300</value>
</value-param>
</init-params>
</component>
Details
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| cleanup-cache |
integer | 300 | The time period over which cache items are expired. |
The JodConverterServices component is used to convert documents into different office formats. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.jodconverter.JodConverterService</key>
<type>org.exoplatform.services.cms.jodconverter.impl.JodConverterServiceImpl</type>
<init-params>
<value-param>
<name>port</name>
<value>${jodconverter.portNumbers}</value>
</value-param>
<value-param>
<name>officeHome</name>
<value>${jodconverter.officeHome}</value>
</value-param>
<value-param>
<name>taskQueueTimeout</name>
<value>${jodconverter.taskQueueTimeout}</value>
</value-param>
<value-param>
<name>taskExecutionTimeout</name>
<value>${jodconverter.taskExecutionTimeout}</value>
</value-param>
<value-param>
<name>maxTasksPerProcess</name>
<value>${jodconverter.maxTasksPerProcess}</value>
</value-param>
<value-param>
<name>retryTimeout</name>
<value>${jodconverter.retryTimeout}</value>
</value-param>
</init-params>
</component>
Details:
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| port | Integer | ${jodconverter.portNumbers} | The number of ports to connect with the office server. |
| officeHome | String
| ${jodconverter.officeHome} | The absolute path to the office home on the current local computer. |
| taskQueueTimeout | Long
| ${jodconverter.taskExecutionTimeout} | The maximum living time of a task in the conversation queue. |
| taskExecutionTimeout |
Long | ${jodconverter.taskExecutionTimeout} | The maximum time to process a task. |
| maxTasksPerProcess |
Integer | ${jodconverter.maxTasksPerProcess} | The maximum number of tasks are processed. |
| retryTimeout |
Long | ${jodconverter.retryTimeout} | The interval time to try to restart the office services in case they unexpectedly stop. |
The LiveLinkManagerService component is used to check broken links, update links when the links are edited and extract links to return a list of all links. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/wcm-configuration.xml.
<component>
<key>org.exoplatform.services.wcm.link.LiveLinkManagerService</key>
<type>org.exoplatform.services.wcm.link.LiveLinkManagerServiceImpl</type>
<init-params>
<properties-param>
<name>server.config</name>
<description>server.address</description>
<property name="scheme" value="http"/>
<property name="hostName" value="localhost"/>
<property name="port" value="8080"/>
</properties-param>
</init-params>
</component>
Details:
| Properties-param | Property name | Type | Value | Description |
|---|---|---|---|---|
| server.config |
|
|
| All the property names are used together to configure the server. Here is an example about the server configuration: http//:localhost:8080. |
The LockService component is used to manage all locked nodes and allows unlocking the locked nodes in the system. It is also used to assign the Lock right to a user or a user group or a membership. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.lock.LockService</key>
<type>org.exoplatform.services.cms.lock.impl.LockServiceImpl</type>
</component>
The NewsletterInitializationService component is used to initiate some data for the newsletter portlet. The configuration of this component is found in packaging/ecmdemo/webapp/src/main/webapp/WEB-INF/conf/sample-portal/wcm/newsletter-configuration.xml.
The Newsletter portlet and its services are deprecated. It remains fully supported for eXo customers, however it will not receive any enhancement and will be removed from the product scope in the future.
<component>
<type>org.exoplatform.services.wcm.newsletter.NewsletterInitializationService</type>
<init-params>
<values-param>
<name>portalNames</name>
<value>classic</value>
<value>acme</value>
</values-param>
<values-param>
<name>administrators</name>
<value>root</value>
<value>john</value>
</values-param>
<object-param>
<name>marketing</name>
<description>marketing</description>
<object type="org.exoplatform.services.wcm.newsletter.NewsletterCategoryConfig">
<field name="name">
<string>marketing</string>
</field>
<field name="title">
<string>Marketing</string>
</field>
<field name="description">
<string>You want to know where we are, where we go ?</string>
</field>
<field name="moderator">
<string>*:/platform/web-contributors</string>
</field>
</object>
</object-param>
<object-param>
<name>general</name>
<description>general</description>
<object type="org.exoplatform.services.wcm.newsletter.NewsletterCategoryConfig">
<field name="name">
<string>general</string>
</field>
<field name="title">
<string>General</string>
</field>
<field name="description">
<string>General information about us</string>
</field>
<field name="moderator">
<string>*:/platform/web-contributors</string>
</field>
</object>
</object-param>
<object-param>
<name>subscription2</name>
<description>subscription2</description>
<object type="org.exoplatform.services.wcm.newsletter.NewsletterSubscriptionConfig">
<field name="name">
<string>results</string>
</field>
<field name="title">
<string>Results</string>
</field>
<field name="description">
<string>Monthly newsletter about our results and forecasts</string>
</field>
<field name="categoryName">
<string>general</string>
</field>
<field name="redactor">
<string>*:/platform/web-contributors</string>
</field>
</object>
</object-param>
<object-param>
<name>subscription1</name>
<description>subscription1</description>
<object type="org.exoplatform.services.wcm.newsletter.NewsletterSubscriptionConfig">
<field name="name">
<string>checklist</string>
</field>
<field name="title">
<string>Check-List</string>
</field>
<field name="description">
<string>Weekly newsletter with general topics</string>
</field>
<field name="categoryName">
<string>general</string>
</field>
<field name="redactor">
<string>*:/platform/web-contributors</string>
</field>
</object>
</object-param>
<object-param>
<name>subscription3</name>
<description>subscription3</description>
<object type="org.exoplatform.services.wcm.newsletter.NewsletterSubscriptionConfig">
<field name="name">
<string>market</string>
</field>
<field name="title">
<string>The market</string>
</field>
<field name="description">
<string>What's on the market today ?</string>
</field>
<field name="categoryName">
<string>marketing</string>
</field>
<field name="redactor">
<string>*:/platform/web-contributors</string>
</field>
</object>
</object-param>
<object-param>
<name>user1@gmail.com</name>
<description>user1@gmail.com</description>
<object type="org.exoplatform.services.wcm.newsletter.config.NewsletterUserConfig">
<field name="mail">
<string>user1@gmail.com</string>
</field>
</object>
</object-param>
<object-param>
<name>user2@gmail.com</name>
<description>user2@gmail.com</description>
<object type="org.exoplatform.services.wcm.newsletter.config.NewsletterUserConfig">
<field name="mail">
<string>user2@gmail.com</string>
</field>
</object>
</object-param>
</init-params>
</component>
Details:
Value-param
| Name | Type | Value | Description |
|---|---|---|---|
| portalNames | string | classic, acme | The portal names. |
| administrators | string | root | The administrator who manages the newsletter portlet. |
Object-param:
object type: org.exoplatform.services.wcm.newsletter.NewsletterCategoryConfig
| Field | Type | Description |
|---|---|---|
| name |
string
| The name of categories or subscriptions. |
| title |
string | The title of categories or subscriptions. |
| description |
string | The description of categories or subscriptions. |
| moderator |
string
| The users or groups that can moderate the newsletter portlet. |
| categoryName |
string
| The categories name. |
| redactor |
string
| The users or groups that are newsletter redactor. |
string | The email that user uses to subscribe. |
The NewsletterManagerService component is used to send newsletters to subscribers. The configuration of this component is found in core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/ext-newsletter-configuration.xml.
The Newsletter Manager portlet and its services are deprecated. It remains fully supported for eXo customers, however it will not receive any enhancement and will be removed from the product scope in the future.
<component>
<type>org.exoplatform.services.wcm.newsletter.NewsletterManagerService</type>
<init-params>
<value-param>
<name>repository</name>
<value>repository</value>
</value-param>
<value-param>
<name>workspace</name>
<value>collaboration</value>
</value-param>
</init-params>
</component>
Details:
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| repository |
string
|
repository
| The repository name. |
| workspace |
string
|
collaboration
| The workspace name. |
The SiteSearchService component is used in the Search portlet that allows users to find all information matching with your given keyword.
It is configured in the core/core-configuration/src/main/webapp/WEB-INF/conf/configuration.xml file as follows:
<import>war:/conf/wcm-core/core-search-configuration.xml</import>
The component configuration maps the SiteSearchService component with its own implementation: SiteSearchServiceImpl.
<component>
<key>org.exoplatform.services.wcm.search.SiteSearchService</key>
<type>org.exoplatform.services.wcm.search.SiteSearchServiceImpl</type>
<component-plugins>
...
</component-plugins>
<init-params>
<value-param>
<name>isEnabledFuzzySearch</name>
<value>true</value>
</value-param>
<value-param>
<name>fuzzySearchIndex</name>
<value/>
</value-param>
</init-params>
</component>
Detail:
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| isEnabledFuzzySearch | boolean | true
| Allow administrators to enable/disable the fuzzy search mechanism. |
| fuzzySearchIndex |
N/A | N/A | Allow the approximate level between the input keyword and the found key results. In case of the invalid configuration, the default value is set to 0.8. |
To have more information about the fuzzy search, please refer to Fuzzy Search.
The SEOService component is used to help users manage SEO data of a page or a content, so their websites can achieve higher rankings on search engines. The configuration of this component is found in /packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/wcm-extension/wcm/seo-configuration.xml.
<component>
<key>org.exoplatform.services.seo.SEOService</key>
<type>org.exoplatform.services.seo.impl.SEOServiceImpl</type>
<init-params>
<object-param>
<name>seo.config</name>
<object type="org.exoplatform.services.seo.SEOConfig">
<field name="robotsindex">
<collection type="java.util.ArrayList">
<value>
<string>INDEX</string>
</value>
<value>
<string>NOINDEX</string>
</value>
</collection>
</field>
<field name="robotsfollow">
<collection type="java.util.ArrayList">
<value>
<string>FOLLOW</string>
</value>
<value>
<string>NOFOLLOW</string>
</value>
</collection>
</field>
<field name="frequency">
<collection type="java.util.ArrayList">
<value>
<string>Always</string>
</value>
<value>
<string>Hourly</string>
</value>
<value>
<string>Daily</string>
</value>
<value>
<string>Weekly</string>
</value>
<value>
<string>Monthly</string>
</value>
<value>
<string>Yearly</string>
</value>
<value>
<string>Never</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component>
Details:
Object-param:
Object type: org.exoplatform.services.seo.SEOConfig
| Field | Type | Value | Description |
|---|---|---|---|
| robotsindex |
ArrayList
|
| Allow search engines to index a particular page or not. |
| robotsfollow |
ArrayList
|
| Allow search engines to follow links from a particular page to find other pages or not. |
| frequency |
ArrayList
|
| Define how often a particular page is updated. |
The QueryService component is used to manage many queries, including adding, removing or executing a query. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.queries.QueryService</key>
<type>org.exoplatform.services.cms.queries.impl.QueryServiceImpl</type>
<init-params>
<value-param>
<name>workspace</name>
<value>system</value>
</value-param>
<value-param>
<name>relativePath</name>
<value>Private/Queries</value>
</value-param>
<value-param>
<name>group</name>
<value>*:/admin</value>
</value-param>
</init-params>
</component>
Details:
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| workspace |
string
|
system
| The workspace name. |
| relativePath |
Private/Queries
|
Private/Queries
| The path to the query location. |
| group |
string
| *:/admin | The group is allowed to access the query folder. |
The TaxonomyService component is used to sort documents to ease searches when browsing documents online. It provides a multi-dimensional set of paths to find a document. In many cases, you can get your content by using different category paths. Therefore, after creating a document somewhere in the repository, it is possible to categorize it by adding several taxonomy references. By browsing the taxonomy tree, it will be possible to find the referencing article and display them as if they were children of the taxonomy nodes. Taxonomies are stored in the JCR itself and the JCR Reference functionality is used to provide that advanced WCM feature. The tree of taxonomies can be managed simply, such as copying/cutting/pasting nodes, or adding and removing taxonomies from the tree. Once a taxonomy has been added, any user who has access to the "Manage Categories" icon from his/her view can then browse the taxonomy tree and refer one of its nodes to the created documents.
<component>
<key>org.exoplatform.services.cms.taxonomy.TaxonomyService</key>
<type>org.exoplatform.services.cms.taxonomy.impl.TaxonomyServiceImpl</type>
<init-params>
<object-param>
<name>defaultPermission.configuration</name>
<object type="org.exoplatform.services.cms.taxonomy.impl.TaxonomyTreeDefaultUserPermission">
<field name="permissions">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.services.cms.taxonomy.impl.TaxonomyTreeDefaultUserPermission$Permission">
<field name="identity">
<string>*:/platform/administrators</string>
</field>
<field name="read">
<string>true</string>
</field>
<field name="addNode">
<string>true</string>
</field>
<field name="setProperty">
<string>true</string>
</field>
<field name="remove">
<string>true</string>
</field>
</object>
</value>
<value>
<object type="org.exoplatform.services.cms.taxonomy.impl.TaxonomyTreeDefaultUserPermission$Permission">
<field name="identity">
<string>*:/platform/users</string>
</field>
<field name="read">
<string>true</string>
</field>
<field name="addNode">
<string>true</string>
</field>
<field name="setProperty">
<string>true</string>
</field>
<field name="remove">
<string>false</string>
</field>
</object>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component>
Details:
Object type: org.exoplatform.services.cms.taxonomy.impl.TaxonomyTreeDefaultUserPermission
| Field | Type | Value | Description |
|---|---|---|---|
| permissions | ArrayList
| {java.util.ArrayList} | The list of the default user permissions to access the taxonomy tree. |
Object type: org.exoplatform.services.cms.taxonomy.impl.TaxonomyTreeDefaultUserPermission$Permission
| Field | Type | Description |
|---|---|---|
| identity | string | The name of user, group or membership. |
| read |
boolean | The permission to read the taxonomy tree. |
| addNode | boolean
| The permission to add a node to the taxonomy tree. |
| setProperty | boolean | The permission to set properties for a node in the taxonomy tree. |
| remove | boolean | The permission to remove a node from the taxonomy tree. |
The ThumbnailService component is used to resize all the images into different sizes. Besides the default sizes, it also allows users to customize the images into the desired sizes. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.thumbnail.ThumbnailService</key>
<type>org.exoplatform.services.cms.thumbnail.impl.ThumbnailServiceImpl</type>
<init-params>
<value-param>
<name>smallSize</name>
<value>32x32</value>
</value-param>
<value-param>
<name>mediumSize</name>
<value>64x64</value>
</value-param>
<value-param>
<name>largeSize</name>
<value>300x300</value>
</value-param>
<value-param>
<name>enable</name>
<value>false</value>
</value-param>
<value-param>
<name>mimetypes</name>
<value>image/jpeg;image/png;image/gif;image/bmp</value>
</value-param>
</init-params>
</component>
Details:
Value-param:
| Name | Type | Value | Description |
|---|---|---|---|
| smallSize |
integer x integer
|
32x32
| The small thumbnail size. |
| mediumSize |
integer x integer
|
64x64
| The medium thumbnail size. |
| largeSize |
integer x integer
|
300x300
| The large thumbnail size. |
| enable |
boolean
|
false
| Specify if the thumbnail is displayed or not. |
| mimetypes |
Images formats
|
image/jpeg;image/png;image/gif;image/bmp
| The image formats are supported. |
The TimelineService component allows documents to be displayed by days, months and years. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.timeline.TimelineService</key>
<type>org.exoplatform.services.cms.timeline.impl.TimelineServiceImpl</type>
<init-params>
<value-param>
<name>itemPerTimeline</name>
<value>5</value>
</value-param>
</init-params>
</component>
Details:
Value-param
| Name | Type | Value | Description |
|---|---|---|---|
| itemPerTimeline |
integer
|
5
| The number of documents are displayed. |
The WatchDocumentService component allows users to watch/unwatch a document. If they are watching the document, they will receive a notification mail when there are any changes on the document. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.cms.watch.WatchDocumentService</key>
<type>org.exoplatform.services.cms.watch.impl.WatchDocumentServiceImpl</type>
<init-params>
<object-param>
<name>messageConfig</name>
<description>description</description>
<object type="org.exoplatform.services.cms.watch.impl.MessageConfig">
<field name="sender">
<string>support@exoplatform.com</string>
</field>
<field name="subject">
<string>Your watching document is changed</string>
</field>
<field name="content">
<string>The document that you are watching is changed.
Please go to ecm to see this change
</string>
</field>
</object>
</object-param>
</init-params>
</component>
Details:
object-param:
Object type: org.exoplatform.services.cms.watch.impl.MessageConfig
| Field | Type | Value | Description |
|---|---|---|---|
| sender | string | support@exoplatform.com | The sender who sends the notification mail. |
| subject | string | Your watching document is changed. | The subject of the notification mail. |
| content | string | The document that you are watching is changed. Please go to ecm to see this change. | The content of the notification mail. |
The WCMService component allows setting expiration cache of portlets and checking given portals if they are shared portals or not. It also gets reference contents basing on item identifiers. The configuration of this component is found in /core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
<component>
<key>org.exoplatform.services.wcm.core.WCMService</key>
<type>org.exoplatform.services.wcm.core.impl.WCMServiceImpl</type>
<init-params>
<properties-param>
<name>server.config</name>
<description>server.config</description>
<property name="expirationCache" value="30"/>
</properties-param>
</init-params>
</component>
Details:
| Properties-param | Property name | Type | Value | Description |
|---|---|---|---|---|
| server.config | expirationCache |
integer
|
30
| The period in which the cache is clear in second. By default, the cache is cleared every 30 seconds. |
This section describes the main component plugins used in Content. Each part supply an example configuration with the explanation about ini-params so you can know how to use these plugins.
This plugin is used to manage the publication lifecycle of web contents and DMS document on a portal page with more states and versions. The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/content-extended/authoring/configuration.xml.
Sample configuration:
<component-plugin>
<name>Authoring publication</name>
<set-method>addPublicationPlugin</set-method>
<type>org.exoplatform.services.wcm.extensions.publication.lifecycle.authoring.AuthoringPublicationPlugin
</type>
<description>This publication lifecycle publish a web content or DMS document to a portal page with more
states and version.
</description>
</component-plugin>
In which:
Name: Authoring publication
Set-method: addPublicationPlugin
Type: org.exoplatform.services.wcm.extensions.publication.lifecycle.authoring.AuthoringPublicationPlugin
This is an abstract class and the parent of ScriptActionPlugin and BPActionPlugin . You can create a link from this plugin to its children.
This plugin is used to define the business process action in Workflow.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.actions.ActionServiceContainer</target-component>
The configuration is applied mainly in packaging/workflow/webapp/src/main/webapp/WEB-INF/workflow-extension/workflow/workflow-system-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.actions.ActionServiceContainer</target-component>
<component-plugin>
<name>exo:businessProcessAction</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.plugin.actions.impl.BPActionPlugin</type>
<priority>112</priority>
<init-params>
<object-param>
<name>predefined.actions</name>
<description>description</description>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig">
<field name="repository">
<string>repository</string>
</field>
<field name="workspace">
<string>collaboration</string>
</field>
<field name="actions">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig$Action">
<field name="type">
<string>exo:publishingProcess</string>
</field>
<field name="name">
<string>content publishing</string>
</field>
<field name="description">
<string>content publishing workflow</string>
</field>
<field name="srcWorkspace">
<string>collaboration</string>
</field>
<field name="srcPath">
<string>/Documents/Validation Requests</string>
</field>
<field name="isDeep">
<boolean>true</boolean>
</field>
<field name="lifecyclePhase">
<collection type="java.util.ArrayList">
<value>
<string>node_added</string>
</value>
</collection>
</field>
<field name="roles">
<string>*:/platform/users</string>
</field>
<field name="variables">
<string>
exo:supervisor=*:/organization/management/executive-board;exo:validator=*:/platform/administrators
</string>
</field>
<field name="mixins">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig$Mixin">
<field name="name">
<string>exo:publishLocation</string>
</field>
<field name="properties">
<string>
exo:publishWorkspace=collaboration;exo:publishPath=/Documents/Live;exo:validator=*:/platform/administrators
</string>
</field>
</object>
</value>
<value>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig$Mixin">
<field name="name">
<string>exo:pendingLocation</string>
</field>
<field name="properties">
<string>
exo:pendingWorkspace=collaboration;exo:pendingPath=/Documents/Pending
</string>
</field>
</object>
</value>
<value>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig$Mixin">
<field name="name">
<string>exo:backupLocation</string>
</field>
<field name="properties">
<string>exo:backupWorkspace=backup;exo:backupPath=/Expired
Documents
</string>
</field>
</object>
</value>
<value>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig$Mixin">
<field name="name">
<string>exo:trashLocation</string>
</field>
<field name="properties">
<string>
exo:trashWorkspace=collaboration;exo:trashPath=/Documents/Trash
</string>
</field>
</object>
</value>
<value>
<object type="org.exoplatform.services.cms.actions.impl.ActionConfig$Mixin">
<field name="name">
<string>mix:affectedNodeTypes</string>
</field>
<field name="properties">
<string>
exo:affectedNodeTypeNames=exo:article,exo:podcast,exo:sample,kfx:document,nt:file,rma:filePlan
</string>
</field>
</object>
</value>
</collection>
</field>
</object>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: exo:businessProcessAction
Set-method: addPlugin
Type: org.exoplatform.services.plugin.actions.impl.BPActionPlugin
Object type: org.exoplatform.services.cms.actions.impl.ActionConfig
| Field | Type | Value | Description |
|---|---|---|---|
| repository | string
| repository
| The repository name. |
| workspace | string
| collaboration
| The workspace name. |
| action | ArrayList
| {java.util.ArrayList} | The action name. |
This plugin is used to filter WCM node types.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.templates.TemplateService</target-component>
The configuration is applied mainly in /packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-templates-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.templates.TemplateService</target-component>
<component-plugin>
<name>FilterContentTypeForWCMSpecificFolder</name>
<set-method>addContentTypeFilterPlugin</set-method>
<type>org.exoplatform.services.cms.templates.ContentTypeFilterPlugin</type>
<description>this plugin is used to filter wcm nodetype</description>
<init-params>
<object-param>
<name>cssFolderFilter</name>
<description>only exo:cssFile can be created in exo:cssFolder</description>
<object type="org.exoplatform.services.cms.templates.ContentTypeFilterPlugin$FolderFilterConfig">
<field name="folderType">
<string>exo:cssFolder</string>
</field>
<field name="contentTypes">
<collection type="java.util.ArrayList">
<value>
<string>exo:cssFile</string>
</value>
</collection>
</field>
</object>
</object-param>
<object-param>
...
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: FilterContentTypeForWCMSpecificFolder
Set-method: addContentTypeFilterPlugin
Type: org.exoplatform.services.cms.templates.ContentTypeFilterPlugin
Object type: org.exoplatform.services.cms.templates.ContentTypeFilterPlugin$FolderFilterConfig
| Field | Type | Value | Description |
|---|---|---|---|
| folderType | string | exo:cssFolder
| The folder type. |
| contentTypes | ArrayList | {java.util.ArrayList} | The content type. |
This plugin is used to store the context configuration of a publication lifecycle. To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.wcm.extensions.publication.PublicationManager</target-component>
The configuration is applied mainly in packaging/ecmdemo/webapp/src/main/webapp/WEB-INF/conf/sample-portal/wcm/content-configuration.xml or packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/content-extended/authoring/configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.wcm.extensions.publication.PublicationManager</target-component>
<component-plugin>
<name>AddContext</name>
<set-method>addContext</set-method>
<type>org.exoplatform.services.wcm.extensions.publication.context.ContextPlugin</type>
<init-params>
<object-param>
<name>contexts</name>
<object type="org.exoplatform.services.wcm.extensions.publication.context.impl.ContextConfig">
<field name="contexts">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.services.wcm.extensions.publication.context.impl.ContextConfig$Context">
<field name="name">
<string>context2</string>
</field>
<field name="priority">
<string>100</string>
</field>
<field name="lifecycle">
<string>lifecycle2</string>
</field>
<field name="site">
<string>acme</string>
</field>
</object>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: AddContext
Set-method: addContext
Type: org.exoplatform.services.wcm.extensions.publication.context.ContextPlugin
Object type: org.exoplatform.services.wcm.extensions.publication.context.impl.ContextConfig
| Field | Type | Value | Description |
|---|---|---|---|
| name |
string
|
context2
| The name of the context. |
| priority |
string
|
100
| The context priority, the higher number indicates higher priority. Because a site may have several lifecycles, the lifecycle with higher priority will be executed sooner. |
| lifecycle |
string
|
lifecycle2
| The name of the lifecycle. |
| site |
string
|
acme
| The site that will apply the context configuration. |
This is an abstract class and the parent of TaxonomyPlugin . You can create a link from this plugin to its children.
This plugin is used in the SiteSearchService component to filter the search results before these results are presented on the search page.
The configuration is applied mainly in core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-search-configuration.xml.
Sample configuration:
<component-plugins>
<component-plugin>
<name>ExcludeMimeTypes</name>
<set-method>addExcludeIncludeDataTypePlugin</set-method>
<type>org.exoplatform.services.wcm.search.ExcludeIncludeDataTypePlugin</type>
<init-params>
<properties-param>
<name>search.exclude.datatypes</name>
<description>exclude some data type when search</description>
<property name="mimetypes" value="text/css,text/javascript,application/x-javascript,text/ecmascript"/>
</properties-param>
</init-params>
</component-plugin>
</component-plugins>
In which:
Name: ExcludeMimeTypes
Set-method: addExcludeIncludeDataTypePlugin
Type: org.exoplatform.services.wcm.search.ExcludeIncludeDataTypePlugin
The plugin has the following parameter:
| Properties-param | Description |
|---|---|
| search.exclude.datatype | Exclude some data types when doing search. |
The search.exclude.datatype property includes two attributes:
| Attribute | Value | Description |
|---|---|---|
| name |
mimetypes
| The name of the property param. |
| value |
text/css,text/javascript,application/x-javascript,text/ecmascript | The list of mimetypes which will be excluded from the search results. |
This plugin is used to refine URLs in Content.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.wcm.friendly.FriendlyService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/content-extended/friendly/configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.wcm.friendly.FriendlyService</target-component>
<component-plugin>
<name>FriendlyService.addConfiguration</name>
<set-method>addConfiguration</set-method>
<type>org.exoplatform.services.wcm.friendly.impl.FriendlyPlugin</type>
<description>Configures</description>
<priority>100</priority>
<init-params>
<value-param>
<name>enabled</name>
<value>true</value>
</value-param>
<object-param>
<name>friendlies.configuration</name>
<object type="org.exoplatform.services.wcm.friendly.impl.FriendlyConfig">
<field name="friendlies">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.services.wcm.friendly.impl.FriendlyConfig$Friendly">
<field name="friendlyUri">
<string>documents</string>
</field>
<field name="unfriendlyUri">
<string>/public/acme/detail?content-id=/repository/collaboration</string>
</field>
</object>
</value>
<value>
<object type="org.exoplatform.services.wcm.friendly.impl.FriendlyConfig$Friendly">
<field name="friendlyUri">
<string>files</string>
</field>
<field name="unfriendlyUri">
<string>/rest-ecmdemo/jcr/repository/collaboration</string>
</field>
</object>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: FriendlyService.addConfiguration
Set-method: addConfiguration
Type: org.exoplatform.services.wcm.friendly.impl.FriendlyPlugin
Object type: org.exoplatform.services.wcm.friendly.impl.FriendlyConfig
| Field | Type | Value | Description |
|---|---|---|---|
| friendlyUrl | string | documents | The object that will be applied the friendly URL. |
| unfriendlyUrl | string | /public/acme/detail?content-id=/repository/collaboration | The path to the location that will be applied the friendly URL. |
This plugin is used to configure the file types and get thumbnail for images.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.thumbnail.ThumbnailService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-thumbnail-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.thumbnail.ThumbnailService</target-component>
<component-plugin>
<name>ImageThumbnailPlugin</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.cms.thumbnail.impl.ImageThumbnailPlugin</type>
<init-params>
<object-param>
<name>thumbnailType</name>
<description>Thumbnail types</description>
<object type="org.exoplatform.services.cms.thumbnail.impl.ThumbnailType">
<field name="mimeTypes">
<collection type="java.util.ArrayList">
<value>
<string>image/jpeg</string>
</value>
<value>
<string>image/png</string>
</value>
<value>
<string>image/gif</string>
</value>
<value>
<string>image/bmp</string>
</value>
<value>
<string>image/tiff</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: ImageThumbnailPlugin
Set-method: addPlugin
Type: org.exoplatform.services.cms.thumbnail.impl.ImageThumbnailPlugin
Object type: org.exoplatform.services.cms.thumbnail.impl.ThumbnailType
| Field | Type | Value | Description |
|---|---|---|---|
| mimeTypes |
String
|
| The list of thumbnail image types. |
When a new portal is created, the configuration of IgnorePortalPlugin is used to avoid deploying data to the existing ones which are listed in the init-parameters.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.wcm.portal.artifacts.CreatePortalArtifactsService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/wcm-extension/wcm/deployment/template-deployment-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.wcm.portal.artifacts.CreatePortalArtifactsService</target-component>
<component-plugin>
<name>Add ignored portals</name>
<set-method>addIgnorePortalPlugin</set-method>
<type>org.exoplatform.services.wcm.portal.artifacts.IgnorePortalPlugin</type>
<description>ignored portals. the service will not deploy data to the ignored portals</description>
<init-params>
<values-param>
<name>ignored.portals</name>
<description>ignored portal list</description>
<value>classic</value>
<value>acme</value>
<value>WAIPortal</value>
</values-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: Add ignored portals
Set-method: addIgnorePortalPlugin
Type: org.exoplatform.services.wcm.portal.artifacts.IgnorePortalPlugin
Init-params
| Name | Type | Value | Description |
|---|---|---|---|
| ignored.portals |
string
|
classic, acme, WAIPortal
| The list of ignored existing portals. |
When a portal is created, this plugin will deploy initial web-contents as the site artifact into the Site Artifact folder of that portal.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.wcm.portal.artifacts.CreatePortalArtifactsService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/wcm-extension/wcm/newsletter-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.wcm.portal.artifacts.CreatePortalArtifactsService</target-component>
<component-plugin>
<name>Initial webcontent artifact for each site</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.wcm.webcontent.InitialWebContentPlugin</type>
<description>This plugin deploy some initial webcontent as site artifact to site artifact folder of portal when
a portal is
created
</description>
<init-params>
<object-param>
<name>Portal logo data</name>
<description>Deployment Descriptor</description>
<object type="org.exoplatform.services.deployment.DeploymentDescriptor">
<field name="target">
<object type="org.exoplatform.services.deployment.DeploymentDescriptor$Target">
<field name="repository">
<string>repository</string>
</field>
<field name="workspace">
<string>collaboration</string>
</field>
<field name="nodePath">
<string>/sites content/live/{portalName}/web contents/site artifacts</string>
</field>
</object>
</field>
<field name="sourcePath">
<string>war:/conf/sample-portal/wcm/artifacts/site-resources/acme-templates/Logo.xml</string>
</field>
</object>
</object-param>
<object-param>
<name>Portal signin data</name>
<description>Deployment Descriptor</description>
<object type="org.exoplatform.services.deployment.DeploymentDescriptor">
<field name="target">
<object type="org.exoplatform.services.deployment.DeploymentDescriptor$Target">
<field name="repository">
<string>repository</string>
</field>
<field name="workspace">
<string>collaboration</string>
</field>
<field name="nodePath">
<string>/sites content/live/{portalName}/web contents/site artifacts</string>
</field>
</object>
</field>
<field name="sourcePath">
<string>war:/conf/sample-portal/wcm/artifacts/site-resources/acme-templates/Signin.xml</string>
</field>
</object>
</object-param>
<object-param>
...
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: AddLifecycle
Set-method: addPlugin
Type: org.exoplatform.services.wcm.webcontent.InitialWebContentPlugin
Object type: org.exoplatform.services.deployment.DeploymentDescriptor$Target
| Name | Type | Value | Description |
|---|---|---|---|
| repository |
string
|
repository
| The repository into which the initial web contents will be deployed. |
| workspace | string | collaboration | The workspace into which the initial web contents will be deployed. |
| nodePath | string | /sites content/live//web contents/site artifacts | The target node where the initial web-contents will be deployed into. |
| sourcePath | string | war:/conf/sample-portal/wcm/artifacts/site-resources/acme-templates/Logo.xml | The path to the source that this plugin will get data. |
This plugin is used to create predefined Symlinks into the system.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.deployment.WCMContentInitializerService</target-component>
The configuration is applied mainly in packaging/ecmdemo/webapp/src/main/webapp/WEB-INF/conf/sample-portal/wcm/deployment/acme-deployment-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.deployment.WCMContentInitializerService</target-component>
<component-plugin>
<name>Content Initializer Service</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.deployment.plugins.LinkDeploymentPlugin</type>
<description>Link Deployment Plugin</description>
<init-params>
<object-param>
<name>link01</name>
<description>Deployment Descriptor</description>
<object type="org.exoplatform.services.deployment.plugins.LinkDeploymentDescriptor">
<field name="sourcePath">
<string>repository:collaboration:/sites content/live/acme/web contents/News/News1</string>
</field>
<field name="targetPath">
<string>repository:collaboration:/sites content/live/acme/categories/acme</string>
</field>
</object>
</object-param>
<object-param>
<name>link02</name>
<description>Deployment Descriptor</description>
<object type="org.exoplatform.services.deployment.plugins.LinkDeploymentDescriptor">
<field name="sourcePath">
<string>repository:collaboration:/sites content/live/acme/web contents/News/News2</string>
</field>
<field name="targetPath">
<string>repository:collaboration:/sites content/live/acme/categories/acme</string>
</field>
</object>
</object-param>
<object-param>
<name>link03</name>
<description>Deployment Descriptor</description>
<object type="org.exoplatform.services.deployment.plugins.LinkDeploymentDescriptor">
<field name="sourcePath">
<string>repository:collaboration:/sites content/live/acme/web contents/News/News3</string>
</field>
<field name="targetPath">
<string>repository:collaboration:/sites content/live/acme/categories/acme</string>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: Content Initializer Service
Set-method: addPlugin
Type: org.exoplatform.services.wcm.webcontent.InitialWebContentPlugin
Object type: org.exoplatform.services.deployment.plugins.LinkDeploymentDescriptor
| Field | Type | Value | Description |
|---|---|---|---|
| sourcePath |
string
|
repository:collaboration:/sites content/live/acme/web contents/News/News1
| The path to the source where this plugin will get data. |
| targetPath |
string
|
repository:collaboration:/sites content/live/acme/categories/acme
| The path to the target where this plugin will deploy. |
This plugin is used to configure predefined groups or users for lock administration. To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.lock.LockService</target-component>
The configuration is applied mainly in core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.lock.LockService</target-component>
<component-plugin>
<name>predefinedLockGroupsOrUsersPlugin</name>
<set-method>addLockGroupsOrUsersPlugin</set-method>
<type>org.exoplatform.services.cms.lock.impl.LockGroupsOrUsersPlugin</type>
<init-params>
<object-param>
<name>LockGroupsOrUsers.configuration</name>
<description>configuration predefined groups or users for lock administrator</description>
<object type="org.exoplatform.services.cms.lock.impl.LockGroupsOrUsersConfig">
<field name="settingLockList">
<collection type="java.util.ArrayList">
<value>
<string>*:/platform/administrators</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: predefinedLockGroupsOrUsersPlugin
Set-method: addLockGroupsOrUsersPlugin
Type: org.exoplatform.services.cms.lock.impl.LockGroupsOrUsersPlugin
Object type: org.exoplatform.services.cms.lock.impl.LockGroupsOrUsersConfig
| Field | Type | Value | Description |
|---|---|---|---|
| settingLockList | ArrayList | {java.util.ArrayList} | The list of the groups or user to be locked. |
This plugin is used to create a predefined drive into a repository. A drive can be considered as a shortcut in the content repository, a quick access to some places for users. You can restrict the visibility of this drive to a group/user and apply a specific view depending on the content you have in this area.
A drive is the combination of:
Path: the root folder of the drive.
View: how we can see contents, such as by list, thumbnails, coverflow.
Role: the visibility to every users, a group or a single user.
Options: allow you to specify whether to see hidden nodes or not and to create folders in this drive or not.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.drives.ManageDriveService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-drives-configuration.xml.
The following structure is used for drives configuration.
<external-component-plugins>
<target-component>org.exoplatform.services.cms.drives.ManageDriveService</target-component>
<component-plugin>
<name>manage.drive.plugin</name>
<set-method>setManageDrivePlugin</set-method>
<type>org.exoplatform.services.cms.drives.impl.ManageDrivePlugin</type>
<description>Nothing</description>
<init-params>
<object-param>
There are initializing attributes of org.exoplatform.services.cms.drives.DriveData object
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
The file that contains the structure above will be configured in the configuration.xml file as the following:
<import>war:/conf/wcm-extension/dms/drives-configuration.xml</import>
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.drives.ManageDriveService</target-component>
<component-plugin>
<name>manage.drive.plugin</name>
<set-method>setManageDrivePlugin</set-method>
<type>org.exoplatform.services.cms.drives.impl.ManageDrivePlugin</type>
<description>Nothing</description>
<init-params>
<object-param>
<name>Managed Sites</name>
<description>Managed Sites</description>
<object type="org.exoplatform.services.cms.drives.DriveData">
<field name="name">
<string>Managed Sites</string>
</field>
<field name="repository">
<string>repository</string>
</field>
<field name="workspace">
<string>collaboration</string>
</field>
<field name="permissions">
<string>*:/platform/administrators</string>
</field>
<field name="homePath">
<string>/sites content/live</string>
</field>
<field name="icon">
<string/>
</field>
<field name="views">
<string>wcm-view</string>
</field>
<field name="viewPreferences">
<boolean>false</boolean>
</field>
<field name="viewNonDocument">
<boolean>true</boolean>
</field>
<field name="viewSideBar">
<boolean>true</boolean>
</field>
<field name="showHiddenNode">
<boolean>false</boolean>
</field>
<field name="allowCreateFolders">
<string>nt:folder,nt:unstructured</string>
</field>
<field name="allowNodeTypesOnTree">
<string>*</string>
</field>
</object>
</object-param>
<object-param>
<name>Public</name>
<description>Public drive</description>
<object type="org.exoplatform.services.cms.drives.DriveData">
<field name="name">
<string>Public</string>
</field>
<field name="repository">
<string>repository</string>
</field>
<field name="workspace">
<string>collaboration</string>
</field>
<field name="permissions">
<string>*:/platform/users</string>
</field>
<field name="homePath">
<string>/Users/${userId}/Public</string>
</field>
<field name="icon">
<string/>
</field>
<field name="views">
<string>simple-view, admin-view</string>
</field>
<field name="viewPreferences">
<boolean>false</boolean>
</field>
<field name="viewNonDocument">
<boolean>false</boolean>
</field>
<field name="viewSideBar">
<boolean>true</boolean>
</field>
<field name="showHiddenNode">
<boolean>false</boolean>
</field>
<field name="allowCreateFolders">
<string>nt:folder,nt:unstructured</string>
</field>
<field name="allowNodeTypesOnTree">
<string>*</string>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: manage.drive.plugin
Set-method: setManageDrivePlugin
Type: org.exoplatform.services.cms.drives.impl.ManageDrivePlugin
Object type: org.exoplatform.services.cms.drives.DriveData
| Field | Type | Value | Description |
|---|---|---|---|
| name |
String
|
Public
| The name of drive which must be unique. |
| repository |
String
|
repository
| Content Repository where to find the root path. |
| workspace |
String
|
collaboration
| Workspace in the Content Repository. |
| homePath |
String
|
/sites content/live
| Root path in the Content Repository.
userId
can be used to use the userId at runtime in the path. |
| permissions |
String
| *:/platform/administrators | Visibility of the drive based on eXo rights. For example: *:/platform/users
|
| icon |
String
| N/A | The Url to the icon. |
| views |
String
|
wcm-view
| The list of views you want to use, separated by commas. For example: simple-view,admin-view
|
| viewPreferences |
Boolean
|
false
| The User Preference icon will be visible if true. |
| viewNonDocument |
Boolean
|
true
| Non-document types will be visible in the user view if true. |
| viewSideBar |
Boolean
|
true
| Show/Hide the left bar (with navigation and filters). |
| showHiddenNode |
Boolean
|
false
| Hidden nodes will be visible if true. |
| allowCreateFolders |
String
|
nt:folder,nt:unstructured | List of node types that you can create as folders. For example: nt:folder,nt:unstructured. |
| allowNodeTypesOnTree |
String
| * | Allow you to filter node types in the navigation tree. For example, the default value is "*" to show all content types. |
This plugin is used to create a predefined View into a repository. A View can include many object parameters. Parameters are used to create default Views, Templates and Actions of Manage View service. View enables administrators to customize View classification that can impact on users in exploring workspace. Each object-param has a type that is a class representing all properties of a View.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.views.ManageViewService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-views-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.views.ManageViewService</target-component>
<component-plugin>
<name>manage.view.plugin</name>
<set-method>setManageViewPlugin</set-method>
<type>org.exoplatform.services.cms.views.impl.ManageViewPlugin</type>
<description>this plugin manage user view</description>
<init-params>
<value-param>
<name>autoCreateInNewRepository</name>
<value>true</value>
</value-param>
<value-param>
<name>predefinedViewsLocation</name>
<value>war:/conf/dms-extension/dms/artifacts</value>
</value-param>
<value-param>
<name>repository</name>
<value>repository</value>
</value-param>
<object-param>
<name>System-View</name>
<description>View configuration for System workspace</description>
<object type="org.exoplatform.services.cms.views.ViewConfig">
<field name="name">
<string>system-view</string>
</field>
<field name="permissions">
<string>*:/platform/administrators</string>
</field>
<field name="template">
<string>/exo:ecm/views/templates/ecm-explorer/SystemView</string>
</field>
<field name="tabList">
<collection type="java.util.ArrayList">
<value>
<object type="org.exoplatform.services.cms.views.ViewConfig$Tab">
<field name="tabName">
<string>Info</string>
</field>
<field name="buttons">
<string>viewNodeType; viewPermissions; viewProperties; showJCRStructure</string>
</field>
</object>
</value>
</collection>
</field>
</object>
</object-param>
<object-param>
<name>System Template</name>
<description>Template for display documents in list style</description>
<object type="org.exoplatform.services.cms.views.TemplateConfig">
<field name="type">
<string>ecmExplorerTemplate</string>
</field>
<field name="name">
<string>SystemView</string>
</field>
<field name="warPath">
<string>/ecm-explorer/SystemView.gtmpl</string>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: manage.view.plugin
Set-method: setManageViewPlugin
Type: org.exoplatform.services.cms.views.impl.ManageViewPlugin
Init-param:
| value-param | Type | Value | Description |
|---|---|---|---|
| autoCreateInNewRepository |
boolean |
true | Allow creating a predefined View in this repository if the value is "true". |
| predefinedViewsLocation |
string | war:/conf/dms-extension/dms/artifacts | The location of the View node in the repository. |
| repository | string | repository | The repository name. |
Object type: org.exoplatform.services.cms.views.ViewConfig
| Field | Type | Value | Description |
|---|---|---|---|
| name | string |
system-view
| The name of view which must be unique inside WCM. |
| permissions | string | *:/platform/administrators | Visibility of the view based on eXo rights. |
| template | string | /exo:ecm/views/templates/ecm-explorer/SystemView
| Specify path to the template location. |
| tabList | ArrayList
| {java.util.ArrayList} | Include a set of view names. |
Object type: org.exoplatform.services.cms.views.ViewConfig$Tab
| Field | Type | Value | Description |
|---|---|---|---|
| tabName | string | Info
| The name of tab which must be unique. |
| button | string | viewNodeType; viewPermissions; viewProperties; showJCRStructure
| Specify a set of view component names. |
Object type: org.exoplatform.services.cms.views.TemplateConfig
| Field | Type | Vsalue | Description |
|---|---|---|---|
| type | string | ecmExplorerTemplate
| Specify if a name is truly a class representing all properties of a view. |
| name | string | system-view
| Specify a set of view component names. |
| warPath | string |
/ecm-explorer/SystemView.gtmpl
| Specify a template location to view. |
This plugin is to set the supported file types of PDF thumbnail. See also ImageThumbnailPlugin .
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.thumbnail.ThumbnailService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-thumbnail-configuration.xml.
Sample configuration:
<component-plugin>
<name>PDFThumbnailPlugin</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.cms.thumbnail.impl.PDFThumbnailPlugin</type>
<init-params>
<object-param>
<name>thumbnailType</name>
<description>Thumbnail types</description>
<object type="org.exoplatform.services.cms.thumbnail.impl.ThumbnailType">
<field name="mimeTypes">
<collection type="java.util.ArrayList">
<value>
<string>application/pdf</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
In which:
Name: PDFThumbnailPlugin
Set-method: addPlugin
Type: org.exoplatform.services.cms.thumbnail.impl.PDFThumbnailPlugin
Object type: org.exoplatform.services.cms.thumbnail.impl.ThumbnailType
| Field | Type | Value | Description |
|---|---|---|---|
| mimeTypes | String | application/pdf | The MIME type of the pdf thumbnail. |
This plugin is used to import the view templates into Content List Viewer.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.views.ApplicationTemplateManagerService</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/wcm-extension/dms/application-templates-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.views.ApplicationTemplateManagerService</target-component>
<component-plugin>
<name>clv.templates.plugin</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.cms.views.PortletTemplatePlugin</type>
<description>This plugin is used to import views templates for Content List Viewer</description>
<init-params>
<value-param>
<name>portletName</name>
<value>content-list-viewer</value>
</value-param>
<value-param>
<name>portlet.template.path</name>
<value>war:/conf/wcm-artifacts/application-templates/content-list-viewer</value>
</value-param>
<object-param>
<name>default.folder.list.viewer</name>
<description>Default folder list viewer groovy template</description>
<object type="org.exoplatform.services.cms.views.PortletTemplatePlugin$PortletTemplateConfig">
<field name="templateName">
<string>UIContentListPresentationDefault.gtmpl</string>
</field>
<field name="category">
<string>list</string>
</field>
</object>
</object-param>
<object-param>
....
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: clv.templates.plugin
Set-method: addPlugin
Type: org.exoplatform.services.cms.views.PortletTemplatePlugin
Init-param:
| Value-param | Type | Value | Description |
|---|---|---|---|
| portletName | string | content-list-viewer | The name of the portlet. |
| portlet.template.path | string | war:/conf/wcm-artifacts/application-templates/content-list-viewer | The path to the configuration of the portlet. |
Object type: org.exoplatform.services.cms.views.PortletTemplatePlugin$PortletTemplateConfig
| Field | Type | Description |
|---|---|---|
| templateName | string | The name of the GROOVY template. |
| category |
string
| The category name. |
This plugin is used to import the predefined processes into the system.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.workflow.WorkflowServiceContainer</target-component>
The configuration is applied mainly in packaging/workflow/webapp/src/main/webapp/WEB-INF/workflow-extension/workflow/bonita-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.workflow.WorkflowServiceContainer</target-component>
<component-plugin>
<name>deploy.predefined.processes</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.workflow.PredefinedProcessesPlugin</type>
<init-params>
<object-param>
<name>predefined.processes</name>
<description>load of default business processes</description>
<object type="org.exoplatform.services.workflow.ProcessesConfig">
<field name="processLocation">
<string>war:/conf/bp</string>
</field>
<field name="predefinedProcess">
<collection type="java.util.HashSet">
<value>
<string>/exo-ecms-ext-workflow-bp-bonita-content-2.3.8-SNAPSHOT.jar</string>
</value>
<value>
<string>/exo-ecms-ext-workflow-bp-bonita-payraise-2.3.8-SNAPSHOT.jar</string>
</value>
<value>
<string>/exo-ecms-ext-workflow-bp-bonita-holiday-2.3.8-SNAPSHOT.jar</string>
</value>
</collection>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
name: deploy.predefined.processes
set-method: addPlugin
type: org.exoplatform.services.workflow.PredefinedProcessesPlugin
Object type: org.exoplatform.services.workflow.ProcessesConfig
| Field | Type | Value | Description |
|---|---|---|---|
| processLocation | string | war:/conf/bp | The path to the process. |
| predefinedProcess | HashSet | java.util.HashSet | The list of the processes. |
This is an abstract class and the parent of StageAndVersionPublicationPlugin and AuthoringPublicationPlugin . You can create a link from this plugin to its children.
This plugin is used to store predefined queries into the repositories of the system.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.queries.QueryService</target-component>
The configuration is applied mainly in /packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-queries-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.queries.QueryService</target-component>
<component-plugin>
<name>query.plugin</name>
<set-method>setQueryPlugin</set-method>
<type>org.exoplatform.services.cms.queries.impl.QueryPlugin</type>
<description>Nothing</description>
<init-params>
<value-param>
<name>autoCreateInNewRepository</name>
<value>true</value>
</value-param>
<value-param>
<name>repository</name>
<value>repository</value>
</value-param>
<object-param>
<name>CreatedDocuments</name>
<description>documents created by the current user</description>
<object type="org.exoplatform.services.cms.queries.impl.QueryData">
<field name="name">
<string>Created Documents</string>
</field>
<field name="language">
<string>xpath</string>
</field>
<field name="statement">
<string>//*[(@jcr:primaryType = 'exo:article' or @jcr:primaryType = 'nt:file') and
@exo:owner='${UserId}$'] order by @exo:dateCreated descending
</string>
</field>
<field name="permissions">
<collection type="java.util.ArrayList">
<value>
<string>*:/platform/users</string>
</value>
</collection>
</field>
<field name="cachedResult">
<boolean>false</boolean>
</field>
</object>
</object-param>
<object-param>
<name>CreatedDocumentsDayBefore</name>
<description>documents created the day before</description>
<object type="org.exoplatform.services.cms.queries.impl.QueryData">
<field name="name">
<string>CreatedDocumentDayBefore</string>
</field>
<field name="language">
<string>xpath</string>
</field>
<field name="statement">
<string>//element(*,exo:article)[@exo:dateCreated < xs:dateTime('${Date}$')] order by
@exo:dateCreated descending
</string>
</field>
<field name="permissions">
<collection type="java.util.ArrayList">
<value>
<string>*:/platform/users</string>
</value>
</collection>
</field>
<field name="cachedResult">
<boolean>true</boolean>
</field>
</object>
</object-param>
<object-param>
<name>AllArticles</name>
<description>All articles</description>
<object type="org.exoplatform.services.cms.queries.impl.QueryData">
<field name="name">
<string>All Articles</string>
</field>
<field name="language">
<string>xpath</string>
</field>
<field name="statement">
<string>//element(*,exo:article) order by @exo:dateCreated descending</string>
</field>
<field name="permissions">
<collection type="java.util.ArrayList">
<value>
<string>*:/platform/users</string>
</value>
</collection>
</field>
<field name="cachedResult">
<boolean>true</boolean>
</field>
</object>
</object-param>
</init-params>
</component-plugin>
</external-component-plugins>
In which:
Name: predefinedTaxonomyPlugin
Set-method: setQueryPlugin
Type: org.exoplatform.services.cms.queries.impl.QueryPlugin
Init-param:
| Value-param | Type | Value | Description |
|---|---|---|---|
autoCreateInNewRepository | boolean | true | Store queries in a new repository if the value is "true". |
repository | string | repository | The repository to the target node. |
Object type: org.exoplatform.services.cms.queries.impl.QueryData
| Field | Type | Description |
|---|---|---|
| name | string | The name of the query. |
| language | string | The language of the query (Xpath, SQL). |
| statement | string | The query statement. |
| permissions | ArrayList | The permission which users must have to use this query. |
| cachedResult | boolean | Specify if the query is cached or not. |
This is an abstract class and the parent of RemoveTaxonomyPlugin . You can create a link from this plugin to its children.
This plugin is used to invalidate taxonomy trees in categories folder of a portal when the portal is removed.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.wcm.portal.artifacts.RemovePortalArtifactsService</target-component>
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.wcm.portal.artifacts.RemovePortalArtifactsService</target-component>
<component-plugin>
<name>Remove taxonomy tree</name>
<set-method>addPlugin</set-method>
<type>org.exoplatform.services.wcm.category.RemoveTaxonomyPlugin</type>
<description>This plugin invalidate taxonomy tree to categories folder of portal when a portal is removed
</description>
</component-plugin>
</external-component-plugins>
In which:
Name: Remove taxonomy tree
Set-method: addPlugin
Type: org.exoplatform.services.wcm.category.RemoveTaxonomyPlugin
This plugin is used to import the predefined script actions into the system.
To use the plugin in the component configuration, you must use the following target-component:
<target-component>org.exoplatform.services.cms.actions.ActionServiceContainer</target-component>
The configuration is applied mainly in packaging/wcm/webapp/src/main/webapp/WEB-INF/conf/dms-extension/dms/dms-actions-configuration.xml.
Sample configuration:
<external-component-plugins>
<target-component>org.exoplatform.services.cms.actions.ActionServiceContainer</target-component>
<component-plugin>
<name>exo:scriptAction</name>