Release Notes for XWiki 7.4

Last modified by Thomas Mortagne on 2023/10/13

This is the release notes for XWiki Commons, XWiki Rendering, XWiki Platform and XWiki Enterprise. They share the same release notes as they are released together and have the same version.

This is our last major release for the XWiki 7.x cycle, and the new Long Term Support (LTS) version. It mainly brings polishing and stabilization for the Nested Pages feature, especially in the UI. Among other things, this release introduces a new notifications menu with the watchlist actions inside. Application Within Minutes now creates a Code and a Data page where the application content is stored. And it is now possible to have template hierarchies and to add an redirection when a page is renamed.

The following important issues were found after this version was released. You should verify if you’re using or need the affected features and decide whether to use a newer version that has it fixed or continue with this release:

New and Noteworthy (since XWiki 7.3)

Full list of issues fixed and Dashboard for 7.4.

Notifications & Watchlist

  • A new menu has been added to the top bar, on the right: the "notifications" menu (represented by a bell). In the future, it will be the place where you can find notifications about some events happening on the wiki (personal message, a page has been modified, etc...).

    Notifications.png

  • In this menu, we have moved the Watchlist icons (watch this page, watch this wiki, etc...). These actions can be triggered with the new switch buttons.

    WatchList-Notifications.png

  • The livetable of the WatchList macro have been updated to support Nested Pages.

      WatchListTable.png

App Within Minutes

The application Code and Data pages are now being created. The Code page lists the application code pages.

awmCodeHomePage.png

The application Data page shows a live table with the application entries. The application home page has been modified to include the Data page.

awmDataHomePage.png

The application entries (custom) live table results page is not generated any more because it was used only to load the translations on demand and now they are loaded on the wiki or user scope, based on the user rights.

Support for template hierarchies

When creating a new document from template, if the template has descendent documents under its path, those documents will also be copied over to the new document's location, preserving the hierarchy, as it was under the template document.

The save operation will display progress and if it was a Save&View operation, the form will be disabled until the operation is complete.

More details on the documentation page on document templates.

savingNewDocumentWithTemplateHierarchy.png

Automatic Redirect on Page Rename

The Rename Page action has a new option (selected by default) to create an automatic redirect from the old page location to the new one. This will ensure that the external links (e.g. the bookmarks) to the renamed page (and its children) will continue to work.

RenameConfirmFlamingo.png

Database Search

The Database Search UI has been modified to support nested pages.

databaseSearch.png

Miscellaneous

  • The default logo is now optimized for "Retina" screens, and can be scaled to any dimensions since it's a vectorial image.
  • The Information tab, at the bottom of each page, does not display the parent and the children of the current page anymore. Since this information is available both in the breadcrumb and in the children viewer, they were redundant and have been removed.

      InformationsTab.png

  • To be more intuitive, the titles of the Rights sections in the page administration have been changed.

      RightsAdmin.png

  • Some bootswatch themes have now a more accurate logo.
  • When the search button on the top menu is clicked, it now closes all other menus.
  • The Sandbox now uses XWiki Syntax 2.1.
  • Non terminal pages are now exported with their corresponding WebPreferences page
  • The "annotations" button in the "More Actions" menu has been moved in the same menu but with other actions and renamed "Annotate".

      Annotate.png

  • The Create Page UI allows you to view and change the location of the new page (that is going to be created) even when you open directly the URL of a new page.

See the full list of JIRA issues fixed in this release.

For Developers

Flamingo

An extension point to add content inside the new "Notifications" menu has been added:

org.xwiki.platform.notifications
NotificationsInside.png

Tree Velocity Macros

You are now able to "call" the Document Tree from Velocity using something like this:

#documentTree({
  'class': 'location-tree',
  'finder': true,
  'showAttachments': false,
  'showRoot': $showRoot,
  'showTerminalDocuments': false,
  'showTranslations': false,
  'showWikis': $showWikis
})

The same is possible with the generic Tree Widget:

#tree({
  'reference': 'XWiki.DocumentTree',
  'root': 'document:xwiki:Sandbox.WebHome',
  'openTo': 'document:xwiki:Sandbox.TestPage2'
})

All the parameters that are available for the wiki macros ({{documentTree}} and {{tree}}) should be available also for the corresponding Velocity macro.

New public Abstract job

A public org.xwiki.job.AbstractJob (and corresponding AbstractJobStatus) is now provided to help implementing a Job. An AbstractJob class already existed since a long time but it was in an internal package.

New lifespan LRU Cache setup

It's now possible to define the maximum time to live since the entry is put in the cache. It used to be possible to set it only since the last time the value was used.

// Configure cache eviction policy
LRUEvictionConfiguration lru = new LRUEvictionConfiguration();
// Set maximum size of the cache as 1000 entries
lru.setMaxEntries(1000);
// Set the maximum time to live since when the entry is used to 1 hour
lru.setMaxIdle(3600)
// Set the maximum time to live since when the entry is put in the cache to 1 hour
lru.setLifespan(3600)

Cache Macro and Rendering Cache are now based on this behavior.

VFS API

Right now the VFS API has issues with authorization checks, meaning that you should use it only for public archives or for private wikis. One problem right now is that as soon as a user having permission accesses the archive, then any other user will be able to see the archive's content as it's served from cache.

Replacement of the Zip Explorer Plugin. API to access the content of archives files (zip, jar, gzip, tar, etc) located as attachments in wiki pages or elsewhere (external URLs, file system, et).

In addition a new Velocity Tool was added in order to be able to use a portion of the NIO2 API from Velocity: niotool.

See VFS API and VFS Tree Macro for more details. Some API examples:

{{velocity}}
## Get the URL to access the content of a file inside a zip:
[[link to file in zip>>$services.vfs.url("attach:[email protected]/vma.txt")]]

## Display inline an image from a zip attached to a wiki page:
[[image:path:$services.vfs.url("attach:[email protected]/test.png")]]

## Read the content of a file inside a zip attached to a page:
$stringtool.toString($niotool.readAllBytes("attach:[email protected]/vma.txt"), "utf-8")

## List all entries inside a zip attached to a page:
#set ($dirStream = $niotool.newDirectoryStream("attach:[email protected]/"))
#foreach ($entry in $dirStream)
  * {{{$entry}}} - $niotool.isDirectory($entry)
#end
{{/velocity}}

{{vfsTree root="attach:[email protected]/"/}}

Example of using the vfsTree Macro:

{{vfsTree root="attach:[email protected]/"/}}

Results in:

vfstree.png

Miscellaneous

  • A new extractFirstReference(EntityType) API has been added to EntityReference: Extract the first entity of the given type from this one by traversing the current entity to the root. This differentiates it from extractReference(EntityType) which extracts the last entity of the given type.
  • The escape Velocity tool has a new method to escape CSS identifiers. This is similar to CSS.escape() available in JavaScript, and is useful if you want to create CSS selectors dynamicaly using untrusted input.
    $escapetool.css('a#b.c d[e=f]g{h:i;j}k')
    ## Output: a\\#b\\.c\\ d\\[e\\=f\\]g\\{h\\:i\\;j\\}k
  • The Document Tree Macro has a new parameter to control whether the hidden documents are filtered or not. Set to false to force the display of the hidden documents in the tree.
    {{documentTree filterHiddenDocuments="false" /}}
  • Temporary resources can now be forced to be downloaded by using the force-download=1 URL parameter
  • WebJars URL format now supports a wiki query string parameter to specify the wiki in which the webjars resource is available. For example: /xwiki/webjars/AjaxQ/0.0.2/ajaxq.js?wiki=mywiki
  • The default link behaviour can be disabled for a tree node, when you use the Tree Widget, by using the 'jstree-no-link' CSS class on the node anchor, which can be set from the node JSON:
    {
      ... (node JSON) ...
      'a_attr': {
        'class': 'jstree-no-link',
        'href': 'some/url'
      }
    }
  • The $regextool Velocity Tool has a new method:
    /**
     * @param content the content to parse
     * @param regex the regular expression to look for in the passed content
     * @return an empty list if the passed regular expression doesn't match the content, several {@link RegexResult}
     *         objects containing the matched position and matched content for all capturing groups and sub-groups
     *         otherwise
     */

    public List<List<RegexResult>> findAll(String content, String regex)

    We had to add a new method because the existing RegexTool#find(String, String) returns information about only the first capturing group. Here's a test to show how the new method works:

    @Test
    public void findAll()
    {
        RegexTool tool = new RegexTool();
        List<List<RegexResult>> result =
            tool.findAll("one :two three (:four) five :six seven=:eight", ":(\\w+) (\\w+)");

        Assert.assertEquals(2, result.size());
        Assert.assertEquals(":two three", result.get(0).get(0).getGroup());
        Assert.assertEquals(":six seven", result.get(1).get(0).getGroup());

        Assert.assertEquals(3, result.get(0).size());
        Assert.assertEquals("two", result.get(0).get(1).getGroup());
        Assert.assertEquals("three", result.get(0).get(2).getGroup());

        Assert.assertEquals(3, result.get(1).size());
        Assert.assertEquals("six", result.get(1).get(1).getGroup());
        Assert.assertEquals("seven", result.get(1).get(2).getGroup());
    }
  • The top level Commons POM now performs some checks on the POMs that have it as parent; for example it checks that non core POMs don't use the "XWiki Development Team" in the developers section so that non-core Extensions deployed on extensions.xwiki.org don't appear as developed by the XWiki Development Team.
  • You can now disable the default Live Table query filters by passing the empty string as the value of the queryFilters parameter.

Deprecated and Retired projects

Upgrades

The following dependencies have been upgraded:

Translations

The following translations have been updated: 

Tested Browsers & Databases

Here is the list of browsers we support and how they have been tested for this release:

BrowserTest Result
Chrome30.pngGoogle Chrome 47Partial execution of TC
Firefox30.pngMozilla Firefox 43Partial execution of TC
IE30.pngInternet Explorer 10Not Tested
IE30.pngInternet Explorer 11Jira Tickets Marked as Fixed in the Release Notes + Partial execution of TC

Here is the list of databases we support and how they have been tested for this release:

DatabaseTest Result
hypersql.pngHyperSQL 2.3.3Not Tested
mysql.pngMySQL 5.6.24Not Tested
oracle.pngOracle 11.2Not Tested
postgresql.pngPostgreSQL 9.4.4Jira Tickets Marked as Fixed in the Release Notes

Performances tests compared to 6.4.8

Like in 7.3 there hasn't really been much performance work on this version which was dedicated to improvement on nested spaces support that was added in 7.2 so we get mostly the same results.

Summary

"similar": difference is lower than 10%
"slightly": difference is lower than 20%

Note that most of the speed related values are an average of very moving results, a lot of things is happening during a HTTP request and it's far from stable duration (that's why 10% may sounds a lot for something called "similar" but the variable can go up and down around 5% sometimes so 10% average is really not that much of a clear win). Dumbbench based tests are executed several times and the lowest result is selected. 

Speed

ActionsDifference
Jetty startupsimilar
First accessnot existing page without UIsimilar
not existing page with UIsimilar
Reloadnot existing page without UIsimilar
not existing page with UIsimilar
Main.WebHome with UI45% faster
Main.WebHome without UI35% faster
SOLRFull SOLR reindexslightly slower
SOLR sync when index is emptysimilar
SOLR sync when there is nothing to dosimilar
Result of search finding lots of results25% faster
Result of search finding one result20% faster
RenderingPage with 1000 macros without UI/34
Page with 1000 html macros without UI/6

Memory

ActionsDifference
Heap Memory after jetty startupsimilar
Heap Memory after full SOLR index+50MB

