JBoss.orgCommunity Documentation

Reference Guides


Welcome to Gatein UXP 3.5 Reference Guide. This guide is a complete reference for customization points, and available APIs, for all modules.

Reference Guide / Content Functions
About this guide
About Content Package
1. Applications
1.1. Portlets
1.1.1. Content Detail
1.1.2. Content List
1.1.3. Search
1.1.4. Sites Explorer
1.1.5. Administration
1.1.6. Fast Content Creator
1.1.7. Form Builder
1.1.8. Authoring
1.1.9. Newsletter
1.1.10. SEO portlet
2. CMIS
2.1. Overview
2.2. CMIS specification
2.3. xCMIS project
2.4. CMIS features
2.4.1. Integration with eXo WCM
2.4.1.1. JCR namespaces and nodetypes
2.4.1.2. WCM drives as CMIS Repositories
2.4.1.2.1. Use Case: Browse Drives via getRepository
2.4.1.3. WCM Symlinks
2.4.1.4. Modify WCM via CMIS
2.4.1.5. CMIS search
2.4.1.5.1. Query examples
2.4.1.5.1.1. Simple query
2.4.1.5.1.2. Find document by several constraints
2.4.1.5.1.3. Full-text search
2.4.1.5.1.4. Extended full-text search
2.4.1.5.1.5. Date property comparison
2.4.1.5.1.6. Boolean property comparison
2.4.1.5.1.7. IN Constraint
2.4.1.5.1.8. Select all documents where longprop property is not in set
2.4.1.5.1.9. Select all documents where longprop property is not in set
2.4.1.5.1.10. IN_FOLDER constraint
2.4.1.5.1.11. Select all documents that are in a specified folder
2.4.1.5.1.12. Select all documents where query supertype is cmis:article
2.4.1.5.1.13. IN_TREE constraint
2.4.1.5.1.14. LIKE Comparison
2.4.1.5.1.15. Test LIKE constraint with escape symbols
2.4.1.5.1.16. NOT constraint
2.4.1.5.1.17. Property existence
2.4.1.5.1.18. ORDER BY
2.4.1.5.1.19. ORDER BY ASC
2.4.1.5.1.20. ORDER BY DESC
2.4.1.5.1.21. ORDER BY SCORE (as columns)
2.4.1.5.1.22. Not equal comparison (decimal)
2.4.1.5.1.23. Not equal comparison (string)
2.4.1.5.1.24. More than comparison (>)
2.4.2. CMIS Domain Model
2.4.3. CMIS Services
2.5. Service JARs
3. Configuration
3.1. Components
3.1.1. ActionServiceContainer
3.1.2. ApplicationTemplateManagerService
3.1.3. FragmentCacheService
3.1.4. JodConverterService
3.1.5. LiveLinkManagerService
3.1.6. LockService
3.1.7. NewsletterInitializationService
3.1.8. NewsletterManagerService
3.1.9. SiteSearchService
3.1.10. SEOService
3.1.11. QueryService
3.1.12. TaxonomyService
3.1.13. ThumbnailService
3.1.14. TimelineService
3.1.15. WatchDocumentService
3.1.16. WCMService
3.2. External Component Plugins
3.2.1. AuthoringPublicationPlugin
3.2.2. BaseActionPlugin
3.2.3. BPActionPlugin
3.2.4. ContentTypeFilterPlugin
3.2.5. ContextPlugin
3.2.6. CreatePortalPlugin
3.2.7. ExcludeIncludeDataTypePlugin
3.2.8. FriendlyPlugin
3.2.9. ImageThumbnailPlugin
3.2.10. IgnorePortalPlugin
3.2.11. InitialWebcontentPlugin
3.2.12. LinkDeploymentPlugin
3.2.13. LockGroupsOrUsersPlugin
3.2.14. ManageDrivePlugin
3.2.15. ManageViewPlugin
3.2.16. PDFThumbnailPlugin
3.2.17. PorletTemplatePlugin
3.2.18. PredefinedProcessesPlugin
3.2.19. PublicationPlugin
3.2.20. QueryPlugin
3.2.21. RemovePortalPlugin
3.2.22. RemoveTaxonomyPlugin
3.2.23. ScriptActionPlugin
3.2.24. ScriptPlugin
3.2.25. StageAndVersionPublicationPlugin
3.2.26. StatesLifecyclePlugin
3.2.27. TagPermissionPlugin
3.2.28. TagStylePlugin
3.2.29. TaxonomyPlugin
3.2.30. TemplatePlugin
3.2.31. XMLdeploymentPlugin
3.3. CMIS configuration
3.3.1. CMIS Configuration
3.3.2. Required nodetypes and namespaces in JCR
3.3.3. Authenticator and organization service configuration
3.3.4. CMIS search and index
3.3.4.1. CMIS Relational View
3.3.4.2. Query Capabilities
3.3.4.3. Configuration
3.3.4.4. Index atomicity and durability
4. Developer references
4.1. WCM Templates
4.1.1. Content types
4.1.1.1. Dialog
4.1.1.1.1. Common parameters
4.1.1.1.2. Text Field
4.1.1.1.3. Hidden Field
4.1.1.1.4. Text Area Field
4.1.1.1.5. Rich Text Field
4.1.1.1.6. Calendar Field
4.1.1.1.7. Upload Field
4.1.1.1.8. Radio Field
4.1.1.1.9. Select box Field
4.1.1.1.10. Checkbox Field
4.1.1.1.11. Mixin Field
4.1.1.1.12. Action Field
4.1.1.1.13. Interceptors
4.1.1.1.14. How to add a new ECM template with tabs
4.1.1.1.15. How to prevent XSS attacks
4.1.1.2. View
4.1.2. List of Contents
4.1.2.1. Content List Template
4.1.2.2. Category Navigation Template
4.2. WCM Explorer
4.2.1. CSS
4.2.2. CKEditor
4.3. Extensions
4.3.1. REST Services
4.3.1.1. Overview
4.3.1.2. Restful Web Service
4.3.1.2.1. HTTP Methods
4.3.1.2.2. Formats
4.3.1.2.3. Data Format
4.3.1.2.4. REST configuration
4.3.1.2.5. Create a REST service
4.3.2. UI Extensions
4.3.2.1. Add your own UIAction
4.3.2.2. Add your own ActionListener
4.3.2.3. Register your UI Action
4.3.2.4. Run your own UI extension sample
4.3.3. Authoring Extension
4.3.3.1. Extended Publication Plugin
4.3.3.1.1. States
4.3.3.1.2. Start/End publication dates
4.3.3.1.3. New Publication Mixin
4.3.3.2. Publication Manager
4.3.3.2.1. Lifecycle
4.3.3.2.1.1. Listen to a lifecycle
4.3.3.2.1.2. Perform tasks when a content's state is updated
4.3.3.2.2. Context
4.3.3.2.3. New Authoring Mixin
4.3.4. Auxiliary attributes for documents
4.4. CMIS Usage code examples
4.4.1. Login to repository
4.4.2. List of documents (folder, files)
4.4.2.1. Use Java
4.4.2.2. Use JavaScript
4.4.3. Read document properties and content-stream
4.4.3.1. Use Java
4.4.3.2. Use JavaScript
4.4.4. Search of data and syntax examples
4.4.4.1. Use java
4.4.4.2. Use JavaScript
4.4.5. Modification of document properties or content
4.4.5.1. Use java
4.4.5.2. Use JavaScript
4.5. Public REST APIs
4.5.1. ThumbnailRESTService
4.5.2. RssConnector
4.5.3. FCKCoreRESTConnector
4.5.4. ResourceBundleConnector
4.5.5. VoteConnector
4.5.6. DriverConnector
4.5.7. GadgetConnector
4.5.8. PortalLinkConnector
4.5.9. GetEditedDocumentRESTService
4.5.10. PublicationGetDocumentRESTService
4.5.11. FavoriteRESTService
4.5.12. RESTImagesRendererService
4.5.13. LifecycleConnector
4.5.14. CopyContentFile
4.5.15. PDFViewerRESTService
4.5.16. ManageDocumentService
4.5.17. DownloadConnector
4.6. Public Java APIs
4.6.1. TaxonomyService
4.6.2. LinkManager
4.6.3. PublicationManager
4.6.4. WCMComposer
4.6.5. NewFolksonomy
4.6.6. ApplicationTemplateManager
4.6.7. NodeFinder
4.6.8. JodConverter
4.6.9. TimelineService
4.6.10. SiteSearchService
4.6.11. SEOService
4.6.12. ManageViewService
4.7. Deprecated portlets
4.8. Miscellaneous and Tips
4.9. FAQ
Reference Guide / Collaboration Functions
Prerequisites
1. Applications
1.1. Portlets
1.1.1. Calendar portlet
1.1.2. Chatbar portlet
1.1.3. Chat Portlet
1.1.4. Contact Portlet
1.1.5. Mail Portlet
1.1.6. RSSreader Portlet
1.2. Gadgets
1.2.1. Eventslist
1.2.2. Taskslist
1.2.3. Messageslist
2. Configurations
2.1. Components in eXo Collaboration Configuration
2.1.1. CalendarService
2.1.2. HistoryImpl
2.1.3. XMPPMessenger
2.1.4. DefaultPresenceStatus
2.1.5. ContactService
2.2. External Component Plugins
2.2.1. Calendar Configuration
2.2.1.1. NewUserListener
2.2.1.2. NewGroupListener
2.2.1.3. NewMembershipListener
2.2.1.4. ReminderPeriodJob
2.2.1.5. PopupReminderPeriodJob
2.2.2. AddActionsPlugin
2.2.3. Chat Configuration
2.2.3.1. HistoryPeriodJob
2.2.3.2. RequestFilterComponentPlugin
2.2.3.3. AuthenticationLoginListener and AuthenticationLogoutListener
2.2.3.3.1. AuthenticationLoginListener
2.2.3.3.2. AuthenticationLogoutListener
2.2.4. Contact Configuration
2.2.4.1. NewUserListener
2.2.4.2. NewMembershipListener
2.2.4.3. UpdateUserProfileListener
2.2.5. Content Configuration
2.2.5.1. RSSContentPluginDescriptionPlugin
2.2.5.2. DescriptionPlugin
2.2.6. Mail Configuration
2.2.6.1. AuthenticationLogoutListener
2.2.6.2. MailSettingConfigPlugin
2.2.7. Social Integration Configuration
2.2.7.1. CalendarDataInitialize
2.2.7.2. ContactDataInitialize
2.2.7.3. ContactSpaceActivityPublisher
2.2.7.4. CalendarSpaceActivityPublisher
2.2.7.5. PortletPreferenceRequiredPlugin
2.3. Data Injectors
2.3.1. ContactDataInjector
2.3.2. CalendarDataInjector
2.3.3. MailDataInjector
2.4. eXo Chatserver Configuration
2.4.1. Openfire Configuration
2.4.1.1. Configuration in Openfire.xml
2.4.1.2. eXo specific configuration
2.4.2. System Configuration
2.4.3. AS configuration
3. JCR Structure
3.1. Calendar JCR Structure
3.1.1. calendars
3.1.2. eventCategories
3.1.3. categories
3.1.4. eXoCalendarFeed
3.1.5. Y%yyyy%
3.1.6. calendarSetting
3.2. Chat JCR Structure
3.3. Address Book JCR Structure
3.3.1. Contacts
3.3.2. ContactGroup
3.3.3. tags
3.3.4. Shared
3.4. Mail JCR Structure
3.5. RSS JCR Structure
4. Developer reference
4.1. Extension points
4.1.1. ContentDAO
4.1.2. ContactLifeCycle
4.1.3. Transport
4.1.4. EventLifeCycle
4.2. Public REST APIs
4.2.1. Calendar application
4.2.2. Mail application
4.2.3. Chat application
4.2.3.1. RESTXMPPService
4.2.3.2. FileExchangeService
Reference Guide / Knowledge Functions
Prerequisites
1. Applications
1.1. Portlets
1.1.1. Forum Portlet
1.1.1.1. Portlet.xml
1.1.1.2. Preferences
1.1.1.3. Events
1.1.1.3.1. ForumLinkEvent
1.1.1.3.2. ReLoadPortletEvent
1.1.1.3.3. OpenLink
1.1.1.3.4. ForumPollEvent
1.1.1.3.5. ForumModerateEvent
1.1.1.3.6. ForumRuleEvent
1.1.1.3.7. QuickReplyEvent
1.1.2. Answers Portlet
1.1.2.1. Portlet.xml
1.1.2.2. Portlet Preferences
1.1.3. FAQ Portlet
1.1.3.1. Portlet.xml
1.1.3.2. Portlet Preferences
1.1.4. Polls Portlet
1.1.4.1. Portlet.xml
1.1.4.2. Portlet Preferences
1.2. Gadgets
2. Configuration
2.1. Components
2.1.1. Components of eXo Knowledge
2.1.2. Components of Forum
2.1.3. Components of Answers
2.1.4. Components of Polls
2.2. External-component-plugin
2.2.1. Init data configuration
2.2.1.1. Initialize the conf-part for loading repository-configuration.xml
2.2.1.2. Initialize workspace name and repository name in storage-configuration.xml
2.2.1.3. Initialize data
2.2.2. Roles Configuration
2.2.3. ProfileProvider Configuration
2.2.3.1. Configuration
2.2.3.2. Use ContactProvider
2.2.3.2.1. By DefaultContactProvider
2.2.3.2.2. By SocialContactProvider
2.2.4. Forum Configuration
2.2.4.1. BBCode Configuration
2.2.4.2. Forums Initializer
2.2.4.2.1. Configuration
2.2.4.2.1.1. Default forum data
2.2.4.2.1.2. Forum array
2.2.4.2.1.3. Forum topics
2.2.4.2.2. Initial Data Plugin
2.2.4.3. Auto-prune
2.2.4.4. User Statistics
2.2.4.5. Update Statistic Data
2.2.4.6. Default User Profile
2.2.5. Answer Configuration
2.2.5.1. Answers Initializer
2.2.5.2. Answers Email Templates Configuration
2.2.6. Poll Configuration
2.3. Data Injector Servive
2.3.1. Technical details
2.3.2. Configuration
2.3.2.1. ForumDataInjector
2.3.2.2. Wiki Data injector
2.3.2.3. AnswerDataInjector
2.3.3. How to use?
3. JCR structure
3.1. Forum JCR structure
3.1.1. Forum System
3.1.1.1. User Profile and User Profile Home
3.1.1.2. Statistic and Statistic Home
3.1.1.3. Ban IP and Ban IP Home
3.1.1.4. Administration and Administration Home
3.1.2. Forum Data
3.1.2.1. Category and Category home
3.1.2.2. Forum
3.1.2.3. Topic
3.1.2.4. Post
3.1.2.5. Tag and Tag home
3.1.2.6. BBCode and BBCode home
3.1.2.7. Topic type and Topic type home
3.2. FAQ JCR structure
3.2.1. Category
3.2.1.1. Sub-category
3.2.1.2. RSS
3.2.1.3. Question and Question Home
3.2.1.4. Multilanguages
3.2.1.5. Answer, Comment and Attachment
3.2.2. FAQ setting
3.2.3. Template for FAQ
3.3. Poll JCR structure
3.4. Wiki JCR structure
3.4.1. Wiki data
3.4.1.1. WikiHome
3.4.1.2. Preferences
3.4.1.3. LinkRegistry
3.4.1.4. Trash
3.4.1.5. Template Container
3.4.2. Wiki metadata
4. Developer reference
4.1. Extension points
4.1.1. ForumEventLifeCycle
4.1.1.1. Configuration plug-in
4.1.1.2. Tutorial
4.1.2. AnswerEventLifeCycle
4.1.2.1. Configuration plug-in
4.1.2.2. Tutorial
4.1.3. BBCodeRenderer
4.2. Internal API
4.2.1. Forum application
4.2.2. Answers application
4.2.3. Polls application
4.3. FAQ Template Configuration
4.3.1. Configuration plug-in
4.3.2. How to change look and feel
4.3.3. API provided by the UIComponent (UIViewer.java)
4.4. Extend actions over a wiki page from external jars
4.4.1. Overview
4.4.2. How to add action extension to the Wiki toolbar
4.4.2.1. Create a new project for action extension
4.4.2.2. Create new actions and their corresponding listeners
4.4.2.3. Register new actions with UIExtensionManager
4.4.2.3.1. Deploy new action extension
Reference Guide / Social Functions
1. Applications
1.1. List of Portlets in Social
1.2. List of Gadgets in Social
1.2.1. Activity Stream
1.2.2. Social RSS Reader
1.2.3. My Connections
1.2.4. My Spaces
2. Configuration
2.1. Component
2.1.1. SpaceService
2.1.2. LifeCycleCompletionService
2.1.3. IdentityManager
2.1.4. ServiceProviderStore
2.1.5. RelationshipManager
2.1.6. SpaceIdentityProvider
2.1.7. SpaceApplicationHandler
2.1.8. ExoPeopleService
2.1.9. RestPortalContainerNameConfig
2.1.10. LinkProvider
2.2. External Component Plugin
2.2.1. ActivityResourceBundlePlugin
2.2.2. IdentityProviderPlugin
2.2.3. MentionsProcessor
2.2.4. OSHtmlSanitizerProcessor
2.2.5. PortletPreferenceRequiredPlugin
2.2.6. SpaceApplicationConfigPlugin
2.2.7. SocialChromatticLifeCycle
2.2.8. TemplateParamsProcessor
2.2.9. URLConverterFilterPlugin
2.2.10. RestPortalContainerNameConfig
3. Developers References
3.1. UI Extensions
3.1.1. About Activity Plugin
3.1.2. How to create activity plugin
3.1.2.1. Create a custom UI component for displaying the activity based on its type
3.1.2.1.1. What is ActivityBuilder?
3.1.2.2. Create a composer extension for composing activity on the UI composer and display it on the activity stream
3.2. Overridable Components
3.3. Public Java APIs
3.3.1. ActivityManager
3.3.2. IdentityManager
3.3.3. RelationshipManager
3.3.4. SpaceService
3.3.5. I18NActivityProcessor
3.3.6. LinkProvider
3.4. Java APIs sample code/ tutorial
3.4.1. Activity Stream
3.4.1.1. Publish an activity
3.4.1.1.1. Publish an activity for a user
3.4.1.1.2. Publish an activity for a space
3.4.1.2. Configure an activity processor
3.4.1.3. Publish an RSS feed with feedmash
3.4.1.4. Sample Code
3.4.2. OpenSocial
3.4.2.1. Gadget
3.4.2.1.1. Supported APIs
3.4.2.1.1.1. REST/RPC API
3.4.2.1.1.2. Configure the security
3.4.2.1.1.3. Publish an activity into a space
3.4.2.2. Tutorial
3.4.3. People
3.4.3.1. Identity
3.4.3.1.1. IdentityProvider
3.4.3.1.2. IdentityManager
3.4.3.2. ProfileListener
3.4.3.3. Connections
3.4.3.3.1. Users connection
3.4.3.3.2. RelationshipListener
3.4.4. Spaces
3.4.4.1. Spaces Management
3.4.4.2. Space's applications management
3.4.4.2.1. Add an application to a space
3.4.4.2.2. Remove an application from a space
3.4.4.3. Space's members management
3.4.4.4. Listener to a space lifecycle
3.4.5. Space widget tutorial
3.4.5.1. Basic version
3.4.5.2. Advanced version
3.4.5.3. Configure
3.4.6. How to extend the activities rendering
3.4.6.1. Objective
3.4.6.2. Requirements
3.4.6.3. Why would you need to do this?
3.4.6.4. Write an ActivityProcessor
3.4.6.5. Configure the processor
3.4.7. XMLProcessor component
3.4.7.1. XMLProccessor Component
3.4.7.2. Built-in XMLProcessor Plugins
3.4.8. How to create internationalized activities
3.4.8.1. Internationalize an activity
3.4.8.2. Get an internationalized message
3.5. Public REST APIs
3.5.1. Activities REST service
3.5.2. Apps REST service
3.5.3. Identity REST service
3.5.4. Linkshare REST service
3.5.5. People Rest Service
3.5.6. Spaces REST service
3.5.7. Widget Rest Service
3.5.8. Location
3.6. Rest Service APIs
3.6.1. Activity Resources
3.6.1.1. GET activity/activityId.format
3.6.1.2. POST activity.format
3.6.1.3. DELETE activity/activityId.format
3.6.1.4. POST activity/destroy/activityId.format
3.6.1.5. GET activity/activityId/comments.format
3.6.1.6. POST activity/activityId/comment.format
3.6.1.7. DELETE activity/activityId/comment/commentId.format
3.6.1.8. POST activity/activityId/comment/destroy/commentId.format
3.6.1.9. GET activity/activityId/likes.format
3.6.1.10. POST activity/activityId/like.format
3.6.1.11. DELETE activity/activityId/like.format
3.6.1.12. POST activity/activityId/like/destroy.format
3.6.2. Activity Stream Resources
3.6.2.1. GET identityId.format
3.6.2.2. GET feed.format
3.6.2.3. GET spaces.format
3.6.2.4. GET connections.format
3.6.3. Identity Resources
3.6.3.1. GET identityId.format
3.6.3.2. GET providerId/remoteId.format
3.6.4. Version Resources
3.6.4.1. GET latest.format
3.6.4.2. GET supported.format
3.7. Public Javascript APIs
3.8. Social JCR Structure
3.8.1. soc:providers
3.8.2. Identity
3.8.3. Relationship
3.8.4. Profile
3.8.5. Profile experience
3.8.6. Activity list
3.8.7. Activity year
3.8.8. Activity month
3.8.9. Activity day
3.8.10. Activity
3.8.11. Activity parameters
3.8.12. Space list
3.8.13. Space
3.9. Spaces Template configuration
3.10. Configure the oauth 2 legged scenario
3.10.1. Generate the certificates
3.10.2. Configure the property file

