Release Notes for XWiki 10.9

Last modified by Marius Dumitru Florea on 2018/11/27

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

Starting with this release the Activity Stream Application is fully replaced by the Notifications Application. The list of followed users is back in the user profile and the Page Index can be sorted by page title. The Users and Groups administrations sections have been improved and there's a new Page Picker Velocity macro that can be used by developers.

New and Noteworthy (since XWiki 10.8.1)

Full list of issues fixed and Dashboard for 10.9.

For Users

Activity Stream is not bundled anymore

 
The good old Activity Stream Application is not bundled anymore with XWiki. This decision has been made because the Notifications Application can now handle the same features with better performances.

As a consequence, we have also modified every applications that was using Activity Stream to use the new Notifications features.

For backward compatibility, we also provide a Legacy Notification Activity Macro that would help you not to break the pages you have created with the use of the {{activity/}} macro..

Followed users in the user profile

 
A user can now see again (it was temporarily removed in past version while we migrated from WatchList to Notifications) the list of the users she is watching in the "network" panel of her user profile.

The name of the wiki is now displayed in the notifications

 
When a notification concerns a page that is not in the current wiki, the name of the wiki is now displayed in the notification.

Document index can be sorted by title

 
The main document index (and also the children/siblings of a page) can now be filtered and sorted by title. In previous versions this was not the case, because filtering and searching happens on the values stored in the database, which can be different from the displayed title.

While this obstacle has not been overcome now pages which have a displayed title which is different from the title stored in the database are now marked with the symbol "1". If these pages are found in the result set, a note is displayed explaining why filtering and sorting might not work as expected for these pages. 

Miscellaneous

  • The notifications macro can now handle tags: The "tags" parameters can be used to filter events that concern pages marked with some given tags. In a multi-wikis environment, it works only on the current wiki.

For Admins

Improved Users Administration Section

 
The Users section from the Wiki Administration has been improved:

  • Shows the user avatar
  • Shows the user scope (Global vs. Local) when you are on a subwiki
  • Has nicer modal popups for creating, editing and deleting the users

Improved Groups Administration Section

 
The Groups section from the Wiki Administration has been improved:

  • Shows the group avatar
  • Shows the member type (User vs. Group) when listing the members of a group
  • Shows the group scope (Global vs. Local) when you are on a subwiki
  • Has nicer modal popups for creating, editing and deleting the groups

Miscellaneous

For Developers

No more unset xobject property

 
Missing properties in an xobject (compared to the xclass) are now automatically added (with a null value most of the time) during save or when adding a new field in a class. Among other things it means you can now use fields in a database query without wondering if the field exist or not, no more missing result because the property is not set in some object yet.

Page picker velocity macro

 
You can now use a #pagePicker($parameters) velocity macro (works like #userPicker) to display an input auto-suggesting pages. Pages are searched by full name (e.g. Sandbox.Page) and title (depending on the locale of the user).

Default empty choice for list properties

 
In the default list property editor an empty choice (generally displayed as "---" but it can be translated) is now always added for non multi select based editing. This avoid hacks like the "---" value which used to be used in various XWikiPreferences properties choices.

Miscellaneous

Upgrades

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

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:

 BrowserTests performed and results
Chrome30.pngGoogle Chrome 70Smoke tests
Firefox30.pngMozilla Firefox 63Not Tested
Edge30.pngMicrosoft Edge 17Not Tested
IE30.pngInternet Explorer 11New and Noteworthy Features + Jira Tickets Marked as Fixed in the Release Notes
Safari30.pngSafari 12Not Tested

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

 DatabaseTests performed and results
hypersql.pngHyperSQL 2.4.1Not Tested
mysql.pngMySQL 5.7Not Tested
oracle.pngOracle 11.2Smoke tests
postgresql.pngPostgreSQL 10New and Noteworthy Features + Jira Tickets Marked as Fixed in the Release Notes

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

 Servlet ContainerTests performed and results
tomcat-icon.pngTomcatNot Tested
jetty-icon.pngJetty (XWiki Standalone packaging)New and Noteworthy Features + Jira Tickets Marked as Fixed in the Release Notes
jetty-icon.pngJettyNot Tested

Known issues

Backward Compatibility and Migration Notes

General Notes

  • When upgrading make sure you compare and merge the following XWiki configuration files since some parameters may have been modified, removed or added:
    • xwiki.cfg
    • xwiki.properties
    • web.xml
    • hibernate.cfg.xml
  • Add xwiki.store.migration=1 in xwiki.cfg so that XWiki will attempt to automatically migrate your current database to any new schema. Make sure you backup your Database before doing anything.

Issues specific to XWiki 10.9

Cannot remove a property from an xobject

It's not possible anymore to completely delete a property from an XObject if that property exists in the XClass. It will be automatically added back (with null value) when the document is saved.

Default is empty in the list property editor

