Release Notes for XWiki 9.8

Last modified by Manuel Smeria on 2017/10/02

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 release introduces a new feature for the Notifications: Watched Entities. It is an experimental feature that will soon replace the Watchlist Application. To try it out and get familiar with it, you need to enable it, since it is currently disabled by default.

For users, we now have more usable notification filter settings, a nice helper when you edit a "Database List" field and a feature that was missing from the CKEditor integration, which is office import.

For developers, it is easier to propose an extension containing REST resources, or to customize the Flamingo LESS code. We have also exposed more database columns in the Query Module for users who don't have programming rights. The notification filters AST (Abstract Syntax Tree) proposes new types of nodes to create complex filter queries. There are also new facilities to avoid using SyntaxFactory, to make Extension Manager faster, or to have more control over some skin elements (CSS IDs and layout variables).

New and Noteworthy (since XWiki 9.7)

Full list of issues fixed and Dashboard for 9.8.

For Users

Watchlist to be replaced by Notifications

 
At the end of the 9.x cycle, we plan to remove the Watchlist Application from XWiki Standard. Before being able to do this, we need that the Notifications Application be able to propose the same features (and even more possibilities).

In this version, you can now receive notifications concerning a watched location (ie: a page, a page and its children, a wiki..), without enabling any specific type of events in the preferences.

This feature is disabled by default (and the Watchlist Application is active by default). See Notifications Application to know how to enable it.

Office Import from CKEditor

 
We upgraded CKEditor Integration to its latest version which brings support for importing office files directly from the CKEditor. There's a dedicated button on the tool bar that opens a dialog where you can select the office file to import and you can choose to filter the styles or to use the Office Viewer macro. Checkout the CKEditor Integration documentation for more information.

Live Table User Filter

 
Filtering the Live Table rows by a column that display users should be easier now with the new suggest filter.

Improved Suggest Input for Database List Properties

 
The edit mode display for Database List properties that have "input" display type and "Use suggest" enabled in their definition has been improved by integrating selectize.js. The new widget handles both single selection and multiple selection properties. See the XWiki Data Model for more information on class properties.

Notifications Filters Settings revamped

 
We have changed the way we display Notification Filters in the Notification Settings page. All filters are listed in a single table so that it is easier to manage (adding, disabling, removing from the same place).

Live Table Database List Filter

 
Filtering the Live Table rows by a column that corresponds to a Database List property should be easier now with the new suggest filter.

For Admins

  • Flavors search optimization: Speed up display of flavors mostly containing core dependencies (when resolving flavors dependencies, just assume those with know recommended versions are valid).

For Developers

Runtime injection of REST resources

 

  • It's now possible to install/uninstall/upgrade REST resources dynamically (it used to require a restart of XWiki)
  • Upgrading/uninstalling a JAR extension doesn't break REST resources coming from extensions anymore

Extracted the $displayContentFooter layout variable from $displayDocExtra

 
A new $displayContentFooter layout variable is available to control the display of the section after the document content but before the docextra tabs; i.e. tags, creator and creation date.
Now, $displayDocExtra controls only the display of the docextra tabs, without affecting the content footer section, individualized above.

Enhanced notification filters AST (Abstract Syntax Tree)

 
In XWiki 9.7RC1, we have introduced an Abstract Syntax Tree (AST) to generate the query that fetch the events we want to display as notifications.

This AST has been created for 2 reasons:

  • in the future, the events might be stored in a different way, and the current HQL query might be not effective on a different storage (such as NoSQL). This AST abstracts the language so the query could still be effective, as soon as we have a translator for the target language.
  • it's easier for developers to write a NotificationFilter by generating an AST than generating a good HQL query that must escape its values and co-exists with other filters...

In this release, we have rewritten the whole internal query, and we had to introduce new types of ExpressionNode to handle all use-cases. This new nodes are:

  • BooleanValueNode to handle a boolean value
  • DateValueNode to handle a date
  • EntityReferenceNode to handle an EntityReference without manual serialization
  • GreaterThanNode to handle >= comparison
  • InNode to check if a property or a value is contained in a list
  • LesserThanNode to handle <= comparison
  • StartsWith to check if a value or a property starts with some other value

Since theses nodes have been created for our own implementation needs, please open a JIRA issue if you wish to have more.

New HQL safe select columns

 
Some new allowed query select columns have been added:

  • XWikiDeletedDocument
    • id
    • fullname
    • language
  • DeletedAttachment
    • id
    • filename

