XWiki Enterprise 3.0 Milestone 1

Last modified by Thomas Mortagne on 2023/10/13

First milestone of the XWiki Enterprise 3.0 version (Roadmap).

New and Noteworthy (since XWiki Enterprise 2.7)

ColorTheme improvements

"Add" menu entry can now be customizable from the ColorTheme wizard and has it's own variable.

AddCustomization.png

Also, info, success, warning and error message colors can now be changed through ColorThemes variables.

General UI improvements

Several XWiki forms have been modified in order to be consistent with our Vertical Layout Usage Form Standard

copy.png

  • Standardized vertical navigation menu layout, which will be used in M2 in administration, user profiles, and in the wiki index
  • Colibri is now the default base skin instead of Albatross
  • XWIKI-5859: Ability to have different panels in wiki and WYSIWYG edit modes

WYSIWYG content editor improvements

  • Better support for Opera, Chrome and Safari
  • Fixed several usability bugs

PDF export improvements

  • XWIKI-5782: PDF export ordered lists are not numbered in the same way as the wiki lists
  • XWIKI-5799: Underlined text has some additional white space before it when export to PDF
  • XWIKI-5844: PDF export sometimes broken when copy/pasting content from MS Office

Miscellaneous

  • Lucene search improvements
  • Enable preview office feature for all formats supporting by OpenOffice (especially docx, xlsx, pdf, pptx, odf, ods, odp)
  • Activity stream performance improvements and bug fixes
  • XAR import improvements (XWIKI-5845, XWIKI-5846)
  • Several macros transformed into Gadgets

For developers

  • XWIKI-2496: Specialized AppServerTrusted authenticator handling Kerberos principals
  • XWIKI-5758: Remove logging to the xwiki.log file in the log4j default configuration
  • XWIKI-5868: Add API for manipulating skin extensions as components
  • XWIKI-5810: Allow skin customization based on the current space name
  • XWIKI-5815: Add a Context macro
  • XWIKI-5900: Generic macro for displaying vertical navigation menus
  • XWIKI-5874: Add API to display document's titles in plain text without any markup
  • XWIKI-5819: Now the limit for nested macro calls is 100 instead of the default 20 (affects the limit of chained comment replies)
  • Various upgrades: Velocity 1.7, Prototype.js 1.7, Jython 2.5.2rc2, Groovy 1.7.6, GWT 2.1.1, JRuby 1.5.6

Translations

  • The following translations have been updated: de, fr, lv, ru, sv

Known issues

Test Report

You can check the manual test report to learn about what was tested and the results on various browsers.

Backward Compatibility and Migration Notes

The Velocity engine was updated to version 1.7

We upgraded Velocity to version 1.7 which brings several changes that are not backwards compatible.

