← Back to Index

8.10 Release Notes

For Developers

A C# Nuxeo Client

8.1A C# Nuxeo Client has been added. A sample application is provided so as to understand how to make use of it. Read the C# client documentation for more information.

New Operations

nuxeo-platform-pdf-util

8.10The new Nuxeo-Platform-PDF-utils addon brings a set of operations to work around PDFs: merging several PDFs, watermarking, page extraction and more. Read this how-to to see an example.

Video Transformations

8.10 A complete set of video tools is now integrated to the DAM addon. It adds tools, operations, automation for handling videos: Slice, Merge, Extract ClosedCaptions and more.

User Invitation

8.2The operation User.Invite is now available to trigger a user invitation remotely.

Studio JAR Hot-Reload

8.2The operation Service.HotReloadStudioSnapshot is now available to trigger a hot-reload of the Studio JAR.

Document.Suscribe

8.10 The operations Document.Subscribe and Document.Unsubscribe are now available to subscribe a user to notifications on the input document.

Document.MoveCollectionMember

8.10 The operation Document.MoveCollectionMember allows to move up and down a document's position inside a collection.

Multi-Valued Property Support for Context.SetWorkflowVar Operation

8.10 All kind of lists are now supported, not only String list.

HTTP Helper Greatly Improved

8.10 Automation Scripting Helper org.nuxeo.ecm.automation.features.HTTPHelper has been improved to support external HTTP calls and remote file download. This helper can typically be used to quickly integrate from Automation with a remote API.

Blob Input Resolver

8.10 It is possible to reference blobs using their key in the blob provider as input of an Automation operation.

REST Endpoint Evolutions

New Token Endpoint

8.3An endpoint has been added to be able to fetch and delete via the REST API tokens for the Nuxeo Authentication module.

OAuth2 Authentication Data New Endpoint

8.10 The new endpoint provider/{providerId} aims at providing access to OAuth2 authentication data for the current user, such as client ID, authorization URL and service user ID. This is required by addons relying on OAuth2, such as Live Connect, for the New Web UI.

New Search Endpoint

8.3A new search endpoint has been added to be able to be able to perform searches as well as saving and fetching them. The query endpoint is now deprecated. Read documentation for details.

Support for LiveConnect Blobs in REST API

8.10 It is now possible from the REST API to create and get a blob that comes from an external blob provider, such as the Live Connect ones.

List Existing Directories

8.10 A GET on '/directory' will list the directories that are not system directory. You can list a subset of directory filtered by types using the `types` query param: curl -X GET -u Administrator:Administrator http://localhost:8080/nuxeo/api/v1/directory?types=ui,my_type. Note that if a directory with system type will never be returned by the REST endpoint even though it has other types matching the query param.

New Content-Type Header

8.2Content-Type header now returns the nuxeo-entity type as well:

application/json; nuxeo-entity=documents
  

Constraints and References on Schema Endpoint

