Details
-
Bug
-
Resolution: Fixed
-
Major
-
1.3
-
None
-
XWiki Enterprise 5.4.5 with Filesystem attachments enabled
Description
Steps to reproduce:
- Install a local XWiki 5.4.5 with filesystem attachments
- Install the workflow extension 1.3 and create a new workflow
- Create a draft document and add an attachment
- Switch the draft though all the workflow states
Result: at the last publish step the script is listing a merge error:
org.xwiki.rendering.macro.MacroExecutionException: Failed to evaluate Velocity Macro for content [ #macro(getUsersFromGroup $target, $wiki) #set($baseRef = $services.model.createDocumentReference($wiki, 'Main', 'WebHome')) #set($targetDocRef = $services.model.resolveDocument($target, 'explicit', $baseRef)) #set($targetDoc = $xwiki.getDocument($targetDocRef)) #set($groups = $targetDoc.getObjects('XWiki.XWikiGroups')) #set($users = $targetDoc.getObjects('XWiki.XWikiUsers')) #foreach($user in $users) #set($mail = $user.getProperty("email").value) #if($!mail != '') #if($recipients && $recipients != "") #set($recipients = "$recipients, $mail") #else #set($recipients = $mail) #end #end #end #foreach($group in $groups) #set($person = $group.getProperty('member').value) #if($person && $!person != '') #getUsersFromGroup("$person", $targetDoc.getWiki()) #end #end #end #set($defaultMail = $xwiki.getXWikiPreference('admin_email', 'mailer@xwiki.localdomain.com')) #set($action = "$!request.action") #set($workflowdoc = "$!request.workflowdoc") ## get the document to which to redirect after the action is done #set($redirectdoc = "$!request.redirectdoc") #if ($redirectdoc == '') ## if none specified, redirect to the workflowdoc #set($redirectdoc = $workflowdoc) #end #if($workflowdoc == "" || $action == "") {{info}}$msg.get('workflow.script.notenoughparams'){{/info}} #else #set($workflowDocRef = $services.model.resolveDocument($workflowdoc)) #if($request.cancel) $response.sendRedirect($xwiki.getURL($workflowDocRef, 'view', '')) #end workflow doc ref: $workflowDocRef Action : $action #if($action == "start") #set($targetReference = $services.model.createDocumentReference("", "$!request.space", "$!request.page")) #set($workflowConfig = "$request.workflow") ##TODO : Check that the target and the existing doc are differents #if($targetReference.equals($workflowDocRef)) $response.sendRedirect($xwiki.getURL($workflowDocRef, 'view', 'same=true')) #else #set($result = $services.publicationworkflow.startWorkflow($workflowDocRef, $workflowConfig, $targetReference)) #end #elseif($action == 'startastarget') #set($workflowConfig = "$!request.workflow") #if ($workflowConfig == '') $response.sendRedirect($xwiki.getURL($redirectdoc, 'view', 'error=missingparams')) #elseif(!$xwiki.exists($workflowDocRef)) $response.sendRedirect($xwiki.getURL($redirectdoc, 'view', 'error=targetdoesnotexist')) #else #set($result = $services.publicationworkflow.startWorkflowAsTarget($workflowDocRef, $workflowConfig)) #if (!$result) $response.sendRedirect($xwiki.getURL($redirectdoc, 'view', 'error=invalidpage')) #end #end #elseif ($action == "submitformoderation") #set($result = $services.publicationworkflow.submitForModeration($workflowDocRef)) #elseif ($action == "submitforvalidation") #set($result = $services.publicationworkflow.submitForValidation($workflowDocRef)) #elseif ($action == "validate") #set($result = $services.publicationworkflow.validate($workflowDocRef)) #elseif ($action == "publish") #set($result = $services.publicationworkflow.publish($workflowDocRef)) #elseif ($action == "refusemoderation" && !$request.cancel) #set($result = $services.publicationworkflow.refuseModeration($workflowDocRef, "$!request.reason")) #elseif ($action == "refusevalidation" && !$request.cancel) #set($result = $services.publicationworkflow.refuseValidation($workflowDocRef, "$!request.reason")) #elseif ($action == "editDraft") #set($result = $services.publicationworkflow.editDraft($workflowDocRef)) #elseif ($action == "getEditableDraft") ## parameter is the target document, check if a draft already exists #set($existingDraft = $services.publicationworkflow.getDraftDocument($workflowDocRef)) #if ($existingDraft) #set($result = $services.publicationworkflow.editDraft($existingDraft)) #set($docToShow = $existingDraft) #else #set($result = $services.publicationworkflow.createDraftDocument($workflowDocRef)) #set($docToShow = $result) #end #elseif ($action == 'unpublish' && !$request.cancel) #set($erase = ($request.crush == '1')) #set($result = $services.publicationworkflow.unpublish($workflowDocRef, $erase)) #elseif ($action == 'archive') #set($result = $services.publicationworkflow.archive($workflowDocRef)) #elseif ($action == 'publishfromarchive') #set($result = $services.publicationworkflow.publishFromArchive($workflowDocRef)) #elseif ($action == 'backtodraft' && !$request.cancel) #set($result = $services.publicationworkflow.unarchive($workflowDocRef, false)) #end #if ($result) #if($action == 'submitformoderation' || $action == 'submitforvalidation' || $action == 'refusemoderation' || $action=='refusevalidation') #set($recipients = '') #set($document = $xwiki.getDocument($workflowDocRef)) #set($workflowObj = $document.getObject("PublicationWorkflow.PublicationWorkflowClass")) #set($workflow = $workflowObj.getProperty("workflow").value) #set($workflowDoc=$xwiki.getDocument($workflow)) #set($group = $workflowDoc.getObject("PublicationWorkflow.PublicationWorkflowConfigClass")) #if($action=='submitformoderation' || $action=='refusevalidation') ##In both cases, we should send a mail to the moderators, if there is any. #set($moderators = $group.getProperty('moderator').value) #if($moderators != '') #getUsersFromGroup($moderators) #elseif($action=='submitformoderation') #set($webmasters = $group.getProperty('validator').value) #getUsersFromGroup($webmasters) #else #set($contributors = $group.getProperty('contributor').value) #getUsersFromGroup($contributors) #end #if($action=='submitformoderation') #set($map={'document':"$xwiki.getDocument($workflowdoc).getDisplayTitle()", 'url':"$xwiki.getDocument($workflowDocRef).getExternalURL()"}) #set($discard = $xwiki.mailsender.sendMessageFromTemplate($defaultMail, $recipients, $xwiki.null, $xwiki.null, "fr", "PublicationWorkflow.MailTemplate : Demande de validation", $map)) #else #set($map= {'document':"$xwiki.getDocument($workflowdoc).getDisplayTitle()", 'url':"$xwiki.getDocument($workflowDocRef).getExternalURL()", 'reason':"$!request.reason"}) #set($discard = $xwiki.mailsender.sendMessageFromTemplate($defaultMail, $recipients, $xwiki.null, $xwiki.null, "fr", "PublicationWorkflow.MailTemplate : Refus de publication", $map)) #end #elseif($action == 'submitforvalidation' || $action=='unpublish') #set($webmasters = $group.getProperty('validator').value) #getUsersFromGroup($webmasters) #set($map={'document':"$xwiki.getDocument($workflowdoc).getDisplayTitle()", 'url':"$xwiki.getDocument($workflowDocRef).getExternalURL()"}) #if($action == 'submitforvalidation') #set($discard = $xwiki.mailsender.sendMessageFromTemplate($defaultMail, $recipients, $xwiki.null, $xwiki.null, "fr", "PublicationWorkflow.MailTemplate : Demande de publication", $map)) #else #set($discard = $xwiki.mailsender.sendMessageFromTemplate($defaultMail, $recipients, $xwiki.null, $xwiki.null, "fr", "PublicationWorkflow.MailTemplate : Dépublication", $map)) #end #elseif($action == 'refusemoderation') #set($contributors = $group.getProperty('contributor').value) #getUsersFromGroup($contributors) #set($map={'document':"$xwiki.getDocument($workflowdoc).getDisplayTitle()", 'url':"$xwiki.getDocument($workflowDocRef).getExternalURL()", 'reason':"$!request.reason"}) #set($discard = $xwiki.mailsender.sendMessageFromTemplate($defaultMail, $recipients, $xwiki.null, $xwiki.null, "fr", "PublicationWorkflow.MailTemplate : Refus de validation", $map)) #end #end #if($action == 'unpublish' || $action=='backtodraft') ##If the document is being unpublished or unarchived we redirect to the draft #set($draft = $services.publicationworkflow.getDraftDocument($workflowDocRef)) $response.sendRedirect($xwiki.getURL($draft, 'view', '')) #elseif($action == 'publish') ##If the document is being published we redirect to the final doc #set($workflowDoc = $xwiki.getDocument($workflowDocRef)) #set($workflowObject = $workflowDoc.getObject("PublicationWorkflow.PublicationWorkflowClass")) #set($target = $workflowObject.getProperty('target').value) $response.sendRedirect($xwiki.getURL($target, 'view', '')) #elseif($action == 'getEditableDraft')## if we're starting a new edit session from the target, direct to the draft $response.sendRedirect($xwiki.getURL($docToShow, 'view', '')) #else ## in all other situations redirect to the document specified from the parameters $response.sendRedirect($xwiki.getURL($redirectdoc, 'view', '')) #end #else $msg.get('workflow.script.failed') #end #end] at org.xwiki.rendering.internal.macro.velocity.VelocityMacro.evaluateString(VelocityMacro.java:131) at org.xwiki.rendering.internal.macro.velocity.VelocityMacro.evaluateString(VelocityMacro.java:50) at org.xwiki.rendering.macro.script.AbstractScriptMacro.evaluateBlock(AbstractScriptMacro.java:302) at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:198) at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:59) at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transformOnce(MacroTransformation.java:191) at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transform(MacroTransformation.java:132) at org.xwiki.rendering.internal.transformation.DefaultTransformationManager.performTransformations(DefaultTransformationManager.java:87) at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:252) at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:125) at org.xwiki.display.internal.DocumentContentDisplayer.display(DocumentContentDisplayer.java:55) at org.xwiki.display.internal.DefaultDocumentDisplayer.display(DefaultDocumentDisplayer.java:80) at org.xwiki.display.internal.DefaultDocumentDisplayer.display(DefaultDocumentDisplayer.java:38) at org.xwiki.sheet.internal.SheetDocumentDisplayer.display(SheetDocumentDisplayer.java:113) at org.xwiki.sheet.internal.SheetDocumentDisplayer.display(SheetDocumentDisplayer.java:50) at org.xwiki.display.internal.ConfiguredDocumentDisplayer.display(ConfiguredDocumentDisplayer.java:67) at org.xwiki.display.internal.ConfiguredDocumentDisplayer.display(ConfiguredDocumentDisplayer.java:41) at com.xpn.xwiki.doc.XWikiDocument.getRenderedContent(XWikiDocument.java:997) at com.xpn.xwiki.doc.XWikiDocument.getRenderedContent(XWikiDocument.java:976) at com.xpn.xwiki.doc.XWikiDocument.getRenderedContent(XWikiDocument.java:1007) at com.xpn.xwiki.api.Document.getRenderedContent(Document.java:619) at sun.reflect.GeneratedMethodAccessor166.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:395) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:384) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:173) at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:280) at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:567) at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71) at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142) at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:106) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:228) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:187) at com.xpn.xwiki.render.XWikiVelocityRenderer.evaluate(XWikiVelocityRenderer.java:105) at com.xpn.xwiki.internal.template.DefaultPrivilegedTemplateRenderer.evaluate(DefaultPrivilegedTemplateRenderer.java:125) at com.xpn.xwiki.internal.template.DefaultPrivilegedTemplateRenderer.evaluateTemplate(DefaultPrivilegedTemplateRenderer.java:75) at com.xpn.xwiki.XWiki.evaluateTemplate(XWiki.java:1687) at com.xpn.xwiki.XWiki.parseTemplate(XWiki.java:1627) at com.xpn.xwiki.api.XWiki.parseTemplate(XWiki.java:918) at sun.reflect.GeneratedMethodAccessor112.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:395) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:384) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:173) at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:280) at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:369) at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) at org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:216) at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:311) at org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:230) at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207) at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:87) at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:106) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:228) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:187) at com.xpn.xwiki.render.XWikiVelocityRenderer.evaluate(XWikiVelocityRenderer.java:105) at com.xpn.xwiki.internal.template.DefaultPrivilegedTemplateRenderer.evaluate(DefaultPrivilegedTemplateRenderer.java:125) at com.xpn.xwiki.internal.template.DefaultPrivilegedTemplateRenderer.evaluateTemplate(DefaultPrivilegedTemplateRenderer.java:75) at com.xpn.xwiki.XWiki.evaluateTemplate(XWiki.java:1687) at com.xpn.xwiki.web.Utils.parseTemplate(Utils.java:167) at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:304) at com.xpn.xwiki.web.XWikiAction.execute(XWikiAction.java:129) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:755) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1448) at com.xpn.xwiki.web.ActionFilter.doFilter(ActionFilter.java:121) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at org.xwiki.wysiwyg.server.filter.ConversionFilter.doFilter(ConversionFilter.java:126) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at com.xpn.xwiki.plugin.webdav.XWikiDavFilter.doFilter(XWikiDavFilter.java:66) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at org.xwiki.container.servlet.filters.internal.SavedRequestRestorerFilter.doFilter(SavedRequestRestorerFilter.java:208) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at org.xwiki.container.servlet.filters.internal.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:111) at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1419) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255) at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) at org.eclipse.jetty.server.Server.handle(Server.java:368) at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:488) at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:943) at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1004) at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:861) at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240) at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) at java.lang.Thread.run(Thread.java:745) Caused by: org.xwiki.velocity.XWikiVelocityException: Failed to evaluate content with id [xwiki:PublicationWorkflow.Script] at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:247) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:187) at org.xwiki.rendering.internal.macro.velocity.VelocityMacro.evaluateString(VelocityMacro.java:124) ... 112 more Caused by: org.apache.velocity.exception.MethodInvocationException: Invocation of method 'publish' in class org.xwiki.workflowpublication.internal.PublicationWorkflowService threw exception java.lang.NullPointerException at xwiki:PublicationWorkflow.Script[line 72, column 46] at org.apache.velocity.runtime.parser.node.ASTMethod.handleInvocationException(ASTMethod.java:243) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:187) at org.apache.velocity.runtime.parser.node.ASTReference.execute(ASTReference.java:280) at org.apache.velocity.runtime.parser.node.ASTReference.value(ASTReference.java:567) at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71) at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142) at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) at org.apache.velocity.runtime.parser.node.ASTElseIfStatement.render(ASTElseIfStatement.java:92) at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:106) at org.apache.velocity.runtime.parser.node.ASTBlock.render(ASTBlock.java:72) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) at org.apache.velocity.runtime.parser.node.ASTIfStatement.render(ASTIfStatement.java:106) at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342) at org.xwiki.velocity.internal.DefaultVelocityEngine.evaluate(DefaultVelocityEngine.java:228) ... 114 more Caused by: java.lang.NullPointerException at com.xpn.xwiki.doc.XWikiDocument.merge(XWikiDocument.java:8503) at org.xwiki.workflowpublication.internal.DefaultPublicationWorkflow.copyContentsToNewVersion(DefaultPublicationWorkflow.java:959) at org.xwiki.workflowpublication.internal.DefaultPublicationWorkflow.publish(DefaultPublicationWorkflow.java:699) at org.xwiki.workflowpublication.internal.PublicationWorkflowService.publish(PublicationWorkflowService.java:291) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.doInvoke(UberspectImpl.java:395) at org.apache.velocity.util.introspection.UberspectImpl$VelMethodImpl.invoke(UberspectImpl.java:384) at org.apache.velocity.runtime.parser.node.ASTMethod.execute(ASTMethod.java:173) ... 126 more