Reference Guide / Content Functions


About this guide
About Content Package
1. Applications
1.1. Portlets
1.1.1. Content Detail
1.1.2. Content List
1.1.3. Search
1.1.4. Sites Explorer
1.1.5. Administration
1.1.6. Fast Content Creator
1.1.7. Form Builder
1.1.8. Authoring
1.1.9. Newsletter
1.1.10. SEO portlet
2. CMIS
2.1. Overview
2.2. CMIS specification
2.3. xCMIS project
2.4. CMIS features
2.4.1. Integration with eXo WCM
2.4.1.1. JCR namespaces and nodetypes
2.4.1.2. WCM drives as CMIS Repositories
2.4.1.2.1. Use Case: Browse Drives via getRepository
2.4.1.3. WCM Symlinks
2.4.1.4. Modify WCM via CMIS
2.4.1.5. CMIS search
2.4.1.5.1. Query examples
2.4.1.5.1.1. Simple query
2.4.1.5.1.2. Find document by several constraints
2.4.1.5.1.3. Full-text search
2.4.1.5.1.4. Extended full-text search
2.4.1.5.1.5. Date property comparison
2.4.1.5.1.6. Boolean property comparison
2.4.1.5.1.7. IN Constraint
2.4.1.5.1.8. Select all documents where longprop property is not in set
2.4.1.5.1.9. Select all documents where longprop property is not in set
2.4.1.5.1.10. IN_FOLDER constraint
2.4.1.5.1.11. Select all documents that are in a specified folder
2.4.1.5.1.12. Select all documents where query supertype is cmis:article
2.4.1.5.1.13. IN_TREE constraint
2.4.1.5.1.14. LIKE Comparison
2.4.1.5.1.15. Test LIKE constraint with escape symbols
2.4.1.5.1.16. NOT constraint
2.4.1.5.1.17. Property existence
2.4.1.5.1.18. ORDER BY
2.4.1.5.1.19. ORDER BY ASC
2.4.1.5.1.20. ORDER BY DESC
2.4.1.5.1.21. ORDER BY SCORE (as columns)
2.4.1.5.1.22. Not equal comparison (decimal)
2.4.1.5.1.23. Not equal comparison (string)
2.4.1.5.1.24. More than comparison (>)
2.4.2. CMIS Domain Model
2.4.3. CMIS Services
2.5. Service JARs
3. Configuration
3.1. Components
3.1.1. ActionServiceContainer
3.1.2. ApplicationTemplateManagerService
3.1.3. FragmentCacheService
3.1.4. JodConverterService
3.1.5. LiveLinkManagerService
3.1.6. LockService
3.1.7. NewsletterInitializationService
3.1.8. NewsletterManagerService
3.1.9. SiteSearchService
3.1.10. SEOService
3.1.11. QueryService
3.1.12. TaxonomyService
3.1.13. ThumbnailService
3.1.14. TimelineService
3.1.15. WatchDocumentService
3.1.16. WCMService
3.2. External Component Plugins
3.2.1. AuthoringPublicationPlugin
3.2.2. BaseActionPlugin
3.2.3. BPActionPlugin
3.2.4. ContentTypeFilterPlugin
3.2.5. ContextPlugin
3.2.6. CreatePortalPlugin
3.2.7. ExcludeIncludeDataTypePlugin
3.2.8. FriendlyPlugin
3.2.9. ImageThumbnailPlugin
3.2.10. IgnorePortalPlugin
3.2.11. InitialWebcontentPlugin
3.2.12. LinkDeploymentPlugin
3.2.13. LockGroupsOrUsersPlugin
3.2.14. ManageDrivePlugin
3.2.15. ManageViewPlugin
3.2.16. PDFThumbnailPlugin
3.2.17. PorletTemplatePlugin
3.2.18. PredefinedProcessesPlugin
3.2.19. PublicationPlugin
3.2.20. QueryPlugin
3.2.21. RemovePortalPlugin
3.2.22. RemoveTaxonomyPlugin
3.2.23. ScriptActionPlugin
3.2.24. ScriptPlugin
3.2.25. StageAndVersionPublicationPlugin
3.2.26. StatesLifecyclePlugin
3.2.27. TagPermissionPlugin
3.2.28. TagStylePlugin
3.2.29. TaxonomyPlugin
3.2.30. TemplatePlugin
3.2.31. XMLdeploymentPlugin
3.3. CMIS configuration
3.3.1. CMIS Configuration
3.3.2. Required nodetypes and namespaces in JCR
3.3.3. Authenticator and organization service configuration
3.3.4. CMIS search and index
3.3.4.1. CMIS Relational View
3.3.4.2. Query Capabilities
3.3.4.3. Configuration
3.3.4.4. Index atomicity and durability
4. Developer references
4.1. WCM Templates
4.1.1. Content types
4.1.1.1. Dialog
4.1.1.1.1. Common parameters
4.1.1.1.2. Text Field
4.1.1.1.3. Hidden Field
4.1.1.1.4. Text Area Field
4.1.1.1.5. Rich Text Field
4.1.1.1.6. Calendar Field
4.1.1.1.7. Upload Field
4.1.1.1.8. Radio Field
4.1.1.1.9. Select box Field
4.1.1.1.10. Checkbox Field
4.1.1.1.11. Mixin Field
4.1.1.1.12. Action Field
4.1.1.1.13. Interceptors
4.1.1.1.14. How to add a new ECM template with tabs
4.1.1.1.15. How to prevent XSS attacks
4.1.1.2. View
4.1.2. List of Contents
4.1.2.1. Content List Template
4.1.2.2. Category Navigation Template
4.2. WCM Explorer
4.2.1. CSS
4.2.2. CKEditor
4.3. Extensions
4.3.1. REST Services
4.3.1.1. Overview
4.3.1.2. Restful Web Service
4.3.1.2.1. HTTP Methods
4.3.1.2.2. Formats
4.3.1.2.3. Data Format
4.3.1.2.4. REST configuration
4.3.1.2.5. Create a REST service
4.3.2. UI Extensions
4.3.2.1. Add your own UIAction
4.3.2.2. Add your own ActionListener
4.3.2.3. Register your UI Action
4.3.2.4. Run your own UI extension sample
4.3.3. Authoring Extension
4.3.3.1. Extended Publication Plugin
4.3.3.1.1. States
4.3.3.1.2. Start/End publication dates
4.3.3.1.3. New Publication Mixin
4.3.3.2. Publication Manager
4.3.3.2.1. Lifecycle
4.3.3.2.1.1. Listen to a lifecycle
4.3.3.2.1.2. Perform tasks when a content's state is updated
4.3.3.2.2. Context
4.3.3.2.3. New Authoring Mixin
4.3.4. Auxiliary attributes for documents
4.4. CMIS Usage code examples
4.4.1. Login to repository
4.4.2. List of documents (folder, files)
4.4.2.1. Use Java
4.4.2.2. Use JavaScript
4.4.3. Read document properties and content-stream
4.4.3.1. Use Java
4.4.3.2. Use JavaScript
4.4.4. Search of data and syntax examples
4.4.4.1. Use java
4.4.4.2. Use JavaScript
4.4.5. Modification of document properties or content
4.4.5.1. Use java
4.4.5.2. Use JavaScript
4.5. Public REST APIs
4.5.1. ThumbnailRESTService
4.5.2. RssConnector
4.5.3. FCKCoreRESTConnector
4.5.4. ResourceBundleConnector
4.5.5. VoteConnector
4.5.6. DriverConnector
4.5.7. GadgetConnector
4.5.8. PortalLinkConnector
4.5.9. GetEditedDocumentRESTService
4.5.10. PublicationGetDocumentRESTService
4.5.11. FavoriteRESTService
4.5.12. RESTImagesRendererService
4.5.13. LifecycleConnector
4.5.14. CopyContentFile
4.5.15. PDFViewerRESTService
4.5.16. ManageDocumentService
4.5.17. DownloadConnector
4.6. Public Java APIs
4.6.1. TaxonomyService
4.6.2. LinkManager
4.6.3. PublicationManager
4.6.4. WCMComposer
4.6.5. NewFolksonomy
4.6.6. ApplicationTemplateManager
4.6.7. NodeFinder
4.6.8. JodConverter
4.6.9. TimelineService
4.6.10. SiteSearchService
4.6.11. SEOService
4.6.12. ManageViewService
4.7. Deprecated portlets
4.8. Miscellaneous and Tips
4.9. FAQ

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
      

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:

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>

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:

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:

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:

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 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.

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.

