Author: scheu Date: Tue May 4 21:00:24 2010 New Revision: 941042 URL: http://svn.apache.org/viewvc?rev=941042&view=rev Log: AXIS2-4702 Contributor:Rich Scheuerle Kudos to Tom Link for informing of this problem.
Added code to properly set and reset the JAXB_ENCODING. Added a test case to validate the code. Modified: axis/axis2/java/core/trunk/modules/jaxws-integration/pom.xml axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/jaxb/string/JAXBStringUTF8Tests.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Modified: axis/axis2/java/core/trunk/modules/jaxws-integration/pom.xml URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/pom.xml?rev=941042&r1=941041&r2=941042&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws-integration/pom.xml (original) +++ axis/axis2/java/core/trunk/modules/jaxws-integration/pom.xml Tue May 4 21:00:24 2010 @@ -1410,6 +1410,8 @@ <include>**/SOAP12DispatchTest.java</include> <include>**/OMElementDispatchTest.java</include> <include>**/JAXBContextTest.java</include> + <include>**/JAXBStringUTF16Tests.java</include> + <include>**/JAXBStringUTF8Tests.java</include> <include>**/StringProviderTests.java</include> <include>**/SOAPFaultProviderTests.java</include> Modified: axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/jaxb/string/JAXBStringUTF8Tests.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/jaxb/string/JAXBStringUTF8Tests.java?rev=941042&r1=941041&r2=941042&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/jaxb/string/JAXBStringUTF8Tests.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws-integration/test/org/apache/axis2/jaxws/jaxb/string/JAXBStringUTF8Tests.java Tue May 4 21:00:24 2010 @@ -27,6 +27,16 @@ public class JAXBStringUTF8Tests extends runTest("a simple string"); } + public void testSimpleStringSwitchEncoding() throws Exception { + String input = "a simple string"; + String output = "a simple string"; + + // Run with different encodings to verify proper processing. + runTestWithEncoding(input, output, null); // no encoding means to use default, UTF-8 + runTestWithEncoding(input, output, "UTF-16"); // Make a call with UTF-16 + runTestWithEncoding(input, output, null); // now try again...using default, UTF-8 + } + public void testStringWithApostrophes() throws Exception { runTest("this isn't a simple string"); } @@ -74,16 +84,20 @@ public class JAXBStringUTF8Tests extends } private void runTestWithUTF8(String input, String output) { - runTestWithEncoding(input, output); + runTestWithEncoding(input, output, null); // no encoding means to use default, UTF-8 } - private void runTestWithEncoding(String input, String output) { + private void runTestWithEncoding(String input, String output, String encoding) { TestLogger.logger.debug("Test : " + getName()); try { JAXBStringPortType myPort = (new JAXBStringService()).getJAXBStringPort(); BindingProvider p = (BindingProvider) myPort; p.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, axisEndpoint); + if (encoding != null) { + p.getRequestContext().put(org.apache.axis2.Constants.Configuration.CHARACTER_SET_ENCODING, encoding); + } + Echo request = new Echo(); request.setArg(input); EchoResponse response = myPort.echoString(request); @@ -94,4 +108,5 @@ public class JAXBStringUTF8Tests extends fail(); } } + } Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java?rev=941042&r1=941041&r2=941042&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/datasource/jaxb/JAXBDSContext.java Tue May 4 21:00:24 2010 @@ -371,12 +371,33 @@ public class JAXBDSContext { Marshaller m = JAXBUtils.getJAXBMarshaller(jbc); if (writer instanceof MTOMXMLStreamWriter && ((MTOMXMLStreamWriter) writer).getOutputFormat() != null) { String encoding = ((MTOMXMLStreamWriter) writer).getOutputFormat().getCharSetEncoding(); - if (encoding != null && !"UTF-8".equalsIgnoreCase(encoding)) { + + String marshallerEncoding = (String) m.getProperty(Marshaller.JAXB_ENCODING); + + // Make sure that the marshaller respects the encoding of the message. + // This is accomplished by setting the encoding on the Marshaller's JAXB_ENCODING property. + if (encoding == null && marshallerEncoding == null) { if (log.isDebugEnabled()) { - log.debug("Setting the Marshaller.JAXB_ENCODING to " + encoding); + log.debug("The encoding and the marshaller's JAXB_ENCODING are both set to the default (UTF-8)"); + } + } else { + // Must set the encoding to an actual String to set it on the Marshaller + if (encoding == null) { + encoding = "UTF-8"; + } + if (!encoding.equalsIgnoreCase(marshallerEncoding)) { + if (log.isDebugEnabled()) { + log.debug("The Marshaller.JAXB_ENCODING is " + marshallerEncoding); + log.debug("The Marshaller.JAXB_ENCODING is changed to the message encoding " + + encoding); + } + m.setProperty(Marshaller.JAXB_ENCODING, encoding); + } else { + if (log.isDebugEnabled()) { + log.debug("The encoding and the marshaller's JAXB_ENCODING are both set to:" + + marshallerEncoding); + } } - - m.setProperty(Marshaller.JAXB_ENCODING, encoding); } } Modified: axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java?rev=941042&r1=941041&r2=941042&view=diff ============================================================================== --- axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java (original) +++ axis/axis2/java/core/trunk/modules/jaxws/src/org/apache/axis2/jaxws/message/databinding/JAXBUtils.java Tue May 4 21:00:24 2010 @@ -33,6 +33,7 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.JAXBIntrospector; import javax.xml.bind.Marshaller; +import javax.xml.bind.PropertyException; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlType; import javax.xml.ws.Holder; @@ -721,8 +722,9 @@ public class JAXBUtils { } /** - * releaseJAXBMarshalller Do not call this method if an exception occurred while using the - * Marshaller. We object my be in an invalid state. + * releaseJAXBMarshalller + * Do not call this method if an exception occurred while using the + * Marshaller. We don't want an object in an invalid state. * * @param context JAXBContext * @param marshaller Marshaller @@ -734,8 +736,20 @@ public class JAXBUtils { log.debug(" JAXBContext = " + JavaUtils.getObjectIdentity(context)); } if (ENABLE_MARSHALL_POOLING) { - marshaller.setAttachmentMarshaller(null); - mpool.put(context, marshaller); + // Make sure to clear any state or properties + + try { + marshaller.setAttachmentMarshaller(null); + // Set the JAXB_ENCODING back to the default value UTF-8 + marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); + mpool.put(context, marshaller); + } catch (Throwable t) { + // Log the problem, and continue without pooling + if (log.isDebugEnabled()) { + log.debug("The following exception is ignored. Processing continues " + t); + } + } + } }