Return-Path: Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: (qmail 6367 invoked from network); 31 Oct 2008 06:10:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 31 Oct 2008 06:10:30 -0000 Received: (qmail 62822 invoked by uid 500); 31 Oct 2008 06:10:36 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 62711 invoked by uid 500); 31 Oct 2008 06:10:35 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 62702 invoked by uid 99); 31 Oct 2008 06:10:35 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 30 Oct 2008 23:10:35 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 31 Oct 2008 06:09:28 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 48BB12388961; Thu, 30 Oct 2008 23:10:09 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r709357 - in /cxf/branches/2.1.x-fixes: ./ rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/ rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/ Date: Fri, 31 Oct 2008 06:10:08 -0000 To: commits@cxf.apache.org From: ningjiang@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081031061009.48BB12388961@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: ningjiang Date: Thu Oct 30 23:10:08 2008 New Revision: 709357 URL: http://svn.apache.org/viewvc?rev=709357&view=rev Log: Merged revisions 709353-709354 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r709353 | ningjiang | 2008-10-31 13:35:50 +0800 (Fri, 31 Oct 2008) | 1 line CXF-1749 quick fix for JMS Encoding issue ........ r709354 | ningjiang | 2008-10-31 13:49:18 +0800 (Fri, 31 Oct 2008) | 1 line CXF-1749 update the messages.properties ........ Modified: cxf/branches/2.1.x-fixes/ (props changed) cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSDestination.java cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/Messages.properties cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSDestinationTest.java cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSUtilsTest.java Propchange: cxf/branches/2.1.x-fixes/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Thu Oct 30 23:10:08 2008 @@ -1 +1 @@ -/cxf/trunk:686333-686363,686764,686820,687096,687194,687363,687387,687463,687543,687722,687798,687814,687817,687891,687910,687914,688086,688102,688133,688596,688735,688870,689572,689596,689855,689924,690067,690289,691246,691271,691295,691338,691355,691488,691602,691646,691706,691728,692116,692157,692310,692466,692499,693653,693819,694179,694263,694417,694716,694744,694747,694795,694869,694981,694987,694993,695041,695096,695396,695484,695537,695552,695561,695619,695684,695835,695840,695868,695935,695977,696016,696094,696433,696720,697085,697868,698128,699289,700261,700507,700602,700981,701316,701783,701830,701862,702187,702205-702248,702267,702547,702561,702580,702602,702609,702616,702653,702656,702957,703191,703239,703309,703501,703513,703548,704584,704937,704997,705150,705235,705274,705340,705446,705548,705614,705692,705708,706482,706631,706675,706900,706909,707034,707089,707100 +/cxf/trunk:686333-686363,686764,686820,687096,687194,687363,687387,687463,687543,687722,687798,687814,687817,687891,687910,687914,688086,688102,688133,688596,688735,688870,689572,689596,689855,689924,690067,690289,691246,691271,691295,691338,691355,691488,691602,691646,691706,691728,692116,692157,692310,692466,692499,693653,693819,694179,694263,694417,694716,694744,694747,694795,694869,694981,694987,694993,695041,695096,695396,695484,695537,695552,695561,695619,695684,695835,695840,695868,695935,695977,696016,696094,696433,696720,697085,697868,698128,699289,700261,700507,700602,700981,701316,701783,701830,701862,702187,702205-702248,702267,702547,702561,702580,702602,702609,702616,702653,702656,702957,703191,703239,703309,703501,703513,703548,704584,704937,704997,705150,705235,705274,705340,705446,705548,705614,705692,705708,706482,706631,706675,706900,706909,707034,707089,707100,709353-709354 Propchange: cxf/branches/2.1.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java?rev=709357&r1=709356&r2=709357&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java (original) +++ cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConduit.java Thu Oct 30 23:10:08 2008 @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; @@ -174,21 +175,26 @@ Message inMessage = new MessageImpl(); exchange.setInMessage(inMessage); LOG.log(Level.FINE, "client received reply: ", jmsMessage); - JMSUtils.populateIncomingContext(jmsMessage, inMessage, JMSConstants.JMS_CLIENT_RESPONSE_HEADERS); - byte[] response = JMSUtils.retrievePayload(jmsMessage); - LOG.log(Level.FINE, "The Response Message payload is : [" + response + "]"); - inMessage.setContent(InputStream.class, new ByteArrayInputStream(response)); - - if (exchange.isSynchronous()) { - synchronized (exchange) { - exchange.put(CORRELATED, Boolean.TRUE); - exchange.notifyAll(); + try { + JMSUtils.populateIncomingContext(jmsMessage, inMessage, JMSConstants.JMS_CLIENT_RESPONSE_HEADERS); + + byte[] response = JMSUtils.retrievePayload(jmsMessage, (String)inMessage.get(Message.ENCODING)); + LOG.log(Level.FINE, "The Response Message payload is : [" + response + "]"); + inMessage.setContent(InputStream.class, new ByteArrayInputStream(response)); + + if (exchange.isSynchronous()) { + synchronized (exchange) { + exchange.put(CORRELATED, Boolean.TRUE); + exchange.notifyAll(); + } } - } - //REVISIT: put on a workqueue? - if (incomingObserver != null) { - incomingObserver.onMessage(exchange.getInMessage()); + //REVISIT: put on a workqueue? + if (incomingObserver != null) { + incomingObserver.onMessage(exchange.getInMessage()); + } + } catch (UnsupportedEncodingException ex) { + getLogger().log(Level.WARNING, "can't get the right encoding information " + ex); } } Modified: cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSDestination.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSDestination.java?rev=709357&r1=709356&r2=709357&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSDestination.java (original) +++ cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSDestination.java Thu Oct 30 23:10:08 2008 @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.UnsupportedEncodingException; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; @@ -158,14 +159,13 @@ public void onMessage(javax.jms.Message message) { try { getLogger().log(Level.FINE, "server received request: ", message); - - byte[] request = JMSUtils.retrievePayload(message); + // Build CXF message from JMS message + MessageImpl inMessage = new MessageImpl(); + JMSUtils.populateIncomingContext(message, inMessage, JMSConstants.JMS_SERVER_REQUEST_HEADERS); + + byte[] request = JMSUtils.retrievePayload(message, (String)inMessage.get(Message.ENCODING)); getLogger().log(Level.FINE, "The Request Message is [ " + request + "]"); - - // Build CXF message from JMS message - MessageImpl inMessage = new MessageImpl(); inMessage.setContent(InputStream.class, new ByteArrayInputStream(request)); - JMSUtils.populateIncomingContext(message, inMessage, JMSConstants.JMS_SERVER_REQUEST_HEADERS); inMessage.put(JMSConstants.JMS_SERVER_RESPONSE_HEADERS, new JMSMessageHeadersType()); inMessage.put(JMSConstants.JMS_REQUEST_MESSAGE, message); inMessage.setDestination(this); @@ -174,6 +174,8 @@ // handle the incoming message incomingObserver.onMessage(inMessage); + } catch (UnsupportedEncodingException ex) { + getLogger().log(Level.WARNING, "can't get the right encoding information. " + ex); } finally { BusFactory.setThreadDefaultBus(null); } Modified: cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java?rev=709357&r1=709356&r2=709357&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java (original) +++ cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java Thu Oct 30 23:10:08 2008 @@ -19,6 +19,7 @@ package org.apache.cxf.transport.jms; +import java.io.UnsupportedEncodingException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; @@ -28,6 +29,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; import java.util.logging.Logger; import javax.jms.BytesMessage; @@ -39,6 +41,7 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.helpers.HttpHeaderHelper; import org.springframework.jms.support.JmsUtils; import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.jms.support.converter.SimpleMessageConverter102; @@ -97,9 +100,12 @@ * Extract the payload of an incoming message. * * @param message the incoming message + * @param encoding the message encoding * @return the message payload as byte[] + * @throws UnsupportedEncodingException */ - public static byte[] retrievePayload(Message message) { + public static byte[] retrievePayload(Message message, String encoding) + throws UnsupportedEncodingException { Object converted; try { converted = new SimpleMessageConverter102().fromMessage(message); @@ -109,7 +115,12 @@ throw JmsUtils.convertJmsAccessException(e); } if (converted instanceof String) { - return ((String)converted).getBytes(); // TODO encoding + if (encoding != null) { + return ((String)converted).getBytes(encoding); + } else { + // Using the UTF-8 encoding as default + return ((String)converted).getBytes("UTF-8"); + } } else if (converted instanceof byte[]) { return (byte[])converted; } else { @@ -118,7 +129,8 @@ } public static void populateIncomingContext(javax.jms.Message message, - org.apache.cxf.message.Message inMessage, String headerType) { + org.apache.cxf.message.Message inMessage, String headerType) + throws UnsupportedEncodingException { try { JMSMessageHeadersType headers = null; headers = (JMSMessageHeadersType)inMessage.get(headerType); @@ -150,13 +162,10 @@ if (name.equals(org.apache.cxf.message.Message.CONTENT_TYPE) || name.equals(JMSConstants.JMS_CONTENT_TYPE) && val != null) { inMessage.put(org.apache.cxf.message.Message.CONTENT_TYPE, val); + // set the message encoding + inMessage.put(org.apache.cxf.message.Message.ENCODING, getEncoding(val)); } - - protHeaders.put(name, Collections.singletonList(val)); - if (name.equals(org.apache.cxf.message.Message.CONTENT_TYPE) - || name.equals(JMSConstants.JMS_CONTENT_TYPE) && val != null) { - inMessage.put(org.apache.cxf.message.Message.CONTENT_TYPE, val); - } + } inMessage.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, protHeaders); } catch (JMSException ex) { @@ -164,6 +173,29 @@ } } + static String getEncoding(String ct) throws UnsupportedEncodingException { + String contentType = ct.toLowerCase(); + String enc = null; + + String[] tokens = contentType.split(";"); + for (String token : tokens) { + int index = token.indexOf("charset="); + if (index >= 0) { + enc = token.substring(index + 8); + } + } + + String normalizedEncoding = HttpHeaderHelper.mapCharset(enc); + if (normalizedEncoding == null) { + String m = new org.apache.cxf.common.i18n.Message("INVALID_ENCODING_MSG", + LOG, new Object[] {enc}).toString(); + LOG.log(Level.WARNING, m); + throw new UnsupportedEncodingException(m); + } + + return normalizedEncoding; + } + protected static void addProtocolHeaders(Message message, Map> headers) throws JMSException { if (headers == null) { @@ -191,7 +223,18 @@ } public static void addContentTypeToProtocolHeader(org.apache.cxf.message.Message message) { - String contentType = (String)message.get(org.apache.cxf.message.Message.CONTENT_TYPE); + String contentType = (String)message.get(org.apache.cxf.message.Message.CONTENT_TYPE); + String enc = (String) message.get(org.apache.cxf.message.Message.ENCODING); + // add the encoding information + if (null != contentType) { + if (enc != null && contentType.indexOf("charset=") == -1) { + contentType = contentType + "; charset=" + enc; + } + } else if (enc != null) { + contentType = "text/xml; charset=" + enc; + } else { + contentType = "text/xml"; + } // Retrieve or create protocol headers Map> headers = CastUtils.cast((Map)message Modified: cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/Messages.properties URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/Messages.properties?rev=709357&r1=709356&r2=709357&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/Messages.properties (original) +++ cxf/branches/2.1.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/Messages.properties Thu Oct 30 23:10:08 2008 @@ -22,4 +22,5 @@ INSUFFICIENT_CONFIGURATION_CONDUIT = Insufficient configuration for Conduit. Did you configure a and set the jndiConnectionFactoryName ? INSUFFICIENT_CONFIGURATION_DESTINATION = Insufficient configuration for Destination. Did you configure a and set the jndiConnectionFactoryName ? JMSCONFIGFEATURE_ONLY_JMS = You can only use JMSConfigFeature with the jms transport -JMSCONFIG_REQUIRED = You have to set the property jmsConfig \ No newline at end of file +JMSCONFIG_REQUIRED = You have to set the property jmsConfig +INVALID_ENCODING_MSG = Invalid character set {0} in the message. \ No newline at end of file Modified: cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSDestinationTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSDestinationTest.java?rev=709357&r1=709356&r2=709357&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSDestinationTest.java (original) +++ cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSDestinationTest.java Thu Oct 30 23:10:08 2008 @@ -198,6 +198,7 @@ header.setJMSPriority(1); header.setTimeToLive(1000); outMessage.put(JMSConstants.JMS_CLIENT_REQUEST_HEADERS, header); + outMessage.put(Message.ENCODING, "US-ASCII"); } private void verifyReceivedMessage(Message inMessage) { @@ -210,12 +211,16 @@ ex.printStackTrace(); } String reponse = IOUtils.newStringFromBytes(bytes); - assertEquals("The reponse date should be equals", reponse, "HelloWorld"); + assertEquals("The reponse date should be equal", reponse, "HelloWorld"); } private void verifyRequestResponseHeaders(Message inMessage, Message outMessage) { JMSMessageHeadersType outHeader = (JMSMessageHeadersType)outMessage .get(JMSConstants.JMS_CLIENT_REQUEST_HEADERS); + String inEncoding = (String) inMessage.get(Message.ENCODING); + String outEncoding = (String) outMessage.get(Message.ENCODING); + + assertEquals("The message encoding should be equal", inEncoding, outEncoding); JMSMessageHeadersType inHeader = (JMSMessageHeadersType)inMessage .get(JMSConstants.JMS_CLIENT_RESPONSE_HEADERS); @@ -336,6 +341,8 @@ backConduit = destination.getBackChannel(m, null, null); // wait for the message to be got from the conduit Message replyMessage = new MessageImpl(); + // copy the message encoding + replyMessage.put(Message.ENCODING, m.get(Message.ENCODING)); sendoutMessage(backConduit, replyMessage, true); } catch (Exception e) { throw new RuntimeException(e); Modified: cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSUtilsTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSUtilsTest.java?rev=709357&r1=709356&r2=709357&view=diff ============================================================================== --- cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSUtilsTest.java (original) +++ cxf/branches/2.1.x-fixes/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/JMSUtilsTest.java Thu Oct 30 23:10:08 2008 @@ -19,6 +19,8 @@ package org.apache.cxf.transport.jms; +import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.util.Properties; import javax.naming.Context; @@ -46,5 +48,22 @@ assertTrue("Environment should not be empty", env.size() > 0); assertTrue("Environemnt should contain NamingBatchSize property", env.get(Context.BATCHSIZE) != null); } + + @Test + public void testGetEncoding() throws IOException { + assertEquals("Get the wrong encoding", JMSUtils.getEncoding("text/xml; charset=utf-8"), "UTF-8"); + assertEquals("Get the wrong encoding", JMSUtils.getEncoding("text/xml"), "UTF-8"); + assertEquals("Get the wrong encoding", JMSUtils.getEncoding("text/xml; charset=GBK"), "GBK"); + try { + JMSUtils.getEncoding("text/xml; charset=asci"); + fail("Expect the exception here"); + } catch (Exception ex) { + assertTrue("we should get the UnsupportedEncodingException here", + ex instanceof UnsupportedEncodingException); + } + + + + } }