8.10New JSON writers have been enabled and old ones removed. On the schema endpoint (http://demo.nuxeo.com/nuxeo/api/v1/config/schemas/) a new fetch.schema=fields property allows to return extended schema fields containing validation constraints.

New Content-Type Header

8.2Content-Type header now returns the nuxeo-entity type as well:

application/json; nuxeo-entity=documents
      

Remove a Blob from a Batch

8.10 DELETE /api/v1/upload/{batchId}/{fileId} will remove the file of index "fileId" in the batch "batchId".

Prevent a Batch from Being Dropped

8.10 A flag has been added to prevent a batch from being dropped when referencing its blobs via Automation / REST API. The header is called X-Batch-No-Drop. When set to true the batch won't be dropped after operated on or referenced. The default is false.

Client-Side Localization

8.3The client is now responsible for sending the locale it is interested in via a dedicated request header.

Fetching Members of Group Object

8.2 New endpoints were added for getting members of a group:

This endpoint supports pagination and returns the full objects (full users and groups). And by default when fetching a user or a group, users and groups members are no more marshaled (only IDs are returned), you can use fetch.group=memberUsers and/or fetch.group=memberGroups to get the full object.

isPoxy, isVersion

8.10 Now the documents returned by the REST API have "isProxy" and "isVersion" properties.

subtypes Enricher

8.10Using the subtypes enricher, you can get document types that can be instantiated under a given document.

Directories

Generic Directory and Directory Templating

8.2 Generic Directories have been introduced, along with the possibility to make regular directories be "templates". First, register a template directory ( template="true" ):

<extension target="org.nuxeo.ecm.directory.sql.SQLDirectoryFactory" point="directories"> 
<directory name="template-dir" template="true">
<dataSource>java:/nxsqldirectory</dataSource>
<createTablePolicy>always</createTablePolicy>
<querySizeLimit>100</querySizeLimit>
</directory>
</extension>

Then use a generic directory to provide specific customizations over the extended template ( extends="template-dir" ):

<extension target="org.nuxeo.ecm.directory.GenericDirectory" point="directories"> 
<directory name="my-directory" extends="template-dir">
<schema>myschema</schema>
<table>mytable</table>
<idField>id</idField>
<passwordField>password</passwordField>
<passwordHashAlgorithm>SSHA</passwordHashAlgorithm>
<substringMatchType>subany</substringMatchType>
<cacheTimeout>3600</cacheTimeout>
<cacheMaxSize>1000</cacheMaxSize>
</directory>
</extension>

The Generic Directory descriptor only supports a generic subset of the configuration of the directories in general (see org.nuxeo.ecm.directory.BaseDirectoryDescriptor for the exact fields). This new indirection allows to make it easier to change implementation of a directory for a given business requirement.

Cache Is Back

8.2 Directories that still have a cacheMaxSize and cacheTimeOut but no newly-defined cacheEntryName are still be using a cache.

Default Directories

8.10 Nuxeo now uses template-based directories for its vocabularies and directories (apart from users and groups). They can be redefined to use another datasource, cache configuration or directory backend by overriding just the single template-directory template. See documentation.

deleteConstraints

8.10 Previously you had to declare:

<component name="org.nuxeo.ecm.webapp.directory.directoryUI">

  <extension target="org.nuxeo.ecm.directory.ui.DirectoryUIManager"
    point="directories">

    <directory name="continent" layout="vocabulary" sortField="label">
      <deleteConstraint
        class="org.nuxeo.ecm.directory.api.ui.HierarchicalDirectoryUIDeleteConstraint">
        <property name="targetDirectory">country</property>
        <property name="targetDirectoryField">parent</property>
      </deleteConstraint>
    </directory>
    <directory name="country" layout="country_vocabulary" sortField="parent" />
</extension>
      

You can now declare directly in the directory core contribution:

 <extension target="org.nuxeo.ecm.directory.sql.SQLDirectoryFactory"
    point="directories">
    <directory name="country">
      <schema>xvocabulary</schema>
      <parentDirectory>continent</parentDirectory>
      <dataSource>java:/nxsqldirectory</dataSource>
      <cacheTimeout>3600</cacheTimeout>
      <cacheMaxSize>1000</cacheMaxSize>
      <table>country</table>
      <idField>id</idField>
      <autoincrementIdField>false</autoincrementIdField>
      <dataFile>directories/country.csv</dataFile>
      <createTablePolicy>on_missing_columns</createTablePolicy>
    </directory>

    <directory name="continent">
      <schema>vocabulary</schema>
      <dataSource>java:/nxsqldirectory</dataSource>
      <cacheTimeout>3600</cacheTimeout>
      <cacheMaxSize>1000</cacheMaxSize>
      <table>continent</table>
      <idField>id</idField>
      <autoincrementIdField>false</autoincrementIdField>
      <dataFile>directories/continent.csv</dataFile>
      <createTablePolicy>on_missing_columns</createTablePolicy>
      <deleteConstraint
        class="org.nuxeo.ecm.directory.HierarchicalDirectoryDeleteConstraint">
        <property name="targetDirectory">country</property>
        <property name="targetDirectoryField">parent</property>
      </deleteConstraint>
    </directory>
</extension>
      

The directory session will check these delete constraints and throw a org.nuxeo.ecm.directory.DirectoryDeleteConstraintException if any are met.

Elasticsearch Evolutions

Elasticsearch Crawl API

8.3The ElasticSearchService now exposes the Elasticsearch scroll API allowing to process large amounts of data.

You can use it this way for instance:

ElasticSearchService ess = Framework.getService(ElasticSearchService.class);
String query = "SELECT * FROM Document ORDER BY ecm:path";

// Perform initial search and get first batch of 20 results
EsScrollResult scrollResult = ess.scroll(new NxQueryBuilder(session).nxql(query).limit(20), 10000);
DocumentModelList batchOfDocs = scrollResult.getDocuments();
while (!batchOfDocs.isEmpty()) {
  for (DocumentModel doc : batchOfDocs) {
    // Process document
    // ...
  }
  // Get next batch of results
  scrollResult = ess.scroll(scrollResult);
  batchOfDocs = scrollResult.getDocuments();
}

Note: the keepAlive parameter in milliseconds only needs to be long enough to perform the next scroll query.

ecm.path Field

8.2A new field in Elasticsearch index is available: ecm:path with the following informations:

 "ecm:path.level1": "default-domain", 
"ecm:path.level2": "workspaces",
"ecm:path.level3": "aWorkspace",
"ecm:path.level4": "aFolder",
"ecm:path.level5": "aFile",
etc.
"ecm:path.depth": 5

Mapping for Audit Index

8.2No specific mapping had been contributed for Audit index. This is now done.

NXQL Evolutions

Fetching Documents from Specific Fields

8.3When calling CoreSession.query, doing a SELECT * FROM Document WHERE ... is doing SELECT ecm:uuid FROM Document WHERE ... and returning the documents whose ids are matching. There are additional use cases of returning documents with other ids. Ex:

  1. Direct page provider with SELECT relation:target FROM DefaultRelation WHERE relation:source = ?
  2. Simplifying collection management with a query like SELECT collection:documentIds/* FROM Collection WHERE ecm:uuid = ?

You can now use such a syntax in your NXQL queries.

Repository Scroll API

8.10There is now a repository scroll API to retrieve large number of results from a single search request. This acts like a database cursor returning batch of document ids.

Subtypes Declaration at Core Level

8.10 Allowed subtype declarations has been moved to core document type declaration extension point and the platform TypeService now relies on those clore declarations. Subtype and icon contributions have been moved to core so that they are available even without JSF. A new facet HiddenInCreation is used to identify doctypes that should not be visible on creation.

CMIS Evolutions

Proxies Are Visible through CMIS

8.3Now when the system property org.nuxeo.cmis.proxies=true (default value) then proxies are visible like any other document using CMIS.

CMIS Test Feature Can Be Used from Third-Party Bundle

8.3It is now possible to have third-party modules use the CmisFeatureSessionHttp feature to run their own tests in the context of a preconfigured CMIS test server.

OpenCMIS 1.0.0

8.10The CMIS connector now relies on OpenCMIS 1.0.0.

Authentication Prompt

8.2 When configuring authentication chains, a new attribute is available at the authentication chain level, handlePrompt so as to configure if the authentication filter delegates the login prompt to its plug-ins or if it returns systematically a 401 response code.

Packaging Evolutions

JSF Application Is Now a Package

8.10The JSF application is now shipped as package, available on the marketplace.

Nuxeo-Server Is the New CAP

8.10 The Nuxeo CAP distribution is no more used. Nuxeo is now distributed as a bare "server" distribution on top of which different user interfaces can be installed. The main ones available are the standard Seam/JSF UI (identical to the previous LTS releases), and a new Web UI (beta). The startup wizard allows you to select which one(s) you want to install on your server. Nuxeo addons may also provide different functionalities depending on the installed UI.

Optional Dependency

8.10The Nuxeo Package system now offers the ability to state an optional dependency for situations where some bundles of the package must be installed only if another specific package is installed. The typical use case is when an addon has bundles for the JSF UI and for the new Web UI. The JSF bundle must be installed only if the JSF Application has been installed.

<optional-dependencies>
  <package>nuxeo-jsf-ui</package>
</optional-dependencies>
          

Protection against Network Corruption

8.10Sometimes content streams get corrupted over the wire. Content Stream hashes are now supported following RFC 3230/5843 "Digest" request header if present, as well as RFC 3230 "Want-Digest".

Quick Filters for Page Providers

8.10 Quick Filters have been added to PageProvider object. They allow to add actionable additional "filters + Sort". They are typically bound to some switches in user interface, to implement things like "Remove Folders From The Result". The REST API has been updated accordingly.

  <quickFilters>
        <quickFilter name="noFolder">
          <clause>ecm:mixinType != 'Folderish'</clause>
        </quickFilter>
        <quickFilter name="mostRecent">
          <sort column="dc:modified" ascending="false" />
        </quickFilter>
        <quickFilter name="onlyValidated">
          <clause>ecm:currentLifeCycleState = 'approved'</clause>
          <sort column="dc:modified" ascending="false" />
    </quickFilter>

documentImportedWithPlatformImporter Event

8.10 An event documentImportedWithPlatformImporter is now fired at the end when a document is imported, to ensure the import process is done for that document. Relying on document created or modified is indeed not enough as several modifications happen during the import process.

URL Codec Evolution

8.10 An evolution has been made to enable to easily switch the URL used in notifications between the JSF application and the Web UI application: If jsf-ui only is installed, point to the JSF UI. If web-ui only is installed, point to the Web UI. If both are installed point to the JSF UI by default. Being able to override this behavior to point to the Web UI, to be documented.

Configuring TinyMCE Editor via Tag Properties

8.1 Plugins and options have been extracted to control them by tag properties in order to display different options depending on the field.

Understanding the Sequence of Listeners Calls

8.1 You can now add this in your log4j.xml:

<category name="org.nuxeo.common.logging">
  <priority value="DEBUG"/>
</category>

Then use the sequence.sh to generate a PNG with a sequence diagram of all threads and listeners.

Note that all events in the chart are in chronological order (not proportional) except for the Initiate link, where the origin points to the thread that has generated a work without telling when (earlier for sure).

Forcing Locale on Login Page and Disabling Some Languages

8.10A new extension point loginScreen on org.nuxeo.ecm.platform.ui.web.auth.service.PluggableAuthenticationService allows to contribute explicitly what are the supported locales.

HTML Content in Tipsy Tooltip

8.1 Tooltips generated with Tipsy now render HTML content properly.

Sample Project to Benchmark the Nuxeo Platform with Gatling

8.3For people who need to write and launch Gatling scenarios for an addon or any Nuxeo project, a Gatling sample is available in the Nuxeo marketplace sample project. Note that Nuxeo has switched to Gatling as it was better suited to reach the level of performances required for benchmarking the Nuxeo Platform in extremely high stress conditions: multiple thousands of requests per seconds.

Random Generation of Documents with Nuxeo Platform Importer

8.3Using the /randomImporter endpoint, the bulk document importer already offered the possibility to generate random documents so as to fill the repository, typically for benchmark purposes. The number of documents that are generated in the various folders is now random, for more realistic load tests. It follows this rule:

Parameters on CommandLine

8.10 It's now possible in the extension point for a command to include a testParameterString to allow to test commands that require parameters:

<extension target="org.nuxeo.ecm.platform.commandline.executor.service.CommandLineExecutorComponent" point="command">
    <command name="mycommand">
      <commandLine>somecommand</commandLine>
      <parameterString>arg1 --arg2 --arg3</parameterString>
      <winCommand>somecommand.exe</winCommand>
      <winParameterString>arg1 /arg2 /arg3</winParameterString>
      <testParameterString>--exists</testParameterString>
      <winTestParameterString>/exists</winTestParameterString>
    </command>
  </extension>

Platform Explorer Addon Evolution

8.3The Platform Explorer addon has been greatly improved: better search features, cleaner look & feel. We reviewed the browsing pattern, simplifying each view to navigate between Extension Points, Services, Operations, Components and Bundles. We have also extended the XML generation feature to help developers have a working sample. Check it out on explorer.nuxeo.com or by installing the Platform Explorer Nuxeo Package.

JSF Widgets Evolutions

Limit Attribute for SuggestDirectoryEntries

8.2A new attribute limit is available for limiting the number of entries returned by the SuggestDirectoryEntries

Disabling Document Field Validation

8.10 You can now disable the document constraint validation in creation and modification forms.

<require>org.nuxeo.ecm.platform.ui.web.DocumentValidationService.activations</require>
  <extension target="org.nuxeo.ecm.core.api.DocumentValidationService" point="activations">
    <validation context="jsfValidator" activated="false" />
  </extension>
        

Let Content Be Part of Your Application Definition

8.10 If you install the Nuxeo Showcase Content Sample package, you can then add Nuxeo Archives into other bundles and provide a contribution so that this Nuxeo Archive is automatically imported.

<?xml version="1.0" encoding="UTF-8" ?>
<component name="org.nuxeo.test.showcase.content">
    <extension target="org.nuxeo.ecm.showcase.content" point="contents">
        <content name="mycontent">
            <filename>export.zip</filename>
        </content>

        <content name="disabled" enable="false">
            <filename>export.zip</filename>
        </content>
    </extension>
</component>
        

Finer Control on Nuxeo Vision Processing

8.10 Nuxeo Vision has been improved to allow to trigger event (typically, an asynchronous event) and process business logic after nuxeo-vision has extracted tags or text. Example: for a Picture, nuxeo-vision stores by default in dc:source the text extracted via OCR. Adding a listener for visionOnImageDone is a good idea if one wants to check for unauthorized words (start a workflow, tag the picture, change its ACL so only an administrator can access it, ...).

No More Selenium Tests

8.3Selenium has been fully replaced by WebDriver for the functional tests of the Nuxeo Platform and is no longer used.

Miscellaneous

No More Selenium Tests

8.3The UIDSequencer interface now supports long integer.

8.10Transaction timeouts are now detected as soon as possible which helps pinpointing long-running processes with more accuracy.