This issue has been created
There is 1 update.
 
 
XWiki Platform / cid:jira-generated-image-avatar-3e2028ce-a40e-47bd-b721-3ed3c698307c XWIKI-23478 Open

Calling services.wysiwyg.fromAnnotatedXHTML from jobMacro crash npe

 
View issue   ·   Add comment
 

Issue created

 
cid:jira-generated-image-avatar-d652cc88-fc6b-4271-a19f-5e26e1d6cd94 Josué Tille created this issue on 22/Aug/25 12:14
 
Summary: Calling services.wysiwyg.fromAnnotatedXHTML from jobMacro crash npe
Issue Type: cid:jira-generated-image-avatar-3e2028ce-a40e-47bd-b721-3ed3c698307c Bug
Affects Versions: 17.4.2, 17.6.0
Assignee: Unassigned
Components: Scripting
Created: 22/Aug/25 12:14
Priority: cid:jira-generated-image-static-major-d539ab6b-abb6-4e07-ac52-63db2966a413 Major
Reporter: Josué Tille
Description:

Step to reproduce:

  • Install the job-macro extension
  • create a page with this content:
{{job groupId="testAnnotated" id="testAnnotated" start="true"}}
{{groovy}}
logger = services.logging.getLogger(doc.fullName);
services.logging.setLevel(doc.fullName, org.xwiki.logging.LogLevel.INFO);
logger.info("calling")
try {
  def x = services.wysiwyg.fromAnnotatedXHTML("<p>Hello</p>", 'xwiki/2.1')
  logger.info("OK")
} catch (Exception e) {
  logger.error('Unhandled exception', e)
}
{{/groovy}}
{{/job}}

Expected: the macro work and log "OK"

Currently: it fail with this error:

Cannot invoke "org.xwiki.container.servlet.ServletSession.getSession()" because the return value of "org.xwiki.container.Container.getSession()" is null
class java.lang.NullPointerException: Cannot invoke "org.xwiki.container.servlet.ServletSession.getSession()" because the return value of "org.xwiki.container.Container.getSession()" is null
    at org.xwiki.store.filesystem.internal.DefaultTemporaryAttachmentSessionsManager.getSession(DefaultTemporaryAttachmentSessionsManager.java:78)
    at org.xwiki.store.filesystem.internal.DefaultTemporaryAttachmentSessionsManager.getOrCreateSession(DefaultTemporaryAttachmentSessionsManager.java:84)
    at org.xwiki.store.filesystem.internal.DefaultTemporaryAttachmentSessionsManager.getUploadedAttachments(DefaultTemporaryAttachmentSessionsManager.java:162)
    at org.xwiki.wysiwyg.script.WysiwygEditorScriptService.injectTemoraryAttachments(WysiwygEditorScriptService.java:422)
    at org.xwiki.wysiwyg.script.WysiwygEditorScriptService.createSecurityDocument(WysiwygEditorScriptService.java:415)
    at org.xwiki.wysiwyg.script.WysiwygEditorScriptService.fromAnnotatedXHTML(WysiwygEditorScriptService.java:376)
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
    at Script59.run(Script59.groovy:5)
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:331)
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:161)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.eval(AbstractJSR223ScriptMacro.java:338)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.evaluateBlock(AbstractJSR223ScriptMacro.java:238)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.evaluateBlock(AbstractJSR223ScriptMacro.java:193)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.evaluateBlock(AbstractJSR223ScriptMacro.java:56)
    at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:182)
    at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:58)
    at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transform(MacroTransformation.java:441)
    at org.xwiki.rendering.internal.transformation.DefaultRenderingContext.transformInContext(DefaultRenderingContext.java:183)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.performTransformation(DefaultMacroContentParser.java:212)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.createXDOM(DefaultMacroContentParser.java:170)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.parse(DefaultMacroContentParser.java:117)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.parse(DefaultMacroContentParser.java:94)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.parse(DefaultMacroContentParser.java:87)
    at wiki:xwiki//org.xwiki.contrib.jobmacro.internal.JobMacroJob.runInternal(JobMacroJob.java:154)
    at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:246)
    at wiki:xwiki//org.xwiki.contrib.jobmacro.internal.JobMacroJob.run(JobMacroJob.java:120)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
 
 