eXo Platform provides CMIS support using the xCMIS project and the WCM Storage provider.

About CMIS

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.

About xCMIS

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.

About eXo CMIS

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.

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.

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.

Note

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:

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.

Note

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.

The WCM drive is used to expose as an isolated repository via the CMIS service. Operations on the repository will reflect the drive immediately.

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}&amp;includeAllowableActions={includeAllowableActions}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;includeACL={includeACL}&amp;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}&amp;filter={filter}&amp;includeAllowableActions={includeAllowableActions}&amp;includePolicyIds={includePolicyIds}&amp;includeRelationships={includeRelationships}&amp;includeACL={includeACL}&amp;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}&amp;searchAllVersions={searchAllVersions}&amp;maxItems={maxItems}&amp;skipCount={skipCount}&amp;includeAllowableActions={includeAllowableActions}=&amp;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:

where parameters include:

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).

Use Case: Follow Symlinks

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:

The requested file (products.xml) contains the entry with information about the folder.



<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:

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:

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.

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:

Additionally, a CMIS query MAY include the following clauses:

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:

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.

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.

This section describes services which provide low-level functionality for UI components.

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.

Details:

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 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.



<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:

Name Type Value Description
portalNames string classic, acme The portal names.
administrators string root The administrator who manages the newsletter portlet.
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.
mail string The email that user uses to subscribe.

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:

