Author: ningjiang Date: Thu Jun 21 03:33:15 2012 New Revision: 1352399 URL: http://svn.apache.org/viewvc?rev=1352399&view=rev Log: Merged revisions 1352070 via svnmerge from https://svn.apache.org/repos/asf/cxf/branches/2.6.x-fixes
................ r1352070 | sergeyb | 2012-06-20 20:50:14 +0800 (Wed, 20 Jun 2012) | 9 lines Merged revisions 1352069 via svnmerge from https://svn.apache.org/repos/asf/cxf/trunk ........ r1352069 | sergeyb | 2012-06-20 13:45:59 +0100 (Wed, 20 Jun 2012) | 1 line [CXF-4350] Getting JAX-RS client code to support JMS, applying a patch from Willem with minor updates ........ ................ Modified: cxf/branches/2.5.x-fixes/ (props changed) cxf/branches/2.5.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java cxf/branches/2.5.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSJmsTest.java Propchange: cxf/branches/2.5.x-fixes/ ------------------------------------------------------------------------------ Merged /cxf/trunk:r1352069 Merged /cxf/branches/2.6.x-fixes:r1352070 Propchange: cxf/branches/2.5.x-fixes/ ------------------------------------------------------------------------------ Binary property 'svnmerge-integrated' - no diff available. Modified: cxf/branches/2.5.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java?rev=1352399&r1=1352398&r2=1352399&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java (original) +++ cxf/branches/2.5.x-fixes/api/src/main/java/org/apache/cxf/message/Message.java Thu Jun 21 03:33:15 2012 @@ -32,6 +32,12 @@ import org.apache.cxf.transport.Destinat public interface Message extends StringMap { String TRANSPORT = "org.apache.cxf.transport"; + + /* + * Boolean property which can be used to check that the current request + * is part of the SOAP (JAX-WS) or non-SOAP/REST (JAX-RS) execution context. + */ + String REST_MESSAGE = "org.apache.cxf.rest.message"; /** * Boolean property specifying if the message is a request message. Modified: cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=1352399&r1=1352398&r2=1352399&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original) +++ cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Thu Jun 21 03:33:15 2012 @@ -86,6 +86,7 @@ public abstract class AbstractClient imp protected static final String RESPONSE_CONTEXT = "ResponseContext"; protected static final String KEEP_CONDUIT_ALIVE = "KeepConduitAlive"; + private static final String HTTP_SCHEME = "http"; private static final String PROXY_PROPERTY = "jaxrs.proxy"; private static final Logger LOG = LogUtils.getL7dLogger(AbstractClient.class); private static final ResourceBundle BUNDLE = BundleUtils.getBundle(AbstractClient.class); @@ -692,7 +693,7 @@ public abstract class AbstractClient imp String address = (String)message.get(Message.ENDPOINT_ADDRESS); // custom conduits may override the initial/current address - if (!address.equals(currentURI.toString())) { + if (address.startsWith(HTTP_SCHEME) && !address.equals(currentURI.toString())) { URI baseAddress = URI.create(address); currentURI = calculateNewRequestURI(baseAddress, currentURI, proxy); message.put(Message.ENDPOINT_ADDRESS, currentURI.toString()); @@ -729,10 +730,22 @@ public abstract class AbstractClient imp m.put(Message.REQUESTOR_ROLE, Boolean.TRUE); m.put(Message.INBOUND_MESSAGE, Boolean.FALSE); + m.put(Message.REST_MESSAGE, Boolean.TRUE); + m.put(Message.HTTP_REQUEST_METHOD, httpMethod); m.put(Message.PROTOCOL_HEADERS, headers); - m.put(Message.ENDPOINT_ADDRESS, currentURI.toString()); - m.put(Message.REQUEST_URI, currentURI.toString()); + if (currentURI.isAbsolute()) { + m.put(Message.ENDPOINT_ADDRESS, currentURI.toString()); + } else { + m.put(Message.ENDPOINT_ADDRESS, state.getBaseURI().toString()); + } + + Object requestURIProperty = cfg.getRequestContext().get(Message.REQUEST_URI); + if (requestURIProperty == null) { + m.put(Message.REQUEST_URI, currentURI.toString()); + } else { + m.put(Message.REQUEST_URI, requestURIProperty.toString()); + } m.put(Message.CONTENT_TYPE, headers.getFirst(HttpHeaders.CONTENT_TYPE)); Modified: cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java?rev=1352399&r1=1352398&r2=1352399&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java (original) +++ cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/LocalClientState.java Thu Jun 21 03:33:15 2012 @@ -24,6 +24,7 @@ import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.UriBuilder; +import org.apache.cxf.common.util.StringUtils; import org.apache.cxf.jaxrs.impl.MetadataMap; /** @@ -31,6 +32,7 @@ import org.apache.cxf.jaxrs.impl.Metadat * */ public class LocalClientState implements ClientState { + private static final String HTTP_SCHEME = "http"; private MultivaluedMap<String, String> requestHeaders = new MetadataMap<String, String>(); private MultivaluedMap<String, String> templates; @@ -44,7 +46,12 @@ public class LocalClientState implements public LocalClientState(URI baseURI) { this.baseURI = baseURI; - this.currentBuilder = UriBuilder.fromUri(baseURI); + String scheme = baseURI.getScheme(); + if (!StringUtils.isEmpty(scheme) && scheme.startsWith(HTTP_SCHEME)) { + this.currentBuilder = UriBuilder.fromUri(baseURI); + } else { + this.currentBuilder = UriBuilder.fromUri("/"); + } } public LocalClientState(LocalClientState cs) { Modified: cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1352399&r1=1352398&r2=1352399&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original) +++ cxf/branches/2.5.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Thu Jun 21 03:33:15 2012 @@ -108,6 +108,7 @@ public class JAXRSOutInterceptor extends if (isResponseAlreadyHandled(message)) { return; } + message.put(Message.REST_MESSAGE, Boolean.TRUE); MessageContentsList objs = MessageContentsList.getContentsList(message); if (objs == null || objs.size() == 0) { Modified: cxf/branches/2.5.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java?rev=1352399&r1=1352398&r2=1352399&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java (original) +++ cxf/branches/2.5.x-fixes/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSUtils.java Thu Jun 21 03:33:15 2012 @@ -47,6 +47,7 @@ import org.apache.cxf.common.logging.Log import org.apache.cxf.common.util.SOAPConstants; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.helpers.HttpHeaderHelper; +import org.apache.cxf.message.MessageUtils; import org.apache.cxf.security.SecurityContext; import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor; import org.apache.cxf.transport.jms.spec.JMSSpecConstants; @@ -212,7 +213,10 @@ public final class JMSUtils { // set the message encoding inMessage.put(org.apache.cxf.message.Message.ENCODING, getEncoding(val)); } - + if (name.equals(org.apache.cxf.message.Message.RESPONSE_CODE)) { + inMessage.getExchange().put(org.apache.cxf.message.Message.RESPONSE_CODE, + Integer.valueOf(val)); + } } inMessage.put(org.apache.cxf.message.Message.PROTOCOL_HEADERS, protHeaders); @@ -596,67 +600,113 @@ public final class JMSUtils { private static void prepareJMSMessageProperties(JMSMessageHeadersType messageProperties, org.apache.cxf.message.Message outMessage, JMSConfiguration jmsConfig) { - if (!messageProperties.isSetSOAPJMSTargetService()) { - messageProperties.setSOAPJMSTargetService(jmsConfig.getTargetService()); - } - if (!messageProperties.isSetSOAPJMSBindingVersion()) { - messageProperties.setSOAPJMSBindingVersion("1.0"); - } - messageProperties.setSOAPJMSContentType(getContentType(outMessage)); - if (getContentEncoding(outMessage) != null) { - messageProperties.setSOAPJMSContentEncoding(getContentEncoding(outMessage)); - } - String soapAction = null; + // Retrieve or create protocol headers Map<String, List<String>> headers = CastUtils.cast((Map<?, ?>)outMessage .get(org.apache.cxf.message.Message.PROTOCOL_HEADERS)); - if (headers != null) { - List<String> action = headers.remove(SOAPConstants.SOAP_ACTION); - if (action != null && action.size() > 0) { - soapAction = action.get(0); - } - } - - if (soapAction == null) { - soapAction = messageProperties.getSOAPJMSSOAPAction(); - } - if (soapAction == null) { - soapAction = extractActionFromSoap12(outMessage); - } + boolean isSoapMessage = + !MessageUtils.isTrue(outMessage.get(org.apache.cxf.message.Message.REST_MESSAGE)); - if (soapAction != null) { - messageProperties.setSOAPJMSSOAPAction(soapAction); - } - if (!messageProperties.isSetSOAPJMSIsFault()) { - if (outMessage.getContent(Exception.class) != null) { - messageProperties.setSOAPJMSIsFault(true); - } else { - messageProperties.setSOAPJMSIsFault(false); + if (isSoapMessage) { + if (!messageProperties.isSetSOAPJMSTargetService()) { + messageProperties.setSOAPJMSTargetService(jmsConfig.getTargetService()); + } + if (!messageProperties.isSetSOAPJMSBindingVersion()) { + messageProperties.setSOAPJMSBindingVersion("1.0"); + } + messageProperties.setSOAPJMSContentType(getContentType(outMessage)); + if (getContentEncoding(outMessage) != null) { + messageProperties.setSOAPJMSContentEncoding(getContentEncoding(outMessage)); } + String soapAction = null; + + if (headers != null) { + List<String> action = headers.remove(SOAPConstants.SOAP_ACTION); + if (action != null && action.size() > 0) { + soapAction = action.get(0); + } + } + + if (soapAction == null) { + soapAction = messageProperties.getSOAPJMSSOAPAction(); + } + + if (soapAction == null) { + soapAction = extractActionFromSoap12(outMessage); + } + + if (soapAction != null) { + messageProperties.setSOAPJMSSOAPAction(soapAction); + } + if (!messageProperties.isSetSOAPJMSIsFault()) { + if (outMessage.getContent(Exception.class) != null) { + messageProperties.setSOAPJMSIsFault(true); + } else { + messageProperties.setSOAPJMSIsFault(false); + } + } + if (!messageProperties.isSetSOAPJMSRequestURI()) { + messageProperties.setSOAPJMSRequestURI(jmsConfig.getRequestURI()); + } + } else { + if (MessageUtils.isRequestor(outMessage)) { + addJMSPropertiesFromMessage(messageProperties, + outMessage, + org.apache.cxf.message.Message.HTTP_REQUEST_METHOD, + org.apache.cxf.message.Message.REQUEST_URI, + org.apache.cxf.message.Message.ACCEPT_CONTENT_TYPE); + } else { + addJMSPropertyFromMessage(messageProperties, + outMessage, + org.apache.cxf.message.Message.RESPONSE_CODE); + } + addJMSPropertyFromMessage(messageProperties, + outMessage, + org.apache.cxf.message.Message.CONTENT_TYPE); } - if (!messageProperties.isSetSOAPJMSRequestURI()) { - messageProperties.setSOAPJMSRequestURI(jmsConfig.getRequestURI()); - } - for (Map.Entry<String, List<String>> ent : headers.entrySet()) { - JMSPropertyType prop = new JMSPropertyType(); - prop.setName(ent.getKey()); - if (ent.getValue().size() > 1) { - StringBuilder b = new StringBuilder(); - for (String s : ent.getValue()) { - if (b.length() > 0) { - b.append(','); + if (headers != null) { + for (Map.Entry<String, List<String>> ent : headers.entrySet()) { + JMSPropertyType prop = new JMSPropertyType(); + prop.setName(ent.getKey()); + if (ent.getValue().size() > 1) { + StringBuilder b = new StringBuilder(); + for (String s : ent.getValue()) { + if (b.length() > 0) { + b.append(','); + } + b.append(s); } - b.append(s); + prop.setValue(b.toString()); + } else { + prop.setValue(ent.getValue().get(0)); } - prop.setValue(b.toString()); - } else { - prop.setValue(ent.getValue().get(0)); + messageProperties.getProperty().add(prop); } - messageProperties.getProperty().add(prop); } } + private static void addJMSPropertiesFromMessage(JMSMessageHeadersType messageProperties, + org.apache.cxf.message.Message message, + String... keys) { + for (String key : keys) { + addJMSPropertyFromMessage(messageProperties, message, key); + } + + } + + private static void addJMSPropertyFromMessage(JMSMessageHeadersType messageProperties, + org.apache.cxf.message.Message message, + String key) { + Object value = message.get(key); + if (value != null) { + JMSPropertyType prop = new JMSPropertyType(); + prop.setName(key); + prop.setValue(value.toString()); + messageProperties.getProperty().add(prop); + } + } + /** * @param messageProperties * @param inMessageProperties Modified: cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSJmsTest.java URL: http://svn.apache.org/viewvc/cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSJmsTest.java?rev=1352399&r1=1352398&r2=1352399&view=diff ============================================================================== --- cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSJmsTest.java (original) +++ cxf/branches/2.5.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSJmsTest.java Thu Jun 21 03:33:15 2012 @@ -39,6 +39,8 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; +import org.apache.cxf.jaxrs.client.JAXRSClientFactory; +import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; import org.apache.cxf.testutil.common.EmbeddedJMSBrokerLauncher; import org.apache.cxf.transport.jms.JMSUtils; @@ -71,6 +73,56 @@ public class JAXRSJmsTest extends Abstra } @Test + public void testGetBookFromWebClient() throws Exception { + // setup the the client + String endpointAddressUrlEncoded = "jms:jndi:dynamicQueues/test.jmstransport.text" + + "?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory" + + "&replyToName=dynamicQueues/test.jmstransport.response" + + "&jndiURL=tcp://localhost:" + JMS_PORT + + "&jndiConnectionFactoryName=ConnectionFactory"; + + WebClient client = WebClient.create(endpointAddressUrlEncoded); + WebClient.getConfig(client).getRequestContext() + .put(org.apache.cxf.message.Message.REQUEST_URI, "/bookstore/books/123"); + + Book book = client.get(Book.class); + assertEquals("Get a wrong response code.", 200, client.getResponse().getStatus()); + assertEquals("Get a wrong book id.", 123, book.getId()); + } + + @Test + public void testGetBookFromWebClientWithPath() throws Exception { + // setup the the client + String endpointAddressUrlEncoded = "jms:jndi:dynamicQueues/test.jmstransport.text" + + "?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory" + + "&replyToName=dynamicQueues/test.jmstransport.response" + + "&jndiURL=tcp://localhost:" + JMS_PORT + + "&jndiConnectionFactoryName=ConnectionFactory"; + + WebClient client = WebClient.create(endpointAddressUrlEncoded); + client.path("bookstore").path("books").path("123"); + + Book book = client.get(Book.class); + assertEquals("Get a wrong response code.", 200, client.getResponse().getStatus()); + assertEquals("Get a wrong book id.", 123, book.getId()); + } + + @Test + public void testGetBookFromProxyClient() throws Exception { + // setup the the client + String endpointAddressUrlEncoded = "jms:jndi:dynamicQueues/test.jmstransport.text" + + "?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory" + + "&replyToName=dynamicQueues/test.jmstransport.response" + + "&jndiURL=tcp://localhost:" + JMS_PORT + + "&jndiConnectionFactoryName=ConnectionFactory"; + + JMSBookStore client = JAXRSClientFactory.create(endpointAddressUrlEncoded, JMSBookStore.class); + Book book = client.getBook("123"); + assertEquals("Get a wrong response code.", 200, WebClient.client(client).getResponse().getStatus()); + assertEquals("Get a wrong book id.", 123, book.getId()); + } + + @Test public void testGetBook() throws Exception { Context ctx = getContext(); ConnectionFactory factory = (ConnectionFactory)ctx.lookup("ConnectionFactory");