1 update

 
cid:jira-generated-image-avatar-d652cc88-fc6b-4271-a19f-5e26e1d6cd94 Changes by Josué Tille on 22/Aug/25 12:16
 
Description: Step to reproduce:
* Install the job-macro extension
* create a page with this content:

{code:java}
{{job groupId="testAnnotated" id="testAnnotated" start="true"}}
{{groovy}}
logger = services.logging.getLogger(doc.fullName);
services.logging.setLevel(doc.fullName, org.xwiki.logging.LogLevel.INFO);
logger.info("calling")
try {
  def x = services.wysiwyg.fromAnnotatedXHTML("<p>Hello</p>", 'xwiki/2.1')
  logger.info("OK")
} catch (Exception e) {
  logger.error('Unhandled exception', e)
}
{{/groovy}}
{{/job}}
{code}
Expected: the macro work and log "OK"

Currently: it fail with this error:
{code:java}
Cannot invoke "org.xwiki.container.servlet.ServletSession.getSession()" because the return value of "org.xwiki.container.Container.getSession()" is null
class java.lang.NullPointerException: Cannot invoke "org.xwiki.container.servlet.ServletSession.getSession()" because the return value of "org.xwiki.container.Container.getSession()" is null
    at org.xwiki.store.filesystem.internal.DefaultTemporaryAttachmentSessionsManager.getSession(DefaultTemporaryAttachmentSessionsManager.java:78)
    at org.xwiki.store.filesystem.internal.DefaultTemporaryAttachmentSessionsManager.getOrCreateSession(DefaultTemporaryAttachmentSessionsManager.java:84)
    at org.xwiki.store.filesystem.internal.DefaultTemporaryAttachmentSessionsManager.getUploadedAttachments(DefaultTemporaryAttachmentSessionsManager.java:162)
    at org.xwiki.wysiwyg.script.WysiwygEditorScriptService.injectTemoraryAttachments(WysiwygEditorScriptService.java:422)
    at org.xwiki.wysiwyg.script.WysiwygEditorScriptService.createSecurityDocument(WysiwygEditorScriptService.java:415)
    at org.xwiki.wysiwyg.script.WysiwygEditorScriptService.fromAnnotatedXHTML(WysiwygEditorScriptService.java:376)
    at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:321)
    at Script59.run(Script59.groovy:5)
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:331)
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:161)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.eval(AbstractJSR223ScriptMacro.java:338)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.evaluateBlock(AbstractJSR223ScriptMacro.java:238)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.evaluateBlock(AbstractJSR223ScriptMacro.java:193)
    at org.xwiki.rendering.macro.script.AbstractJSR223ScriptMacro.evaluateBlock(AbstractJSR223ScriptMacro.java:56)
    at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:182)
    at org.xwiki.rendering.macro.script.AbstractScriptMacro.execute(AbstractScriptMacro.java:58)
    at org.xwiki.rendering.internal.transformation.macro.MacroTransformation.transform(MacroTransformation.java:441)
    at org.xwiki.rendering.internal.transformation.DefaultRenderingContext.transformInContext(DefaultRenderingContext.java:183)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.performTransformation(DefaultMacroContentParser.java:212)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.createXDOM(DefaultMacroContentParser.java:170)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.parse(DefaultMacroContentParser.java:117)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.parse(DefaultMacroContentParser.java:94)
    at org.xwiki.rendering.internal.macro.DefaultMacroContentParser.parse(DefaultMacroContentParser.java:87)
    at wiki:xwiki//org.xwiki.contrib.jobmacro.internal.JobMacroJob.runInternal(JobMacroJob.java:154)
    at org.xwiki.job.AbstractJob.runInContext(AbstractJob.java:246)
    at wiki:xwiki//org.xwiki.contrib.jobmacro.internal.JobMacroJob.run(JobMacroJob.java:120)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
    at java.base/java.lang.Thread.run(Thread.java:840)
{code}


Note, calling from a page this way work:
{code}
{{groovy}}
services.wysiwyg.fromAnnotatedXHTML("<p>Hello</p>", 'xwiki/2.1')
{{/groovy}}
{code}

So the issue is probably related to the context in the job-macro.