Upgrade Notes per Version

Upgrade Notes per Version

This topic provides information about things you need to check and extra tasks you may need to perform when upgrading your XperienCentral installation to a specific version. The modifications per version are not cumulative which means that you need to apply the changes for all versions between your current version and the one you are upgrading to. For example, if you upgrade from XperienCentral R35 to R41, you need to apply the changes described in this topic for all versions from R36 up to and including R41. For general upgrade information, see Upgrading a Linux Installation or Upgrading a Windows Installation.

See also Changelog per Version for information on issues resolved in each XperienCentral release.

Click an XperienCentral version for specific upgrade information.

 

 

XperienCentral R50

Release date: November 10, 2025

Minimum Version Required for Upgrading to XperienCentral R50

Upgrading to XperienCentral R50 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R50.

Anchor element removed

The Anchor element is no longer supported in the new editor and so all instances of the anchor element will be removed in the upgrade to this release. Instead, use the Heading Overview element which provides an automated anchor overview based on all existing headings. If you want to verify whether anchor elements are still being used in your deployment, run the following XPath query in the JCR Browser to retrieve all Anchor element instances:

//element(*, wo:ss_element_anchor)

Uninstall bundle “GX WebManager - Rich Text Editor”

Open Configuration / Plugis and uninstall the bundle “GX WebManager - Rich Text Editor”. This bundle is no longer used by XC.

Change CSP Directives

The new editor loads icons from an embedded font lumo-icons using a Data URL. In order to load those icons properly, the font-src directive must be updated to allow Data URLs as source. To do so, you can use the Content Security Configuration panel:

  • Open Configuration / Content Security Configuration

  • Select Styling / Font

  • Check ‘Enabled’

  • Check ‘Self’

  • Check 'Data

  • Press Apply

Add CSS and JS to the head

The new editor requires a stylesheet and Javascript file to be added to the head of your custom presentations. Append this to your JSPs that render a full page:

<%-- Javascript and CSS files for the Froala editor --%> <c:if test="${param.mode == 'incontext'}"> <script type="text/javascript" src="${pageContext.request.contextPath}/wcb/nl.gx.product.wmpgui/iframe.js"></script> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/wcb/nl.gx.product.wmpgui/resources/css/iframe.css"> </c:if>

Styling the new editor

The new editor automatically adds two extra <div> elements to the HTML when in Edit mode. This gives you full control over styling the inline editor’s components. For instance, if you want to change the background color of the cursor block that appears between two WCB elements, use the following CSS:

div.fr-wrapper > div.fr-element.fr-view p.xc-cursor { background-color: red; }

HTML differences in Edit Mode

When you edit content using the new Froala editor, the HTML used in the inline mode will slightly differ from the HTML that was used by the old editor. There are two important changes;

  • Two extra div elements will be inserted inside editable areas in edit mode.

  • Additionaldiv elements are placed around personalizations in edit mode.

Two extra div elements

In the new editor, two extra div elements will be inserted inside editable areas. Therefore, you may need to modify your CSS when it assumes that the rich text content being edited or rendered is a direct descendant of the editable area.

For example, consider the following editable tag in your presentation:

<wm:editable contentHolder="${contentHolder}" area="0" tag="div" class="content-wrapper"></wm:editable>

In the old editor, editing this editable area on an empty page would result in the following HTML:

<div … data-wm-contentsource="pageversion-…/content/0" data-wm-mayedit="true" data-wm-active="true" class="content-wrapper"> <p><br></p> </div>

However, when using the Froala editor, it results in two additional div elements like this:

<div … data-wm-contentsource="pageversion-…/content/0" data-wm-mayedit="true" data-wm-active="true" class="content-wrapper"> <div class="fr-wrapper" dir="ltr"> <div class="fr-element fr-view" dir="ltr" contenteditable="true" aria-disabled="false" spellcheck="true"> <p><br></p> </div> </div> </div>

These two additional div elements may affect styling. For example, when display:grid is set on the div with class content-wrapper like this:

div.content-wrapper { display: grid }

In the old editor, display: grid was applied to the direct descendants of the outer div, which contained the rich text being edited. In the Froala editor however, the direct descendant of the outer div is the div with the fr-wrapper class, and display:grid will not be applied to the rich text being edited.

To resolve this issue, simply modify the CSS to be applied on the div with the fr-view class instead:

div.fr-view { display: grid }

Known limitations in the new editor

The following limitations currently apply to the Froala editor but may be supported later on:

  • Nesting quotes is currently not possible. So a quote may never have another quote inside it. The editor simply won’t allow it.

  • It is currently not possible to merge two table cells, simply because you cannot select multiple table cells. The merge cells option is supported by the Froala itself, but not yet available in XC.

XperienCentral R49

Release date: August 14, 2025

Minimum Version Required for Upgrading to XperienCentral R49

Upgrading to XperienCentral R49 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R49.

This release does not include any upgrade notes; all changes are fully backward compatible.

XperienCentral R48

Release date: June 9, 2025

Minimum Version Required for Upgrading to XperienCentral R48

Upgrading to XperienCentral R48 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R48.

Update CSP header settings

During this upgrade, tighten the Content Security Policy (CSP) for styling if feasible. The following settings are recommended for most installations and will be the new defaults for future setups.

Content Security Configuration panel:

  • CSS > Style: Enabled, Use nonce, Self

  • CSS > Style Attribute: Enabled, Unsafe Hashes

  • Integration > Object: Enabled, None - Automatically applied!

These settings will enhance the security of your installation by mitigating the risk of CSS-based attacks.

Background Information

Nonce for Style Tags: A random nonce will be included in the CSP header and injected into each <style> tag, enhancing security by preventing unauthorized style injections.

Hash for Style Attributes: A hash will be calculated for each style attribute and added to the CSP header, ensuring that only trusted styles are applied.

<object> and <embed> tags ignored: Were used in the past for embedding flash and videos.

Potential Issues

These settings may not work if libraries inject style tags and attributes. This is also why these settings are not applied to the XperienCentral edit environment.

Most Restrictive Settings

For maximum security, consider the following settings in the Content Security Configuration panel:

  • CSS > Style: Enabled, Self

  • CSS > Style Attribute: Disabled (uncheck all checkboxes)

  • Integration > Object: Enabled, None

These settings prevent the use of all inline style tags and attributes, including those in Layouts.

Audit Trail Database Modification

In R45 we made some database modifications for the Audit Trail. In this version we make another modification to improve the loading times of the Audit Trail panel even further.

The application manager or a developer must execute one query on the database used to store the Audit Trail history. The query creates a new index. Creating the index is optional, but GX Software recommends that you do so. You can upgrade XperienCentral to version R48 without the new index.

When the index is created, the entire table is copied first. Because the table might be quite large, it is important to check whether there is enough available free disk space to create the copy before running the queries in order to avoid crashing the database server.

Execute the following query on the database containing the Audit Trail:

CREATE INDEX timestmpContentIdIndex ON wmHistory (timestmp, contentId)

XperienCentral R46.1

Release date: April 18, 2025

Minimum Version Required for Upgrading to XperienCentral R46.1

Upgrading to XperienCentral R46.1 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R46.1.

Update CSP header settings

During this upgrade, tighten the Content Security Policy (CSP) for styling if feasible. The following settings are recommended for most installations and will be the new defaults for future setups.

Content Security Configuration panel:

  • CSS > Style: Enabled, Use nonce, Self

  • CSS > Style Attribute: Enabled, Unsafe Hashes

  • Integration > Object: Enabled, None - Automatically applied!

These settings will enhance the security of your installation by mitigating the risk of CSS-based attacks.

Background Information

Nonce for Style Tags: A random nonce will be included in the CSP header and injected into each <style> tag, enhancing security by preventing unauthorized style injections.

Hash for Style Attributes: A hash will be calculated for each style attribute and added to the CSP header, ensuring that only trusted styles are applied.

<object> and <embed> tags ignored: Were used in the past for embedding flash and videos.

Potential Issues

These settings may not work if libraries inject style tags and attributes. This is also why these settings are not applied to the XperienCentral edit environment.

Most Restrictive Settings

For maximum security, consider the following settings in the Content Security Configuration panel:

  • CSS > Style: Enabled, Self

  • CSS > Style Attribute: Disabled (uncheck all checkboxes)

  • Integration > Object: Enabled, None

These settings prevent the use of all inline style tags and attributes, including those in Layouts.

 

Note: These changes are not available in R47.

XperienCentral R47

Release date: March 3, 2025

Minimum Version Required for Upgrading to XperienCentral R47