Easier Flamingo Skin customizations

 
We now provide a default less/custom.less file that can be overwritten for your custom Flamingo Skin. You don't longer need to manually overwrite less/style.less.vm in order to add your custom code. This will make the upgrade to a newer version of the skin much smoother.

Extension Manager improvements

 

  • new API in ExtensionManagerConfiguration to get a recommended version for a passed Extension id
  • various optimizations
    • speed resolve when the range contains only one version (don't ask all versions anymore)
    • better merge of version constraint ranges to only keep most specific ranges

Miscellaneous

  • Viewers in the more actions menu are no longer affected when customizing the docextra section: The viewers entries in the content menu now listen to the $displayShortcuts layout variable (as intended) and are no longer affected by the usage of the $docextras variable. For example, to remove all tabs and all shortcuts for the current page, you could write in a Velocity script in the page:

    #set($displayDocExtra = false)
    #set($displayShortcuts = false)
  • REST Resource to Retrieve Property Values: A new REST resource is available to retrieve the list of values of an XWiki class property. It currently works only with Database List (DBList) properties but we plan to add support for List of Users properties soon. The main use case for this new resource is to provide suggestions when editing object properties. See the REST API documentation for more details.

  • Add some missing CSS class iD : for "children", "comments", "attachments", "history" and "information" menu entries of flamingo flavor like the others menu entries.

  • New Syntax#valueOf(String) API: SyntaxFactory is now deprecated and replaced by the static Syntax#valueOf(String).

Upgrades

The following runtime dependencies have been upgraded (they have a different release cycle than XWiki Commons, XWiki Rendering, XWiki Platform and XWiki Enterprise):

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 ChromeNot Tested
Firefox30.pngMozilla Firefox 56Jira Tickets Marked as Fixed in the Release Notes + New and Noteworthy Features
IE30.pngInternet Explorer 10Not Tested
IE30.pngInternet Explorer 11Not Tested

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

DatabaseTest Result
hypersql.pngHyperSQL 2.4.0Jira Tickets Marked as Fixed in the Release Notes + New and Noteworthy Features
mysql.pngMySQLNot Tested
oracle.pngOracleNot Tested
postgresql.pngPostgreSQLNot Tested

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.

Database List Property Values

We fixed a few security issues around Database List properties by:

  • restricting the type of explicit query you can use on the Database List definition based on the class author rights
  • evaluating the Velocity code from the explicit query only if the class author has script right
  • checking if the current user has the right to view the returned values (when implicit query is used)

This may break existing applications if they use Database List properties and the last author of the class that holds the property definition doesn't have sufficient rights.

Changes in the way the $docextra variable works

If, prior to 9.8, you were using the $docextra variable to hide the document tags and creator/creation-date or to hide the viewers section in the "More actions" content menu, please be advised that it will not work as expected anymore. Please read above, in this release notes, how $displayContentFooter, $displayDocExtra and/or $displayShortcuts should be used instead.

API Breakages

The following APIs were modified since XWiki 9.7:

  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method org.xwiki.notifications.filters.expression.generics.AbstractNode org.xwiki.notifications.filters.NotificationFilter::filterExpression(org.xwiki.model.reference.DocumentReference)
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method void org.xwiki.notifications.filters.NotificationFilterManager::deleteFilterPreference(java.lang.String) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method org.xwiki.rendering.block.Block org.xwiki.notifications.filters.NotificationFilterManager::displayFilter(org.xwiki.notifications.filters.NotificationFilter, org.xwiki.notifications.filters.NotificationFilterPreference) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.util.Set<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(org.xwiki.model.reference.DocumentReference) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.util.Set<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(org.xwiki.model.reference.DocumentReference, org.xwiki.notifications.filters.NotificationFilter) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.util.Set<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(org.xwiki.model.reference.DocumentReference, org.xwiki.notifications.filters.NotificationFilter, org.xwiki.notifications.filters.NotificationFilterType) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.util.Set<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(org.xwiki.model.reference.DocumentReference, org.xwiki.notifications.filters.NotificationFilter, org.xwiki.notifications.filters.NotificationFilterType, org.xwiki.notifications.NotificationFormat) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method void org.xwiki.notifications.filters.NotificationFilterManager::saveFilterPreferences(java.util.Set<org.xwiki.notifications.filters.NotificationFilterPreference>)
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method void org.xwiki.notifications.filters.NotificationFilterManager::setFilterPreferenceEnabled(java.lang.String, boolean) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.expression.AndNode::<init>(===org.xwiki.notifications.filters.expression.generics.AbstractNode===, org.xwiki.notifications.filters.expression.generics.AbstractNode)

      ## New:
      parameter void org.xwiki.notifications.filters.expression.AndNode::<init>(===org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode===, org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode)
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.expression.AndNode::<init>(org.xwiki.notifications.filters.expression.generics.AbstractNode, ===org.xwiki.notifications.filters.expression.generics.AbstractNode===)

      ## New:
      parameter void org.xwiki.notifications.filters.expression.AndNode::<init>(org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode, ===org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode===)
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.expression.NotNode::<init>(===org.xwiki.notifications.filters.expression.generics.AbstractNode===)

      ## New:
      parameter void org.xwiki.notifications.filters.expression.NotNode::<init>(===org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode===)
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.expression.OrNode::<init>(===org.xwiki.notifications.filters.expression.generics.AbstractNode===, org.xwiki.notifications.filters.expression.generics.AbstractNode)

      ## New:
      parameter void org.xwiki.notifications.filters.expression.OrNode::<init>(===org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode===, org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode)
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.expression.OrNode::<init>(org.xwiki.notifications.filters.expression.generics.AbstractNode, ===org.xwiki.notifications.filters.expression.generics.AbstractNode===)

      ## New:
      parameter void org.xwiki.notifications.filters.expression.OrNode::<init>(org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode, ===org.xwiki.notifications.filters.expression.generics.AbstractOperatorNode===)
  • Young API
    • Violation type:
      java.class.nonFinalClassInheritsFromNewClass
    • Code:
      ## Old:
      class org.xwiki.notifications.filters.expression.generics.AbstractBinaryOperatorNode

      ## New:
      class org.xwiki.notifications.filters.expression.generics.AbstractBinaryOperatorNode
  • Young API
    • Violation type:
      java.class.nonFinalClassInheritsFromNewClass
    • Code:
      ## Old:
      class org.xwiki.notifications.filters.expression.generics.AbstractUnaryOperatorNode

      ## New:
      class org.xwiki.notifications.filters.expression.generics.AbstractUnaryOperatorNode
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.expression.PropertyValueNode::<init>(===org.xwiki.notifications.filters.NotificationFilterProperty===)

      ## New:
      parameter void org.xwiki.notifications.filters.expression.PropertyValueNode::<init>(===org.xwiki.notifications.filters.expression.EventProperty===)
  • Young API
    • Violation type:
      java.class.superTypeTypeParametersChanged
    • Code:
      ## Old:
      class org.xwiki.notifications.filters.expression.PropertyValueNode

      ## New:
      class org.xwiki.notifications.filters.expression.PropertyValueNode
  • Young API
    • Violation type:
      java.method.returnTypeChanged
    • Code:
      ## Old:
      method org.xwiki.notifications.filters.expression.generics.AbstractNode org.xwiki.notifications.filters.NotificationFilter::filterExpression(org.xwiki.model.reference.DocumentReference, org.xwiki.notifications.preferences.NotificationPreference)

      ## New:
      method org.xwiki.notifications.filters.expression.ExpressionNode org.xwiki.notifications.filters.NotificationFilter::filterExpression(org.xwiki.model.reference.DocumentReference, org.xwiki.notifications.preferences.NotificationPreference)
  • Young API
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method org.xwiki.notifications.filters.expression.ExpressionNode org.xwiki.notifications.filters.NotificationFilter::filterExpression(org.xwiki.model.reference.DocumentReference, org.xwiki.notifications.filters.NotificationFilterType)
  • Young API
    • Violation type:
      java.class.removed
    • Code:
      ## Old:
      class org.xwiki.notifications.filters.expression.LikeNode
  • Added the PropertyValues element to the REST model to be used by the ClassPropertyValues resource.
    • Violation type:
      java.annotation.attributeValueChanged
    • Code:
      ## Old:
      class org.xwiki.rest.model.jaxb.LinkCollection

      ## New:
      class org.xwiki.rest.model.jaxb.LinkCollection

Credits

The following people have contributed code to this release (sorted alphabetically):

  • Anca Luca
  • ClĂ©ment Aubin
  • Ecaterina Moraru (Valica)
  • Eduard Moraru
  • Guillaume Delhumeau
  • Marius Dumitru Florea
  • Pascal B
  • Sergiu Dumitriu
  • Thomas Mortagne
  • Vincent Massol
Tags:
   

Get Connected