Field Type Value Description
robotsindex ArrayList

INDEX

NOINDEX

Allow search engines to index a particular page or not.
robotsfollow ArrayList

FOLLOW

NOFOLLOW

Allow search engines to follow links from a particular page to find other pages or not.
frequency ArrayList

Always

Hourly

Daily

Weekly

Monthly

Yearly

Never

Define how often a particular page is updated.

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:

Field Type Value Description
permissions ArrayList {java.util.ArrayList} The list of the default user permissions to access the taxonomy tree.
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.

Details:

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 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.

Details:

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.

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 define the business process action in Workflow.

To use the plugin in the component configuration, you must use the following 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:

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:

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:

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:

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:

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 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:

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:

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:

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:

Field Type Value Description
mimeTypes String

image/jpeg

image/png

image/gif

image/bmp

image/tiff

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:

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:

In which:

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:

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 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:

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:

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:

The configuration is applied mainly in core/core-configuration/src/main/webapp/WEB-INF/conf/wcm-core/core-services-configuration.xml.

Sample configuration:

In which:

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:

To use the plugin in the component configuration, you must use the following 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.

The file that contains the structure above will be configured in the configuration.xml file as the following:

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:

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:

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:

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.
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.
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.
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:

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:

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.
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:

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:

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 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:

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 &lt; 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:

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.
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.