Federation Services Expression Language - Alfresco Federation Services - 3.2 - 3.2 - Ready - Alfresco - external - Alfresco/Alfresco-Federation-Services/3.2/Alfresco-Federation-Services/Using/Integrations/Job-Setup-and-Configurations/Job-Mappings/Federation-Services-Expression-Language - 2025-03-04

Alfresco Federation Services

Platform
Alfresco
Product
Alfresco Federation Services
Release
3.2
License

Federation Services uses a version of the JEval project to handle expressions. Expressions can be used in many places in Federation Services. Specifically they are used for calculated fields on the mapping page, but tasks and connectors can use them in their configuration pages too. The filter task is another good example.

An expression allows you to create values based on some formula or set of function calls. This can be used in a host of use cases to solve many problems including:

  • Formatting data
  • Value based on result of a decision
  • Setting default values
  • Creating data from other data

Expression Basics:

An expression is just a series of Strings, Numbers, Function Calls, and Operators put together by the administrator resulting in a value.

Strings or Numbers or Booleans

Strings are surrounded with ‘ ‘. If something is not surrounded with a ‘, then it’s treated as a number. This will result in an error if you try to convert a string to a number.

‘Mark’ is a string

Mark is a number, but will cause an error.

‘0’ is a String

0 Is the number 0.

Booleans result in 1.0 or 0.0 where 1.0 is true and 0.0 is false.

‘mark’ == ‘mark’ would result in 1.0, or true. Whereas

‘mark’ == ‘nathan’ would result in 0.0.

Variables

Variables are either part of the Repository Document, Version History, or Fields from a Repository.

Note:

You access a variable using the following format: ’#{rd.path}’

Tasks search for #{ when detecting calculated field. The first portion identifies where to find the data. Repository Document== rd Version History== version Fields== field or nothing

Examples:

#{rd.mimetype}

#{version.label}

Where document is the type:

#{document.myfield}, which is exactly the same as #{field.document.myfield}

See below for a full reference of all rd and version variables available.

Function Calls

You call functions with no ‘ ‘ such as:

now()

Most functions are camel case. So first letter is lower case, start of each syllable after that is upper case:

toLower(), startsWith(), etc..

String Functions

Full list of String functions with example:

startsWith('test.pdf', 'test', 0) substring('test.pdf', 3, length('test.pdf')) toUpperCase('test.pdf') indexOf('test.pdf', '.', 0) length('test.pdf') replace('test.pdf', 'p', 'x') concat('test.pdf', 'test.xml') equals('test.pdf', 'test.PDF') equalsIgnoreCase('test.pdf', 'test.PDF') compareToIgnoreCase('test.pdf', 'test.xml') compareTo('test.pdf', 'test.xml') charAt('test.pdf', 1) endsWith('test.pdf', '.xml') toLowerCase('Hello World!') trim('abc ') + 'd' lastIndexOf('abcabcabc', 'abc', 8) eval(1 + 2)

Math Functions

Full list of math functions with example:

asin(1) atan(2.2) atan2(2.2, 2.3) ceil(2.2) cos(2.1) exp(2.2) floor(2.2) IEEEremainder(2, 6) log(2) max(2.2, 3.5) min(2.2, 6.6) pow(2, 5) random(6) rint(2) round(2) sin(2) sqrt(9) tan(2) toDegrees(45) toRadians(44) abs(-1)

Custom Functions

If the first argument is blank, use the second argument.

isblank('#{rd.path}', '/my/default/path')

Returns the date at the time the job is run

now()

If the first date string is not a valid date, it will use the second date string as the default. This can be now(), another hard coded String, or some other function or set of functions.

toDate('Date String', 'Default Date')

Creating your own custom functions

Operators

The normal Boolean, number, and string operators for Java work with Federation Services Expressions:

+ - && ! || / == ) ( )= (= % * !=

Repository Document Variables

All variables with Federation Services Variable Resolvers are case-insensitive.

Repository Document

CreatedDate ModifiedDate FileName FileLength ID MimeType ObjectType Path 3SixtySourceRepositoryID

Version

totalVersions label seriesId isLatest isMajor listId

Examples

#{rd.CreatedDate} #{rd.ModifiedDate} #{rd.FileName} #{rd.FileLength} #{rd.ID} #{rd.MimeType} #{rd.ObjectType} #{rd.Path} #{rd.3SixtySourceRepositoryID} #{version.totalVersions} #{version.label} #{version.seriesId} #{version.isLatest} #{version.isMajor} #{version.listId}

Custom Fields you need to prepend with field

#{field.myObject.myCustomField}

#{rd.filename} + _ + version.label

#{mytype.claimid} + _ + #{mypolicy.policynumber}

Filters expect a Boolean result, 1.0 or 0.0. So you can do things like:

#{rd.mimeType} == text/html

Nested Functions

You can also nest functions. A good example is toDate:

toDate('#{rd.createddate}', now())

This results in rd.created date being formatted into UTC format, but if for some reason Federation Services detects an invalid date it will use the result of now() instead.

Migration Manager Variables

Variable name: job.lastrundate

Description: This variable is substituted by the last successful job run date. If the job is run for the first time, it substitutes with 1st January, 1990

Example: SELECT * FROM mydatabase.events where created_at > CONVERT(DATE_FORMAT(‘#{job.lastrundate}’, ‘%Y%m%d’), char);