The List property select based editor now always make sure the default choice is empty value for non multi list. It's possible control that by indicate what is the default value in which case empty value won't be proposed anymore.

API Breakages

The following APIs were modified since XWiki 10.8.1:

  • Not a breakage.
    • Violation type:
      java.annotation.attributeValueChanged
    • Code:
      ## Old:
      @interface org.xwiki.stability.Unstable

      ## New:
      @interface org.xwiki.stability.Unstable
  • Not a breakage: class moved to a legacy module
    • Violation type:
      java.class.removed
    • Code:
      ## Old:
      class org.xwiki.velocity.introspection.AbstractChainableUberspector
  • Not a breakage: class moved to a legacy module
    • Violation type:
      java.class.removed
    • Code:
      ## Old:
      interface org.xwiki.velocity.introspection.ChainableUberspector
  • Not a breakage: class moved to a legacy module
    • Violation type:
      java.class.removed
    • Code:
      ## Old:
      class org.xwiki.velocity.introspection.ChainingUberspector
  • Not a breakage: class moved to a legacy module
    • Violation type:
      java.class.removed
    • Code:
      ## Old:
      class org.xwiki.velocity.introspection.LinkingUberspector
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.util.Set<java.lang.String> org.xwiki.notifications.filters.NotificationFilterPreference::getEventTypes()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.util.Set<org.xwiki.notifications.NotificationFormat> org.xwiki.notifications.filters.NotificationFilterPreference::getFilterFormats()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.lang.String org.xwiki.notifications.filters.NotificationFilterPreference::getFilterPreferenceName()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.lang.String org.xwiki.notifications.filters.NotificationFilterPreference::getId()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.util.Set<org.xwiki.notifications.NotificationFormat> org.xwiki.notifications.filters.NotificationFilterPreference::getNotificationFormats()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.lang.String org.xwiki.notifications.filters.NotificationFilterPreference::getPage()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.lang.String org.xwiki.notifications.filters.NotificationFilterPreference::getPageOnly()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.util.List<java.lang.String> org.xwiki.notifications.filters.NotificationFilterPreference::getProperties(org.xwiki.notifications.filters.NotificationFilterProperty)
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.noLongerDefault
    • Code:
      ## Old:
      method java.util.Date org.xwiki.notifications.filters.NotificationFilterPreference::getStartingDate()

      ## New:
      method java.util.Date org.xwiki.notifications.filters.NotificationFilterPreference::getStartingDate()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.nowAbstract
    • Code:
      ## Old:
      method java.util.Date org.xwiki.notifications.filters.NotificationFilterPreference::getStartingDate()

      ## New:
      method java.util.Date org.xwiki.notifications.filters.NotificationFilterPreference::getStartingDate()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.lang.String org.xwiki.notifications.filters.NotificationFilterPreference::getUser()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method java.lang.String org.xwiki.notifications.filters.NotificationFilterPreference::getWiki()
  • NotificationFilterPreference store did not scale
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method void org.xwiki.notifications.filters.NotificationFilterPreference::setEnabled(boolean)
  • Adding a parameter to a REST API is actually not a blocker.
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method javax.ws.rs.core.Response org.xwiki.notifications.rest.NotificationsResource::getNotifications(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception

      ## New:
      method javax.ws.rs.core.Response org.xwiki.notifications.rest.NotificationsResource::getNotifications(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception
  • Adding a parameter to a REST API is actually not a blocker.
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method java.lang.String org.xwiki.notifications.rest.NotificationsResource::getNotificationsRSS(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception

      ## New:
      method java.lang.String org.xwiki.notifications.rest.NotificationsResource::getNotificationsRSS(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception
  • Adding a parameter to a REST API is actually not a blocker.
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method javax.ws.rs.core.Response org.xwiki.notifications.rest.NotificationsResource::getNotifications(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception

      ## New:
      method javax.ws.rs.core.Response org.xwiki.notifications.rest.NotificationsResource::getNotifications(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception
  • Adding a parameter to a REST API is actually not a blocker.
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method java.lang.String org.xwiki.notifications.rest.NotificationsResource::getNotificationsRSS(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception

      ## New:
      method java.lang.String org.xwiki.notifications.rest.NotificationsResource::getNotificationsRSS(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) throws java.lang.Exception
  • Adding a new REST API is actually not a blocker.
    • Violation type:
      java.method.addedToInterface
    • Code:
      ## Old:
      null

      ## New:
      method javax.ws.rs.core.Response org.xwiki.notifications.rest.NotificationsResource::postNotifications() throws java.lang.Exception
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method void org.xwiki.notifications.filters.NotificationFilterManager::deleteFilterPreference(java.lang.String) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.util.stream.Stream<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(java.util.Collection<org.xwiki.notifications.filters.NotificationFilterPreference>, org.xwiki.notifications.filters.NotificationFilter)
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.util.stream.Stream<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(java.util.Collection<org.xwiki.notifications.filters.NotificationFilterPreference>, org.xwiki.notifications.filters.NotificationFilter, org.xwiki.notifications.filters.NotificationFilterType)
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.util.stream.Stream<org.xwiki.notifications.filters.NotificationFilterPreference> org.xwiki.notifications.filters.NotificationFilterManager::getFilterPreferences(java.util.Collection<org.xwiki.notifications.filters.NotificationFilterPreference>, org.xwiki.notifications.filters.NotificationFilter, org.xwiki.notifications.filters.NotificationFilterType, org.xwiki.notifications.NotificationFormat)
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method java.util.Collection<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.removed
    • Code:
      ## Old:
      method void org.xwiki.notifications.filters.NotificationFilterManager::saveFilterPreferences(java.util.Set<org.xwiki.notifications.filters.NotificationFilterPreference>)
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method void org.xwiki.notifications.filters.NotificationFilterManager::setFilterPreferenceEnabled(java.lang.String, boolean) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.removed
    • Code:
      ## Old:
      method void org.xwiki.notifications.filters.NotificationFilterManager::setStartDateForUser(org.xwiki.model.reference.DocumentReference, java.util.Date) throws org.xwiki.notifications.NotificationException
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.watch.WatchedLocationReference::<init>(org.xwiki.model.reference.EntityReference, java.lang.String, org.xwiki.model.reference.EntityReferenceResolver<java.lang.String>, org.xwiki.notifications.filters.internal.scope.ScopeNotificationFilterLocationStateComputer, ===org.xwiki.notifications.filters.NotificationFilterManager===)

      ## New:
      parameter void org.xwiki.notifications.filters.watch.WatchedLocationReference::<init>(org.xwiki.model.reference.EntityReference, java.lang.String, org.xwiki.model.reference.EntityReferenceResolver<java.lang.String>, org.xwiki.notifications.filters.internal.scope.ScopeNotificationFilterLocationStateComputer, ===org.xwiki.notifications.filters.NotificationFilterPreferenceManager===)
  • Young API
    • Violation type:
      java.method.parameterTypeChanged
    • Code:
      ## Old:
      parameter void org.xwiki.notifications.filters.watch.WatchedUserReference::<init>(java.lang.String, org.xwiki.notifications.filters.internal.user.EventUserFilterPreferencesGetter, ===org.xwiki.notifications.filters.NotificationFilterManager===)

      ## New:
      parameter void org.xwiki.notifications.filters.watch.WatchedUserReference::<init>(java.lang.String, org.xwiki.notifications.filters.internal.user.EventUserFilterPreferencesGetter, ===org.xwiki.notifications.filters.NotificationFilterPreferenceManager===)
  • Add an optional parameter to a REST API end point
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method org.xwiki.rest.model.jaxb.PropertyValues org.xwiki.rest.resources.classes.ClassPropertyValuesResource::getClassPropertyValues(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, java.util.List<java.lang.String>) throws org.xwiki.rest.XWikiRestException

      ## New:
      method org.xwiki.rest.model.jaxb.PropertyValues org.xwiki.rest.resources.classes.ClassPropertyValuesResource::getClassPropertyValues(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer, java.util.List<java.lang.String>, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException
  • Add a hierarchy property to the Search Result from the REST model
    • Violation type:
      java.annotation.attributeValueChanged
    • Code:
      ## Old:
      class org.xwiki.rest.model.jaxb.SearchResult

      ## New:
      class org.xwiki.rest.model.jaxb.SearchResult
  • Add an optional parameter to a REST API end point
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.spaces.SpaceSearchResource::search(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException

      ## New:
      method org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.spaces.SpaceSearchResource::search(java.lang.String, java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException
  • Add an optional parameter to a REST API end point
    • Violation type:
      java.method.numberOfParametersChanged
    • Code:
      ## Old:
      method org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikiSearchResource::search(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException

      ## New:
      method org.xwiki.rest.model.jaxb.SearchResults org.xwiki.rest.resources.wikis.WikiSearchResource::search(java.lang.String, java.lang.String, java.util.List<java.lang.String>, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean) throws org.xwiki.rest.XWikiRestException

Credits

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

  • Adel Atallah
  • Arun Pattni
  • Clemens Klein-Robbenhaar
  • Ecaterina Moraru (Valica)
  • Eduard Moraru
  • Guillaume Delhumeau
  • JSDennebouy
  • Lavinia Florean
  • Leif Erik Andersen
  • Mario-Hofstaetter
  • Marius Dumitru Florea
  • Ryszard Jeziorski
  • Simon Urli
  • Thomas Mortagne
  • Valdis Vitolins
  • Vincent Massol
  • xrichard
  • 吴国凯

Get Connected