More details on performance comparison on single wiki between 7.4.2 and 6.4.8.

Known issues

Backward Compatibility and Migration Notes

General Notes

When upgrading make sure you compare your xwiki.cfg, xwiki.properties and web.xml files with the newest version since some configuration parameters may have been modified or added. Note that you should add xwiki.store.migration=1 so that XWiki will attempt to automatically migrate your current database to the new schema. Make sure you backup your Database before doing anything.

Issues specific to XWiki 7.4

  • Better backward-compatibility for URLs has been added for the following 2 cases:
    • If the view action is omitted in the URL and the first space name doesn't match an action name, then the "view" action is implied
    • The view action can be specified even when the wiki is configured to hide the view action.
    • Note that this fixes some backward-compatibility issue introduced in XWiki 7.2

API Breakages

The following APIs were modified since XWiki 7.4:

  • was wrongly extending internal class:
org.xwiki.extension.job.history.ReplayJobStatus: Removed org.xwiki.job.internal.AbstractJobStatus from the list of superclasses
org.xwiki.extension.job.history.ReplayJobStatus: Removed org.xwiki.job.internal.DefaultJobStatus from the list of superclasses
org.xwiki.extension.xar.job.diff.DiffXarJobStatus: Removed org.xwiki.job.internal.AbstractJobStatus from the list of superclasses
org.xwiki.extension.xar.job.diff.DiffXarJobStatus: Removed org.xwiki.job.internal.DefaultJobStatus from the list of superclasses
org.xwiki.refactoring.job.EntityJobStatus: Removed org.xwiki.job.internal.AbstractJobStatus from the list of superclasses
org.xwiki.refactoring.job.EntityJobStatus: Removed org.xwiki.job.internal.DefaultJobStatus from the list of superclasses
  • impossible to implement it without dependeing on XMLRPC module:
com.xpn.xwiki.XWikiContext: Method 'public org.apache.xmlrpc.server.XmlRpcServer ajc$get$xmlRpcServer(com.xpn.xwiki.XWikiContext)' has been removed
com.xpn.xwiki.XWikiContext: Method 'public void ajc$set$xmlRpcServer(com.xpn.xwiki.XWikiContext, org.apache.xmlrpc.server.XmlRpcServer)' has been removed
com.xpn.xwiki.XWikiContext: Method 'public org.apache.xmlrpc.server.XmlRpcServer getXMLRPCServer()' has been removed
com.xpn.xwiki.XWikiContext: Method 'public void setXMLRPCServer(org.apache.xmlrpc.server.XmlRpcServer)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public org.apache.xmlrpc.server.XmlRpcServer ajc$interFieldGetDispatch$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$xmlRpcServer(com.xpn.xwiki.XWikiContext)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public void ajc$interFieldInit$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$xmlRpcServer(com.xpn.xwiki.XWikiContext)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public void ajc$interFieldSetDispatch$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$xmlRpcServer(com.xpn.xwiki.XWikiContext, org.apache.xmlrpc.server.XmlRpcServer)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public org.apache.xmlrpc.server.XmlRpcServer ajc$interMethod$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$getXMLRPCServer(com.xpn.xwiki.XWikiContext)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public void ajc$interMethod$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$setXMLRPCServer(com.xpn.xwiki.XWikiContext, org.apache.xmlrpc.server.XmlRpcServer)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public org.apache.xmlrpc.server.XmlRpcServer ajc$interMethodDispatch1$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$getXMLRPCServer(com.xpn.xwiki.XWikiContext)' has been removed
com.xpn.xwiki.XWikiContextCompatibilityAspect: Method 'public void ajc$interMethodDispatch1$com_xpn_xwiki_XWikiContextCompatibilityAspect$com_xpn_xwiki_XWikiContext$setXMLRPCServer(com.xpn.xwiki.XWikiContext, org.apache.xmlrpc.server.XmlRpcServer)' has been removed
Tags:
   

Get Connected