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 mostly an improvements release on new performance report design, Solr search UI and Watchlist notifications. It also introduces the experimental support for flavors in the Distribution Wizard and a new Extension History section in the administration.
New and Noteworthy (since XWiki 7.1M2)
Full list of issues fixed and Dashboard for 7.1.
The debug performance tree has been made a bit more dynamic to be able to open/close nodes.
Flavor
This feature is experimental and you should try it only for test purpose.
If no default distribution is configured, Distribution Wizard will now let you select the flavor to install.
WatchList
The realtime watchlist messages are now handled separately from the schedules (hourly, daily, weekly) notifications. We have a separate template for them and, because of this, can now display them in a more user-friendly way and they can be threaded/grouped by your email client by the document they occurred in. For more information and screenshots, please see the documentation.
New Solr search UI options
It's now possible to disable highlighting and faceting which are very slow tasks. Can be controlled directly from the search UI or from the Main.SolrSearchConfig document.
See Solr Search Application.
Extension History
The Extension Manager Application has a new section that shows the history of the extension-related actions (e.g. install, uninstall, repair, etc.) offering support for selective export, import and replay of history records. This basically means that an administrator can:
- keep track of the extensions that are installed/uninstalled on his wiki (see who performed the action and when, in reverse chronological order, most recent first)
- perform a couple of actions (e.g. install/upgrade a group of extensions) on a single wiki and then replay those actions on multiple wikis
Miscellaneous
- The default document cache size has been increased from 100 to 500 elements
- Minor visual consistency improvement of the tag cloud header of the LiveTable
See the full list of JIRA issues fixed in this release.
For Developers
Script oriented advanced extension search API
A new script oriented API has been added to use advanced extension search possibilities introduced in 7.0. See Extension Script Module.
Record and Replay Extension Actions
The Extension Module has a new script service to access the extension history and to replay recorded history actions. The extension history records the extension related jobs (e.g. install, uninstall, etc.) along with the decisions taken by the user during the job execution (e.g. merge conflicts, delete unused pages). This means for instance that you can replay an upgrade without the need to handle again the merge conflicts.
The recording is performed by listening to the job events fired during the execution of an extension action, including the new QuestionAskedEvent and QuestionAnsweredEvent introduced in this release.
Upgrades
The following dependencies have been upgraded:
Miscellaneous
- Extension upgrade plan job now support checking specific list of installed extensions (instead of the top level installed extensions)
- You can now disable the automatic start of Distribution Wizard with two new options.
- It's possible to disable minification from xwiki.properties configuration file. Set debug.minify to false.
Translations
The following translations have been updated:
Tested Browsers & Databases
Failed to execute the [velocity] macro. Cause: [The execution of the [velocity] script macro is not allowed in [xwiki:TestReports.ManualTestReportSummaryXWiki71RC1]. Check the rights of its last author or the parameters if it's rendered from another script.]. Click on this message for details.
org.xwiki.rendering.macro.MacroExecutionException: The execution of the [velocity] script macro is not allowed in [xwiki:TestReports.ManualTestReportSummaryXWiki71RC1]. Check the rights of its last author or the parameters if it's rendered from another script.
at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:178)
at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:58)
at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transform(MacroTransformation.java:311)
at org.xwiki.rendering.internal.transformation.DefaultRenderingContext.transformInContext(DefaultRenderingContext.java:183)
at org.xwiki.rendering.internal.transformation.DefaultTransformationManager.performTransformations(DefaultTransformationManager.java:88)
at org.xwiki.rendering.internal.macro.include.IncludeMacro.lambda$execute$0(IncludeMacro.java:204)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.internal.macro.include.IncludeMacro.execute(IncludeMacro.java:203)
at org.xwiki.rendering.internal.macro.include.IncludeMacro.execute(IncludeMacro.java:59)
at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transform(MacroTransformation.java:311)
at org.xwiki.rendering.internal.transformation.DefaultRenderingContext.transformInContext(DefaultRenderingContext.java:183)
at org.xwiki.rendering.internal.transformation.DefaultTransformationManager.performTransformations(DefaultTransformationManager.java:88)
at org.xwiki.display.internal.DocumentContentAsyncExecutor.executeInCurrentExecutionContext(DocumentContentAsyncExecutor.java:396)
at org.xwiki.display.internal.DocumentContentAsyncExecutor.execute(DocumentContentAsyncExecutor.java:269)
at org.xwiki.display.internal.DocumentContentAsyncRenderer.execute(DocumentContentAsyncRenderer.java:112)
at org.xwiki.rendering.async.internal.block.AbstractBlockAsyncRenderer.render(AbstractBlockAsyncRenderer.java:157)
at org.xwiki.rendering.async.internal.block.AbstractBlockAsyncRenderer.render(AbstractBlockAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:290)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.execute(DefaultBlockAsyncRendererExecutor.java:125)
at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:67)
at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:43)
at org.xwiki.display.internal.DefaultDocumentDisplayer.display(DefaultDocumentDisplayer.java:96)
at org.xwiki.display.internal.DefaultDocumentDisplayer.display(DefaultDocumentDisplayer.java:39)
at org.xwiki.sheet.internal.SheetDocumentDisplayer.display(SheetDocumentDisplayer.java:123)
at org.xwiki.sheet.internal.SheetDocumentDisplayer.display(SheetDocumentDisplayer.java:52)
at org.xwiki.display.internal.ConfiguredDocumentDisplayer.display(ConfiguredDocumentDisplayer.java:68)
at org.xwiki.display.internal.ConfiguredDocumentDisplayer.display(ConfiguredDocumentDisplayer.java:42)
at com.xpn.xwiki.doc.XWikiDocument.display(XWikiDocument.java:1389)
at com.xpn.xwiki.doc.XWikiDocument.getRenderedContent(XWikiDocument.java:1525)
at com.xpn.xwiki.doc.XWikiDocument.displayDocument(XWikiDocument.java:1475)
at com.xpn.xwiki.doc.XWikiDocument.displayDocument(XWikiDocument.java:1444)
at com.xpn.xwiki.api.Document.displayDocument(Document.java:788)
at jdk.internal.reflect.GeneratedMethodAccessor441.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:571)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:554)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:221)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:368)
at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:704)
at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:75)
at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:242)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:190)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.xwiki.velocity.internal.directive.TryCatchDirective.render(TryCatchDirective.java:86)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.Template.merge(Template.java:358)
at org.apache.velocity.Template.merge(Template.java:262)
at org.xwiki.velocity.internal.InternalVelocityEngine.evaluate(InternalVelocityEngine.java:225)
at com.xpn.xwiki.internal.template.VelocityTemplateEvaluator.evaluateContent(VelocityTemplateEvaluator.java:105)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.evaluateContent(TemplateAsyncRenderer.java:219)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.renderVelocity(TemplateAsyncRenderer.java:174)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:135)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.lambda$syncRender$0(DefaultAsyncRendererExecutor.java:284)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:284)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.render(DefaultBlockAsyncRendererExecutor.java:154)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:904)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:866)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:853)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:808)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:800)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:79)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:73)
at org.xwiki.template.script.TemplateScriptService.render(TemplateScriptService.java:54)
at jdk.internal.reflect.GeneratedMethodAccessor259.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:571)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:554)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:221)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:368)
at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:492)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:218)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:331)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:261)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.Template.merge(Template.java:358)
at org.apache.velocity.Template.merge(Template.java:262)
at org.xwiki.velocity.internal.InternalVelocityEngine.evaluate(InternalVelocityEngine.java:225)
at com.xpn.xwiki.internal.template.VelocityTemplateEvaluator.evaluateContent(VelocityTemplateEvaluator.java:105)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.evaluateContent(TemplateAsyncRenderer.java:219)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.renderVelocity(TemplateAsyncRenderer.java:174)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:135)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.lambda$syncRender$0(DefaultAsyncRendererExecutor.java:284)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:284)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.render(DefaultBlockAsyncRendererExecutor.java:154)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:904)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:866)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:853)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:808)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderNoException(InternalTemplateManager.java:800)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:79)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.renderNoException(DefaultTemplateManager.java:73)
at org.xwiki.template.script.TemplateScriptService.render(TemplateScriptService.java:54)
at jdk.internal.reflect.GeneratedMethodAccessor259.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:571)
at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:554)
at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:221)
at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:368)
at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:492)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:218)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:331)
at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:261)
at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:304)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:171)
at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:147)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:190)
at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:439)
at org.apache.velocity.Template.merge(Template.java:358)
at org.apache.velocity.Template.merge(Template.java:262)
at org.xwiki.velocity.internal.InternalVelocityEngine.evaluate(InternalVelocityEngine.java:225)
at com.xpn.xwiki.internal.template.VelocityTemplateEvaluator.evaluateContent(VelocityTemplateEvaluator.java:105)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.evaluateContent(TemplateAsyncRenderer.java:219)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.renderVelocity(TemplateAsyncRenderer.java:174)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:135)
at com.xpn.xwiki.internal.template.TemplateAsyncRenderer.render(TemplateAsyncRenderer.java:54)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.lambda$syncRender$0(DefaultAsyncRendererExecutor.java:284)
at com.xpn.xwiki.internal.security.authorization.DefaultAuthorExecutor.call(DefaultAuthorExecutor.java:98)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.syncRender(DefaultAsyncRendererExecutor.java:284)
at org.xwiki.rendering.async.internal.DefaultAsyncRendererExecutor.render(DefaultAsyncRendererExecutor.java:267)
at org.xwiki.rendering.async.internal.block.DefaultBlockAsyncRendererExecutor.render(DefaultBlockAsyncRendererExecutor.java:154)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:904)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:866)
at com.xpn.xwiki.internal.template.InternalTemplateManager.renderFromSkin(InternalTemplateManager.java:846)
at com.xpn.xwiki.internal.template.InternalTemplateManager.render(InternalTemplateManager.java:832)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.render(DefaultTemplateManager.java:91)
at com.xpn.xwiki.internal.template.DefaultTemplateManager.render(DefaultTemplateManager.java:85)
at com.xpn.xwiki.XWiki.evaluateTemplate(XWiki.java:2564)
at com.xpn.xwiki.web.Utils.parseTemplate(Utils.java:180)
at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:651)
at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:339)
at com.xpn.xwiki.web.LegacyActionServlet.service(LegacyActionServlet.java:108)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:122)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.xwiki.wysiwyg.filter.ConversionFilter.doFilter(ConversionFilter.java:61)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.xwiki.container.servlet.filters.internal.SetHTTPHeaderFilter.doFilter(SetHTTPHeaderFilter.java:63)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.xwiki.resource.servlet.RoutingFilter.doFilter(RoutingFilter.java:132)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.xwiki.container.servlet.filters.internal.SavedRequestRestorerFilter.doFilter(SavedRequestRestorerFilter.java:208)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.xwiki.container.servlet.filters.internal.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:354)
at org.apache.coyote.ajp.AjpProcessor.service(AjpProcessor.java:433)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:840)
Here is the list of browsers we support and how they have been tested for this release:
Here is the list of databases we support and how they have been tested for this release:
For the full list of tests see this page.
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.
Mail API changes
The young mail API has been refactored to provide better and more detailed error reporting.
The MailState enumeration has been extended to report more detailed mail state (prepare_success, prepare_error, send_success, send_error and send_fatal_error). The MailListener interface has been extended to provide more detailed event. Now each mail batch should use new independent listener. The listener receive the batch identifier of its own batch when the mail preparation starts (#onPrepareBegin()), and have to keep it for all subsequent events. Independent success and error events for both the prepare and send phases are provided for each message (#onPrepareMessageSuccess(), #onPrepareMessageError(), #onSendMessageSuccess(), #onSendMessagError()). Moreover, premature interruption of the prepare phase is caught and reported (#onPrepareFatalError). Inability of the send phase to retrieve a message for sending is also explicitly reported (#onSendMessageFatalError()).
There is now more than one message state representing an error, therefore, the MailStatusResult interface has been extended with a #getAllError() method to retrieve all message status in error. Moreover, the #getTotalMailCount()# may represent a partial total in case of failure of the prepare phase. In that case, it represents the number of mails sent to the send phase. As a consequence, #isProcessed()# and #waitTillProcess()# now considerer the batch to be processed when all successfully prepared mail has been sent, or failed to be prepared or sent.
The mail API is now tracking individual message based on the standard Message-ID headers, which made it fully compliant with RFC-822 WRT the mail identification. Caller that want to specify custom Message-ID may do so by extending MimeMessage to preserve the Message-ID of the message. Caller is also responsible to ensure that different messages are identified by unique message identifier.
Sending multiple messages with the same Message-ID is no more supported since it does not respect the RFC-822 standard.
Reusing the same Message-ID for retrying a failed message is allowed and will be tracked by the same status if the batch identifier is also reused.
API Breakages
The following APIs were modified since XWiki 7.0.1:
- Add support for advanced search
org.xwiki.extension.repository.ExtensionRepositoryManager: Method 'public org.xwiki.extension.repository.result.IterableResult search(org.xwiki.extension.repository.search.ExtensionQuery)' has been added to an interface
- Add support for named steps
org.xwiki.job.event.status.JobProgress: Method 'public org.xwiki.job.event.status.JobProgressStep getCurrentStep()' has been added to an interface
org.xwiki.job.event.status.JobProgress: Method 'public org.xwiki.job.event.status.JobProgressStep getRootStep()' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public void endStep(java.lang.Object)' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public void pushLevelProgress(java.lang.Object)' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public void startStep(java.lang.Object)' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public void startStep(java.lang.Object, java.lang.String)' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public void startStep(java.lang.Object, java.lang.String, java.lang.String, java.lang.Object[])' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public void startStep(java.lang.Object, org.xwiki.logging.Message)' has been added to an interface
- Add new helper
org.xwiki.job.event.status.JobProgressManager: Method 'public java.lang.Object call(java.util.concurrent.Callable, java.lang.Object)' has been added to an interface
org.xwiki.job.event.status.JobProgressManager: Method 'public java.lang.Object call(java.util.concurrent.Callable, int, java.lang.Object)' has been added to an interface
- Add a new method to this young API
org.xwiki.skin.Skin: Method 'public org.xwiki.rendering.syntax.Syntax getOutputSyntax()' has been added to an interface
- Not really been removed but now return Object. Breaks code building that use this method but should be ok for runtime.
com.xpn.xwiki.XWiki: Method 'public com.xpn.xwiki.render.XWikiRenderingEngine getRenderingEngine()' has been removed
- Not used since a long time now (XWikiRenderingEngine is a component) and impossible to implement it without a trigerring most of the old rendering engine.
com.xpn.xwiki.XWiki: Method 'public void setRenderingEngine(com.xpn.xwiki.render.XWikiRenderingEngine)' has been removed
- Young API. Added handling of URL parameters
org.xwiki.url.ExtendedURL: In method 'public ExtendedURL(java.net.URL)' the number of arguments has changed
- Never supposed to be an API
com.xpn.xwiki.plugin.scheduler.StatusListener: Class com.xpn.xwiki.plugin.scheduler.StatusListener removed
- Young API. Remove useless Session argument since the MimeMessage will be given a valid Session when it's deserialized from the mail content store for sending.
org.xwiki.mail.MimeMessageFactory: In method 'public java.lang.Object createMessage(javax.mail.Session, java.lang.Object, java.util.Map)' the number of arguments has changed
- Young API. Allow load a single message status and added sorting capabilities for multiple statuses.
org.xwiki.mail.MailStatusStore: In method 'public java.util.List load(java.util.Map, int, int)' the number of arguments has changed
org.xwiki.mail.MailStatusStore: Return type of method 'public java.util.List load(java.util.Map, int, int)' has been changed to org.xwiki.mail.MailStatus
org.xwiki.mail.MailStatusStore: Method 'public java.util.List load(java.util.Map, int, int, java.lang.String, boolean)' has been added to an interface
- Young API. Large refactoring for adding the ability to register new URL Resource Types
org.xwiki.resource.AbstractResourceReference: Parameter 2 of 'public void addParameter(java.lang.String, java.lang.String)' has changed its type to java.lang.Object
org.xwiki.resource.ResourceReference: Parameter 2 of 'public void addParameter(java.lang.String, java.lang.String)' has changed its type to java.lang.Object
org.xwiki.resource.ResourceReferenceHandlerManager: Method 'public boolean canHandle(java.lang.Object)' has been added to an interface
org.xwiki.resource.ResourceReferenceResolver: Removed field TYPE_URL
org.xwiki.resource.ResourceReferenceResolver: In method 'public org.xwiki.resource.ResourceReference resolve(java.lang.Object, java.util.Map)' the number of arguments has changed
org.xwiki.resource.ResourceType: Method 'public org.xwiki.resource.ResourceType fromString(java.lang.String)' has been removed
- Young API. Rename MimeMessageWrapper into ScriptMimeMessage (not a wrapper anymore). Velocity scripts are not affected by the change.
org.xwiki.mail.script.MailSenderScriptService: Return type of method 'public org.xwiki.mail.script.MimeMessageWrapper createMessage(java.lang.String, java.lang.Object, java.util.Map)' has been changed to org.xwiki.mail.script.ScriptMimeMessage
org.xwiki.mail.script.MailSenderScriptService: Return type of method 'public org.xwiki.mail.script.MimeMessageWrapper createMessage(java.lang.String, java.lang.Object)' has been changed to org.xwiki.mail.script.ScriptMimeMessage
org.xwiki.mail.script.MailSenderScriptService: Return type of method 'public org.xwiki.mail.script.MimeMessageWrapper createMessage()' has been changed to org.xwiki.mail.script.ScriptMimeMessage
org.xwiki.mail.script.MailSenderScriptService: Return type of method 'public org.xwiki.mail.script.MimeMessageWrapper createMessage(java.lang.String, java.lang.String)' has been changed to org.xwiki.mail.script.ScriptMimeMessage
org.xwiki.mail.script.MailSenderScriptService: Return type of method 'public org.xwiki.mail.script.MimeMessageWrapper createMessage(java.lang.String, java.lang.String, java.lang.String)' has been changed to org.xwiki.mail.script.ScriptMimeMessage
org.xwiki.mail.script.MimeMessageWrapper: Class org.xwiki.mail.script.MimeMessageWrapper removed
- Young API. Change of API to fix bug in waitForProcessin(). Scripting API has not been broken, only the Java API has
org.xwiki.mail.MailResult: Method 'public boolean isProcessed()' has been removed
org.xwiki.mail.MailResult: Method 'public void waitTillProcessed(long)' has been removed
org.xwiki.mail.MailStatusResult: Method 'public long getProcessedMailCount()' has been added to an interface
org.xwiki.mail.MailStatusResult: Method 'public long getSize()' has been removed
org.xwiki.mail.MailStatusResult: Method 'public long getTotalMailCount()' has been added to an interface
org.xwiki.mail.MailStatusResult: Method 'public boolean isProcessed()' has been added to an interface
org.xwiki.mail.MailStatusResult: Method 'public void waitTillProcessed(long)' has been added to an interface
- Young API. Class moved to the "script" package. Script service usage is unchanged.
org.xwiki.mail.MailStorageScriptService: Class org.xwiki.mail.MailStorageScriptService removed