镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Make XsltStepTest DOCTYPE check locale-independent - #482

Open
e210 wants to merge 1 commit into
OpenIntegrationEngine:mainfrom
e210:fix/issue-476-xslt-doctype-locale
Open

e210 wants to merge 1 commit into
OpenIntegrationEngine:mainfrom
e210:fix/issue-476-xslt-doctype-locale

Conversation

@e210

@e210 e210 commented Oct 10, 2026

Copy link
Copy Markdown
Contributor

The JDK kindly translates "DOCTYPE is disallowed", so on an Italian machine the test got "DOCTYPE non è consentito" and gave up. Now it checks for disallow-doctype-decl, the feature URI that every translation keeps as is. No locale forcing needed.

Passes on it, tr, en and ja.

Part of #476 (the CI scenario is still to come)

…gine#476)

The JDK translates the "DOCTYPE is disallowed" message, so the test failed
on non-English locales. Check the feature URI instead, which appears in
every translation.

Signed-off-by: Ezio Caffi <ezio.caffi@gmail.com>
@github-actions

Copy link
Copy Markdown

Test Results

128 files  ±0  128 suites  ±0   3m 9s ⏱️ +44s
729 tests ±0  729 ✅ ±0  0 💤 ±0  0 ❌ ±0 
819 runs  ±0  813 ✅ ±0  6 💤 ±0  0 ❌ ±0 

Results for commit 40e9746. ± Comparison against base commit a13e6af.

@e210
e210 marked this pull request as ready for review October 10, 2026 21:49
@NicoPiel

Copy link
Copy Markdown
Contributor

Could you also require the parse error itself? For example:

    String s = String.valueOf(e);
    assertTrue(s, s.contains("SAXParseException") && s.contains("disallow-doctype-decl"));

@tonygermano

Copy link
Copy Markdown
Member

Could you also require the parse error itself? For example:

    String s = String.valueOf(e);
    assertTrue(s, s.contains("SAXParseException") && s.contains("disallow-doctype-decl"));

@NicoPiel This is the stack trace (in French). The actual exception is a javax.xml.transform.TransformerException, but since the test runs in rhino it's wrapped. If there is a SAXParseException, it's nested so deep that it doesn't fit in the stack trace. I think the solution in this PR is acceptable.

org.mozilla.javascript.WrappedException: Wrapped javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: DOCTYPE n'est pas autorisé lorsque la fonctionnalité "http://apache.org/xml/features/disallow-doctype-decl" est définie sur True. (d3c45e0b-dc7c-4a84-b838-0af946ad9897#37)
	at app//org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1899)
	at app//org.mozilla.javascript.MemberBox.invoke(MemberBox.java:160)
	at app//org.mozilla.javascript.NativeJavaMethod.call(NativeJavaMethod.java:226)
	at app//org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:1692)
	at app//org.mozilla.javascript.Interpreter.interpret(Interpreter.java:1013)
	at app//org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:109)
	at app//org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:412)
	at app//org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3578)
	at app//org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:121)
	at app//com.mirth.connect.util.JavaScriptTestUtil.testScript(JavaScriptTestUtil.java:88)
	at app//com.mirth.connect.util.JavaScriptTestUtil.testTransformerStep(JavaScriptTestUtil.java:136)
	at app//com.mirth.connect.util.JavaScriptTestUtil.testTransformerStep(JavaScriptTestUtil.java:117)
	at app//com.mirth.connect.util.JavaScriptTestUtil.testTransformerStep(JavaScriptTestUtil.java:113)
	at app//com.mirth.connect.plugins.xsltstep.XsltStepTest.transform(XsltStepTest.java:129)
	at app//com.mirth.connect.plugins.xsltstep.XsltStepTest.transform(XsltStepTest.java:113)
	at app//com.mirth.connect.plugins.xsltstep.XsltStepTest.doctypeIsRejected(XsltStepTest.java:78)
	at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base@17.0.17/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base@17.0.17/java.lang.reflect.Method.invoke(Method.java:569)
	at app//org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
	at app//org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at app//org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
	at app//org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at app//org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at app//org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
	at app//org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
	at app//org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
	at app//org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
	at app//org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
	at app//org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
	at app//org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
	at app//org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
	at app//org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
	at app//org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at app//org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
	at app//org.junit.runners.ParentRunner.run(ParentRunner.java:413)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:112)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
	at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:40)
	at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:54)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:53)
	at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base@17.0.17/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base@17.0.17/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base@17.0.17/java.lang.reflect.Method.invoke(Method.java:569)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92)
	at jdk.proxy1/jdk.proxy1.$Proxy4.processTestClass(Unknown Source)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker$2.run(TestWorker.java:183)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103)
	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63)
	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:72)
	at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
	at app//worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)
Caused by: javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: DOCTYPE n'est pas autorisé lorsque la fonctionnalité "http://apache.org/xml/features/disallow-doctype-decl" est définie sur True.
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:792)
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:395)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:138)
	... 58 more
Caused by: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: DOCTYPE n'est pas autorisé lorsque la fonctionnalité "http://apache.org/xml/features/disallow-doctype-decl" est définie sur True.
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getDOM(TransformerImpl.java:603)
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:782)
	... 64 more
Caused by: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: DOCTYPE n'est pas autorisé lorsque la fonctionnalité "http://apache.org/xml/features/disallow-doctype-decl" est définie sur True.
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager.getDTM(XSLTCDTMManager.java:426)
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager.getDTM(XSLTCDTMManager.java:214)
	at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getDOM(TransformerImpl.java:581)
	... 65 more

@tonygermano tonygermano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I appreciate someone running the builds in other locales and submitting fixes.

Maybe we'll have actual i18n support at some point 😄

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants