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
divelements will be inserted inside editable areas in edit mode.Additional
divelements 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:
Stop Tomcat if it is running.
Remove the directory
<webmanager-root>/work/searchengine.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_ShowFormFragmentIAF_HideFormFragmentIAF_ShowErrorIAF_HideErrorIAF_SubmitFormIAF_AfterSubmitIAF_AjaxShowFormStepIAF_FormLoadedIAF_ClientSideFrameworkLoaded
For the following events, no changes have to be made if you keep using jQuery:
IAF_ShowFormFragmentIAF_HideFormFragmentIAF_SubmitFormIAF_FormLoadedIAF_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_ShowErrorIAF_HideErrorIAF_AfterSubmitIAF_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 errorsIAF_HideError: passes on error div IDIAF_AfterSubmit: passes on data returned by XCIAF_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, thee.detailis an object where e.detail.id is the error div id ande.detail.errorscontains the errorsFor
IAF_HideError, thee.detailis the same object as above, where only e.detail.id should be relevant, ase.detail.errorswill be emptyFor
IAF_AfterSubmit,e.detailis the response data object from the Form POST (same data as the old argument)For
IAF_AjaxShowFormStep,e.detailis 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:XslFoFilterXSLFoTransformerMobileESPFilterDeviceAtlasFilterDeviceRedirectFilter
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.