Configuration

This chapter covers the following topics:

Configuration overview

In eXo Platform, a lot of configuration options are customizable via properties. If you want to change the default configurations of eXo Platform, simply do as follows:

  1. Create your own .properties file that must be named exo.properties. This file contains all configurations to be customized: $PLATFORM_TOMCAT_HOME/gatein/conf/exo.properties

A .properties file has no header, so you do not need to preserve the header. You can refer to exo-sample.properties that is provided by default but has no effect on the eXo Platform configuration. This default file exposes all properties you can override or extend, but in comments (#). Instead of creating new, you can rename exo-sample.properties into exo.properties, then make changes on your needed properties and remove their comments.

  1. Add configurations to be customized in exo.properties. Pay attention to the followings:

    • Each property is defined on one line that conforms to the syntax: property_name=property_value.

    • Order of the property lines does not take any effect, but it is important that you use the exact key of each property in exo.properties that is already exposed in exo-sample.properties or listed in this chapter. The usage of properties and their keys are detailed in the later sections.

    • The text before the equal sign is the key that you should not change and the text after the equal sign is the property’s value that you can edit.

  2. Save and restart the eXo Platform server for your changes to take effect.

Besides the capability of customizing configurations in exo.properties, you can follow in another way by adding a system property, either in bin/setenv-customize.sample.(sh|bat) or bin/standalone-customize.sample.conf(.bat), or in any your custom scripts. See Customizing environment variables for detailed instructions.

Note

There are some configuration properties that will not be configurable by the system property but in exo.properties only, including:

  • exo.jcr.cluster.jgroups.config

  • exo.service.cluster.jgroups.config

  • exo.jcr.cache.config

  • exo.jcr.cache.config.workspace.portal-system

  • exo.jcr.lock.cache.config

  • exo.jcr.index.cache.config

  • exo.cache.config.template

eXo Platform configuration

In eXo Platform, almost all configurations are performed in a folder that is controlled by a system property named exo.conf.dir. This property is set by setenv.* scripts.

The default value of exo.conf.dir is: $PLATFORM_TOMCAT_HOME/gatein/conf.

That folder contains the following main files that you need to take care: exo.properties (if you need to override the eXo Platform configurations); configuration.xml and portal/${PORTAL_NAME}/configuration.xml (if having the ${PORTAL_NAME} portal container).

Note

The xml configuration is mainly done during the development phase, whereas the configuration in exo.properties targets the deployment phase. So configurations that you want to customize should be done in the exo.properties file.

To understand more clearly the role of those files, let’s begin with the portal container concept.

The eXo Platform Kernel collects runtime components in the portal containers. A portal container holds all components to run a portal instance. It serves pages under the servlet context for its name.

The default portal container in eXo Platform is called “portal”. This explains why the default URL of the samples is http://localhost:8080/portal. The default portal container can be configured directly inside exo.conf.dir.

eXo Platform is capable of running several portal instances simultaneously on the same server. Each instance can be configured and customized independently via files located at: portal/${PORTAL_NAME} (under exo.conf.dir), where ${PORTAL_NAME} is the name of the portal container.

Note

The name of the configuration file can be altered. Please refer to the PortalContainer section in the Kernel reference for more details on portal containers and other options to modify the location of the properties.

Services that run inside a portal container are declared via the xml configuration files like configuration.xml. Such files exist in jars, wars and below exo.conf.dir.

The .xml configuration files also serve as the main way to customize the portal via the multiple plugins offered by the eXo Platform components.

Additionally, the .xml files may contain variables that are populated via properties defined in exo.properties. Hence, the exo.properties file serves as exposing some selected variables that are necessary to configure eXo Platform in a server environment.

exo.properties

This file can be added to easily override or extend configurations of eXo Platform. The important variables that can be overridden are exposed in a sample properties file named exo-sample.properties, but in comments. See Configuration overview for more details.

configuration.xml

This file contains the built-in configuration for the “portal” portal container.

  • In most cases, you should not change this file.

  • In case you do not want to use “portal” as the default portal for your project, this file can be used to import another PortalContainerDefinition into the root container.

Note

To learn more about how to configure a new portal container, please refer to eXo Kernel.

portal/${PORTAL_NAME}/configuration.xml

The extra configuration for the ${PORTAL_NAME} portal container if any. This is where further customizations (for ${PORTAL_NAME} portal container) can be placed. Generally, custom configurations are provided by extension wars. However, this file is the last loaded by Kernel. It has a higher priority over any other configuration files, including extensions. So, you can override any internal component configuration.

This may turn handy services or configurations that are not exposed in exo.properties.

Properties reference

This page is a reference to configurations exposed via exo.properties.

Note

This is not an exhaustive list. Some properties are not documented in this chapter, because they are extremely rarely used by administrators. If the property you are searching for is not here, search it in the whole documentation and raise a question in Community Forum, if necessary.

Platform

Name

Description

Default

exo.base.url

Generates links

http://localhost:8080

exo.accountsetup.skip

Skips “account setup” screen or not?

false

exo.super.user

The predefined super user’s

name.

root

exo.portal.resetpassword .expiretime

The expiration time of a reset password link.

24 (hours)

SMTP

Name

Description

Default

exo.email.smtp.from

The “From” field in outgoing emails.

noreply@exoplatform.com

exo.email.smtp.host

The external mail server. emails.

localhost

exo.email.smtp.port

The external mail server port.

25

exo.email.smtp.start tls.enable

Enable TLS or not?

false

exo.email.smtp.auth

Enable SMTP authentication or not?

false

exo.email.smtp.usern ame

Username to get authenticated with the mail server.

exo.email.smtp.pass word

Password to get authenticated with the mail server.

exo.email.smtp.sock etFactory.port

Port to connect to if a socket factory is specified.

exo.email.smtp.sock etFactory.class

A class to create SMTP sockets.

JODConverter

Name

Description

Default

exo.jodconverter.enable

Enable JODConverter or not?

true

exo.jodconverter.port numbers

List of ports used to create soffice processes.

2002

exo.jodconverter.office home

The home folder of the Office installation.

Blank (auto-detected)

exo.jodconverter.taskqu euetimeout

The maximum living time in milliseconds of a task in the conversation queue.

30000

exo.jodconverter.taskex ecutiontimeout

The maximum time in milliseconds to process a task.

120000

exo.jodconverter.maxtas ksperprocess

The maximum number of tasks to process by an office server.

200

exo.jodconverter.retryt imeout

The interval time in milliseconds to try to restart an office server in case it unexpectedly stops.

120000

Search connector

Name

Description

Default

exo.[searchConnectorName]. connector.[informationType] .enable

Turn on/off a specific Search connector for a certain information type.

true

exo.unified-search. indexing.file.maxSize

Maximum size of files to index

20 MB

exo.unified-search. indexing.supportedMimeTypes

List of indexed file Types

Notification

Name

Description

Default

exo.notification. NotificationDailyJob. expression

Cron expression to schedule daily emails.

0 0 23 ? * * (11:00pm every day)

exo.notification.Notif icationWeeklyJob.expression

Cron expression to schedule weekly emails.

0 0 11 ? * SUN (11:00am every Sunday)

exo.notification.servic e.QueueMessage.period

The delay time (in seconds) between two batches of sent mails.

60

exo.notification.servic e.QueueMessage.numberOfMailPe rBatch

The maximum number of emails sent each batch.

30

exo.notification.portal name

The “from” field in notification emails.

eXo

exo.notification.maxite ms

Maximum number of notifications displayed in the popup list.

8

exo.notification.viewal l

Living days of items displayed in the View All page.

30

exo.notification.WebNot ificationCleanJob.expression

Cron expression to schedule the job that cleans web notification old items.

0 0 23 ? * * (11:00pm every day)

JCR

Name

Description

Default

exo.jcr.datasource.dialect

In most cases the dialect is auto-detected. Follow the link to know exceptions.

auto

exo.jcr.storage.enabled

Enable file system storage for JCR values?

true

WebDav

Name

Description

Default

exo.webdav.def-folder -node-type

Matching node type of folders.

nt:folder

exo.webdav.def-file- node-type

Matching node type of files.

nt:file

exo.webdav.def-file- mimetype

The mimetype to exchange file data.

application/octet-stream

exo.webdav.update- policy

The policy applied when there is an update via WebDav.

create-version

exo.webdav.folder-icon -path

The display icon of a folder.

/eXoWCMResources/skin/ images/file/nt-folder. png

exo.webdav.cache- control

The cache-control header that defines cache and cache live time.

text/*:max-age=3600; image/*:max-age=1800; application/*:max-age= 1800;*/*:no-cache

ECMS

ECMS Watch Document

Name

Description

Default

exo.ecms.watchdocument.sender

The “from” field notification in the emails.

support@exoplatform.com

exo.ecms.watchdocument.subject

The subject of the notification emails.

“Your watching document is changed”

exo.ecms.watchdocument.mimetype

Mimetype of the message body.

text/html

exo.ecms.watchdocument.content

The message body.

Check it yourself in exo-sample.properties

ECMS Document versioning

Name

Description

Default

exo.ecms.documents.versioning .drives

The drives that are enabled for Document versioning.

Managed Sites,Groups,Personal Documents

exo.ecms.documents.versions.max

The max number of versions that a document can have.

0 (no limit)

exo.ecms.documents.versions.exp iration

The expiration time (in days) of a document version.

0 (no limit)

ECMS Document viewer

Name

Description

Default

exo.ecms.documents.pdfview er.max-file-size

Max file size of documents for preview, in MB

10

exo.ecms.documents.pdfview er.max-pages

Max number of pages of documents for preview

99

Calendar

Name

Description

Default

exo.calendar.default.event .suggest

An integer number n, used to auto-calculate and suggest the end time when users create/edit an event.

2 (equivalent to 1 hour)

exo.calendar.default.task. suggest

An integer number n, used to auto-calculate and suggest the end time when users create/edit a task.

1 (equivalent to 30 mins)

Site metadata

Name

Description

Default

exo.intranet.portalConfig. metadata.override

Don’t change this unless you customize the Intranet site.

false

exo.intranet.portalConfig. metadata.importmode

Don’t change this unless you customize the Intranet site.

insert

exo.acme.portalConfig.meta data.override

Only affect when you install the ACME addon.

false

exo.ide.portalConfig.metad ata.override

Only affect when you install the IDE addon.

true

Datasource

Name

Description

Default

exo.jcr.datasource. name

JCR datasource name.

java:/comp/env/exo-jcr

exo.idm.datasource. name

IDM datasource name.

java:/comp/env/exo-idm

Clustering

Quartz Scheduler

Main Scheduler Properties

Name

Description

Default

exo.quartz.scheduler.insta nceName

The name of the scheduler instance.

ExoScheduler

exo.quartz.scheduler.insta nceId

The type of the scheduler instance.

AUTO

ThreadPool configuration Properties

Name

Description

Default

exo.quartz.threadPool.clas s

Is the name of the ThreadPool implementation used.

org.quartz.simpl.SimpleThre adPool

exo.quartz.threadPool.thre adPriority

It an integer value between Thread.MIN_PRIO RITY (which is 1) and Thread.MAX_PRIO RITY (which is 10).

5 (which is the value of Thread.NORM_PRIORITY)

exo.quartz.threadPool.thre adCount

It is the number of threads that are available for concurrent execution of jobs.

25

JobStore configuration Properties (in cluster mode only)

Name

Description

Default

exo.quartz.jobStore.misfir eThreshold

The number of milliseconds the scheduler will tolerate a trigger to pass its next-fire-time by, before being considered misfired.

6000

exo.quartz.jobStore.class

The Scheduler’s JobStore class name.

org.quartz.impl.jdbcjobstor e.JobStoreTX

exo.quartz.jobStore.driver DelegateClass

The Driver delegate which will understand the database system dialect.

org.quartz.impl.jdbcjobstor e.StdJDBCDelegate

exo.quartz.jobStore.usePro perties

The flag which instructs JDBCJobStore that all values in JobDataMaps will be Strings.

false

exo.quartz.jobStore.dataSo urce

The name of the DataSources defined in the configuration properties file for quartz.

quartzDS

exo.quartz.jobStore.tableP refix

The prefix used for to Quartz’s tables in the database.

QRTZ_

exo.quartz.jobStore.isClus tered

Set to “true” in order to turn on clustering features.

false

exo.quartz.jobStore.cluste rCheckinInterval

Set the frequency (in milliseconds) at which this instance “checks-in” with other instances of the cluster.

20000

exo.quartz.jobStore.maxMis firesToHandleAtATime

The maximum number of misfired triggers the jobstore will handle in a given pass.

20

exo.quartz.jobStore.dontSe tAutoCommitFalse

Setting this parameter to “true” tells Quartz not to call setAutoCommit(fa lse) on connections obtained from the DataSource(s).

false

exo.quartz.jobStore.acquir eTriggersWithinLock

Whether or not the acquisition of next triggers to fire should occur within an explicit database lock.

false

exo.quartz.jobStore.lockHa ndler.class

The class name to be used to produce an instance of a “org.quartz.impl .jdbcjobstore”.

exo.quartz.jobStore.driver DelegateInitString

A pipe-delimited list of properties (and their values) that can be passed to the DriverDelegate during initialization time.

exo.quartz.jobStore.txIsol ationLevelSerializable

A value of “true” tells Quartz (when using JobStoreTX or CMT) to call setTransactionIs olation(Connecti on.TRANSACTION_ SERIALIZABLE) on JDBC connections. This can be helpful to prevent lock timeouts with some databases under high load, and long-lasting transactions.

false

exo.quartz.jobStore.select WithLockSQL

Must be a SQL string that selects a row in the “LOCKS” table and places a lock on the row.

SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE

Datasources configuration (in cluster mode only)

Name

Description

Default

exo.quartz.dataSource.quar tzDS.jndiURL

The JNDI URL for a DataSource that is managed by eXo Platform.

java:/comp/env/exo-jpa_por tal

Password Encryption

Name

Description

Default

exo.plidm.password.class

The class that encrypts the user password before it is stored in the database.

DatabaseReadingSaltEncoder

exo.plidm.password.hash

The encrypt algorithm.

SHA-256

Elasticsearch Properties

Name

Description

Default

exo.es.version.minor

The expected minor Elastisearch version compatible with eXo Platform.

5.6

exo.es.embedded.enabled

Allows to run an Elasticsearch server embedded in eXo Platform (not recommended for production).

true

es.cluster.name

Cluster name identifies your Elasticsearch cluster for auto-discovery. If you’re running multiple clusters on the same network, make sure you’re using unique names.

exoplatform-es

es.node.name

Name of the mode for the embedded mode. If not specified, a name is generated dynamically at startup.

exoplatform-es-embedded

es.network.host

Sets both ‘bind_host’ and ‘publish_host’ params. More details here

“127.0.0.1”

es.discovery.zen.ping. unicast.hosts

In Unicast dicovery mode, this parameter lets you set a list of master nodes in the cluster to perform discovery when new nodes (master or data) are started.

[“127.0.0.1”]

es.http.port

TCP Port of the embedded ES node.

9200

es.path.data

Local path to the directory where to Elasticsearch will store index data allocated for this node.

gatein/data

Elasticsearch Client

Name

Description

Default

exo.es.search.server .url

URL of the node used for searching. Required and exo.es.embedded. enabled=false

http://127.0.0.1:9200

exo.es.search.server .username

Username used for the BASIC authentication on the Elasticsearch node used for searching.

exo.es.search.server .password

Password used for the BASIC authentication on the Elasticsearch node used for searching.

exo.es.index.server .url

URL of the node used for indexing.

http://127.0.0.1:9200

exo.es.index.server .username

Username used for the BASIC authentication on the Elasticsearch node used for indexing.

exo.es.index.server .password

Password used for the BASIC authentication on the Elasticsearch node used for indexing.

Elasticsearch Indexing properties

Name

Description

Default

exo.es.indexing.batch .number

Maximum number of documents that can be sent to Elasticsearch in one bulk request.

1000

exo.es.indexing.requ est.size.limit

Maximum size (in bytes) of an Elasticsearch bulk request.

10485760 (= 10Mb)

exo.es.reindex.batch. size

Size of the chunks of the reindexing batch.

100

exo.es.indexing.repli ca.number.default

Number of replicas of the index.

1

exo.es.indexing.shard .number.default

Number of shards of the index.

5

Enable/Disable activity type

Name

Description

Default

exo.activity-type.acti vity-type-key.enabled

The property that allows to enable or disable an activity having the type key `` activity-type -key `` from posting in the streams.

true

File storage configuration

Name

Description

Default

exo.files.binaries. storage.type

Allows to define the file storage way: File system (type=fs) or RDBMS (type=rdbms).

fs

exo.commons.FileStorag eCleanJob.enabled

Enables/disables the job that cleans unused files.

true

exo.commons.FileStorag eCleanJob.retention-time

The retention time of unused files

30 days

exo.commons.FileStorag eCleanJob.expression

The cron job expression for scheduling the file cleaner job

0 0 11 ? * SUN

exo.files.storage.dir

The location where to store binary files in case of file system storage. In cluster mode, this location (folder) should be shared.

{exo.data.dir}/files

MongoDB configuration

MongoDB is the database for eXo Chat: all the below parameters could be configured in chat.properties file

Groovy templates statistics

Name

Description

Default

exo.statistics.groovy .template.enabled

Enables/disables Groovy Templates statistics that is collected asynchronously.

true

CometD configuration

Name

Description

Default

exo.cometd.oort.url

The CometD Oort URL used in clustering mode.

http://localhost:8080/come td/cometd”, localhost should be replaced by the hostname or the IP of the cluster node.

exo.cometd.oort. configType

The CometD configuration type which could be either “static” or “multicast”.

multicast

exo.cometd.oort.cloud

A comma-separated list of URLs of other Oort comets to connect to at startup.

Update of last login time

Name

Description

Default

exo.idm.user.updateLast LoginTime

Enables/disables the update of last login time each time the user login.

true

Define spaces administrators group

Name

Description

Default

exo.social.spaces. administrators

Defines the list of spaces administrators groups.

Assets versions used in static resources URLs

Name

Description

Default

exo.assets.version

Defines the assets version.

It is set to eXo Platform binary version.

Username case sensitive

Name

Description

Default

exo.auth.case.insensitive

Defines if usernames in eXo Platform are case sensitive or not.

false.

User inactivity delay

Name

Description

Default

exo.user.status. offline.delay

Defines the time laps which makes the user in offline status. Its value is expressed in milliseconds.

240000

Notifications channels

Name

Description

Default

exo.notification.channels

Defines the activated notification channels.

WEB_CHANNEL, MAIL_CHANNEL

Wiki application base URI

Name

Description

Default

wiki.permalink.appuri

Defines the base URI for the wiki application permalinks.

wiki

Files upload limit

Name

Description

Default

exo.ecms.connector.dr ives.uploadLimit

Maximum size (in MB) allowed of an uploaded file.

200

exo.social.activity.upl oadLimit

Maximum size (in MB) allowed of an uploaded image through the CKEditor.

200

exo.wiki.attachment. uploadLimit

Maximum size (in MB) allowed of an uploaded file in Wiki application.

200

Agenda

Name

Description

Default

exo.agenda.calendar.defaultColor1 to exo.agenda.calendar.defaultColor10

A set of default colors to use for newly created Space Calendars

defaultColor1:#08a554 defaultColor2:#f8b121 defaultColor3:#ee7429 defaultColor4:#e5282c defaultColor5:#e32386 defaultColor6:#2aa8e2 defaultColor7:#743289 defaultColor8:#ac2986 defaultColor9:#3853a0 defaultColor10:#32388c

exo.agenda.reminder.computing.period

Reminders of occurrent events are computed periodically to store its exact date of notification. This is the period, in days, of next upcoming event reminders to compute using a Periodic Job.

2 (two days)

exo.agenda.webConferencing.default

Name of default Web Conferencing Provider to use.

jitsi (when exo-jitsi addon is installed)

exo.agenda.settings.agendaDefaultView

Default user setting for Agenda view for new users. Possible values: month, week or day

week

exo.agenda.settings.agendaWeekStartOn

Default user setting for first day of the week. Possible values: MO, TU, WE, TH, FR, SA or SU

MO

exo.agenda.settings.showWorkingTime

Default user setting for showing or not working time in Agenda (add gray background on non working hours)

false

exo.agenda.settings.workingTimeStart

Default user setting for working hour start

09:00

exo.agenda.settings.workingTimeEnd

Default user setting for working hour end

18:00

exo.agenda.settings.automaticPushEvents

Default user setting for automatic pushing events remotely into connected Remote Agenda Provider or not.

true

exo.agenda.google.connector.enabled

Global setting to allow users to connect their personal Google Calendar with eXo Agenda or not.

true

exo.agenda.google.connector.key

Client API Key to be generated from Google Console to identify current site that uses eXo Agenda application. See https://developers.google.com/calendar/auth

exo.agenda.office.connector.enabled

Global setting to allow users to connect their personal Office 365 Outlook Calendar with eXo Agenda or not.

true

exo.agenda.office.connector.key

Client API Key to be generated from Office 365 to identify current site that uses eXo Agenda application. See https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow

Configure username case sensitive

By default, eXo Platform is case insensitive. You can configure it to become case sensitive through a parameter in exo.properties file:

  • exo.auth.case.insensitive, default value set to true.

If you set the exo.auth.case.insensitive to true this means that the username “user” is the same as “User” or “uSEr”. If it is set to false, this means that the user should take care of capital and minimal letters when typing the username.

User inactivity delay configuration

When a user does not make any action on the platform i.e he is inactive for a time lapse, he is considered as offline.

The time lapse is configurable in exo.properties file using this parameter exo.user.status.offline.delay.

The parameter is expressed in millisecond and the value default is 240000 milliseconds.

 # The delay when we consider a user as offline. Default value is 240000 milliseconds
exo.user.status.offline.delay=240000

People directory sort field configuration

In people application, users are sorted to facilitate the search in the directory. It is possible to choose the field on which to sort by defining this parameter in exo.properties file:

exo.social.identity.sort.field=fullname

The following values are accepted: fullname, lastname or firstname.

Note

The fullname is the display name defined by the user.

You can also define the sort direction (ASC for ascending or DESC for descending) with this parameter in exo.properties file:

exo.social.identity.sort.direction=asc

It is also possible to define the first character filtering field when using the letters filters:

exo.social.identity.firstChar.field=lastname

By default, users are sorted in the people directory by their full names in ascending order and filtered by the first character of their last name.

Data directory configuration

JCR data is stored in both SQL databases and File System. JCR Database configuration is explained in Database. The JCR File System configuration is explained in this section.

Typically, the JCR File System data consists of four folders:

  • JCR indexes.

  • JCR values storage.

    To store JCR value, SQL database is used as primary storage and another directory can be used as a secondary, dedicated storage for BLOB data. It is optional and you can configure to not store BLOB data in File System, by changing the default configuration in the exo.properties file.

    exo.jcr.storage.enabled=true
    
  • JTA (Transaction information).

  • Swap data (temporary memory space).

By default, these four folders are located under a common directory that is $PLATFORM_TOMCAT_HOME/gatein/data.

In production, it is recommended to configure it to use a directory separated from the package. Especially in cluster mode, it should be a network shared folder.

Configuration in Platform Tomcat

In Tomcat, the directory is configured by the environment variable EXO_DATA_DIR. Edit the bin/setenv-customize.(sh|bat) script:

EXO_DATA_DIR=/mnt/nfs/shared/exo/data

You need to create the script file by copying/renaming the sample bin/setenv-customize.sample.(sh|bat). See Customizing environment variables for more information.

Assets version configuration

Between versions, eXo Platform makes various changes on various layers. To avoid that browsers use cached assets and display old behavior, a parameter exo.assets.version is added in exo.properties file.

When eXo Platform is updated, his parameter allows to:

  • Enforce browsers to reload javascript and css.

  • Build eXo Platform urls for resources serving.

  • Avoid asking users to clear their browser’s cache.

By default, this parameter is set to eXo Platform package version, i.e for the version 5.0.x it is set to 5.0.x.

# Assets versions used in static resources URLs. Useful to manage caches.
exo.assets.version=5.0.x

Quartz Scheduler configuration

eXo Platform uses Quartz Scheduler, the Java Framework for scheduling jobs, in a wide range of features. When eXo Platform runs in cluster mode, it is important to prevent jobs to execute concurrently. Quartz has its own cluster mode, with each instance of eXo Platform server as a node of Quartz load balancing and failover group.

Since the version 6.0 of eXo Platform, Quartz is used in in-memory mode. And it’s switched to persisted mode when clustering is enabled. So it is automatically configured in eXo Platform. As an administrator, you can change default Quartz settings in eXo Platform through exo.properties file.

By default, here are Quartz properties:

#Configure Main Scheduler Properties
#exo.quartz.scheduler.instanceName=ExoScheduler
#exo.quartz.scheduler.instanceId=AUTO

#Configure ThreadPool
#exo.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
#exo.quartz.threadPool.threadPriority=5
#exo.quartz.threadPool.threadCount=25

#Configure JobStore (In cluster mode only, where the persistent mode is enabled)
#exo.quartz.jobStore.misfireThreshold=6000
#exo.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
#For SQL server set exo.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.MSSQLDelegate
#For postgres set exo.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#exo.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#exo.quartz.jobStore.useProperties=false
#exo.quartz.jobStore.dataSource=quartzDS
#exo.quartz.jobStore.tablePrefix=QRTZ_
#exo.quartz.jobStore.isClustered=false
#exo.quartz.jobStore.clusterCheckinInterval=20000
#exo.quartz.jobStore.maxMisfiresToHandleAtATime=20
#exo.quartz.jobStore.dontSetAutoCommitFalse=false
#exo.quartz.jobStore.acquireTriggersWithinLock=false
#exo.quartz.jobStore.lockHandler.class=
#exo.quartz.jobStore.driverDelegateInitString=
#exo.quartz.jobStore.txIsolationLevelSerializable=false
#exo.quartz.jobStore.selectWithLockSQL=SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE
#exo.quartz.dataSource.quartzDS.jndiURL=java:/comp/env/exo-jpa_portal

More details about the definition and default values of the above properties could be found in the table Properties reference. You can also refer to Quartz Configuration Reference documentation for more details about quartz parameters.

Configure documents multiupload in the activity stream

Through the MultiUpload feature, you are able to upload up to 20 files per activity having each one 200 MB as max size.

You can change the default behavior through exo.properties file by configuring these two parameters:

  • exo.social.composer.maxToUpload=20, default value set to 20.

  • exo.social.composer.maxFileSizeInMB=200, default value set to 200 MB.

Transaction service

The JCR transaction timeout is 420 seconds by default. If your application runs longer transactions, you might need a bigger timeout.

Configure the timeout by adding the exo.jcr.transaction.timeout property in exo.properties file.

exo.jcr.transaction.timeout=3600

The value is in seconds.

Server base URL

The property exo.base.url is used to generate links in some cases, like a topic link in an email notification.

Generally you need to configure it to the base URL that users use to access eXo Platform. For example, if you use a reverse proxy, the URL should be the proxy’s host.

The following is the default configuration. To change it, edit exo.properties file.

# The Server Base URL is the URL via which users access eXo platform. All links created (for emails etc) will be prefixed by this URL.
# The base URL must be set to the same URL by which browsers will be viewing your eXo platform instance.
# Sample: exo.base.url=https://intranet.mycompany.com
exo.base.url=http://localhost:8080

Wiki application base URI

The property wiki.permalink.appuri allows you to define the base URI for the wiki application permalinks.

It is configurable through exo.properties file. Its default value is wiki.

The parameter wiki.permalink.appuri utility is to well redirect wiki pages when moving wiki application to different location than the default one.

wiki.permalink.appuri=wiki

Account setup

At the first startup of eXo Platform, the Account Setup and Greetings! screens will appear by default. However, in some scenarios, these screens are not necessary, for example:

  • When you have an extension that declares sample users.

  • When you want to connect to an existing user directory.

To skip these screens, simply change the default value from “false” into “true” in the exo.properties file.

exo.accountsetup.skip=true

Custom data validators configuration

Custom data validator, or user-configurable validator is the mechanism allowing users to define their own validation rules. For example, the username must be lowercase, or shorter than 20 characters. In eXo Platform, there are 6 validators that administrators can configure to use and the architecture allows developers to add more validators as they wish.

The validators can be configured via properties in exo.properties file.

A configuration is created by adding an entry with the gatein.validators. prefix in exo.properties file. This prefix is followed by a validator name, a period ‘.’ and a validator aspect. Currently, there are the following validators and validator aspects:

  • Validators:

    • username: Validates the ‘Username’ field in the Create or Edit user form.

    • password: Validates the ‘Password’ field in the Create or Edit user form.

    • groupmembership: There is a built-in regex that is currently not used to validate any field:

      GROUP_MEMBERSHIP_VALIDATION_REGEX = "^(\\p{Lower}[\\p{Lower}\\d\\._]+)(\\s*,\\s*(\\p{Lower}[\\p{Lower}\\d\\._]+))*$";
      
    • email: Validates the Email Address field in the Create or Edit user form.

    • displayname: Validates the Display Name field in the Create or Edit user form.

    • jobtitle: Validates the Job Title field in the User Profile form.

    • grouplabel: Validates the Label field in Add or Edit group form.

    • pagename: Validates the page name field in the Add new page form. Its label is Page Name if you create a page from the Page ManagementAdd New Page menu. In the Page Creation Wizard, the label is Node Name.

  • Validator aspects:

    • gatein.validators.{validatorName}.length.min: The minimum length of the validated field.

    • gatein.validators.{validatorName}.length.max: The maximum length of the validated field.

    • gatein.validators.{validatorName}.regexp: The regular expression to which the validated field must conform.

    • gatein.validators.{validatorName}.format.message: The information message that is displayed when the field does not conform to the specified regular expression.

See details about the “username” and “password” validators as below. For instructions on how to add a new validator (not in the above list), see Developing your own validator.

Configuration of username validator

By default, the username will be validated as follows:

  • The length must be between 3 and 30 characters.

  • Only lowercase letters, numbers, underscores (_) and period (.) can be used.

  • No consecutive underscores (_) or periods (.) can be used.

  • Must start with a lowercase letter.

  • Must end with a lowercase letter or number.

Note

Some components that leverage GateIn depend on usernames being all lowercase. Therefore, we require to use a lowercase username only.

If you want to validate that username format is email-like, you could use the following configuration:

# validators
gatein.validators.userName.regexp=^[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,4}$
gatein.validators.username.format.message=Username must be a valid email address

When the username field does not conform to this rule, the account is not created and there will be a warning message:

The field "User Name" must match the format "Username must be a valid email address".

In case you do not define gatein.validators.username.format.message, the value of gatein.validators.userName.regexp will be used in the warning message:

The field "User Name" must match the format "^[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,4}$".

Configuration of password validator

By default, the password will be validated as follows:

  • The length must be between 9 and 256 characters.

  • Must contains at minima 1 digit, 1 lower case, 1 upper case

This default configuration correspond to the minimal password length recommended by ANSSI-PG-078 in low to medium sensitivity contexts.

If you want to change the password validation in medium to high sensitivity contexts, the ANSSI recommends to use the following configuration :

# validators
gatein.validators.passwordpolicy.regexp=((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).\\{12,256\\})
gatein.validators.passwordpolicy.length.max=256
gatein.validators.passwordpolicy.length.min=12
gatein.validators.passwordpolicy.format.message=Minimum of 1 digit, 1 lower case, 1 upper case, minimum of 12 chars.

If you want to change the password validation to use the strong level defined by ANSSI, you could use the following configuration :

# validators
gatein.validators.passwordpolicy.regexp=((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).\\{15,256\\})
gatein.validators.passwordpolicy.length.max=256
gatein.validators.passwordpolicy.length.min=15
gatein.validators.passwordpolicy.format.message=Minimum of 1 digit, 1 lower case, 1 upper case, minimum of 15 chars.

Note

Even when the maximum password length is not set, that maximum will not be revealed to the end user. This is done on purpose to limit exposure to some attacks related to very long password.

Note

If you need to define more rules for password complexity, you can update the regexp according to your rules. Remember to update the error message accordingly to help the user enter a valid password.

Outgoing mail service

eXo Platform includes an email sending service that needs to be configured before it can function properly. This service, for instance, is used to send notifications of connection requests.

The service requires an external SMTP server that allows accounts to send email from applications. A suggestion is to use Google SMTP, as detailed below.

In configuration, you need to provide your account and password, and other information so that eXo Platform can connect to the SMTP server.

The configuration file exo.properties is as follows:

Here is the default configuration (it will not work of course, you will need to edit it):

# Email display in "from" field of emails sent by eXo platform.
exo.email.smtp.from=noreply@exoplatform.com
# SMTP Server hostname.
exo.email.smtp.host=localhost
# SMTP Server port.
exo.email.smtp.port=25
# True to enable the secure (TLS) SMTP. See RFC 3207.
exo.email.smtp.starttls.enable=false
# True to enable the SMTP authentication.
exo.email.smtp.auth=false
# Username to send for authentication. Sample: [email protected]
exo.email.smtp.username=
# Password to send for authentication.
exo.email.smtp.password=
# Specify the port to connect to when using the specified socket factory. Sample: exo.email.smtp.socketFactory.port=465
exo.email.smtp.socketFactory.port=
# This class will be used to create SMTP sockets. Sample: exo.email.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
exo.email.smtp.socketFactory.class=
# (SSL Only) Starting from OpenJDK 11.0.11, legacy SSL protocols are no longer supported. Need to enforce TLS version.
mail.smtp.ssl.protocols=TLSv1.2 # (or TLSv1.3)

Read the inline comments to understand each property. Here are some remarks:

  • You need to provide SMTP server host/port, a username/password to be authenticated by that server. Others are optional.

  • Typically, administrators want to mask the From field in the system emails with something like no-reply@exoplatform.com so that the receivers recognize it is robotic. Many SMTP services allow you to set From field in outgoing emails to another email address than the authenticated account. That’s why here you see the property exo.email.smtp.from.

    If this parameter is not valid, the value of exo.email.smtp.username will be used instead.

  • If you want to use SMTP gateway over SSL, configure a certificate truststore containing your SMTP server’s public certificate. Depending on the key sizes, you may then also need to install Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for your Java Runtime Environment.

Using Gmail as your SMTP server

Here is the sample using smtp.gmail.com server:

exo.email.smtp.from=noreply@exoplatform.com
exo.email.smtp.host=smtp.gmail.com
exo.email.smtp.port=465
exo.email.smtp.starttls.enable=true
exo.email.smtp.auth=true
exo.email.smtp.username=exo.test100@gmail.com
exo.email.smtp.password=***
exo.email.smtp.socketFactory.port=465
exo.email.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

Note

If you want to use SMTP gateway over SSL, and starting from openjdk 11.0.11, which no longer supports legacy SSL versions (SSLv3, TLSv1, TLSv1.1) , the following property mail.smtp.ssl.protocols=TLSv1.2 has to be added in eXo Platform.

To make the configuration work, you need to:

  • Register a Google account that is exo.test100@gmail.com in the sample.

  • Enable POP and IMAP for that account. This can be done simply in your Gmail settings, see the screenshot below.

    image0

Here is a checklist provided by Google to help you solve problem if any.

Besides, for securing your account, Google may block access from an app and send you an email to review the access. So in case the mail service does not work, check your inbox and get the link to allow the app access.

Note

In case of Gmail, exo.email.smtp.from must be a real account that you own. It does not need to be a Gmail account, as you can guess by the sample. You will configure your main account (that is exo.email.smtp.username) to add this from email as another “send as”.

To do so, follow this guide of Google.

In case the from parameter is not valid, it does not fail the email sending and the main account will be displayed instead.

Changing sender information of email notification

In eXo Platform, email notifications are sent to users when significant actions involving them occur (for example, new users, connection request, space invitation, and more). These emails help them to track of activities taking place in their Social Intranet.

As an administrator, you can configure information (name and email address) of the sender, from which all notifications are sent, via two ways:

  • In UI, click AdministrationPortalNotifications. Then edit Email Notification Sender section.

  • Via exo.properties file. See Configuration overview if you have not created this file yet.

    exo.notification.portalname=eXo
    exo.email.smtp.from=noreply@exoplatform.com
    

    In which:

    • exo.notification.portalname: Name of the sender. The default value is eXo.

    • exo.email.smtp.from: Email address of the sender. The default value is noreply@exoplatform.com.

Subscribing to notifications of document changes

The function Watch document in Sites Explorer allows users to receive notification by email when a document is updated. The email address of receivers is the email they declare in their profile. Administrators can customize the sender, subject, mimetype and content of the notification.

Note

To get the email notification feature work, you first need to configure Outgoing mail service first.

To customize the email notification, simply add the following properties in exo.properties file.

# Email content for WatchDocumentService
exo.ecms.watchdocument.subject=Your watching document is changed
exo.ecms.watchdocument.mimetype=text/html
exo.ecms.watchdocument.content=Dear $user_name,<br><br>The document $doc_name ($doc_title) has changed.<br><br>Please go to <a href="$doc_url">$doc_title</a> to see this change.<br><br>

In which:

Property

Default value

Description

exo.ecms.watchdocument.subj ect

Your watching document is changed

The subject of the email notification.

exo.ecms.watchdocument.mime type

text/html

The format of the email content. There are two types: text/html and text/plain.

exo.ecms.watchdocument.cont ent

Dear $user_name,<br><br> The document $doc_name ($doc_title) has changed.<br><br>Plea se go to <a href=”$doc_url”>$do c_title</a> to see this change.<br><br>

The content of the email notification.

You can use four parameters below in the exo.ecms.watchdocument.content property:

  • $user_name: The full name of the receiver.

  • $doc_name: The name of the document.

  • $doc_title: The title of the document.

  • $doc_url: The link to view the document in Sites Explorer.

WebDAV configuration

The embedded WebDAV server lets you configure some parameter via exo.properties file.

# JCR Webdav configuration
    exo.webdav.def-folder-node-type=nt:folder
    exo.webdav.def-file-node-type=nt:file
    exo.webdav.def-file-mimetype=application/octet-stream
    exo.webdav.update-policy=update
    exo.webdav.folder-icon-path=/eXoWCMResources/skin/images/file/nt-folder.png
    exo.webdav.cache-control=text/*:max-age=3600;image/*:max-age=1800;application/*:max-age=1800;*/*:no-cache

exo.webdav.def-folder-node-type

Default (JCR) node type which is used for the creation of collections.

exo.webdav.def-file-node-type

Default (JCR) node type which is used for the creation of files.

exo.webdav.def-file-mimetype

A mime-type is detected by file extension or HTTP request header. If those are not found, this parameter is used.

exo.webdav.update-policy

This defines the behavior when a PUT command is executed against an existing resource:

  • add: It tries to add new resource with the same name.

  • create-version: It creates a new version of the resource.

  • Otherwise, the PUT command updates the resource and its last modification date.

exo.webdav.folder-icon-path

The default path is an icon in eXoWCMResources webapp.

exo.webdav.cache-control

This determines the live time of the caches for each type of responses. Use no-cache if you want a type to be not cached.

Secure the listing of the contents of JCR folders through Webdav

For security reasons, it is important to an administrator to secure the access to WebDAV urls of JCR folders.

You can define which JCR folders could be listed through Webdav by using the parameter exo.webdav.folder.listing.paths.allowed.regex in exo.properties file:

exo.webdav.folder.listing.paths.allowed.regex=(collaboration:/Users/(.*)/(.*)/(.*)/(.*))|(collaboration:/Groups/(.*))|(collaboration:/sites/(.*))|(portal-system:/production/app:gadgets/(.*))

The above example allows the listing access to theses folders: users folders, groups folders, sites folders and gadgets folders.

Note

The value of the parameter exo.webdav.folder.listing.paths.allowed.regex should respect this pattern : wokspace_Name:/regex.

The default value of exo.webdav.folder.listing.paths.allowed.regex is set to empty which means that the contents of All JCR folders are listed.

Open in Office configuration

With the Open in Office feature, you are able to easily edit documents, spreadsheets and presentations in the native applications installed on your client, without keeping a local copy.

By default, there are 4 labels displayed for corresponding file types as below:

Label

File types

Open in Word

docx, doc, docm, dot, dotm, dotx.

Open in Excel

xltx, xltm, xlt, xlsx, xlsm, xlsb, xls, xll, xlam, xla.

Open in Powerpoint

pptx, pptm, ppt, ppsx, ppsm, pps, ppam, ppa, potx, potm, pot

Open on Desktop

Non-MS Office files, such as Open Document text files (odp, ods, odt, and more) or archive files (zip, rar, war, and more).

As an administrator, you can easily configure the file types associated with the application named as in “Open in Word”, and set a new label via exo.properties file.

exo.remote-edit.$CATEGORY=$SET_OF_FILETYPES
exo.remove-edit.$CATEGORY.label=$LABEL
  • Replace $CATEGORY with any text as you want, but it should represent the application in correspondence to the file types defined in $SET_OF_FILETYPES.

  • Replace $LABEL with the application label that will be displayed in the UI, for example “Word” or “MS Word”.

Here are some examples:

  • Changing the default labels from “Open in Word”, “Open in Excel”, and “Open in Powerpoint” into “Open in MS Word”, “Open in MS Excel” and “Open in MS Powerpoint”:

    #MS Word
    exo.remote-edit.word=docx,doc,docm,dot,dotm,dotx
    exo.remote-edit.word.label=MS Word
    
    #MS Excel
    exo.remote-edit.excel=xltx,xltm,xlt,xlsx,xlsm,xlsb,xls,xll,xlam,xla
    exo.remote-edit.excel.label=MS Excel
    
    #MS Powerpoint
    exo.remote-edit.powerpoint=pptx,pptm,ppt,ppsx,ppsm,pps,ppam,ppa,potx,potm,pot
    exo.remote-edit.powerpoint.label=MS Powerpoint
    

    image1

  • Adding a new label “Open in LibreOffice” for some Open Document Text file types:

    exo.remote-edit.libreoffice=odp,ods,odt
    exo.remote-edit.libreoffice.label=LibreOffice
    

    image2

  • Setting a new label “Open in Writer” for some both Word and Open Document Text file types:

    exo.remote-edit.writer=docx,doc,odm,odt
    exo.remote-edit.writer.label=Writer
    

    image3

JODConverter configuration

In Sites Explorer or Activity Stream, users can preview documents of various types, without downloading it. To support this feature, eXo Platform uses the JODConverter service that requires OpenOffice or LibreOffice to be installed locally (in the same machine with the eXo Platform server).

Installing OpenOffice/LibreOffice

Follow OpenOffice guideline or LibreOffice guideline to install.

Note that those softwares might be installed in some Linux distributions by the OS already.

Note

JODConverter is already built in eXo Platform, so you do not need to install it.

Sigar Framework

In Windows, Sigar is recommended. JODConverter uses Sigar - if available - to manage Office processes. Without Sigar, there is possibility that Office processes are not stopped successfully when you shut down eXo Platform, and it causes problem in your next start.

So download the following files and install them to the lib folder :$PLATFORM_TOMCAT_HOME/lib

  • sigar.jar

  • sigar-x86-winnt.dll for Windows 32.

  • sigar-amd64-winnt.dll for Windows 64.

JODConverter version

eXo Platform uses JODConverter v3.0 that enhances processing different file types much.

Activating and deactivating

JODConverter is activated by default. You can deactivate it (and consequently not use the preview feature) by setting exo.jodconverter.enable=false in exo.properties file.

Configurations

Note

In most cases, you do not need to configure JODConverter because it can work with default configurations. However, if you are using

OpenOffice 4 (or later), or have installed the Office server untypically, you will need to specify exo.jodconverter.officehome by yourself. See Specifying exo.jodconverter.officehome.

JODConverter configurations can be edited in the exo.properties file. See Configuration overview if the file has not been created yet.

# JOD Converter
exo.jodconverter.enable=true
exo.jodconverter.portnumbers=2002
exo.jodconverter.officehome=
exo.jodconverter.taskqueuetimeout=30000
exo.jodconverter.taskexecutiontimeout=120000
exo.jodconverter.maxtasksperprocess=200
exo.jodconverter.retrytimeout=120000

Key

Default value

Description

exo.jodconverter.portnumbers

2002

List of ports, separated by commas - those used by each JODConverter processing thread. The number of office instances is equal to the number of ports.

exo.jodconverter.officehome

See here

The absolute path to Office installed folder.

exo.jodconverter.taskqueuetimeo ut

30000

The maximum living time of a task in the conversation queue. The task will be removed from the queue if the waiting time is longer than taskQueueTimeout.

exo.jodconverter.taskexecutiont imeout

120000

The maximum time to process a task. If the processing time of a task is longer than taskExecutionTimeout, this task will be aborted and the next task is processed.

exo.jodconverter.maxtasksperpro cess

200

The maximum number of tasks are processed.

exo.jodconverter.retrytimeout

120000

The interval time to restart the Office services after an unexpected crash.

Specifying exo.jodconverter.officehome

Again, the default configuration should work in many cases. Most likely you need to change it for OpenOffice 4.

Note

Note that EXO_JODCONVERTER_OFFICEHOME variable is not used as of 4.1.0. The customize script does not overlap JODConverter configuration anymore, so only use exo.properties for it.

Here are some examples of the property:

  • In Windows: exo.jodconverter.officehome=C:\\Program Files (x86)\\OpenOffice 4

Note

Remember to use double slash (\\) for Windows.

  • In OS X: exo.jodconverter.officehome=/Applications/OpenOffice.app/Contents (OpenOffice 4) or exo.jodconverter.officehome=/Applications/LibreOffice.app/Contents (LibreOffice).

  • In Linux: exo.jodconverter.officehome=/opt/openoffice4.

    In Linux, if you do not know the path, you might check the followings:

    • /opt/openoffice.org3

    • /opt/libreoffice

    • /usr/lib/openoffice

    • /usr/lib/libreoffice

Services details

To support as many as possible document types, it is recommended you install all available services of Open Office. However, if you do not want to do so, refer to the following table to know which packages are needed for which services.

File extensions

Service names

Open Office installation package

Libre Office installation package

doc

docx

odt

writer

openoffice.org-writer

libreoffice-writer

odf

math

openoffice.org-math

libreoffice-math

odg

draw

openoffice.org-draw

libreoffice-draw

odp

ppt

pptx

impress

openoffice.org-impres s

libreoffice-impress

ods

ots

xls

xlsx

xlt

calc

openoffice.org-calc

libreoffice-calc

Limiting size of uploaded files

Files can be uploaded in multiple applications such as Documents, Wiki, Forum, … The maximum allowed size for the uploaded files can be changed by configuration for each application.

In Documents application

When you upload a file in Documents or Sites Explorer, its size is limited to 200 MB by default.

To change this limit, edit the exo.ecms.connector.drives.uploadLimit property in exo.properties file.

For example:

exo.ecms.connector.drives.uploadLimit=300

Note

As of 4.1, this configuration also takes effect on files uploaded from Activity Stream (using the Share function).

In activities posts and comments

In a message post or a comment, it is possible to attach an image through the CKEditor. By default the image size is limited to 200 MB.

You can change this limit by editing the value of the exo.social.activity.uploadLimit property in exo.properties file.

For example:

exo.social.activity.uploadLimit=200

In Wiki application

Same as for the previous applications, files upload size in Wiki is limited, by default to 200 MB which could be redefined through the property exo.wiki.attachment.uploadLimit in exo.properties file.

For example:

exo.wiki.attachment.uploadLimit=200

In Forum application

In forum application, you can upload files as attachements in topics or import a whole forum to eXo Platform forum application.

Both sizes could be defined through these properties:

  • File size in topic:

exo.forum.attachment.upload.limit=10
  • Forum import size:

exo.forum.import.upload.limit=200

Note

The size is in MB for all the above properties.

Tip

For any others file upload location, the maximum file size is defined by the property exo.uploadLimit.

Default value set to 10 Mb.

Limiting public access to the upload service

By default, unauthenticated users are not allowed to upload resources to the server through the Upload component on UI or by accessing directly the “/upload” handler, because this may cause some problems of server disk space. However, you can definitely configure the UploadHandler to allow this.

To change this restriction, edit the exo.portal.uploadhandler.public-restriction property in the exo.properties file as follows:

exo.portal.uploadhandler.public-restriction=false

Customizing site data

eXo Platform provides 2 built-in sites: Intranet and ACME. In case you want to customize data of these sites, for example, modifying or overwriting the existing data, use the externalized parameters in exo.properties file.

Intranet

  • exo.intranet.portalConfig.metadata.override: Allow (true) or not allow (false) overriding the Intranet data. See Overriding Portal Data for more details.

  • exo.intranet.portalConfig.metadata.importmode: Customize data import strategy (CONSERVE, INSERT, MERGE, or OVERWRITE). See here for more details about these modes.

Enabling/Disabling auto-creating a taxonomy tree

eXo Platform allows you to enable/disable auto-creating a taxonomy tree during a new site creation by adding the ecms.taxonomy.autoCreateWithNewSite parameter to exo.properties file.

# Configuration for a taxonomy tree
ecms.taxonomy.autoCreateWithNewSite=false

By default, the parameter is set to false, it means the creation of a taxonomy tree is disabled when you create a new site.

To enable the function, simply set the parameter to true.

Enabling/Disabling any activity type

eXo Platform allows you to enable/disable any activity type. Disabling an activity type means that this kind of activities will not be posted in the streams.

To enable/disable an activity type, you need to add exo.activity-type.activity-type-key.enabled parameter to exo.properties file.

# Configuration for activity type enabling/disabling
exo.activity-type.activity-type-key=false

By default, the parameter is set to true, it means the activity of type `` activity-type-key`` is enabled i.e it posts in the streams.

To disable the activity type, simply set the parameter to false.

Note

In the exo.activity-type.activity-type-key.enabled, activity-type-key could take many values depending on the activity type. Learn more about different activity types below.

activity-type-key could take these values:

  • DEFAULT_ACTIVITY: Activity posted by a user, without documents or link attached.

  • USER_ACTIVITIES_FOR_SPACE: Activity posted when a user creates an activity in a space.

  • LINK_ACTIVITY: Activity with a link attachement.

  • sharecontents\:spaces: Activity for contents sharing in a space.

  • USER_PROFILE_ACTIVITY: Activity automatically posted the first time a user updates his/her profile.

  • DOC_ACTIVITY: Activity with document posted via the Share feature of the mobile application.

  • files\:spaces: Activity with documents attached.

  • contents\:spaces: Activity automatically posted when a content is created.

  • cs-calendar\:spaces: Activity automatically posted when a new event is created.

  • ks-forum\:spaces: Activity automatically posted when a new forum topic or post is created.

  • ks-answer\:spaces: Activity automatically posted when a new question or answer is created.

  • ks-poll\:spaces: Activity automatically posted when a new poll is created.

  • ks-wiki\:spaces: Activity automatically posted when a new wiki page is created in a space wiki.

  • CALENDAR_ACTIVITY: Comment posted when an event is updated

  • exosocial\:people: Comment posted when a user updates his/her profile.

  • poll\:spaces: Comment posted when a poll is updated

  • sharecontents\:spaces: Activity automatically posted when a content is shared in a space.

Some activities types has been, by default, disabled since eXo Platform 6. Here is the full list of the disabled activity types:

  • sharefiles\:spaces: Activity automatically posted when a document is shared in a space.

  • exosocial\:spaces: Comment posted when a member joins/leaves a space.

  • SPACE_ACTIVITY: Activity posted when a space is created. It contains the space’s description and the number of members.

  • exosocial\:relationship: Activity post when two user are connected together.

  • USER_ACTIVITIES_FOR_RELATIONSHIP: Activity automatically posted the first time a user is getting connected to another one, containing the number of relations.

  • USER_COMMENTS_ACTIVITY_FOR_RELATIONSHIP: Comment automatically posted when two users are getting connected.

In addition to disabling the above cited activity types, new ones were introduced and they are all, by default, disabled. Those properties are not effective unless the activity type files\:spaces is enabled :

  • files-spaces.CREATION_COMMENT: Comment added after uploading a file

  • files-spaces.UPDATE_COMMENT: Comments when a file is renamed or one of its properties is updated

  • files-spaces.MOVE_COMMENT: Comments when moving a file from a folder to another one

  • files-spaces.TAG_ACTION_COMMENT: Comments when adding/removing tag(s) to a file

  • files-spaces.ADD_PROPERTY: Comments when a property is added to the file

  • files-spaces.REMOVE_PROPERTY: Comments when a property is removed from a file

Configure spaces administration group

By default, only the super user is able to manage all the spaces of the platform:

  • Create pages on spaces.

  • Add/delete/promote members.

  • Add/modify/delete space data (Wiki pages, forum Posts, activities, tasks…).

With eXo Platform 5.0 it is possible to define a group of users to manage spaces. This group of users is able to edit and delete all kind of spaces: visible and hidden.

The group of spaces administrators could be defined by adding this property to exo.properties file:

  • exo.social.spaces.administrators

Note

  • You should specify the membership type (*, member, manager…)

in the value of the property.

  • It is possible to specify a list of groups separated by commas ,.

In this example, all users of the two groups /platform/administrators and /developers are allowed to manage spaces:

exo.social.spaces.administrators=\*:/platform/administrators,\*:/developers

Logs

The logs of eXo Platform are controlled by the Java Logging API.

By default, the logs are configured to:

  • log errors and warnings on the console.

  • log $PLATFORM_TOMCAT_HOME/logs/platform.log.

The logs are configured via the file:

  • $PLATFORM_TOMCAT_HOME/conf/logging.properties. Please refer to Tomcat’s Logging Documentation for more information on how to adjust this file to your needs.

Hibernate properties for JPA

Since 4.3 version, eXo Platform uses Java Persistance API (JPA) to manage relational data and Hibernate as a JPA provider. In tis section, we will define properties allowing to configure Hibernate in eXo Platform. The following properties should be set in exo.properties file.

Name

Description

Value

General configuration

exo.jpa.hibernat e.dialect

The classname of a Hibernate org.hibernate.dialect.Dialect

A fully-qualified classname for example for HSQl database it is org.hibernate.di alect.HSQLDialec t

exo.jpa.hibernat e.show_sql

Enables/disables log about SQL statements.

true or false

exo.jpa.hibernat e.format_sql

Format log about SQL statements.

true or false

exo.jpa.hibernat e.default_schema

The schema name.

${gatein.idm.dat asource.schema:}

exo.jpa.hibernat e.default_catalo g

The catalog name, it qualifies unqualified table names with the given catalog in generated SQL.

exo.jpa.hibernat e.session_factor y_name

The org.hibernate.SessionFactory is automatically bound to this name in JNDI after it is created.

JNDI name

exo.jpa.hibernat e.max_fetch_dept h

Sets a maximum depth for the outer join fetch tree for single-ended associations. A single-ended assocation is a one-to-one or many-to-one assocation. A value of 0 disables default outer join fetching.

A value between 0 and 3

exo.jpa.hibernat e.default_batch_ fetch_size

Default size for Hibernate batch fetching of associations.

4,8 or 16

exo.jpa.hibernat e.default_entity _mode

Default mode for entity representation for all sessions opened from this SessionFactory, defaults to pojo.

dynamic-map or pojo

exo.jpa.hibernat e.order_updates

Forces Hibernate to order SQL updates by the primary key value of the items being updated. This reduces the likelihood of transaction deadlocks in highly-concurrent systems.

true or false

exo.jpa.hibernat e.order_by.defau lt_null_ordering

Defines precedence of null values in ORDER BY clause. Defaults to none which varies between RDBMS implementation.

none, first or last

exo.jpa.hibernat e.generate_stati stics

Causes Hibernate to collect statistics for performance tuning

true or false

exo.jpa.hibernat e.use_identifier _rollback

if true, generated identifier properties are reset to default values when objects are deleted.

true or false

exo.jpa.hibernat e.use_sql_commen ts

If true, Hibernate generates comments inside the SQL, for easier debugging.

true or false

Database configuration: JDBC

exo.jpa.hibernat e.jdbc.fetch_siz e

A non-zero value determines the JDBC fetch size, by calling Statement.setFetchSize().

An integer or 0

exo.jpa.hibernat e.jdbc.batch_siz e

A non-zero value causes Hibernate to use JDBC2 batch updates.

A value between 5 and 30

exo.jpa.hibernat e.jdbc.batch_ver sioned_data

Set this property to true if your JDBC driver returns correct row counts from executeBatch(). This option is usually safe, but is disabled by default. If enabled, Hibernate uses batched DML for automatically versioned data.

true or false

exo.jpa.hibernat e.jdbc.factory_c lass

Select a custom org.hibernate.jdbc.Batcher. Irrelevant for most applications.

The fully-qualified class name of the factory

exo.jpa.hibernat e.jdbc.use_scrol lable_resultset

Enables Hibernate to use JDBC2 scrollable resultsets. This property is only relevant for user-supplied JDBC connections. Otherwise, Hibernate uses connection metadata.

true or false

exo.jpa.hibernat e.jdbc.use_strea ms_for_binary

Use streams when writing or reading binary or serializable types to or from JDBC. This is a system-level property.

true or false

exo.jpa.hibernat e.jdbc.use_get_g enerated_keys

Allows Hibernate to use JDBC3 PreparedStatement.getGenerate dKeys() to retrieve natively-generated keys after insert. You need the JDBC3+ driver and JRE1.4+. Disable this property if your driver has problems with the Hibernate identifier generators. By default, it tries to detect the driver capabilities from connection metadata.

true or false

Database configuration: Cache properties

exo.jpa.hibernat e.cache.provider _class

The classname of a custom CacheProvider.

org.hibernate.ca che.HashtableCac heProvider

exo.jpa.hibernat e.cache.use_mini mal_puts

Optimizes second-level cache operation to minimize writes, at the cost of more frequent reads. This is most useful for clustered caches and is enabled by default for clustered cache implementations.

true or false

exo.jpa.hibernat e.cache.use_quer y_cache

Enables the query cache. You still need to set individual queries to be cachable.

true or false

exo.jpa.hibernat e.cache.use_seco nd_level_cache

Completely disable the second level cache, which is enabled by default for classes which specify a cache mapping.

true or false

exo.jpa.hibernat e.cache.query_ca che_factory

A custom QueryCache interface. The default is the built-in StandardQueryCache.

Fully-qualified classname

exo.jpa.hibernat e.cache.region_p refix

A prefix for second-level cache region names.

a string

exo.jpa.hibernat e.cache.use_stru ctured_entries

Forces Hibernate to store data in the second-level cache in a more human-readable format.

true or false

exo.jpa.hibernat e.cache.use_refe rence_entries

Optimizes second-level cache operation to store immutable entities (aka “reference”) which do not have associations into cache directly, this case, lots of disassemble and deep copy operations could be avoided. Default value of this property is false.

true or false

Database configuration: Transactions properties

exo.jpa.hibernat e.transaction.fa ctory_class

The classname of a TransactionFactory to use with Hibernate Transaction API. The default is JDBCTransactionFactory.

org.hibernate.tr ansaction.JTATra nsactionFactory

exo.jpa.hibernat e.jta.UserTransa ction

The JTATransactionFactory needs a JNDI name to obtain the JTA UserTransaction from the application server.

a JNDI name

exo.jpa.hibernat e.transaction.ma nager_lookup_cla ss

The classname of a TransactionManagerLookup, which is used in conjunction with JVM-level or the hilo generator in a JTA environment.

org.hibernate.tr ansaction.JBossT ransactionManage rLookup

exo.jpa.hibernat e.transaction.fl ush_before_compl etion

Causes the session be flushed during the before completion phase of the transaction. If possible, use built-in and automatic session context management instead.

true or false

exo.jpa.hibernat e.transaction.au to_close_session

Causes the session to be closed during the after completion phase of the transaction. If possible, use built-in and automatic session context management instead.

true or false

Database configuration: Miscellaneous properties

exo.jpa.current_ session_context_ class

Supply a custom strategy for the scoping of the Current Session.

jta, thread, managed, or custom.Class

exo.jpa.factory_ class

Chooses the HQL parser implementation.

org.hibernate.hq l.internal.ast.A STQueryTranslato rFactory or org.hibernate.hq l.internal.class ic.ClassicQueryT ranslatorFactory

exo.jpa.query.su bstitutions

Map from tokens in Hibernate queries to SQL tokens, such as function or literal names.

hqlLiteral=SQL_L ITERAL or hqlFunction=SQLF UNC

exo.jpa.hbm2ddl. auto

Validates or exports schema DDL to the database when the SessionFactory is created. With create-drop, the database schema is dropped when the SessionFactory is closed explicitly.

validate, update, create, create-drop

Connection pool properties

exo.jpa.hibernat e.proxool.xml

Configure Proxool provider using an XML file (.xml is appended automatically)

exo.jpa.hibernat e.proxool.proper ties

Configure the Proxool provider using a properties file (.properties is appended automatically)

exo.jpa.hibernat e.proxool.existi ng_pool

Whether to configure the Proxool provider from an existing pool.

exo.jpa.hibernat e.proxool.pool_a lias

Proxool pool alias to use. Required.

JCR Configuration

Because JCR Configuration is a very advanced topic, it is recommended you:

  • Learn about eXo JCR configuration.

  • Use default values, change them only if you know what you are doing.

  • Understand how to configure datasource in the Database chapter.

The configurations introduced here are a subset of JCR configurations. There are many JCR configurations which are packed in .war files, so you have to unpack to edit them. To avoid unpacking them, the subset is externalized to be configured easily in exo.properties file.

Here is the list of externalized configurations with their short descriptions.

  • Repository:

    exo.jcr.repository.default=repository
    exo.jcr.workspace.default=collaboration
    exo.jcr.workspace.system=system
    

    In which, “repository”, “collaboration” and “system” are names of default repository, default workspace and system workspace respectively. Refer to Repository Configuration for details.

  • Datasource:

    exo.jcr.datasource.name=java:/comp/env/exo-jcr
    exo.jcr.datasource.dialect=auto
    exo.jcr.db-structure-type=single
    

    These configurations are applied to all workspaces. Refer to Workspace for details.

  • Jgroups:

    exo.jcr.cluster.jgroups.config-url=file:${exo.jcr.cluster.jgroups.config}
    

    This externalizes the jgroups-configuration parameter of all workspace caches, query-handlers and lock-managers. Refer to Workspace for details.

  • Value Storage:

    exo.jcr.storage.enabled=true
    

    This externalizes the enabled property of file system value-storage (that is configured at workspace level). The true value (default) means all binary values are stored in file system. The false value means all binary values are stored in the database. Refer to Value Storage plugin for data container for details.

Cache configuration

To retrieve and display content faster, eXo Platform uses some cache services. See Basic concepts for explanation of properties used for eXo Platform caches.

Note

More details about the eXo Platform caches can be found in:

The below properties are all the cache configuration properties with their default value.

Note

Default values should be changed to better tune eXo Platform.

Portal caches

eXo Platform provides a list of Portal caches, including:

These Portal caches can be overridden in exo.properties file.

# Portal Cache Configuration - MOP session Manager
exo.cache.portal.mop.MaxNodes=5000
exo.cache.portal.mop.TimeToLive=-1
exo.cache.portal.mop.strategy=LIRS
# For Cluster mode
exo.cache.portal.mop.cacheMode=asyncInvalidation

# Portal Cache Configuration - Navigation Service
exo.cache.portal.navigation.MaxNodes=5000
exo.cache.portal.navigation.TimeToLive=-1
exo.cache.portal.navigation.strategy=LIRS
# For Cluster mode
exo.cache.portal.navigation.cacheMode=asyncInvalidation

# Portal Cache Configuration - Description Service
exo.cache.portal.description.MaxNodes=5000
exo.cache.portal.description.TimeToLive=-1
exo.cache.portal.description.strategy=LIRS
# For Cluster mode
exo.cache.portal.description.cacheMode=asyncReplication

# Portal Cache Configuration - Page Service
exo.cache.portal.page.MaxNodes=5000
exo.cache.portal.page.TimeToLive=-1
exo.cache.portal.page.strategy=LIRS
# For Cluster mode
exo.cache.portal.page.cacheMode=asyncInvalidation

# Portal Cache Configuration - Template Service
exo.cache.portal.template.MaxNodes=5000
exo.cache.portal.template.TimeToLive=-1
exo.cache.portal.template.strategy=LIRS
# For Cluster mode
exo.cache.portal.template.cacheMode=asyncInvalidation

# Portal Cache Configuration - ResourceBundleData
exo.cache.portal.ResourceBundleData.MaxNodes=3000
exo.cache.portal.ResourceBundleData.TimeToLive=-1

The specific configuration of Portal caches can be found in the files:

i. For MOPSessionManager, NavigationService, DescriptionService, PageService:

  • $PLATFORM_TOMCAT_HOME/webapps/portal.war!/WEB-INF/conf/portal/portal-configuration.xml.

ii. For TemplateService and ResourceBundle:

  • $PLATFORM_TOMCAT_HOME/webapps/platform-extension.war!/WEB-INF/conf/platform/cache-configuration.xml.

MOPCache

The MOPCache caches all model objects of the portal (MOP), such as sites, pages and preferences. When the cached MOP objects are called, they will be directly retrieved from cache rather than the database.

  • The cached MOP object is invalidated when it is modified or removed.

  • The MOPCache size equals to the number of MOP objects in cache.

  • The maximum heap size cannot be calculated exactly because the MOPCache caches many types of MOP objects that are different in size.

DescriptionCache

The DescriptionCache caches a pair of name-description. Accordingly, the cached pair of name-description will be taken directly from cache rather than the database.

  • The cached pair of name-description is invalidated when the data of this name-description pair is modified or destroyed.

  • The DescriptionCache size equals to the number of name-description pairs in cache.

  • The maximum heap size is dependent on length of name and description of each pair stored in cache. The size of a name-description pair is often less than 200 bytes, so the maximum heap size equals to the cache size multiplied by 200 bytes.

PageCache

The PageCache caches data of a page when one user visits it for the first time. When the cached page is visited, it will be loaded from cache rather than the database.

  • The cached page is invalidated when the page is destroyed. When the page is modified, its new data will be updated into cache.

  • The PageCache size equals to the number of pages in cache.

  • The maximum heap size is dependent on some dynamic attributes of a page, for example, site name that contains the page, length of access/edit permission, display name of page.

TemplateCache

The TemplateCache caches all Groovy templates of the portal by its template path and ResourceResolver. When the cached template is called, it will be loaded from cache rather than the database or the file system.

  • The cached Groovy template is invalidated when it is removed or modified.

  • The TemplateCache size equals to the number of Groovy templates in cache.

  • The maximum heap size is dependent on length of Groovy template. The size of a Groovy template is often less than 100KB, so the maximum heap size equals to the cache size multiplied by 100KB.

ResourceBundleCache

The ResourceBundleCache caches all resource bundles by name and locale. When the cached resource bundle is called, it will be directly loaded from cache rather than the database or the file system.

  • The cached resource bundle is invalidated when it is removed or modified.

  • The ResourceBundleCache size equals to the number of resource bundles in cache.

  • The maximum heap size is dependent on the size of resource bundle. The size of a resource bundle is often less than 100KB, so the maximum heap size equals to the cache size multiplied by 100KB.

Notications, settings and user state caches

eXo Platform provides a list of Caches for notifications, settings and user state:

  • SettingCache

  • Web Notification Count Cache

  • Web Notification Cache

  • Web Notifications Cache

  • User State Service

  • User Setting Service

The Settings, Notifications and User State caches can be overridden in exo.properties file.

#== Notications, settings and user state Caches Configuration == #

# Commons Cache Configuration - Settings Service
exo.cache.commons.SettingService.MaxNodes=2000
exo.cache.commons.SettingService.TimeToLive=360000
exo.cache.commons.SettingService.strategy=LIRS
# For cluster mode
exo.cache.commons.SettingService=asyncInvalidation

# Commons Cache Configuration - Web Notification Count
exo.cache.commons.WebNotificationCountCache.MaxNodes=5000
exo.cache.commons.WebNotificationCountCache.TimeToLive=-1
exo.cache.commons.WebNotificationCountCache.strategy=LIRS
exo.cache.commons.WebNotificationCountCache.cacheMode=asyncReplication

# Commons Cache Configuration - Web Notification
exo.cache.commons.WebNotificationCache.MaxNode=5000
exo.cache.commons.WebNotificationCache.TimeToLive=3600
exo.cache.commons.WebNotificationCache.strategy=LIRS
exo.cache.commons.WebNotificationCache.cacheMode=asyncReplication

# Commons Cache Configuration - Web Notifications
exo.cache.commons.WebNotificationsCache.MaxNodes=5000
exo.cache.commons.WebNotificationsCache.TimeToLive=3600
exo.cache.commons.WebNotificationsCache.strategy=LIRS
exo.cache.commons.WebNotificationsCache.cacheMode=asyncReplication

# Commons Cache Configuration - User State Service
exo.cache.commons.UserStateService.MaxNodes=5000
exo.cache.commons.UserStateService.TimeToLive=600
exo.cache.commons.UserStateService.strategy=LIRS
exo.cache.commons.UserStateService.cacheMode=asyncReplication

# Commons Cache Configuration - User Setting Service
exo.cache.commons.UserSettingService.MaxNodes=5000
exo.cache.commons.UserSettingService.TimeToLivee=86400
exo.cache.commons.UserSettingService.strategy=LIRS
exo.cache.commons.UserSettingService.cacheMode=asyncInvalidation

The specific configuration of SettingCache can be found in the file:

  • $PLATFORM_TOMCAT_HOME/lib/commons-component-common-X.Y.Z.jar!/conf/portal/configuration.xml.

SettingCache

The SettingCache caches the setting value for all contexts and all scopes. When any users ask for the cached setting value, it will be retrieved from cache rather than the database.

  • The SettingCache is never invalidated.

  • The SettingCache size equals to the number of setting values in cache.

  • Each entry of cache is a pair and key is a composite key(Context context, Scope scope, String key). The value is String, Double, Long or Boolean. In reality, the size of these values should be less than 100 bytes, so the maximum heap size equals to the cache size multiplied by 400 bytes.

ECMS caches

eXo Platform provides a list of ECMS caches, including:

Here are the configurations in exo.properties file:

# == ECMS Caches Configuration == #

# ECMS Cache Configuration - Drive Service
    exo.cache.ecms.drive.MaxNodes=5000
    exo.cache.ecms.drive.TimeToLive=600
    exo.cache.ecms.drive.strategy=LIRS
    exo.cache.ecms.drive.cacheMode=syncInvalidation

    # ECMS Cache Configuration - Script Service
    exo.cache.ecms.scriptservice.MaxNodes=300
    exo.cache.ecms.scriptservice.TimeToLive=86400

    # ECMS Cache Configuration - Fragment Cache Service (Markup Cache)
    exo.cache.ecms.fragmentcacheservice.MaxNodes=10000
    exo.cache.ecms.fragmentcacheservice.TimeToLive=30

    # ECMS Cache Configuration - Templates Service
    exo.cache.ecms.templateservice.MaxNodes=100
    exo.cache.ecms.templateservice.TimeToLive=-1
    exo.cache.ecms.TemplateService.strategy=LIRS
    exo.cache.ecms.templateservice.cacheMode=asyncReplication

    # ECMS Cache Configuration - Initial Webcontent
    exo.cache.ecms.initialwebcontentplugin.MaxNodes=300
    exo.cache.ecms.initialwebcontentplugin.TimeToLive=86400
    exo.cache.ecms.InitialWebContentPlugin.strategy=LIRS
    exo.cache.ecms.initialwebcontentplugin.cacheMode=asyncInvalidation

    # ECMS Cache Configuration - PDF Viewer Service
    exo.cache.ecms.PDFViewerService.MaxNodes=1000
    exo.cache.ecms.PDFViewerService.TimeToLive=3600
    exo.cache.ecms.PDFViewerService.strategy=LIRS
    exo.cache.ecms.PDFViewerService.cacheMode=syncInvalidation

    # ECMS Cache Configuration - SEO Cache
    exo.cache.ecms.seoservice.MaxNode=1000
    exo.cache.ecms.seoservice.TimeToLive=3600
    exo.cache.ecms.seoservice.strategy=LIRS
    exo.cache.ecms.seoservice.cacheMode=asyncReplication

    # ECMS Cache Configuration - Query Service
    exo.cache.ecms.queryservice.MaxNodes=5000
    exo.cache.ecms.queryservice.TimeToLive=600000
    exo.cache.ecms.queryservice.strategy=LIRS
    exo.cache.ecms.queryservice.cacheMode=asyncReplication

    # ECMS Cache Configuration - SiteSearch Service found
    exo.cache.ecms.sitesearchservice.found.MaxNodes=10000
    exo.cache.ecms.sitesearchservice.found.TimeToLive=3600

    # ECMS Cache Configuration - SiteSearch Service drop
    exo.cache.ecms.sitesearchservice.drop.MaxNodes=10000
    exo.cache.ecms.sitesearchservice.drop.TimeToLive=3600

    # ECMS Cache Configuration - Javascript Cache
    exo.cache.ecms.javascript.MaxNodes=1000
    exo.cache.ecms.javascript.TimeToLive=3600
    exo.cache.ecms.javascript.strategy=LIRS
    exo.cache.ecms.javascript.cacheMode=asyncReplication

    # ECMS Cache Configuration - Lock
    exo.cache.ecms.lockservice.MaxNodes=300
    exo.cache.ecms.lockservice.TimeToLive=-1
    exo.cache.ecms.LockService.strategy=LIRS
    exo.cache.ecms.lockservice.cacheMode=replication

    # ECMS Cache Configuration - Folksonomy Service
    exo.cache.ecms.folkservice.MaxNodes=300
    exo.cache.ecms.folkservice.TimeToLive=-1
    exo.cache.ecms.folkservice.strategy=LIRS
    exo.cache.ecms.folkservice.cacheMode=asyncReplication

These properties are exposed via exo.properties for administrators. The full configuration can be found in XML configuration files. For SEO Cache, the file is:

  • $PLATFORM_TOMCAT_HOME/webapps/ecm-wcm-extension.war!/WEB-INF/conf/wcm-extension/wcm/seo-configuration.xml.

For the other caches, the file is:

  • $PLATFORM_TOMCAT_HOME/webapps/ecm-wcm-core.war!/WEB-INF/conf/wcm-core/core-services-configuration.xml.

Drive Cache

The managedrive caches visited drives of Sites Explorer by their names. When any users visit the cached drives, these drives will be directly retrieved from cache rather than the database.

  • The cache is invalidated when the drive is removed or added.

  • The cache size equals to the number of drives in cache.

  • The maximum heap size consumed by the cache are calculated as below:

    • Each item of drive cache contains: name, workspace, homePath, permission, view, icon, allowcreatefolders, viewReferences, viewNondocument, viewSidebar, showHiddenNode.

    • The first 7 elements are String and their length often should not be greater than 1000 bytes.

    • The last 4 elements are Boolean and the size of each element is 1 byte.

    • Thus, the maximum heap size equals to the cache size multiplied by 7004 bytes.

Script Cache

The scriptservice caches the ECMS Script objects. When there are any requests for cached scripts, these scripts are retrieved from cache rather than the database.

  • The scriptservice cache is never invalidated.

  • The cache size equals to the number of scripts in cache.

  • The maximum heap size equals to the cache size multiplied by size of the script object.

Template Cache

The templateservice caches the list of document nodetypes. When any users call for the cached document nodetypes, data will be retrieved from cache rather than the database.

  • The templateservice cache is invalidated when the document template is updated.

  • The cache size is 1.

  • The heap size consumed by the cache is unlimited. However the cache contains node names only, so it consumes less than 10KB.

Initial Web Content Cache

The webcontent.initialwebcontentplugin caches the artifacts (nodes) that are used to initialize a new portal. When a cached artifact is called, it will be read and returned from cache rather than the database.

  • The cache is never invalidated because the initial artifact is never changed.

  • The cache size equals to the number of the cached artifacts.

  • The maximum heap size equals to the total size of all artifacts.

Fragment Cache

The fragmentcacheservice caches content of SCVs and CLVs. When any users call for these cached portlets, these portlets will be retrieved from cache rather than the database.

  • The fragmentcacheservice is invalidated when SCVs and CLVs are switched from the edit to the live mode.

  • The cache size equals to the number of SCVs/CLVs in cache.

  • The maximum heap size consumed by the cache: total size of cached SCVs/CLVs (the SCVs/CLVs size is unlimited).

PDF Viewer Cache

The pdfviewer caches the path to a specific page of a specific PDF file. In eXo Platform, when a user views an Office document or PDF file, the viewed page is extracted into a PDF file, and REST is used to return that file content to client browser.

  • The pdfviewer cache is never invalidated.

  • The cache size equals to the number of pages viewed by users.

  • The maximum heap size equals to the cache size multiplied by 200 bytes (supposing that the longest file path is 200 characters).

SEO Cache

The seoservice caches the SEO metadata of all pages in all sites. When the SEO metadata of these cached pages are called, the created pages will be got based on the page path from cache rather than the database.

  • The seoservice cache is never invalidated.

  • The cache size equals to the number of pages to which the SEO metadata is added.

  • The maximum heap size is calculated as follows:

    • Each Metadata object contains 8 String objects: uri, rbcontent, keywords, description, title, frequency, fullStatus, pageReference. Each object is usually less than 100 characters.

    • 5 bytes (a float and a boolean) for priority and sitemap.

    • Thus, the total heap size equals to the cache size multiplied by 805 bytes.

Social caches

eXo Platform provides 4 Social caches, including:

You can change values of these Social caches in exo.properties file.

In particular:

# == SOCIAL Caches Configuration == #

# Social Cache Configuration - Identity
exo.cache.social.IdentityCache.MaxNodes=5000
exo.cache.social.IdentityCache.TimeToLive=86400
exo.cache.social.IdentityCache.strategy=LIRS
exo.cache.social.IdentityCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Identity Index
exo.cache.social.IdentityIndexCache.MaxNodes=5000
exo.cache.social.IdentityIndexCache.TimeToLive=86400
exo.cache.social.IdentityIndexCache.strategy=LIRS
exo.cache.social.IdentityIndexCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Profile
exo.cache.social.ProfileCache.MaxNodes=5000
exo.cache.social.ProfileCache.TimeToLive=86400
exo.cache.social.ProfileCache.strategy=LIRS
exo.cache.social.ProfileCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Identities
exo.cache.social.IdentitiesCache.MaxNodes=5000
exo.cache.social.IdentitiesCache.TimeToLive=86400
exo.cache.social.IdentitiesCache.strategy=LIRS
exo.cache.social.IdentitiesCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Identities Count
exo.cache.social.IdentitiesCountCache.MaxNodes=5000
exo.cache.social.IdentitiesCountCache.TimeToLive=86400
exo.cache.social.IdentitiesCountCache.strategy=LIRS
exo.cache.social.IdentitiesCountCache.cacheMode=asyncInvalidation


# Social Cache Configuration - Relationship
exo.cache.social.RelationshipCache.MaxNodes=10000
exo.cache.social.RelationshipCache.TimeToLive=86400
exo.cache.social.RelationshipCache.strategy=LIRS
exo.cache.social.RelationshipCache.cacheMode=asyncReplication

# Social Cache Configuration - Relationship From Identity
exo.cache.social.RelationshipFromIdentityCache.MaxNodes=10000
exo.cache.social.RelationshipFromIdentityCache.TimeToLive=86400
exo.cache.social.RelationshipFromIdentityCache.strategy=LIRS
exo.cache.social.RelationshipFromIdentityCache.cacheMode=asyncReplication

# Social Cache Configuration - Relationships Count
exo.cache.social.RelationshipsCountCache.MaxNodes=5000
exo.cache.social.RelationshipsCountCache.TimeToLive=86400
exo.cache.social.RelationshipsCountCache.strategy=LIRS
exo.cache.social.RelationshipsCountCache.cacheMode=asyncReplication

# Social Cache Configuration - Relationships
exo.cache.social.RelationshipsCache.MaxNodes=5000
exo.cache.social.RelationshipsCache.TimeToLive=86400
exo.cache.social.RelationshipsCache.strategy=LIRS
exo.cache.social.RelationshipsCache.cacheMode=asyncReplication

# Social Cache Configuration - Activity
exo.cache.social.ActivityCache.MaxNodes=6000
exo.cache.social.ActivityCache.TimeToLive=3600
exo.cache.social.ActivityCache.strategy=LIRS
exo.cache.social.ActivityCache.cacheMode=asyncReplication

# Social Cache Configuration - Activities Count
exo.cache.social.ActivitiesCountCache.MaxNodes=5000
exo.cache.social.ActivitiesCountCache.TimeToLive=86400

# Social Cache Configuration - Activities
exo.cache.social.ActivitiesCache.MaxNodes=5000
exo.cache.social.ActivitiesCache.TimeToLive=86400

# Social Cache Configuration - Space
exo.cache.social.SpaceCache.MaxNodes=500
exo.cache.social.SpaceCache.TimeToLive=86400
exo.cache.social.SpaceCache.strategy=LIRS
exo.cache.social.SpaceCache.cacheMode=asyncReplication

# Social Cache Configuration - Space Ref
exo.cache.social.SpaceRefCache.MaxNodes=2000
exo.cache.social.SpaceRefCache.TimeToLive=86400
exo.cache.social.SpaceRefCache.strategy=LIRS
exo.cache.social.SpaceRefCache.cacheMode=asyncReplication

# Social Cache Configuration - Spaces Count
exo.cache.social.SpacesCountCache.MaxNodes=5000
exo.cache.social.SpacesCountCache.TimeToLive=86400
exo.cache.social.SpacesCountCache.strategy=LIRS
exo.cache.social.SpacesCountCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Spaces
exo.cache.social.SpacesCache.MaxNodes=5000
exo.cache.social.SpacesCache.TimeToLive=86400
exo.cache.social.SpacesCache.strategy=LIRS
exo.cache.social.SpacesCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Active Identities
exo.cache.social.ActiveIdentitiesCache.MaxNodes=4000
exo.cache.social.ActiveIdentitiesCache.TimeToLive=86400
exo.cache.social.ActiveIdentitiesCache.strategy=LIRS
exo.cache.social.ActiveIdentitiesCache.cacheMode=asyncInvalidation

# Social Cache Configuration - Suggestions Cache
exo.cache.social.SuggestionsCache.MaxNodes=5000
exo.cache.social.SuggestionsCache.TimeToLive=86400
exo.cache.social.SuggestionsCache.strategy=LIRS
exo.cache.social.SuggestionsCache.cacheMode=asyncInvalidation

The specific configuration of each Social cache can be found in:

  • $PLATFORM_TOMCAT_HOME/webapps/social-extension.war!/WEB-INF/conf/social-extension/social/cache-configuration.xml.

IdentityCache

The IdentityCache caches information related to identities, such as index, count or profile. When any users view or take actions on users/spaces or activity page that contains the cached identity information, information will be directly retrieved from cache rather than the database.

  • The IdentityCache is invalidated when the user/space is deleted or updated.

  • The IdentityCache size equals to the number of identities in cache.

  • The maximum heap size is calculated as follows:

    • Identity Data: 33Kb (Max size: 500)

    • Identity Index: 24Kb (Max size: 500)

    • Identities List: 3747Kb (Max size: 2000)

    • Identities Count: 739Kb (Max size: 2000)

    • Profile Data: 170Kb (Max size: 500)

RelationshipCache

The RelationshipCache caches relationship information of users in the social networking. Any connection status (connection, pending, invitation, suggestion and count of relationships) is cached. When any users ask for these cached relationships, their information will be retrieved from cache rather than the database.

  • The RelationshipCache is invalidated when the connection is changed/removed or when a new connection is added.

  • The RelationshipCache size equals to the number of relationships in cache.

  • The maximum heap size is calculated as follows:

    • Relationship Data: 14610Kb (Max size: 20000)

    • Relationships Count: 16Kb (Max size: 800)

    • Relationships: 171Kb (Max size: 800)

    • Suggestion: 400Kb (Max size: 500)

SpaceCache

The SpaceCache caches all information of spaces, including the count and space references. When any users visit the cached spaces, their information will be retrieved from cache rather than the database.

  • The SpaceCache is invalidated when the space is deleted or updated.

  • The SpaceCache size equals to the number of spaces in cache.

  • The maximum heap size is calculated as follows:

    • Space Data: 1177Kb (Max size: 1000)

    • Spaces List: 1126Kb (Max size: 1000)

    • Spaces Count: 203Kb (Max size: 4000)

    • Space Ref: (38Kb) (Max size: 10000)

ActivityCache

The ActivityCache caches information related to activities, such as the count of activities. When any users visit the cached activities, information of these activities will be retrieved from cache rather than the database.

  • The ActivityCache is invalidated when the activity is deleted or updated (a new comment is added to the activity).

  • The ActivityCache size equals to the number of activities in cache.

  • The maximum heap size is calculated as follows:

    • Activities Data: 3697Kb (Max size: 10000)

    • Activities List: 2555Kb (Max size: 4000)

    • Activities Count: 98Kb (Max size: 4000)

Forum caches

eXo Platform provides 9 Forum caches, including:

You can override these Forum caches in exo.properties file.

# == FORUM Caches Configuration == #

# Forum Cache Configuration - ForumPermissions
exo.cache.forum.ForumPermissionsUsers.MaxNodes=300
exo.cache.forum.ForumPermissionsUsers.TimeToLive=-1
exo.cache.forum.ForumPermissionsUsers.strategy=LIRS
exo.cache.forum.ForumPermissionsUsers.cacheMode=asyncInvalidation

# Forum Cache Configuration - BBCodeData
exo.cache.forum.BBCodeData.MaxNodes=500
exo.cache.forum.BBCodeData.TimeToLive=-1
exo.cache.forum.BBCodeData.strategy=LIRS
exo.cache.forum.BBCodeData.cacheMode=asyncReplication

# Forum Cache Configuration - BBCodeListData
exo.cache.forum.BBCodeListData.MaxNodes=500
exo.cache.forum.BBCodeListData.TimeToLive=-1
exo.cache.forum.BBCodeListData.strategy=LIRS
exo.cache.forum.BBCodeListData.cacheMode=asyncReplication

# Forum Cache Configuration - User Profile
exo.cache.forum.UserProfile.MaxNodes=800
exo.cache.forum.UserProfile.TimeToLive=14400
exo.cache.forum.UserProfile.strategy=LIRS
exo.cache.forum.UserProfile.cacheMode=asyncInvalidation

# Forum Cache Configuration - User Profile List
exo.cache.forum.UserProfileList.MaxNodes=300
exo.cache.forum.UserProfileList.TimeToLive=1800
exo.cache.forum.UserProfileList=LIRS
exo.cache.forum.UserProfileList.cacheMode=asyncInvalidation

# Forum Cache Configuration - User Profiles List Count
exo.cache.forum.UserProfileListCount.MaxNodes=300
exo.cache.forum.UserProfileListCount.TimeToLive=1800
exo.cache.forum.UserProfileListCount=LIRS
exo.cache.forum.UserProfileListCount.cacheMode=asyncInvalidation

# Forum Cache Configuration - Login User Profiles
exo.cache.forum.LoginUserProfile.MaxNodes=500
exo.cache.forum.LoginUserProfile.TimeToLive=-1
exo.cache.forum.LoginUserProfile.strategy=LIRS
exo.cache.forum.LoginUserProfile.cacheMode=asyncInvalidation

# Forum Cache Configuration - Category List
exo.cache.forum.CategoryList.MaxNodes=50
exo.cache.forum.CategoryList.TimeToLive=-1
exo.cache.forum.CategoryList.strategy=LIRS
exo.cache.forum.CategoryList.cacheMode=asyncInvalidation

# Forum Cache Configuration - Category Data
exo.cache.forum.CategoryData.MaxNodes=150
exo.cache.forum.CategoryData.TimeToLive=-1
exo.cache.forum.CategoryData.strategy=LIRS
exo.cache.forum.CategoryData.cacheMode=asyncReplication

# Forum Cache Configuration - Forum List
exo.cache.forum.ForumList.MaxNodes=100
exo.cache.forum.ForumList.TimeToLive=-1
exo.cache.forum.ForumList.strategy=LIRS
exo.cache.forum.ForumList.cacheMode=asyncInvalidation

# Forum Cache Configuration - Forum Data
exo.cache.forum.ForumData.MaxNodes=500
exo.cache.forum.ForumData.TimeToLive=-1
exo.cache.forum.ForumData.strategy=LIRS
exo.cache.forum.ForumData.cacheMode=asyncReplication

# Forum Cache Configuration - Topic Data
exo.cache.forum.TopicData.MaxNodes=2000
exo.cache.forum.TopicData.TimeToLive=86400
exo.cache.forum.TopicData.strategy=LIRS
exo.cache.forum.TopicData.cacheMode=asyncReplication

# Forum Cache Configuration - Topic List
exo.cache.forum.TopicList.MaxNodes=500
exo.cache.forum.TopicList.TimeToLive=-1
exo.cache.forum.TopicList.strategy=LIRS
exo.cache.forum.TopicList.cacheMode=asyncInvalidation

# Forum Cache Configuration - Topic List Count
exo.cache.forum.TopicListCount.MaxNodes=500
exo.cache.forum.TopicListCount.TimeToLive=-1
{exo.cache.forum.TopicListCount.strategy=LIRS
exo.cache.forum.TopicListCount.cacheMode=asyncInvalidation

# Forum Cache Configuration - Post data
exo.cache.forum.PostData.MaxNodes=20000
exo.cache.forum.PostData.TimeToLive=-1
exo.cache.forum.PostData.strategy=LIRS
exo.cache.forum.PostData.cacheMode=asyncReplication

# Forum Cache Configuration - Post List
exo.cache.forum.PostList.MaxNodes=500
exo.cache.forum.PostList.TimeToLive=-1
exo.cache.forum.PostList.strategy=LIRS
exo.cache.forum.PostList.cacheMode=asyncInvalidation

# Forum Cache Configuration - Post List Count
exo.cache.forum.PostListCount.MaxNodes=500
exo.cache.forum.PostListCount.TimeToLive=-1
exo.cache.forum.PostListCount.strategy=LIRS
exo.cache.forum.PostListCount.cacheMode=asyncInvalidation

# Forum Cache Configuration - Poll Data
exo.cache.poll.PollData.MaxNodes=100
exo.cache.poll.PollData.TimeToLive=-1
exo.cache.poll.PollData.strategy=LIRS
exo.cache.poll.PollData.cacheMode=asyncInvalidation

# Forum Cache Configuration - Poll List
exo.cache.poll.PollList.MaxNodes=500
exo.cache.poll.PollList.TimeToLive=-1
exo.cache.poll.PollList.strategy=LIRS
exo.cache.poll.PollList.cacheMode=asyncInvalidation

# Forum Cache Configuration - Poll Summary Data
exo.cache.poll.PollSummaryData.MaxNodes=500
exo.cache.poll.PollSummaryData.TimeToLive=-1
exo.cache.poll.PollSummaryData.strategy=LIRS
exo.cache.poll.PollSummaryData.cacheMode=asyncInvalidation

# Forum Cache Configuration - Watch List Data
exo.cache.forum.WatchListData.MaxNodes=5000
exo.cache.forum.WatchListData.TimeToLive=-1
exo.cache.forum.WatchListData.strategy=LIRS
exo.cache.forum.WatchListData.cacheMode=asyncInvalidation

# Forum Cache Configuration - Link List Data
exo.cache.forum.LinkListData.MaxNodes=150
exo.cache.forum.LinkListData.TimeToLive=-1
exo.cache.forum.LinkListData.strategy=LIRS
exo.cache.forum.LinkListData.cacheMode=asyncInvalidation

# Forum Cache Configuration - Object Name Data
exo.cache.forum.ObjectNameData.MaxNodes=10000
exo.cache.forum.ObjectNameData.TimeToLive=-1
exo.cache.forum.ObjectNameData.strategy=LIRS
exo.cache.forum.ObjectNameData.cacheMode=asyncReplication

# Forum Cache Configuration - Misc Data
exo.cache.forum.MiscData.MaxNodes=10000
exo.cache.forum.MiscData.TimeToLive=86400
exo.cache.forum.MiscData.strategy=LIRS
exo.cache.forum.MiscData.cacheMode=asyncReplication

The specific configuration of each Forum cache can be found in:

  • $PLATFORM_TOMCAT_HOME/webapps/forum-extension.war!/WEB-INF/ks-extension/ks/forum/cache-configuration.xml.

UserProfilesCache

The UserProfilesCache caches information of users, for example, name, number of topics, number of posts, user settings information in the forum system. These cached information will be used when the users log in the forum for next times.

  • The UserProfilesCache is invalidated when the user is deleted or updated, or when the user creates a new topic/post or changes his/her user settings, logs in/out of the system.

  • The UserProfilesCache size equals to the number of user profiles in forum.

  • The maximum heap size of UserProfilesCache is 213Kb (Max size: 500).

CategoriesCache

The CategoriesCache caches information of categories, such as name, order, description, permissions. Information of these cached categories are used when the Forums application is opened not for the first time.

  • The CategoriesCache is invalidated when the category is modified (for example, when the user updates his/her profile, or watches a category, or adds/deletes a space).

  • The CategoriesCache size equals to the number of categories in cache.

  • The maximum heap size is calculated as follows:

    • Categories List: 207Kb (Max size: 50)

    • Categories Data: 54Kb (Max size: 150)

ForumsCache

The ForumsCache caches information related to forums, such as name, order, description, permission. Information of these cached forums is used when any users open the Forums application not for the first time.

  • The ForumsCache is invalidated when the forum is modified (updating user profile, users watch on Forum, spaces updated).

  • The ForumsCache size equals to the number of forums in cache.

  • The maximum heap size is calculated as follows:

    • Forum List: 66Kb (Max size: 500)

    • Forum Data: 982Kb (Max size: 2500)

TopicsCache

The TopicsCache caches information related to topics, such as name, description, owner, last updated time and permission. When any users go to the cached topics, their information will be retrieved from cache rather than the database.

  • The TopicsCache is invalidated when the topic is modified (for example, when the user watches a topic, or adds/deletes a post, or deletes a space).

  • The TopicsCache size equals to the number of topics in cache.

  • The maximum heap size is calculated as follows:

    • Topic List: 194Kb (Max size: 150)

    • Topic Data: 581Kb (Max size: 500)

PostsCache

The PostsCache caches information of posts, such as title, message, owner. When any users do anything related to the cached posts, information will be retrieved from cache rather than the database.

  • The PostsCache is invalidated when the post is modified (or updated).

  • The PostsCache size equals to the number of topics in cache.

  • The maximum heap size is calculated as follows:

    • Post List: 228Kb (Max size: 150)

    • Post Data: 720Kb (Max size: 500)

WatchesCache

The WatchesCache caches information related to watches, such as users and emails. These cached information will be used when the forum/category/topic is loaded not for the first time.

  • The WatchesCache is invalidated when a post is modified (unwatched/watched).

  • The WatchesCache size equals to the number of watches in cache.

  • The maximum heap size of watched data is 257Kb (Max size: 500)

ObjectNameDataCache

The ObjectNameDataCache caches simple information of categories/forums/topics, such as name and jcr-path. When any users ask for these cached forums/categories/topics, the information will be retrieved from cache rather than the database.

  • The ObjectNameDataCache is invalidated when a category/forum/topic is updated.

  • The ObjectNameDataCache size equals to the number of ObjectNameData in cache.

  • The maximum heap size of ObjectNameDataCache is 239Kb (Max size: 500).

MiscDataCache

The MiscDataCache caches simple information related to categories list size, forums list size, topic list size, screen name of users. These cached information is used when the Forums application is opened not for the first time.

  • The MiscDataCache is invalidated when a category/forum/topic/post/user profile is modified.

  • The MiscDataCache size equals to the number of MiscData in cache.

  • The maximum heap size equals to 45Kb (Max size: 600).

BBCodeCache

The BBCodeCache caches information related to BBCodes, such as tag name, replacement, description, isOption. When any users open the topic containing the cached BBCodeCache or add/edit the BBCode, information will be retrieved from cache rather than the database.

  • The BBCodeCache is invalidated when the BBCode is modified.

  • The BBCodeCache size equals to the number of BBCodes in cache.

  • The maximum heap size is calculated as follows:

    • BBCode List: 9Kb (Size: 10).

    • BBCode Data: 11,25Kb (Size: 50).

Wiki caches

eXo Platform provides 3 Wiki caches, including:

You can change these Social caches that are handled by PageRenderingCacheService in exo.properties file.

In particular:

# == WIKI Caches Configuration == #

    # Wiki Cache Configuration - Page Rendering
    exo.cache.wiki.PageRenderingCache.MaxNodes=3500
    exo.cache.wiki.PageRenderingCache.TimeToLive=-1
    exo.cache.wiki.PageRenderingCache.strategy=LIRS
    exo.cache.wiki.PageRenderingCache.cacheMode=asyncReplication


    # Wiki Cache Configuration - Page Attachment
    exo.cache.wiki.PageAttachmentCache.MaxNodes=3500
    exo.cache.wiki.PageAttachmentCache.TimeToLive=-1
    exo.cache.wiki.PageAttachmentCache.strategy=LIRS
    exo.cache.wiki.PageAttachmentCache.cacheMode=asyncReplication

The specific configuration of each Wiki cache can be found in:

  • $PLATFORM_TOMCAT_HOME/lib/wiki-service-xxx.jar!/conf/portal/cache-configuration.xml.

RenderingCache

The RenderingCache caches content of visited wiki pages. When any users visit the cached wiki pages, their content will be retrieved from cache rather than the database.

  • The RenderingCache is updated when a wiki page is removed or modified.

  • The RenderingCache size equals to the number of wiki pages in cache.

  • The size of a wiki page is unlimited, so the maximum heap size consumed by the cache is unlimited too. However, most of wiki pages are often less than 100KB. Therefore, the maximum heap size equals to the cache size multiplied by 100KB.

UuidCache

The UuidCache caches Uuid of nodes that stores the visited wiki pages. When any users visit these wiki pages, Wiki gets the nodes by UUID in cache that is much faster than query in the database.

  • The UuidCache is updated when the wiki page is removed.

  • The UuidCache size equals to the number of wiki pages in cache.

  • Every Uuid has the length of 32 bytes, so the maximum heap size equals to the cache size multiplied by 32 bytes.

AttachmentCountCache

The AttachmentCountCache caches the number of attachments of the visited wiki pages. When the visited wiki pages are called, the number of page attachments will be retrieved from cache rather than the database.

  • The AttachmentCountCache is updated when the wiki page is removed/modified or when its attachment is added/removed.

  • The AttachmentCountCache size equals to the number of wiki pages in cache.

  • The maximum heap size equals to the cache size multiplied by 4 bytes (“4” - size of Integer).

Calendar caches

eXo Platform provides 6 Calendar caches, including:

You can change values of these Calendar caches in exo.properties file.

# == CALENDAR Caches Configuration == #

     # Calendar Cache By Id - Group/User/Shared Calendars
     exo.cache.calendar.Calendar.MaxNodes=1000
     exo.cache.calendar.Calendar.TimeToLive=3600
     exo.cache.calendar.Calendar.strategy=LIRS
     exo.cache.Calendar.Calendar.cacheMode=asyncReplication

     # Calendar originating datasource by calendarId
     exo.cache.calendar.dsNameById.MaxNodes=1000
     exo.cache.calendar.dsNameById.TimeToLive=-1

     # Calendar Cache Configuration - Group Calendar
     exo.cache.calendar.GroupCalendar.MaxNodes=100
     exo.cache.calendar.GroupCalendar.TimeToLive=86400
     exo.cache.calendar.GroupCalendar.strategy=LIRS
     exo.cache.calendar.GroupCalendar.cacheMode=asyncReplication

     # Calendar Cache Configuration - Group Calendar Event
     exo.cache.calendar.GroupCalendarEvent.MaxNodes=1000
     exo.cache.calendar.GroupCalendarEvent.TimeToLive=3600
     exo.cache.calendar.GroupCalendarEvent.strategy=LIRS
     exo.cache.calendar.GroupCalendarEvent.cacheMode=asyncReplication

     # Calendar Cache Configuration - Group Calendar Recurrent Event
     exo.cache.calendar.GroupCalendarRecurrentEvent.MaxNodes=1000
     exo.cache.calendar.GroupCalendarRecurrentEvent.TimeToLive=3600
     exo.cache.calendar.GroupCalendarRecurrentEvent.strategy=LIRS
     exo.cache.calendar.GroupCalendarRecurrentEvent.cacheMode=asyncReplication

     # Calendar Cache Configuration - User Calendar
     exo.cache.calendar.UserCalendar.MaxNodes=1000
     exo.cache.calendar.UserCalendar.TimeToLive=3600
     exo.cache.calendar.UserCalendar.strategy=LIRS
     exo.cache.calendar.UserCalendar.cacheMode=asyncInvalidation

     # Calendar Cache Configuration - User Calendar Setting
     exo.cache.calendar.UserCalendarSetting.MaxNodes=1000
     exo.cache.calendar.UserCalendarSetting.TimeToLive=3600
     exo.cache.calendar.UserCalendarSetting.strategy=LIRS
     exo.cache.calendar.UserCalendarSetting.cacheMode=asyncInvalidation

     # Calendar Cache Configuration -Event Categories
     exo.cache.calendar.EventCategories.MaxNodes=1000
     exo.cache.calendar.EventCategories.TimeToLive=3600
     exo.cache.calendar.EventCategories.strategy=LIRS
     exo.cache.calendar.EventCategories.cacheMode=asyncReplication

The specific configuration of each Calendar cache can be found in:

  • $PLATFORM_TOMCAT_HOME/webapps/calendar-extension.war!/WEB-INF/cs-extension/cs/cs-configuration.xml.

GroupCalendarCache

The GroupCalendarCache caches the Calendar objects. This object contains metadata information of a calendar, such as calendar name, time zone, permissions. When any users access the cached group calendar, the metadata of this group calendar will be retrieved from cache rather than the database.

  • The cached GroupCalendarCache is invalidated when the user updates calendar metadata, such as creating, deleting, updating calendars (changing time zone).

  • The GroupCalendarCache size equals to the number of Calendar objects in cache.

  • Each Calendar object is approximately 75 bytes, so the maximum heap size equals to the cache size multiplied by 75 bytes.

UserCalendarCache

The UserCalendarCache caches the Calendar object. When any users access the cached user calendar, the metadata of this user calendar will be retrieved from cache rather than the database.

  • The UserCalendarCache is invalidated when the user updates calendar metadata, such as creating, deleting, updating calendar (changing time zone).

  • The UserCalendarCache size equals to the number of Calendar objects in cache.

  • Each Calendar object is approximately 75 bytes, so the maximum heap size equals to the cache size multiplied by 75 bytes.

GroupCalendarEventCache

The GroupCalendarEventCache caches information about events, for example, summary, datetime, invitations, attachments. When any users show content of a group calendar (for example, its events, tasks) for the first time, a query will be made, then put the result to the cache. When another users access the cached content, its data will be retrieved from cache rather than the database.

  • The GroupCalendarEventCache is invalidated when the users make changes on content of the group calendar, for example, creating, deleting tasks, updating summary of events.

  • The GroupCalendarEventCache size equals to the number of events in cache.

  • If the event does not contain the attachment file, each event object is approximately 200 bytes. Therefore, the maximum heap size equals to the cache size multiplied by 200 bytes.

GroupCalendarRecurrentEventCache

The GroupCalendarRecurrentEventCache caches information about recurring events, for example, summary, datetime, invitations, and attachment. When any users show content of a group calendar that contains the recurring event (for example, its events, tasks) for the first time, a query will be made, then put the result to the cache. When another users access the cached content, the data query will be retrieved from cache rather than the database.

  • The GroupCalendarRecurrentEventCache is invalidated when the user makes changes on recurring events, for example, deleting, updating summary of recurring events.

  • The GroupCalendarRecurrentEventCache size equals to the number of recurring events in cache.

  • If the recurring event does not contain the attachment file, each object is approximately 200 bytes. Therefore, the maximum heap size equals to the cache size multiplied by 200 bytes.

UserCalendarSettingsCache

The UserCalendarSettingsCache caches information about calendar settings, such as datetime format, calendar filter, view types. When the user needs calendar settings, such as access to calendar page and need to render current view (month view, week view), a query is made and put the setting information to the cache. If another users access the cached calendar settings, the data will be directly retrieved from cache rather than the database.

  • The UserCalendarSettingsCache is invalidated when the user changes his settings or the user is deleted.

  • The UserCalendarSettingsCache size equals to the number of calendar settings in cache.

  • Each Calendar setting object is approximately 80 bytes, so the maximum heap size equals to the cache size multiplied by 80 bytes.

Calendar Cache by ID

This cache will manage:

  • User private calendars by id and username.

  • User shared calendar by id and username.

  • Group calendar by id.

Calendar originating datasource by calendarId

This cache will manage originating datasource name (“jcr” or “task”) to be able to search for the calendar information from the dedicated store.

EventCategoriesCache

The EventCategoriesCache caches event category names and Ids. When an event category is called for the first time, a query is made and data is put into the cache. For next time, when another users call the cached event category, its data will be retrieved from cache rather than the database.

  • The EventCategoriesCache is invalidated when the user creates, updates or deletes the event category.

  • The EventCategoriesCache size equals to the number of event categories in cache.

  • The EventCategoriesCache size is approximately 24 bytes, so the maximum heap size equals to the cache size multiplied by 24 bytes.

Wallet caches

eXo Platform provides 2 wallet caches:

  • Wallet account cache

  • Wallet transaction cache

You can add new values of these caches in exo.properties file.

exo.cache.wallet.account.MaxNodes=2000
exo.cache.wallet.account.TimeToLive=-1
exo.cache.wallet.transactions.MaxNodes=2000
exo.cache.wallet.transactions.TimeToLive=-1

The specific configuration of wallet caches can be found in:

  • $PLATFORM_TOMCAT_HOME/webapps/wallet-common.war!/WEB-INF/wallet/cache-configuration.xml.

Wallet account cache

The Wallet account cache caches the Wallet objects. This object contains metadata information of a wallet, such as identity id, username, space pretty name, wallet enablement… When any user get access to their wallet or a space wallet, the cached wallet object will be retrieved from cache rather than the database.

  • The cached Wallet account is invalidated when the user updates its metadata such as reimporting its private key.

  • The Wallet account cache size should be equal to the number of wallets used in eXo Platform.

  • Each Wallet object take about 400 bytes in memory. So the maximum heap size occupied by the wallet cache would be its size multiplied by 400 bytes.

Wallet Transactions cache

The Wallet Transactions cache caches the blockchain transaction metadata sent by a wallet. This object contains information such as transaction hash, username, space pretty name, transaction status… When any user get access to the list of their transactions or a space wallet transactions, the cached wallet transactions objects will be retrieved from cache rather than the database.

  • The cached Wallet transaction is invalidated when the users updates their metadata such as changing transaction status from pending to success or failed.

  • The Wallet transaction cache size should equals the number of wallet accounts multiplied by the first transactions list page size (10 elements per page).

  • Each Wallet transaction object take about 700 bytes in memory. So the maximum heap size occupied by the wallet transaction cache would be its size multiplied by 700 bytes.

End-date suggestion

eXo Platform offers the end-date suggestion feature in Calendar that you can change in exo.properties file.

# auto suggest the end of event time to 1 hour (2 x 30 min)
exo.calendar.default.event.suggest=2
# auto suggest the end of task time to 30 minutes (1 x 30 min)
exo.calendar.default.task.suggest=1

In which:

  • The numeric value of duration suggestion is complied with the following rules: 1 = 30 minutes, 2 = 1 hour, 3 = 1 hour 30 minutes, 4 = 2 hours. This means 1 block equals to 30 minutes.

  • exo.calendar.default.event.suggest: Defines the duration of an event. That is, if the start-time is 7:00AM in the From field, the end-time will be auto-increased to 8:00AM in the To field. “2” is set by default for the duration of events.

  • exo.calendar.default.task.suggest: Defines the duration of a task. That is, if the start-time is 7:00AM in the From field, the end-time will be auto-increased to 7:30AM in the To field. “1” is set by default for the duration of tasks.

Predefined users, groups and memberships

When eXo Platform starts for the first time, it initializes some users, groups and memberships, such as user root and group /platform. Some user attributes are set also, including password, firstname, lastname and email.

First you should get familiar with the expression of group and membership. If a user has the member:/platform/users membership, it means the user is a member of the /platform/users group. The groups are organized like a tree, in which /platform/users is a sub-group of /platform group.

A membership is formed by a membership type and a group. Member, editor and manager are some of predefined membership types. So strictly speaking, “membership type” and “membership” are different concepts. However, the word “membership” is sometimes used with the meaning of “membership type”.

Next you will learn the configurations of predefined users, groups and memberships which are written in:

  • $PLATFORM_TOMCAT_HOME/webapps/platform-extension.war!/WEB-INF/conf/organization/organization-configuration.xml.

This section does not directly aim at changing those predefined organizational data, but if it is the further step you want to go, you can easily perform via the extension mechanism provided by eXo Platform.

Organizational data initializer

At top of the configuration file, you see the initializer declaration that is supposed to create all the predefined data discussed here:

<component-plugin>
    <name>init.service.listener</name>
    <set-method>addListenerPlugin</set-method>
    <type>org.exoplatform.services.organization.OrganizationDatabaseInitializer</type>
    <description>this listener populate organization data for the first launch</description>
    <init-params>
        <value-param>
            <name>checkDatabaseAlgorithm</name>
            <description>check database</description>
            <value>entry</value>
        </value-param>
        ...
    </init-params>
</component-plugin>

Notice the value of checkDatabaseAlgorithm. If it is set to entry, each user, group and membership listed in the configuration is checked each time eXo Platform is started. If an entry does not exist in the database yet, it will be created. If the value is set to empty, the data will be updated to the database only if the database is empty.

Predefined membership types

All predefined membership types can be found under the membershipType field. Here is an extract:

<field name="membershipType">
    <collection type="java.util.ArrayList">
        <value>
            <object type="org.exoplatform.services.organization.OrganizationConfig$MembershipType">
                <field name="type"><string>*</string></field>
                <field name="description"><string>Any membership type</string>  </field>
            </object>
        </value>
        <value>
            <object type="org.exoplatform.services.organization.OrganizationConfig$MembershipType">
                <field name="type"><string>manager</string></field>
                <field name="description"><string>manager membership type</string></field>
            </object>
        </value>
        ...
    </collection>
</field>

Predefined groups

All predefined groups can be found under the group field. Here is an extract:

<field name="group">
    <collection type="java.util.ArrayList">
        <value>
            <object type="org.exoplatform.services.organization.OrganizationConfig$Group">
                <field name="name"><string>developers</string></field>
                <field name="parentId"><string /></field>
                <field name="description"><string>the /developers group</string></field>
                <field name="label"><string>Development</string></field>
            </object>
        </value>
        ...
    </collection>
</field>

Predefined users

All predefined users can be found under the user field. The configurations are username, firstname, lastname, email, password and the list of memberships granted to the user. Here is an extract:

<field name="user">
    <collection type="java.util.ArrayList">
        <value>
            <object type="org.exoplatform.services.organization.OrganizationConfig$User">
                <field name="userName"><string>${exo.super.user}</string></field>
                <field name="password"><string>password</string></field>
                <field name="firstName"><string>Root</string></field>
                <field name="lastName"><string>Root</string></field>
                <field name="email"><string>[email protected]</string></field>
                <field name="groups">
                    <string>*:/platform/administrators,*:/platform/users,*:/platform/web-contributors,*:/organization/employees,member:/organization/management/executive-board</string>
                </field>
            </object>
        </value>
        ...
    </collection>
</field>

Note that the code above uses the exo.super.user property which is set to root in exo.properties file:

Enabling/Disabling groovy templates statistics

Management and Monitoring Gadgets is a set of administrative gadgets that provide a global vision for the system and they can provide performance statistics useful for administrators.

With eXo Platform 4.4, a new parameter configurable through exo.properties file, was introduced:

exo.statistics.groovy.template.enabled=true

This parameter allows to enable/disable groovy templates statistics that is collected asynchronously. Enabling it (i.e setting it to “True”) activates the statistics collection to be made in memory without logs.

Note

This parameter is not necessary for production environements. It could be activated for testing purposes.

Search connector configuration

There are a number of built-in Search connectors which are activated by default in eXo Platform. You can easily turn any of them off by setting its corresponding property to false in the exo.properties file, as referring the following table:

Property

Description

exo.unified-search.connector.f ile.enable

Turn on/off Unified Search connector for all files. The default is true, that is, all files are included in the search scope.

exo.unified-search.connector.w iki.enable

Turn on/off Unified Search connector for all Wiki pages. The default is true, that is, all Wiki pages are included in the search scope.

exo.unified-search.connector.p age.enable

Turn on/off Unified Search connector for all portal pages. The default is true, that is, all portal pages are included in the search scope.

exo.unified-search.connector.p ost.enable

Turn on/off Unified Search connector for all Forum posts. The default is true, that is, all Forum posts are included in the search scope.

exo.unified-search.connector.t ask.enable

Turn on/off Unified Search connector for all Calendar tasks. The default is true, that is, all Calendar tasks are included in the search scope.

exo.unified-search.connector.s pace.enable

Turn on/off Unified Search connector for all spaces. The default is true, that is, all spaces are included in the search scope.

exo.unified-search.connector.e vent.enable

Turn on/off Unified Search connector for all Calendar events. The default is true, that is, all Calendar events are included in the search scope.

exo.unified-search.connector.p eople.enable

Turn on/off Unified Search connector for all users. The default is true, that is, all users are included in the search scope.

exo.unified-search.connector.d ocument.enable

Turn on/off Unified Search connector for all documents. The default is true, that is, all documents are included in the search scope.

Unified Search configuration

eXo Platform exposes several parameters for effective use of Unified Search Engine. You can change these parameters in :ref:`exo.properties <Configuration.ConfigurationOverview>`file.

# Enables Fuzzy search engine
# Values: true/false
exo.unified-search.engine.fuzzy.enable=true

# Sets the required similarity between the query term and the matching terms
# Values : Between 0 and 1
exo.unified-search.engine.fuzzy.similarity=0.5

# List characters will be ignored by indexer
exo.unified-search.excluded-characters=.-

Fuzzy parameters

Since 4.0.4, there are two properties that allow you to enable/disable Fuzzy search and adjust its effectiveness. You can read about Fuzzy search here. Basically, the engine searches for not only exact keyword but also similar words. It is likely a feature expected by end-users, but it is also a deal with search speed. That is why you should have ability to adjust degree of similarity and enable/disable Fuzzy search.

By default, Fuzzy search is enabled. Fuzzy search will be performed when the user adds a tilde (~) after a single keyword. So the “Home~” keyword triggers a Fuzzy search of which the result may include “Rome”. Also, the user can append a similarity to narrow or extend the search result, for example “Home~0.8”.

Property

Description

exo.unified-search.engine.fuzz y.enable

The value can be true or false that means Fuzzy search is enabled or disabled respectively. The default is true.

exo.unified-search.engine.fuzz y.similarity

The default similarity that varies between 0 and 1. The closer to 1 this value is set, the more found words are similar to the keyword. The value of this property is effective when the user does not add a similarity.

Use the period (.) for floating point, for example “0.1”, “0.2”. The default is 0.5.

Excluded characters

By default only the whitespace is recognized as the word separator - means if the data is “Lorem Ipsum”, there are two indexes will be created for “Lorem” and “Ipsum”.

The built-in indexing service of eXo Platform allows more word separators, like dot (.) or hyphen (-). To define those, edit the property exo.unified-search.excluded-characters.

When a user types a phrase to search, the word separator is used also. For example if hyphen is configured, and the user types “Lorem-Ipsum”, then the query is sent as if it is two words.

Elasticsearch Configuration

Properties of the Elasticsearch embedded node

When deployed as embedded, the Elasticsearch configuration files (elasticsearch.yml and logging.yml) are embedded in the add-on. All the properties can be set directly in exo.properties and will override the default properties defined in elasticsearch.yml and logging.yml.

All the properties below are standard properties of Elasticsearch. When a property es.xxx is defined in exo.properties, it is automatically picked by the embedded Elasticsearch node (without the “es.” prefix).

################################ Elasticsearch Embedded node ################################

es.cluster.name=exoplatform-es
es.node.name=exoplatform-es-embedded
es.network.host=127.0.0.1
es.discovery.zen.ping.unicast.hosts=["127.0.0.1"]
es.http.port=9200
es.path.data=gatein/data

More details about these properties can be found in the Properties reference chapter.

Properties of the Elasticsearch client

eXo Platform communicates with the Elasticsearch server via multiple components through so-called client code. The client code differentiates calls done to the server for indexing and for searching. It allows to have different a deployment topology where different Elasticsearch server have different roles. The following client paramters are configurable in exo.properties

################################ Elasticsearch ################################
exo.es.embedded.enabled=true
exo.es.index.server.url=http://127.0.0.1:9200
exo.es.index.server.username=root
exo.es.index.server.password=xxxxx
exo.es.indexing.batch.number=1000
exo.es.indexing.replica.number.default=1
exo.es.indexing.shard.number.default=5
exo.es.indexing.request.size.limit=10485760
exo.es.reindex.batch.size=100
exo.es.search.server.url=http://127.0.0.1:9200
exo.es.search.server.username=root
exo.es.search.server.password=xxxxx

It is also possible to configure the number of connection in the http connections pool used for search and indexing calls to Elasticsearch by defining these parameters:

exo.es.search.http.connections.max=2
exo.es.index.http.connections.max=2

exo.es.search.http.connections.max is the maximum number of connections in the HTTP connections pool for Elasticsearch search calls. Default value set to 2. exo.es.index.http.connections.max is the maximum number of connections in the HTTP connections pool for Elasticsearch indexing calls. Default value set to 2.

The parameter

exo.es.embedded.enabled=true

allows to enable/disable Elasticsearch Embedded node startup. It is set to True by default. More details about the parameters in Properties reference.

Properties of the indexing processor and connectors

The properties below allow to configure indexing parameters such as the number of shards, replicas, batch size…

For more details about indexing with Elasticseach, you can take a look in this documentation.

################################ Properties of the indexing processor ################################
exo.es.indexing.batch.number=1000
exo.es.indexing.request.size.limit=10485760
exo.es.reindex.batch.size=100
################################ Properties of the indexing connectors ################################
exo.es.indexing.replica.number.default=1
exo.es.indexing.shard.number.default=5

More details about the parameters in Properties reference chapter.

CometD

What is CometD?

CometD is a set of libraries that facilitates the writing of web applications that perform messaging over the web such as web chat applications.

The role of CometD is to deliver messages over the wire using the best available transport: Websocket or HTTP, independently of the APIs used in the application. It also provides transparent fallback in case WebSocket does not work.

CometD clustering

CometD provides a clustering solution called Oort that allows you to scale horizontally your web applications. With a CometD based system in cluster mode, clients connect to multiple nodes instead of a single node.

Oort clustering is not a high-availability solution. In fact, when a node is down, all the clients are disconnected and then connected to another node by a new handshake. When this happens then if the application did not implement a method to retrieve information, the data build on the client side is lost.

CometD configuration

To configure CometD in either cluster or standalone mode, some parameters are needed. A list of parameters is provided in CometD’s Official documentation.

Note

All CometD parameters are configurable in eXo Platform in the exo.properties file by prefixing them with exo.cometd.. For example, to override the maximum size of Websocket messages, a value must be set for the parameter ws.maxMessageSize. Thus, in eXo Platform this value must be set in exo.properties through the exo.cometd.ws.maxMessageSize.

Youtube integration

eXo Platform uses YouTube Data API v3 that provides access to YouTube data, such as videos, playlists, and channels. To enable this, you should configure a Youtube V3 API Key property via exo.properties file.

For instance:

youtube.v3.api.key=AIzaSyDToZc6oTOpe7kZIJeSUMvxfyoS6hhKJuI

In which:

Notification

The feature related to configuration in this section is the Email/On-site notification. Here are some aspects of the feature:

  • Users can receive daily/weekly emails that sum up the activities they are interested in. This is performed in the background by jobs called NotificationDailyJob and NotificationWeeklyJob.

  • In the Web UI, the notifications pop up immediately when an activity happens. And there is a page called “View All” where users can see all the recent notifications.

    In the background, a job called WebNotificationJob takes care to remove notifications that are older than a configurable live time.

Here under is the list of related properties that you can configure via exo.properties file.

  • exo.notification.NotificationDailyJob.expression

    This is the Cron expression to schedule the daily emails. By default it is 0 0 23 ? * * (11:00pm every day).

    Learn to write Cron expression string here.

  • exo.notification.NotificationWeeklyJob.expression

    This is the Cron expression to schedule the weekly emails. By default it is 0 0 11 ? * SUN (11:00am every Sunday).

  • exo.notification.service.QueueMessage.period

    When they run, the jobs divide emails into batches and send them sequentially for preventing overloads. This configuration is the delay time (in seconds) between two batches.

    The default is 60 (one minute).

  • exo.notification.service.QueueMessage.numberOfMailPerBatch

    This is the (maximum) number of emails of each batch. The default is 30.

  • exo.notification.portalname

    This is the “from” field in the emails. The default is eXo.

  • exo.notification.maxitems

    The maximum number of notifications displayed in the popover list. The default is 8.

  • exo.notification.viewall

    The number of days a notification takes place in the “View All” page. When it reaches its live time, it will be removed by the WebNotificationJob. The default is 30 (days).

  • exo.notification.WebNotificationCleanJob.expression

    The Cron expression to schedule the WebNotificationJob. By default it runs at 11:00pm every day (0 0 23 ? * *).

Notification channels configuration

In eXo Platform, two notification channels are available by default:

  • Web channel: notifications are sent on the web browser.

  • Email channel: notifications are sent via the email.

It is possible to define which channels to activate through the parameter exo.notification.channels in exo.properties file.

It is a comma separated property which could take these values:

  • MAIL_CHANNEL

  • WEB_CHANNEL

By default (when the property is not customized or empty), all the available channels are activated. When a notification channel is added through an extension, it is automatically activated.

Document versioning

By default, versioning is enabled for documents contained in the Managed Sites, Groups and Personal Documents drives. To change this configuration, edit the exo.ecms.documents.versioning.drives property in the exo.properties file.

For example:

exo.ecms.documents.versioning.drives=Managed Sites,Personal Documents

in which the drives are separated by commas.

Besides, to control the data arisen from this feature, eXo Platform provides you with the two properties:

  • exo.ecms.documents.versions.max: defines the maximum number of versions that a document can have. When the maximum number of versions is reached, only the X last versions are kept while the other ones are permanently deleted. A non-positive value means no limit - by default this property is set to 0 (no limit).

  • exo.ecms.documents.versions.expiration: defines the expiration time (in days) of a document version. When the expiration time is reached, the version is permanently deleted. The last version of a document is never deleted. A non-positive value means no limit - by default this property is set to 0 (no limit).

Note

If the value of the property exo.ecms.documents.versioning.drives is updated to add or remove drives, the documents already existing in the old and new drives are not impacted. Only the new documents are impacted by the updates. All the previous rules apply, depending on whether the document is versioned or not.

Document Viewer

The Document Viewer relies on document conversion on serverside which can take significant resources on large files. In order to avoid excessive resource consumption, this component limits the size of files it can display. Limits are set both in file weight and in number of pages in the document:

  • exo.ecms.documents.pdfviewer.max-file-size: defines the maximum size in Megabytes that a file can weight to be displayed in the document viewer. Beyond that size, the document viewer displays a warning message instead of the document content :

    image4

    Default limit is 10MB. Any non-positive or invalid value will fallback to default.

  • exo.ecms.documents.pdfviewer.max-pages: defines the maximum number of pages that a document can contain to be displayed in the document viewer. Beyond that number of pages, the document viewer displays a warning message instead of the document content.

    image5

    Default limit is 99 pages. Any non-positive value or invalid value will fallback to default.

Forgot Password

If you forget your password, you can request the system to send you a link to reset it. The link will be sent to your email and will expire as soon as you successfully reset the password or after an expiration time.

The expiration time is 24 hours by default. To change it, edit the following in exo.properties file.

exo.portal.resetpassword.expiretime=24

The time unit is hour.

Password Encryption

For security, the user passwords are encrypted before being stored into the database. When a user logs in, he provides a password in clear text. This given password is then encrypted by the same algorithm and the same encoder class before being compared with the stored password. If they match, the user gets authenticated.

As of eXo Platform 4.3, the encoder and the algorithm can be configured via exo.properties file.

Note

It is not likely administrators will want to change the default encoder and algorithm. However for users who upgrade from a previous version older than 4.3, it is important to know that the default encoder and the default algorithm have changed, so you will need to re-configure it back to the old one which has been used, otherwise old users will not be able to log in.

Before 4.3, the defaults are:

  • Encoder class: org.picketlink.idm.impl.credential.HashingEncoder

  • Algorithm: MD5

As of 4.3, the defaults are:

  • Encoder class: org.picketlink.idm.impl.credential.DatabaseReadingSaltEncoder

  • Algorithm: SHA-256

To change the defaults in 4.3 back to the old ones, edit exo.properties to have:

exo.plidm.password.class=org.picketlink.idm.impl.credential.HashingEncoder
exo.plidm.password.hash=MD5

Task Management

Note

The Task Management application is packaged as an add-on, so you need to install it first. Refer to this guide for more details.

To define a default workflow for new projects in the Task Management application, you can configure a property named exo.tasks.default.status via exo.properties file.

For instance:

exo.tasks.default.status=To Do, In Progress, Wait, Validate, Done

in which, each status in the workflow is separated by a comma.

File storage configuration

With eXo Platform 4.4 version, a new file storage subsystem has been introduced besides JCR. It’s currently used for wiki attachments and user and space profile pictures. Read more in File Storage. A property allows to indicate which file storage method should be used:

exo.files.binaries.storage.type=fs

Setting exo.files.binaries.storage.type to rdbms means that files will be stored as BLOBs in the database.

Setting exo.files.binaries.storage.type to fs means that files will be stored on the server file system.

Other properties related to file storage can be configured in exo.properties file:

  • exo.commons.FileStorageCleanJob.expression=0 0 11 ? * SUN: defines the scheduling (a cron expression) of the job responsible to clean unused files.

  • exo.commons.FileStorageCleanJob.retention-time=30: defines how long unused files should be retained before deletion. It is set to 30 days by default.

  • exo.commons.FileStorageCleanJob.enabled=true: enables/disables the cron job. By default, the job is enabled i.e set to true.

  • In case you set exo.files.binaries.storage.type to fs, you can parameter the files storage location with this parameter: exo.files.storage.dir. Its default value is set to ${exo.data.dir}/files

    The directory exo.files.storage.dir should be shared in cluster mode.

Chat Configuration

Configuring the eXo Chat add-on can be done by creating a chat.properties file or using the exo.properties file (if you have not created this file, see Configuration Overview).

These configuration files are located in:

  • $PLATFORM_TOMCAT_HOME/gatein/conf/.

Note

You were asked to create the files for security during the setup. If you include any parameter below into the exo.properties, you should add the prefix chat. to its name, such as chat.dbServerHost. Besides, in case both of these files are used, parameters in the exo.properties file will have higher priority than those in the chat.properties file.

Database

Parameter

Default

Description

dbServerType

mongo

You should always use the default value. The other value, embed, is used for unit testing.

dbServerHost

localhost

The host name or IP of MongoDB.

dbServerPort

27017

The port number to connect to MongoDB host.

dbServerHosts

The MongoDB nodes to connect to, as a comma-separated list of <host:port> values. For example “host1:27017,host2:27017,host3:27017 “.

dbName

chat

Name of the Mongo database name.

dbAuthentication

false

Set it true if authentication is required to access MongoDB.

dbUser

EMPTY

Provide the username to access the database if authentication needed.

dbPassword

EMPTY

Provide the password to access the database if authentication needed.

Warning

It is highly recommended to define the parameter dbServerHosts instead of defining the two parameters dbServerHost and dbServerPort as they are depracated starting from eXo Platform 5.0 version.

Generally, you do not need to configure those unless you have secured your MongoDB. See details about connecting to secured MongoDB in Secured MongoDB.

Mail Server

This server is used for Sending meeting notes (see Recording a discussion). The parameters of mail configuration for the eXo Chat server are the same as those of Outgoing Mail Service, but without the prefix exo.. Notice that if you include these parameters into the exo.properties file, you should add the prefix chat. to their name.

Chat Server

Chat Client updates

Parameter

Default

Description

chatIntervalChat

5000 (milliseconds)

Time interval to refresh messages in a chat.

chatIntervalSession

60000 (milliseconds)

Time interval to keep a chat session alive in milliseconds.

chatIntervalStatus

60000 (milliseconds)

Time interval to refresh user status in milliseconds.

chatIntervalNotif

5000 (milliseconds)

Time interval to refresh Notifications in the main menu in milliseconds.

chatIntervalUsers

60000 (milliseconds)

Time interval to refresh Users list in milliseconds.

chatTokenValidity

60000 (milliseconds)

Time after which a token will be invalid. The use will then be considered offline.

Configuring eXo Web Conferencing

eXo Web Conferencing add-on enables users to make video calls through the interface of eXo Platform. You can parameter this add-on by configuring the below variables in exo.properties file.

Parameter

Default

Description

webconferencing.webrtc.bundlePolicy

balanced

WebRTC setting to indicate which media-bundling policy to use when gathering ICE candidates.

webconferencing.webrtc.iceCandidatePoolSize

0

WebRTC setting which define the size of the prefetched ICE pool.

webconferencing.webrtc.iceTransportPolicy

all

WebRTC setting to indicate which candidates the ICE Agent is allowed to use.

webconferencing.webrtc.default.stun.enabled

true

Indicates if the default defined STUN servers must be used.

webconferencing.webrtc.exo.stun.enabled

false

Indicates if the default defined eXo STUN servers must be used.

webconferencing.webrtc.xirsys.stun.enabled

false

Indicates if the Xirsys STUN servers must be used.

webconferencing.webrtc.exo.turn.enabled

false

Indicates if the default defined TURN servers must be used.

webconferencing.webrtc.exo.turn.username

Username to authenticate on default TURN servers.

webconferencing.webrtc.exo.turn.credential

Password to authenticate on default TURN servers.

webconferencing.webrtc.xirsys.turn.enabled

false

Indicates if the Xirsys TURN servers must be used.

webconferencing.webrtc.xirsys.username

Username to authenticate on Xirsys TURN servers.

webconferencing.webrtc.xirsys.credential

Password to authenticate on Xirsys TURN servers.

webconferencing.webrtc.active

true

Indicates if the WebRTC connector is active.

Update of last login time

By default, eXo Platform persists the last login time information for each user in an internal database. You may need to disable this parameter to optimize login time especially when your system is highly solicited by a lot of concurrent users. You can disable this feature by configuring the parameter exo.idm.user.updateLastLoginTime in exo.properties file. The default value is set to true.

Setting exo.idm.user.updateLastLoginTime to true enables the update, in the IDM database, of the last login time each time the user login to eXo Platform.

Setting exo.idm.user.updateLastLoginTime to false disables the update of the user’s last login time and if the platform is connected to an external system for users storage (such as LDAP or AD), the last login time will be updated in this external system.

Enabling/Disabling login history

Starting from 5.3 version, eXo Platform allows you to enable/disable the login history data storage by adding the parameter exo.audit.login.enabled to exo.properties file.

# Enable/disable login history storage
exo.audit.login.enabled=true

By default, the parameter is set to true, it means that the login history data is stored in the database.

To disable the login history data storage in the database, simply set the parameter exo.audit.login.enabled to false.

Configuring eXo Wallet

The eXo Wallet addon uses the Ethereum Blockchain to let eXo users hold and exchange crypto-currency (aka tokens) managed inside this blockchain.

Blockchain network settings

The addon is configured by default to communicate with Ethereum’s public network (called the “Mainnet”) throught Infura using websocket and http protocols:

exo.wallet.blockchain.networkId=1
exo.wallet.blockchain.network.websocket=wss://mainnet.infura.io/ws/v3/a1ac85aea9ce4be88e9e87dad7c01d40
exo.wallet.blockchain.network.http=https://mainnet.infura.io/v3/a1ac85aea9ce4be88e9e87dad7c01d40

Note

The default configuration points to an eXo-owner infura project ID that serves as proxy to the mainnet. To learn more about infura infrastructure and projects, please visit Infura documentation

  • The Websocket endpoint is used to:

    • Scan newly mined blocks on the blockchain to check if any validated transaction involves a wallet owned by an available user in your eXo Platform instance. The periodicity can be configured using the following property (Default value: every hour):

    exo.wallet.ContractTransactionVerifierJob.expression=0 0 * ? * * *
    
    • Checks all pending transactions sent using the eXo Wallet application to update its internal state (cache and persistent storage) and send notifications to receiver and sender of the transactions. The check is made periodically and can be configured using the following property (Default value: each day at 7:15 AM):

    exo.wallet.PendingTransactionVerifierJob.expression=0 15 7 * * ?
    
    • Send raw transactions of all wallets. When a user sends a transaction, it gets signed by a private key in the browser side. The resulted raw transaction is sent to eXo Platform server instead of sending it directly to blockchain. This will avoid bad UX of user when network is interrupted or a problem happens on browser side. eXo Platform server will send raw transactions of users into blockchain periodically. The periodicity can be configured using the following property (Default value: every 30 seconds):

        exo.wallet.TransactionSenderJob.expression=0/30 * * * * ?
    
    The maximum number of pending transactions to send (per wallet) is determined by the following property (Default: 3 pending transactions per wallet):
    
    exo.wallet.transaction.pending.maxToSend=3
    
    • Retrieve periodically the gas price suggested on blockchain. This gas price will be used in wallets, when dynamic gas price choice is used. The periodicity can be configured using the following property (Default value: every 2 minutes):

    exo.wallet.GasPriceUpdaterJob.expression=0 0/2 * * * ?
    
  • Unlike the Admin wallet which uses Web3j (Server side) to issue transactions, the HTTP endpoint is used by users and spaces wallets using Web3.js (Browser side) to communicate with the blockchain to issue transactions.

    WalletBlockchainCommunication

Blockchain transaction settings

  • When submitting a transaction to the Ethereum blockchain, some special properties are required by the blockchain protocols, namely gas limit and gas price.

    • Gas limit

      The gas limit is the maximum gas that a transaction can consume to execute any operation using the token contract. It can be modified using the following property:

      # Value in GAS
      exo.wallet.transaction.gas.limit=150000
      
    • Gas price

      The gas price parameters will determine transaction fee of operations made using eXo Wallet addon. In the UI, the user has three choices:

      • Cheap transaction: this option will use the gas price configured by the following property (in WEI):

      exo.wallet.transaction.gas.cheapPrice=4000000000
      
      • Dynamic or Normal transaction: This is the default choice used for perkstore and wallet. In fact, the default option is to use dynamic gas price that will be computed and determined from blockchain periodically. This will avoid using a static gas price which can lead to a very slow transaction mining time. On the other hand, using a dynamic gas price can lead to having expensive transactions. (This will depend on the proposed gas price by blockchain) The dynamic gas price is bounded by minimal Cheap gas price configuration and Fast gas price configuration. To make this gas price static, you can modify the following parameter (Default value: true):

         exo.wallet.blockchain.useDynamicGasPrice=false
      
      Once the dynamic gas price is turned off, you can set a static ``normal gas price`` configured by the following property (in `WEI <http://ethdocs.org/en/latest/ether.html>`__):
      
      exo.wallet.transaction.gas.normalPrice=8000000000
      
      • Fast transaction: this option will use the gas price configured by the following property (in WEI):

      exo.wallet.transaction.gas.fastPrice=15000000000
      
  • When a transaction is submitted but isn’t mined for several days, it will be marked as failed in eXo Wallet’s internal database. The maximum number of days waiting for transaction mining can be configured using the following property:

    exo.wallet.transaction.pending.maxDays=1
    

    Note

    If the transaction is still not mined after exo.wallet.transaction.pending.maxDays days, it will be marked as a failed transaction in eXo’s internal database. if/when it gets eventually mined (pending.maxDays), the Job ContractTransactionVerifierJob will detect it and will update the real transaction status coming from the blockchain and send notifications.

  • The parallel number of transactions to send:

    exo.wallet.transaction.pending.maxToSend=5
    
  • The number of sending transaction attempts is configured by:

    exo.wallet.transaction.pending.maxSendingAttempts=3
    

    Note

    If the transaction is still not mined after exo.wallet.transaction.pending.maxDays days, it will be marked as a failed in eXo’s internal database. if/when it gets eventually mined (pending.maxDays), the Job ContractTransactionVerifierJob will detect it and will update the real transaction status coming from the blockchain and send notifications.

  • When a new user creates his wallet, we could set the Ether/Matic value to send to him so that he can pay for a transaction on the blockchain using the following property. If not set, the user will receive an amount sufficient to pay for a single transaction calculated using the gas price detected on the blockchain.

    exo.wallet.blockchain.defaultInitialCryptoCurrencyFunds=0.3
    

Wallet types

  • Admin wallet

    The Admin wallet is created automatically during first startup of the eXo Platform server.

    In order to be able to submit transactions to the blockchain using `Web3j<https://web3j.io/>`_ server side, the private key of the Admin wallet is stored (in encrypted form) in the internal database. The private key is encrypted by combining two passwords:

    Warning

    The generated keystore file under gatein/conf/codec MUST be backed up as a data folder, because it contains a key file that is used to decrypt stored wallets private keys. If it’s lost, all wallets private keys will be lost and consequently, all funds would be lost and unrecoverable.

    • A second password that must be configured in properties:

    exo.wallet.admin.key=changeThisKey
    

    Warning

    The password can’t be changed once the platform is started for the first time. In fact, this password will be used to encrypt the Admin wallet’s private key that will be stored in database. If its value is modified after server startup, the private key of admin wallet won’t be decrypted anymore, preventing all administrative operations.

    The Admin wallet can be used by /platform/rewarding group members to initialize other wallets. The private key of the admin wallet cannot be accessed by any user to avoid exposing its funds to an unauthorized person.

  • User wallet

    By default, any user of the platform can create their own wallet. A property is added to restrict access to wallet application to a group of users:

    # Example of expressions
    
    # Any user
    exo.wallet.accessPermission=
    # All connected users of the platform
    exo.wallet.accessPermission=/platform/users
    # All administrators of the platform
    exo.wallet.accessPermission=*:/platform/administrators
    # All members of space associated to group internal_space
    exo.wallet.accessPermission=member:/spaces/internal_space
    
  • Space wallet

    Space managers can add the wallet application in their space using Managing space applications UI:

    SpaceAddWallet

    Space wallets can be managed by one or multiple space managers. In fact, the space wallet is similar to user wallet. To use it, it must be activated by an admin. The operation is carried out by the Admin Wallet account. By default, any space member can access to the space wallet in readonly mode.

Token contract

The contract address used for the main token currency can be configured using the following variable:

exo.wallet.blockchain.token.address=0xc76987d43b77c45d51653b6eb110b9174acce8fb

This address is the official contract address for the official rewarding token promoted by eXo. It shouldn’t change through eXo Platform versions on the Ethereum Mainnet blockchain. This crypto-currency token, is shared by all eXo Community users.

It is an ERC-20 Token contract that is deployed on Ethereum Mainnet.

WalletTokenCommunication

To be able to receive some tokens, a wallet address must be initialized by a token contract administrator on the blockchain (this cannot be done on your eXo Platform server).