[
https://issues.apache.org/jira/browse/XALANJ-2374?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16721364#comment-16721364
]
Heiko Selber commented on XALANJ-2374:
--------------------------------------
This is the patch that we applied in a local version of xalan 2.7.2
{code:java}
diff -p MethodResolver.java MethodResolver-mod.java
*** MethodResolver.java 2018-12-14 13:25:37.057962149 +0100
--- MethodResolver-mod.java 2018-12-14 13:38:38.730717148 +0100
*************** public class MethodResolver
*** 708,713 ****
--- 708,721 ----
if((javaClass == java.lang.String.class) ||
(javaClass == java.lang.Object.class))
return xobj.str();
+ // =================================================
+ // BUG FIX START
+ // for https://issues.apache.org/jira/browse/XALANJ-2374
+ // needed for Java 1.8.0_102
+ else if(javaClass == java.lang.CharSequence.class)
+ return xobj.str();
+ // BUG FIX END
+ // =================================================
else if(javaClass == Character.TYPE)
{
String str = xobj.str();
{code}
Sorry I let this issue unanswered for so long...
> MethodResolver not handling CharSequence class conversion
> ---------------------------------------------------------
>
> Key: XALANJ-2374
> URL: https://issues.apache.org/jira/browse/XALANJ-2374
> Project: XalanJ2
> Issue Type: Bug
> Environment: Windows Sun JRE 1.5.0.6 or higher
> HPUnix JRE 1.5.0 or higher
> Reporter: Alex
> Priority: Major
>
> When using Java extensions with StringBuffer class, the MethodResolver picks
> a method whose argument types are not converted properly. This was noticed
> in the new versions of JVM due to the order at which they return all methods
> available for a given class. Since the MethodResolver scores the methods,
> the one with the lowest score wins. However, the method chosen is different
> depending on the order in which JVM returns the available methods. In the
> later versions, the StringBuffer.append(String) operation will actually find
> the StringBuffer.append(CharSequence) instead. This is ok but the "convert"
> method in the MethodResolver does not handle this type and therefore
> generates a "Double" type. This causes an "Argument Type Mismatch" exception
> when the "append" method is called. I have fixed the code by adding another
> "elseif" statement in the "convert" function (see the CharSequence section):
> case XObject.CLASS_STRING:
> {
> if((javaClass == java.lang.String.class) ||
> (javaClass == java.lang.Object.class))
> return xobj.str();
> else if(javaClass == java.lang.CharSequence.class)
> return xobj.str();
> else if(javaClass == Character.TYPE)
> {
> String str = xobj.str();
> if(str.length() > 0)
> return new Character(str.charAt(0));
> else
> return null; // ??
> }
> else if(javaClass == Boolean.TYPE)
> return new Boolean(xobj.bool());
> else
> {
> return convertDoubleToNumber(xobj.num(), javaClass);
> }
> }
> The XSLT stylesheet that uses this code is the following:
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="1.0" xmlns:xalan="http://xml.apache.org/xalan"
> xmlns:lxslt="http://xml.apache.org/xslt" xmlns:my-ext="ext2"
> xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java"
> extension-element-prefixes="my-ext">
> <xsl:template match="/">
> <xsl:variable name="Destination"
> select="java:java.lang.StringBuffer.new('ABC')"/>
> <xsl:variable name="Str"
> select="java:java.lang.String.new('DB')"/>
> <xsl:variable name="b3"
> select="java:append($Destination,$Str)"/>
> <output>
> <xsl:value-of select="java:toString($Destination)"/>
> </output>
> </xsl:template>
> </xsl:stylesheet>
> If the code change is not made, the following exception results (again, this
> is only in the newer JVM versions as the older ones return the
> StringBuffer.append(String) before the StringBuffer.append(CharSequence) and
> thus the correct method is found:
> javax.xml.transform.TransformerException: java.lang.IllegalArgumentException:
> argument type mismatch
> at
> org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:403)
> at
> org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:227)
> at
> org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:460)
> at
> org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:196)
> at org.apache.xpath.XPath.execute(XPath.java:308)
> at
> org.apache.xalan.templates.ElemVariable.getValue(ElemVariable.java:323)
> at
> org.apache.xalan.templates.ElemVariable.execute(ElemVariable.java:291)
> at
> org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2324)
> at
> org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2147)
> at
> org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1203)
> at
> org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:665)
> at
> org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1119)
> at
> org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1097)
> at com.exln.stylus.CXalanDriver.doProcessing(CXalanDriver.java:108)
> at com.exln.stylus.CProcessorDriver.process(CProcessorDriver.java:55)
> Caused by: java.lang.IllegalArgumentException: argument type mismatch
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at
> org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:389)
> ... 14 more
> ---------
> java.lang.IllegalArgumentException: argument type mismatch
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
> at java.lang.reflect.Method.invoke(Unknown Source)
> at
> org.apache.xalan.extensions.ExtensionHandlerJavaPackage.callFunction(ExtensionHandlerJavaPackage.java:389)
> at
> org.apache.xalan.extensions.ExtensionsTable.extFunction(ExtensionsTable.java:227)
> at
> org.apache.xalan.transformer.TransformerImpl.extFunction(TransformerImpl.java:460)
> at
> org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:196)
> at org.apache.xpath.XPath.execute(XPath.java:308)
> at
> org.apache.xalan.templates.ElemVariable.getValue(ElemVariable.java:323)
> at
> org.apache.xalan.templates.ElemVariable.execute(ElemVariable.java:291)
> at
> org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2324)
> at
> org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2147)
> at
> org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1203)
> at
> org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:665)
> at
> org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1119)
> at
> org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1097)
> at com.exln.stylus.CXalanDriver.doProcessing(CXalanDriver.java:108)
> at com.exln.stylus.CProcessorDriver.process(CProcessorDriver.java:55)
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]