We had to fix the following problems on the velocity code bundled with XWiki Enteprise:

  • Escape quotes in interpolated strings (both ' and ") by doubling them ('' and "") (See VELOCITY-555)
  • XABLOG-117: Blog application broken under Velocity 1.7
  • XAADMINISTRATION-200: Configurable sections are broken ("configuration cannot be displayed because it was last edited by Admin who doesn't have permission to edit this page")
  • XE-806:  Upgrade activity macro to work with velocity 1.7

Macro evaluation strategy

The main change is that Velocity 1.7 changed the way macro evaluations work. While before it was more flexible with many possible outcomes depending on what parameters were passed, and how they were used inside the macro, the current version simplified a lot the internal logic of variable assignments inside macros, which resulted in a critical regression for us. The same change was introduced between 1.6.0 and 1.6.1, but was reverted in 1.6.2 when we notified them of the regression, with the decision to go further with the change in 1.7.

To better understand the kind of code that doesn't work, take this example:

{{code language="none}}
#macro(callBySharing $x)
  #set($x = 'a')
#end
#set($y = 'y')
#callBySharing($y)

$y -> 'y' in 1.7
$y -> 'a' in 1.6.2, 1.6.0 and before)
{{/code}}

But:

#set($x = 'x')
#callBySharing($x)

$x -> 'a' in all versions

This means that only macros that are supposed to assign and return a value in one of its formal parameters will stop working, and only when the formal and actual parameters have different names. Macros with signatures like:

#macro(computeSomething $fromValue1 $fromValue2 $putResultHere)

The only macro in the global macros.vm that was broken by this change was #setVariableFromRequest, which is already fixed in the released version.

Now there's also a generic #setVariable ("variableName" $value) macro which can be used to emulate the call by sharing behavior in custom macros. How to use it:

Suppose you had a macro like this:

#macro(isBlogGlobal $blogDoc $isGlobal)
  #set($isGlobal = false)
  #getBlogProperty($blogDoc 'blogType' '' $discard)
  #if($discard == 'global')
    #set($isGlobal = true)
  #end
#end

Here $isGlobal is the output variable which now doesn't always work. The updated version of the macro can be written as:

#macro(isBlogGlobal $blogDoc $isGlobal)
  #set ($result = false)
  #getBlogProperty($blogDoc 'blogType' '' $discard)
  #if($discard == 'global')
    #set($result = true)
  #end
  #set ($isGlobal = $util.null)
  #setVariable ("$isGlobal" $result)
#end

Pay attention to the last two lines in the macro.

In Velocity, when rendering $variable, where $variable is undefined or null, will cause the variable name to be printed instead. As it happens, when inside a macro, what gets printed is the name of the actual parameter (the one passed in the macro call), and not the formal one (the one declared in the macro definition). So, whenever $isGlobal is rendered as a string, the name of the actual parameter is obtained.

#set ($isGlobal = $util.null) will make sure that no matter what the previous value of the variable was, $isGlobal will be null from this point forward, and "$isGlobal" will output the name of the actual parameter.

When calling #setVariable ("$isGlobal" $result), the first parameter will contain the name of the actual parameter used when calling #isBlogGlobal.

Inside the #setVariable macro, the wanted variable is assigned using #evaluate.

Quotes and apostrophes inside strings

The second change is the escape syntax used inside strings for quotes and apostrophes. While before this used to work:

{{velocity}}
#set ($a = "He said \"maybe\"")
$a => He said \"maybe\"
{{/velocity}}

now this snippet would throw an exception. Trying to escape an apostrophe inside an apostrophe-delimited string would have failed even before.

In Velocity 1.7 it is possible to place both single and double quotes inside a string, by doubling that character. For example:

{{velocity}}
#set ($a = "He said ""maybe""")
$a => He said "maybe"

#set ($b = 'that''s funny')
$b => that's funny
{{/velocity}}

General Notes

If you're running in a multiwiki setup you'll also need to define the property xwiki.store.migration.databases=all to your xwiki.cfg file or explicitly name all databases to be migrated as in xwiki.store.migration.databases=db1,db2,....

You may also want to import the default wiki XAR in order to benefit from the improvements listed above.

Always make sure you compare your xwiki.cfg file with the newest version since some configuration parameters were added. Note 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.

API Breakages

The following APIs were modified since XWiki Enterprise 2.7:

ERROR: 7006: org.xwiki.rendering.macro.box.AbstractBoxMacro: Return type of method 'protected org.xwiki.rendering.internal.macro.box.MacroContentParser getMacroContentParser()' has been changed to org.xwiki.rendering.internal.macro.MacroContentParser
ERROR: 8001: org.xwiki.rendering.block.AbstractFatherBlock: Class org.xwiki.rendering.block.AbstractFatherBlock removed
ERROR: 7012: org.xwiki.rendering.block.Block: Method 'public java.lang.String getParameter(java.lang.String)' has been added to an interface
ERROR: 7012: org.xwiki.rendering.block.Block: Method 'public java.util.Map getParameters()' has been added to an interface
ERROR: 7012: org.xwiki.rendering.block.Block: Method 'public void setParameter(java.lang.String, java.lang.String)' has been added to an interface
ERROR: 7012: org.xwiki.rendering.block.Block: Method 'public void setParameters(java.util.Map)' has been added to an interface
ERROR: 4001: org.xwiki.rendering.block.BulletedListBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.BulletedListBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.DefinitionDescriptionBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.DefinitionDescriptionBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.DefinitionListBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.DefinitionListBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.DefinitionTermBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.DefinitionTermBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 8001: org.xwiki.rendering.block.FatherBlock: Class org.xwiki.rendering.block.FatherBlock removed
ERROR: 4001: org.xwiki.rendering.block.FormatBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.FormatBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.GroupBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.GroupBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.HeaderBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.HeaderBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.LinkBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.LinkBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.ListItemBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.ListItemBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.MacroMarkerBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.MacroMarkerBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.NumberedListBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.NumberedListBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.ParagraphBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.ParagraphBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.QuotationBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.QuotationBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.QuotationLineBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.QuotationLineBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.SectionBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.SectionBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.TableBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.TableBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.TableCellBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.TableCellBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.TableHeadCellBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.TableHeadCellBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.TableRowBlock: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.TableRowBlock: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 4001: org.xwiki.rendering.block.XDOM: Removed org.xwiki.rendering.block.FatherBlock from the set of implemented interfaces
ERROR: 5001: org.xwiki.rendering.block.XDOM: Removed org.xwiki.rendering.block.AbstractFatherBlock from the list of superclasses
ERROR: 7002: org.xwiki.rendering.syntax.SyntaxType: Method 'public java.lang.String toIdString()' has been removed
ERROR: 7012: org.xwiki.bridge.DocumentModelBridge: Method 'public org.xwiki.rendering.syntax.Syntax getSyntax()' has been added to an interface
ERROR: 7005: org.xwiki.properties.ConverterManager: Parameter 1 of 'public java.lang.Object convert(java.lang.Class, java.lang.Object)' has changed its type to java.lang.reflect.Type
ERROR: 7012: org.xwiki.properties.PropertyDescriptor: Method 'public java.lang.reflect.Type getPropertyType()' has been added to an interface
ERROR: 7005: org.xwiki.properties.converter.AbstractConverter: Parameter 1 of 'public java.lang.Object convert(java.lang.Class, java.lang.Object)' has changed its type to java.lang.reflect.Type
ERROR: 7005: org.xwiki.properties.converter.Converter: Parameter 1 of 'public java.lang.Object convert(java.lang.Class, java.lang.Object)' has changed its type to java.lang.reflect.Type
ERROR: 7012: org.xwiki.officeimporter.openoffice.OpenOfficeConverter: Method 'public boolean isMediaTypeSupported(java.lang.String)' has been added to an interface

Get Connected