Upgrading to XperienCentral R47 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R47.

Check Configuration Files

See Check Configuration Files.

Anchor Element

The Anchor element will be removed completely in XperienCentral R50. Instead, use the Heading Overview element which provides an automated anchor overview based on all existing headings. If you want to verify whether anchor elements are still being used in your deployment, run the following XPath query in the JCR Browser to retrieve all Anchor element instances:

//element(*, wo:ss_element_anchor)

Update License File

A new license file (usually named configuration.xml) is needed to run XperienCentral version R47. This updated license will be provided by GX Customer Services. The license file prepares your environment for the new rich text editor which will be introduced in stages in upcoming releases.

XperienCentral R46

Release date: December 2, 2024

Minimum Version Required for Upgrading to XperienCentral R46

Upgrading to XperienCentral R46 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R46.

Check Configuration Files

See Check Configuration Files.

Rebuild search index

Due to a change in the Search functionality, you must rebuild the content index and remove the work/search engine directory before starting the upgrade. Perform these steps before starting Tomcat with the new deploy:

  1. Stop Tomcat if it is running.

  2. Remove the directory <webmanager-root>/work/searchengine.

  3. Remove the directory <webmanager-root>/work/contentindex.

As a result, the frontend search index will be empty after performing the upgrade. So make sure you rebuild the frontend index after performing the upgrade.

Solr replication

In R46 the SOLR version has changed from 9.5 to 9.7. If you are using SOLR replication this means the internal replication requests are now send via http/2 by standard. If the server running your XC environment don’t support (internal) http/2 requests you should add the -Dsolr.http1=true java option to your setenv.sh or setenv.bat.

jQuery Has Been Removed

In XperienCentral version R45 the Interactive Forms JavaScript files have been modified to remove the dependency on jQuery. This has a direct impact on any custom JavaScript implementations you have developed that listen for thrown events. There are two paths that you can take to rewrite your frontend code: either remove jQuery altogether from your own implementation (recommended!) or rewrite your custom code to still use jQuery. The following events are thrown by Interactive Forms which you have the ability to listen to in your own frontend code:

  • IAF_ShowFormFragment

  • IAF_HideFormFragment

  • IAF_ShowError

  • IAF_HideError

  • IAF_SubmitForm

  • IAF_AfterSubmit

  • IAF_AjaxShowFormStep

  • IAF_FormLoaded

  • IAF_ClientSideFrameworkLoaded

For the following events, no changes have to be made if you keep using jQuery:

  • IAF_ShowFormFragment

  • IAF_HideFormFragment

  • IAF_SubmitForm

  • IAF_FormLoaded

  • IAF_ClientSideFrameworkLoaded


If you do want to rewrite your custom JavaScript to not include jQuery, rewrite your code as follows:

Old situation:

$(document).on('IAF_ShowFormFragment, '.formfragment', function(e) { ... });

 

New situation without jQuery:

document.addEventListener('IAF_ShowFormFragment', (e) => {    const fragment = e.target;    ... });

The same applies for the other events.

For the following events changes have to be made regardless of whether you keep using jQuery or not:

  • IAF_ShowError

  • IAF_HideError

  • IAF_AfterSubmit

  • IAF_AjaxShowFormStep

In the old case these jQuery events had specific data which was added to them, but the way you have to retrieve this data has changed.

  • IAF_ShowError: passes on error div ID and the errors

  • IAF_HideError: passes on error div ID

  • IAF_AfterSubmit: passes on data returned by XC

  • IAF_AjaxShowFormStep: passes on form step data returned by XC

For these events you can apply the following changes to your code:

IAF_ShowError

Old situation:

$(document).on('IAF_ShowError', '.wmpform div', function(e, errorDivId, errors) { ... });


New situation with jQuery:

$(document).on('IAF_ShowError', '.wmpform div', function(e) {    const errorDivId = e.detail.id;    const errors = e.detail.errors;    ... });


New situation without jQuery:

document.addEventListener('IAF_ShowError', (e) => {    const fragment = e.target;    const errorDivId = e.detail.id;    const errors = e.detail.errors;    ... });


IAF_HideError

Old situation:

$(document).on('IAF_HideError', '.wmpform div', function(e, errorDivId) { ... });


New situation with jQuery:

$(document).on('IAF_HideError', '.wmpform div', function(e) {    const errorDivId = e.detail.id;    ... });


New situation without jQuery:

document.addEventListener('IAF_HideError', (e) => {    const fragment = e.target;    const errorDivId = e.detail.id;    ... });


IAF_AfterSubmit

Old situation:

$(document).on('IAF_AfterSubmit', '.wmpform', function(e, data) { ... });


New situation with jQuery:

$(document).on('IAF_AfterSubmit', '.wmpform', function(e) {    const data = e.detail;    ... });


New situation without jQuery:

document.addEventListener('IAF_AfterSubmit', (e) => {    const form = e.target;    const data = e.detail;    ... });


IAF_AjaxShowFormStep

Old situation:

$(document).on('IAF_AjaxShowFormStep', '.wmpform', function(e, formStep) { ... });


New situation with jQuery:

$(document).on('IAF_AjaxShowFormStep', '.wmpform', function(e) {    const formStep = e.detail;    ... });

 

New situation without jQuery:

document.addEventListener('IAF_AjaxShowFormStep', (e) => {    const form = e.target;    const formStep = e.detail;    ... });


Summary

  • For IAF_ShowError, the e.detail is an object where e.detail.id is the error div id and e.detail.errors contains the errors

  • For IAF_HideError, the e.detail is the same object as above, where only e.detail.id should be relevant, as e.detail.errors will be empty

  • For IAF_AfterSubmit, e.detail is the response data object from the Form POST (same data as the old argument)

  • For IAF_AjaxShowFormStep, e.detail is the identifier of the form step (same data as the old argument)

XperienCentral R45

Release date: September 10, 2024

Minimum Version Required for Upgrading to XperienCentral R45

Upgrading to XperienCentral R45 requires a minimum version of R26. If you are upgrading from XperienCentral R25 or lower, you must first upgrade to R26 and then upgrade to XperienCentral R45.

Check Configuration Files

See Check Configuration Files.

Check Custom Media Item Code

If you implement a custom media item, you will most likely need to modify your custom media item controller. Usually, BeanUtils.copyProperties is used to copy properties from the media item version to your form backing object in YourCustomMediaItemController#formBackingObject and vice versa in YourCustomMediaItemController#onSubmit. However, since a media item itself doesn't have a presentation, the setPresentation and setPresentationVariant on MediaItemArticleVersionImpl now throws an UnsupportedOperationException. In XperienCentral versions R44 and lower, that method didn't do anything. To prevent this runtime exception from being thrown, you must explicitly omit these properties when you use BeanUtils to copy its properties.

For example, change;

BeanUtils.copyProperties(mediaItemVersion, myFormBackingObject);

to

BeanUtils.copyProperties(mediaItemVersion, myFormBackingObject, new String[ {"presentation", "presentationVariant"});

and change

BeanUtils.copyProperties(myFormBackingObject, mediaItemVersion);

to

BeanUtils.copyProperties(myFormBackingObject, mediaItemVersion, new String[]{"presentation", "presentationVariant"});

 

Audit Trail Database Modifications

In some cases, the Audit Trail panel can cause the XperienCentral environment to freeze up. This is caused by the out of control growth of some database tables related to the audit information that is collected and stored. To solve this problem, the application manager or a developer must execute two queries on the database used to store the Audit Trail history. These queries create two new indices. Creating the indices is optional but GX Software recommends that you do so. You can upgrade XperienCentral to version R45 without the new indices.

When the indices are created, the entire table is copied first. Because the table might be quite large, it is important to check whether there is enough available free disk space to create the copy before running the queries in order to avoid crashing the database server.


Execute the following two queries on the database containing the Audit Trail:

CREATE INDEX parentContentIdIndex ON wmHistory (parentContentId); CREATE INDEX webIdActionContenttypeIndex ON wmHistory (webId, action, contenttype);

 

Deprecated Components

In XperienCentral version R45, a number of deprecated components have been removed. If you have custom code that makes use of any of these components, you must modify it. The following components have been deprecated/removed:

  • All references to page models

  • Deprecated/unused filters in web.xml:

    • XslFoFilter

    • XSLFoTransformer

    • MobileESPFilter

    • DeviceAtlasFilter

    • DeviceRedirectFilter

  • The Mobile Toolkit module

XperienCentral Core

nl.gx.webmanager.cms.core.Personalization

Removed interface Personalization.
Replace with nl.gx.webmanager.cms.core.PersonalizationItem.   
Used in reusables.

nl.gx.webmanager.authorization.AuthorizationService

Removed method login(String username, String password, HttpServletRequest request).
Replace with LoginStatus.SUCCESS.equals(authorizationService.formLogin(username, password, request)).
Used in reusables.     

nl.gx.webmanager.authorization.Role

Removed methods getToolbarElements(), getToolbarElementIcons() and setToolbarElemenIcons().
There is no migration path - these methods should not be used. 
Not used in reusables.

nl.gx.webmanager.authorization.User

Removed method getEditLanguage().
Replace with nl.gx.webmanager.authorization.User.getEditingLanguage,
Not used in reusables.

Removed method delete(),
Replace with nl.gx.webmanager.authorization.AuthorizationService.deleteUser(user).
Not used in reusables.

nl.gx.webmanager.cms.workflow.WorkflowActivity

Removed method createInstance().
Replace with nl.gx.webmanager.services.workflow.WorkflowService.createWorkflowActivityInstance().
Not used in reusables.

nl.gx.webmanager.cms.mediarepository.implementation.MediaTerm

Removed method getInstance(String termName).
Replace with nl.gx.webmanager.cms.mediarepository.implementation.MediaTerm.getInstance(null, termName).
Not used in reusables.

nl.gx.webmanager.cms.core.InternalLink

Removed method setMouseOverText(String mouseOverText).
Replace with nl.gx.webmanager.cms.core.InternalLink.setLinkTitle(mouseOverText).
Not used in reusables.

nl.gx.webmanager.cms.core.Link

Removed method getMouseOverText(String mouseOverText).
Replace with getLinkTitle(mouseOverText)
Not used in reusables.

nl.gx.webmanager.cms.mediarepository.MediaItemVersion

Removed method getMediaItem().
Replace with nl.gx.webmanager.cms.core.ContentItemVersion.getContentItem().
Used in reusables.     


Removed method setLeadImage(FileResource leadImage).
Replace with nl.gx.webmanager.cms.core.ContentItemVersion.setAttachedLeadImage(leadImage.getFileResouce()),
Used in reusables.     

Removed method setLeadImage(Image leadImage).
Replace with nl.gx.webmanager.cms.core.ContentItemVersion.setAttachedLeadImage(leadImage).
Not used in reusables.

Removed method setPublic(boolean isPublic).
Do not use this method because public (published) should be determined by the workflow state and not set manually.  
Not used in reusables.

Removed method setArticle(boolean isArticle).
Determining whether a media item is an article should be done by <mediaItemInstance> instanceof ElementHolder
Not used in reusables.

Removed method isArticle().
Determining whether a media item is an article should be done by <mediaItemInstance> instanceof ElementHolder.
Not used in reusables.

Removed method setContentType(String contentType).
Do not use - you should not set the content type manually.
Not used in reusables.

Removed method createRichTextElements().
Replace with MediaItemVersion.getElementHolder() or cast to ElementHolder and use this method on the resulting ElementHolder
Not used in reusables.

Removed method getLastElement().
Replace with MediaItemVersion.getElementHolder() or cast to ElementHolder and use this method on the resulting ElementHolder
Not used in reusables.

Removed method insertLastElementAtCursor().
Replace with MediaItemVersion.getElementHolder() or cast to ElementHolder and use this method on the resulting ElementHolder
Not used in reusables.

nl.gx.webmanager.cms.core.ContentItem

Removed method getMostRelevantVersion(Language language)
Replace with getVersion(false, language, false, new Date(), true),
Not used in reusables.

nl.gx.webmanager.cms.core.RelatedDownloadLink

Removed method setDownloadFileResource(FileResource file).
Do not use.
Not used in reusables.

nl.gx.webmanager.cms.core.Page

Removed method getBlockLabel(),
Replace with getBlockLabels().
Not used in reusables.

Removed method getDefaultEditingLanguage().
Replace with website.getDefaultContentLanguage()
Not used in reusables.

Removed method setDefaultEditingLanguage(Language language).
Do not use this method - manually setting the editing language is not recommended. 
Not used in reusables.

nl.gx.webmanager.cms.core.ElementHolder

Removed method setModelElements(Element[] elements).
Do not use this method - page models are no longer supported.
Not used in reusables.

Removed method getModelElements().Do not use this method - page models are no longer supported.Not used in reusables.