XWiki Enterprise 3.0 Milestone 1
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.
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
- 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 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:
#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:
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:
#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:
#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:
#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:
#set ($a = "He said ""maybe""")
$a => He said "maybe"
#set ($b = 'that''s funny')
$b => that's funny
{{/velocity}}
General Notes
You may also want to import the default wiki XAR in order to benefit from the improvements listed above.
API Breakages
The following APIs were modified since XWiki Enterprise 2.7:
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