Author: ningjiang Date: Thu May 6 09:22:14 2010 New Revision: 941623 URL: http://svn.apache.org/viewvc?rev=941623&view=rev Log: CAMEL-2614 supports multi part message in PAYLOAD mode
Added: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java (with props) camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java (with props) camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java (with props) camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java (with props) camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java (with props) Removed: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/AbstractMessageInInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/AbstractMessageOutInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/DOMInInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/DOMOutInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/PayloadContentRedirectInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/SoapMessageInInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/SoapMessageOutInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/XMLMessageInInterceptor.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/XMLMessageOutInterceptor.java Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanEndpoint.java camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/feature/PayLoadDataFormatFeature.java camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfWsdlFirstPayloadModeTest.java camel/trunk/components/camel-cxf/src/test/resources/person.wsdl Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java (original) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java Thu May 6 09:22:14 2010 @@ -52,7 +52,7 @@ public class CxfConsumer extends Default // we receive a CXF request when this method is called public Object invoke(Exchange cxfExchange, Object o) { - + if (LOG.isTraceEnabled()) { LOG.trace("Received CXF Request: " + cxfExchange); } @@ -63,8 +63,15 @@ public class CxfConsumer extends Default // create a Camel exchange org.apache.camel.Exchange camelExchange = endpoint.createExchange(); + DataFormat dataFormat = endpoint.getDataFormat(); + + BindingOperationInfo boi = cxfExchange.getBindingOperationInfo(); + if (dataFormat == DataFormat.PAYLOAD && boi.isUnwrapped()) { + boi = boi.getWrappedOperation(); + cxfExchange.put(BindingOperationInfo.class, boi); + } - BindingOperationInfo boi = cxfExchange.get(BindingOperationInfo.class); + //BindingOperationInfo boi = cxfExchange.get(BindingOperationInfo.class); if (boi != null) { camelExchange.setProperty(BindingOperationInfo.class.getName(), boi); if (LOG.isTraceEnabled()) { @@ -73,7 +80,6 @@ public class CxfConsumer extends Default } // set data format mode in Camel exchange - DataFormat dataFormat = endpoint.getDataFormat(); camelExchange.setProperty(CxfConstants.DATA_FORMAT_PROPERTY, dataFormat); if (LOG.isTraceEnabled()) { LOG.trace("Set Exchange property: " + DataFormat.class.getName() Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java (original) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfEndpoint.java Thu May 6 09:22:14 2010 @@ -23,6 +23,8 @@ import java.util.concurrent.atomic.Atomi import javax.xml.ws.WebServiceProvider; +import org.w3c.dom.Element; + import org.apache.camel.CamelContext; import org.apache.camel.CamelException; import org.apache.camel.Consumer; @@ -41,12 +43,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; -import org.apache.cxf.bus.spring.BusWiringBeanFactoryPostProcessor; import org.apache.cxf.common.classloader.ClassLoaderUtils; import org.apache.cxf.common.util.ClassHelper; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.ClientImpl; import org.apache.cxf.endpoint.Endpoint; +import org.apache.cxf.feature.LoggingFeature; import org.apache.cxf.frontend.ClientFactoryBean; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.frontend.ClientProxyFactoryBean; @@ -57,6 +59,9 @@ import org.apache.cxf.jaxws.JaxWsProxyFa import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.apache.cxf.message.Attachment; import org.apache.cxf.message.Message; +import org.apache.cxf.message.MessageContentsList; +import org.apache.cxf.service.model.BindingOperationInfo; +import org.apache.cxf.service.model.MessagePartInfo; import org.springframework.context.ApplicationContext; /** @@ -83,6 +88,7 @@ public class CxfEndpoint extends Default private HeaderFilterStrategy headerFilterStrategy; private AtomicBoolean getBusHasBeenCalled = new AtomicBoolean(false); private boolean isSetDefaultBus; + private boolean loggingFeatureEnabled; public CxfEndpoint(String remaining, CxfComponent cxfComponent) { super(remaining, cxfComponent); @@ -144,6 +150,14 @@ public class CxfEndpoint extends Default } } + if (loggingFeatureEnabled) { + sfb.getFeatures().add(new LoggingFeature()); + } + + if (getDataFormat() == DataFormat.PAYLOAD) { + sfb.setDataBinding(new HybridSourceDataBinding()); + } + sfb.setBus(getBus()); sfb.setStart(false); } @@ -237,6 +251,11 @@ public class CxfEndpoint extends Default factoryBean.getFeatures().add(new MessageDataFormatFeature()); } else if (getDataFormat() == DataFormat.PAYLOAD) { factoryBean.getFeatures().add(new PayLoadDataFormatFeature()); + factoryBean.setDataBinding(new HybridSourceDataBinding()); + } + + if (loggingFeatureEnabled) { + factoryBean.getFeatures().add(new LoggingFeature()); } factoryBean.setBus(getBus()); @@ -267,6 +286,11 @@ public class CxfEndpoint extends Default factoryBean.getFeatures().add(new MessageDataFormatFeature()); } else if (getDataFormat() == DataFormat.PAYLOAD) { factoryBean.getFeatures().add(new PayLoadDataFormatFeature()); + factoryBean.setDataBinding(new HybridSourceDataBinding()); + } + + if (loggingFeatureEnabled) { + factoryBean.getFeatures().add(new LoggingFeature()); } factoryBean.setBus(getBus()); @@ -453,6 +477,14 @@ public class CxfEndpoint extends Default public boolean isSetDefaultBus() { return isSetDefaultBus; } + + public void setLoggingFeatureEnabled(boolean loggingFeatureEnabled) { + this.loggingFeatureEnabled = loggingFeatureEnabled; + } + + public boolean isLoggingFeatureEnabled() { + return loggingFeatureEnabled; + } public void start() throws Exception { if (headerFilterStrategy == null) { @@ -496,8 +528,21 @@ public class CxfEndpoint extends Default } if (DataFormat.PAYLOAD == message.get(DataFormat.class)) { + CxfPayload<?> payload = (CxfPayload<?>)params[0]; - message.put(List.class, payload.getBody()); + List<Element> elements = payload.getBody(); + + BindingOperationInfo boi = message.get(BindingOperationInfo.class); + MessageContentsList content = new MessageContentsList(); + int i = 0; + + for (MessagePartInfo partInfo : boi.getOperationInfo().getInput().getMessageParts()) { + if (elements.size() > i) { + content.put(partInfo, elements.get(i++)); + } + } + + message.setContent(List.class, content); message.put(Header.HEADER_LIST, payload.getHeaders()); } else { super.setParameters(params, message); Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java (original) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfProducer.java Thu May 6 09:22:14 2010 @@ -17,7 +17,6 @@ package org.apache.camel.component.cxf; import java.io.InputStream; -import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; @@ -113,14 +112,21 @@ public class CxfProducer extends Default BindingOperationInfo boi = getBindingOperationInfo(camelExchange); ObjectHelper.notNull(boi, "BindingOperationInfo"); + // keep the message wrapper in PAYLOAD mode + if (dataFormat == DataFormat.PAYLOAD && boi.isUnwrapped()) { + boi = boi.getWrappedOperation(); + cxfExchange.put(BindingOperationInfo.class, boi); + + } + // store the original boi in the exchange camelExchange.setProperty(BindingOperationInfo.class.getName(), boi); if (LOG.isTraceEnabled()) { LOG.trace("Set exchange property: BindingOperationInfo: " + boi); } - + // Unwrap boi before passing it to make a client call - if (!endpoint.isWrapped() && boi != null) { + if (dataFormat != DataFormat.PAYLOAD && !endpoint.isWrapped() && boi != null) { if (boi.isUnwrappedCapable()) { boi = boi.getUnwrappedOperation(); if (LOG.isTraceEnabled()) { @@ -128,7 +134,7 @@ public class CxfProducer extends Default } } } - + // bind the request CXF exchange binding.populateCxfRequestFromExchange(cxfExchange, camelExchange, requestContext); Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java (original) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/DefaultCxfBinding.java Thu May 6 09:22:14 2010 @@ -27,8 +27,11 @@ import java.util.Set; import javax.activation.DataHandler; import javax.xml.namespace.QName; +import javax.xml.transform.dom.DOMSource; +import javax.xml.ws.Holder; import org.w3c.dom.Element; +import org.w3c.dom.Node; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; @@ -43,6 +46,8 @@ import org.apache.cxf.endpoint.Endpoint; import org.apache.cxf.frontend.MethodDispatcher; import org.apache.cxf.headers.Header; import org.apache.cxf.helpers.CastUtils; +import org.apache.cxf.helpers.DOMUtils; +import org.apache.cxf.helpers.XMLUtils; import org.apache.cxf.jaxws.context.WrappedMessageContext; import org.apache.cxf.message.Attachment; import org.apache.cxf.message.Message; @@ -50,6 +55,8 @@ import org.apache.cxf.message.MessageCon import org.apache.cxf.service.Service; import org.apache.cxf.service.model.BindingMessageInfo; import org.apache.cxf.service.model.BindingOperationInfo; +import org.apache.cxf.service.model.MessagePartInfo; +import org.apache.cxf.service.model.OperationInfo; /** * The Default CXF binding implementation. @@ -267,6 +274,9 @@ public class DefaultCxfBinding implement DataFormat dataFormat = camelExchange.getProperty(CxfConstants.DATA_FORMAT_PROPERTY, DataFormat.class); + // make sure the "requestor role" property does not get propagated as we do switch role + responseContext.remove(Message.REQUESTOR_ROLE); + // propagate contexts if (dataFormat != DataFormat.POJO) { // copying response context to out message seems to cause problem in POJO mode @@ -284,7 +294,7 @@ public class DefaultCxfBinding implement if (outBody != null) { if (dataFormat == DataFormat.PAYLOAD) { CxfPayload<?> payload = (CxfPayload<?>)outBody; - outMessage.put(List.class, payload.getBody()); + outMessage.setContent(List.class, getResponsePayloadList(cxfExchange, payload.getBody())); outMessage.put(Header.HEADER_LIST, payload.getHeaders()); } else { if (responseContext.get(Header.HEADER_LIST) != null) { @@ -333,7 +343,6 @@ public class DefaultCxfBinding implement } - // HeaderFilterStrategyAware Methods // ------------------------------------------------------------------------- @@ -350,6 +359,30 @@ public class DefaultCxfBinding implement // Non public methods // ------------------------------------------------------------------------- + protected MessageContentsList getResponsePayloadList(org.apache.cxf.message.Exchange exchange, + List<Element> elements) { + BindingOperationInfo boi = exchange.getBindingOperationInfo(); + + if (boi.isUnwrapped()) { + boi = boi.getWrappedOperation(); + exchange.put(BindingOperationInfo.class, boi); + } + + MessageContentsList answer = new MessageContentsList(); + + int i = 0; + + for (MessagePartInfo partInfo : boi.getOperationInfo().getOutput().getMessageParts()) { + if (elements.size() > i) { + answer.put(partInfo, elements.get(i++)); + + } + } + + return answer; + + } + /** * @param camelExchange * @param cxfContext Request or Response context @@ -500,7 +533,6 @@ public class DefaultCxfBinding implement } } - @SuppressWarnings("unchecked") protected static Object getContentFromCxf(Message message, DataFormat dataFormat) { Set<Class<?>> contentFormats = message.getContentFormats(); Object answer = null; @@ -522,11 +554,9 @@ public class DefaultCxfBinding implement } } } else if (dataFormat == DataFormat.PAYLOAD) { - // TODO handle other message types in the future. Currently, this binding only - // deal with SOAP in PayLoad mode. - List<Element> body = message.get(List.class); List<SoapHeader> headers = CastUtils.cast((List<?>)message.get(Header.HEADER_LIST)); - answer = new CxfPayload<SoapHeader>(headers, body); + answer = new CxfPayload<SoapHeader>(headers, getPayloadBodyElements(message)); + } else if (dataFormat == DataFormat.MESSAGE) { answer = message.getContent(InputStream.class); } @@ -538,6 +568,68 @@ public class DefaultCxfBinding implement return answer; } + + protected static List<Element> getPayloadBodyElements(Message message) { + MessageContentsList inObjects = MessageContentsList.getContentsList(message); + org.apache.cxf.message.Exchange exchange = message.getExchange(); + BindingOperationInfo boi = exchange.getBindingOperationInfo(); + + OperationInfo op = boi.getOperationInfo(); + + if (boi.isUnwrapped()) { + op = boi.getWrappedOperation().getOperationInfo(); + } + + + List<MessagePartInfo> partInfos = null; + boolean client = Boolean.TRUE.equals(message.get(Message.REQUESTOR_ROLE)); + if (client) { + // it is a response + partInfos = op.getOutput().getMessageParts(); + + } else { + // it is a request + partInfos = op.getInput().getMessageParts(); + } + + List<Element> answer = new ArrayList<Element>(); + + for (MessagePartInfo partInfo : partInfos) { + if (!inObjects.hasValue(partInfo)) { + continue; + } + + Object part = inObjects.get(partInfo); + + if (part instanceof Holder) { + part = ((Holder)part).value; + } + + if (part instanceof DOMSource) { + Element element = getFirstElement(((DOMSource)part).getNode()); + + if (element != null) { + answer.add(element); + } + + if (LOG.isTraceEnabled()) { + LOG.trace("Extract body element " + + (element == null ? "null" : XMLUtils.toString(element))); + } + + } else if (part instanceof Element) { + answer.add((Element)part); + } else { + if (LOG.isDebugEnabled()) { + LOG.debug("Unhandled part type '" + part.getClass()); + } + } + } + + return answer; + } + + public static Object getBodyFromCamel(org.apache.camel.Message out, DataFormat dataFormat) { Object answer = null; @@ -552,6 +644,14 @@ public class DefaultCxfBinding implement return answer; } + private static Element getFirstElement(Node node) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + return (Element)node; + } + + return DOMUtils.getFirstElement(node); + } + public void copyJaxWsContext(org.apache.cxf.message.Exchange cxfExchange, Map<String, Object> context) { if (cxfExchange.getOutMessage() != null) { org.apache.cxf.message.Message outMessage = cxfExchange.getOutMessage(); Added: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java?rev=941623&view=auto ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java (added) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java Thu May 6 09:22:14 2010 @@ -0,0 +1,89 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.cxf; + +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import org.w3c.dom.Node; + +import org.apache.cxf.databinding.DataReader; +import org.apache.cxf.databinding.DataWriter; +import org.apache.cxf.databinding.source.NodeDataReader; +import org.apache.cxf.databinding.source.NodeDataWriter; +import org.apache.cxf.databinding.source.XMLStreamDataReader; +import org.apache.cxf.databinding.source.XMLStreamDataWriter; +import org.apache.cxf.jaxb.JAXBDataBinding; + +/** + * This is a hybrid DataBinding of {...@link JAXBDataBinding} and {...@link org.apache.cxf.databinding.source.SourceDataBinding}. + * Like the SourceDataBinding, this DataBinding de/serializes parameters as DOMSource objects. And like the JAXBDataBinding, the + * {...@link #initialize(org.apache.cxf.service.Service)} + * method can initialize the service model's message part schema based on the service class in the message part info. + * Hence, this DataBinding supports DOMSource object de/serialization without requiring users to provide a WSDL. + * + * @version @Revision: 789534 $ + */ +public class HybridSourceDataBinding extends JAXBDataBinding { + private XMLStreamDataReader xsrReader; + private XMLStreamDataWriter xswWriter; + private NodeDataWriter nodeWriter; + private NodeDataReader nodeReader; + + public HybridSourceDataBinding() { + super(); + this.xsrReader = new XMLStreamDataReader(); + this.xswWriter = new XMLStreamDataWriter(); + + this.nodeReader = new NodeDataReader(); + this.nodeWriter = new NodeDataWriter(); + } + + @SuppressWarnings("unchecked") + @Override + public <T> DataReader<T> createReader(Class<T> cls) { + if (cls == XMLStreamReader.class) { + return (DataReader<T>) xsrReader; + } else if (cls == Node.class) { + return (DataReader<T>) nodeReader; + } else { + throw new UnsupportedOperationException("The type " + cls.getName() + " is not supported."); + } + } + + @Override + public Class<?>[] getSupportedReaderFormats() { + return new Class[] {XMLStreamReader.class, Node.class}; + } + + @SuppressWarnings("unchecked") + @Override + public <T> DataWriter<T> createWriter(Class<T> cls) { + if (cls == XMLStreamWriter.class) { + return (DataWriter<T>) xswWriter; + } else if (cls == Node.class) { + return (DataWriter<T>) nodeWriter; + } else { + throw new UnsupportedOperationException("The type " + cls.getName() + " is not supported."); + } + } + + @Override + public Class<?>[] getSupportedWriterFormats() { + return new Class[] {XMLStreamWriter.class, Node.class}; + } +} Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/HybridSourceDataBinding.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanEndpoint.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanEndpoint.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanEndpoint.java (original) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/cxfbean/CxfBeanEndpoint.java Thu May 6 09:22:14 2010 @@ -29,6 +29,7 @@ import org.apache.camel.util.CamelContex import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.endpoint.Server; +import org.apache.cxf.feature.LoggingFeature; import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; import org.apache.cxf.transport.ConduitInitiatorManager; @@ -48,7 +49,8 @@ public class CxfBeanEndpoint extends Pro private boolean isSetDefaultBus; private CxfBeanBinding cxfBeanBinding = new DefaultCxfBeanBinding(); private HeaderFilterStrategy headerFilterStrategy = new CxfHeaderFilterStrategy(); - + private boolean loggingFeatureEnabled; + public CxfBeanEndpoint(String remaining, CxfBeanComponent component) { super(remaining, component); } @@ -101,15 +103,21 @@ public class CxfBeanEndpoint extends Pro bean.setBus(bus); bean.setStart(true); bean.setAddress("camel://" + createEndpointUri()); + if (loggingFeatureEnabled) { + bean.getFeatures().add(new LoggingFeature()); + } server = bean.create(); } else { - JAXRSServerFactoryBean answer = new JAXRSServerFactoryBean(); - answer.setServiceBeans(serviceBeans); - answer.setAddress("camel://" + createEndpointUri()); - answer.setStart(true); - answer.setTransportId(CxfBeanTransportFactory.TRANSPORT_ID); - answer.setBus(bus); - server = answer.create(); + JAXRSServerFactoryBean bean = new JAXRSServerFactoryBean(); + bean.setServiceBeans(serviceBeans); + bean.setAddress("camel://" + createEndpointUri()); + bean.setStart(true); + bean.setTransportId(CxfBeanTransportFactory.TRANSPORT_ID); + bean.setBus(bus); + if (loggingFeatureEnabled) { + bean.getFeatures().add(new LoggingFeature()); + } + server = bean.create(); } } @@ -167,5 +175,13 @@ public class CxfBeanEndpoint extends Pro public HeaderFilterStrategy getHeaderFilterStrategy() { return headerFilterStrategy; } + + public void setLoggingFeatureEnabled(boolean loggingFeatureEnabled) { + this.loggingFeatureEnabled = loggingFeatureEnabled; + } + + public boolean isLoggingFeatureEnabled() { + return loggingFeatureEnabled; + } } Modified: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/feature/PayLoadDataFormatFeature.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/feature/PayLoadDataFormatFeature.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/feature/PayLoadDataFormatFeature.java (original) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/feature/PayLoadDataFormatFeature.java Thu May 6 09:22:14 2010 @@ -20,86 +20,40 @@ import java.util.ArrayList; import java.util.Collection; import java.util.logging.Logger; -import org.apache.camel.component.cxf.interceptors.DOMInInterceptor; -import org.apache.camel.component.cxf.interceptors.DOMOutInterceptor; -import org.apache.camel.component.cxf.interceptors.PayloadContentRedirectInterceptor; +import org.apache.camel.component.cxf.interceptors.ConfigureDocLitWrapperInterceptor; +import org.apache.camel.component.cxf.interceptors.RemoveClassTypeInterceptor; import org.apache.cxf.Bus; -import org.apache.cxf.binding.Binding; import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.Server; import org.apache.cxf.interceptor.ClientFaultConverter; -import org.apache.cxf.phase.Phase; /** * This feature just setting up the CXF endpoint interceptor for handling the * Message in PAYLOAD data format */ public class PayLoadDataFormatFeature extends AbstractDataFormatFeature { - private static final Logger LOG = LogUtils.getL7dLogger(PayLoadDataFormatFeature.class); - // filter the unused phase - - // PRE_INVOKE needs to be removed. Otherwise, HolderInInterceptor will interfere us - private static final String[] REMOVING_IN_PHASES = { - Phase.UNMARSHAL, Phase.PRE_LOGICAL, Phase.PRE_LOGICAL_ENDING, Phase.POST_LOGICAL, - Phase.POST_LOGICAL_ENDING, Phase.PRE_INVOKE - }; - - private static final String[] REMOVING_OUT_PHASES = { - Phase.MARSHAL, Phase.MARSHAL_ENDING, Phase.PRE_LOGICAL, Phase.PRE_LOGICAL_ENDING, Phase.POST_LOGICAL, - Phase.POST_LOGICAL_ENDING - }; - + private static final Logger LOG = LogUtils.getL7dLogger(PayLoadDataFormatFeature.class); + private static final Collection<Class> REMOVING_FAULT_IN_INTERCEPTORS; - + + static { REMOVING_FAULT_IN_INTERCEPTORS = new ArrayList<Class>(); - // remove ClientFaultConverter as it tries to unmarshal to java object. REMOVING_FAULT_IN_INTERCEPTORS.add(ClientFaultConverter.class); } @Override public void initialize(Client client, Bus bus) { - removeInterceptorWhichIsInThePhases(client.getInInterceptors(), REMOVING_IN_PHASES); - removeInterceptorWhichIsInThePhases(client.getEndpoint().getService().getInInterceptors(), REMOVING_IN_PHASES); - removeInterceptorWhichIsInThePhases(client.getEndpoint().getInInterceptors(), REMOVING_IN_PHASES); - removeInterceptorWhichIsInThePhases(client.getEndpoint().getBinding().getInInterceptors(), REMOVING_IN_PHASES); - - removeInterceptorWhichIsInThePhases(client.getOutInterceptors(), REMOVING_OUT_PHASES); - removeInterceptorWhichIsInThePhases(client.getEndpoint().getService().getOutInterceptors(), REMOVING_OUT_PHASES); - removeInterceptorWhichIsInThePhases(client.getEndpoint().getOutInterceptors(), REMOVING_OUT_PHASES); - removeInterceptorWhichIsInThePhases(client.getEndpoint().getBinding().getOutInterceptors(), REMOVING_OUT_PHASES); - - removeInterceptors(client.getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - removeInterceptors(client.getEndpoint().getService().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - removeInterceptors(client.getEndpoint().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - removeInterceptors(client.getEndpoint().getBinding().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - - addDataHandlingInterceptors(client.getEndpoint().getBinding()); + removeFaultInInterceptorFromClient(client); + client.getEndpoint().getBinding().getInInterceptors().add(new ConfigureDocLitWrapperInterceptor(true)); + client.getEndpoint().getBinding().getInInterceptors().add(new RemoveClassTypeInterceptor()); } @Override - public void initialize(Server server, Bus bus) { - - removeInterceptorWhichIsInThePhases(server.getEndpoint().getService().getInInterceptors(), REMOVING_IN_PHASES); - removeInterceptorWhichIsInThePhases(server.getEndpoint().getInInterceptors(), REMOVING_IN_PHASES); - removeInterceptorWhichIsInThePhases(server.getEndpoint().getBinding().getInInterceptors(), REMOVING_IN_PHASES); - - removeInterceptorWhichIsInThePhases(server.getEndpoint().getService().getOutInterceptors(), REMOVING_OUT_PHASES); - removeInterceptorWhichIsInThePhases(server.getEndpoint().getOutInterceptors(), REMOVING_OUT_PHASES); - removeInterceptorWhichIsInThePhases(server.getEndpoint().getBinding().getOutInterceptors(), REMOVING_OUT_PHASES); - - removeInterceptors(server.getEndpoint().getService().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - removeInterceptors(server.getEndpoint().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - removeInterceptors(server.getEndpoint().getBinding().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); - - addDataHandlingInterceptors(server.getEndpoint().getBinding()); - } - - private void addDataHandlingInterceptors(Binding binding) { - binding.getInInterceptors().add(new DOMInInterceptor()); - binding.getOutInterceptors().add(new DOMOutInterceptor()); - binding.getOutInterceptors().add(new PayloadContentRedirectInterceptor()); + public void initialize(Server server, Bus bus) { + server.getEndpoint().getBinding().getInInterceptors().add(new ConfigureDocLitWrapperInterceptor(true)); + server.getEndpoint().getBinding().getInInterceptors().add(new RemoveClassTypeInterceptor()); } @Override @@ -107,5 +61,12 @@ public class PayLoadDataFormatFeature ex return LOG; } + private void removeFaultInInterceptorFromClient(Client client) { + removeInterceptors(client.getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); + removeInterceptors(client.getEndpoint().getService().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); + removeInterceptors(client.getEndpoint().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); + removeInterceptors(client.getEndpoint().getBinding().getInFaultInterceptors(), REMOVING_FAULT_IN_INTERCEPTORS); + } + } Added: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java?rev=941623&view=auto ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java (added) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java Thu May 6 09:22:14 2010 @@ -0,0 +1,52 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.cxf.interceptors; + +import org.apache.cxf.interceptor.AbstractInDatabindingInterceptor; +import org.apache.cxf.interceptor.DocLiteralInInterceptor; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.Phase; + +/** + * This interface configures the flag {...@link DocLiteralInInterceptor#KEEP_PARAMETERS_WRAPPER}. + * + * @version @Revision: 789534 $ + */ +public class ConfigureDocLitWrapperInterceptor extends AbstractInDatabindingInterceptor { + + boolean unwrapParameterFlag; + + public ConfigureDocLitWrapperInterceptor(boolean unwrapParameterFlag) { + super(Phase.UNMARSHAL); + addBefore(DocLiteralInInterceptor.class.getName()); + this.unwrapParameterFlag = unwrapParameterFlag; + } + + public void handleMessage(Message message) throws Fault { + message.put(DocLiteralInInterceptor.KEEP_PARAMETERS_WRAPPER, unwrapParameterFlag); + } + + public boolean isUnwrapParameterFlag() { + return unwrapParameterFlag; + } + + public void setUnwrapParameterFlag(boolean unwrapParameterFlag) { + this.unwrapParameterFlag = unwrapParameterFlag; + } + +} Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/ConfigureDocLitWrapperInterceptor.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java?rev=941623&view=auto ============================================================================== --- camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java (added) +++ camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java Thu May 6 09:22:14 2010 @@ -0,0 +1,89 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.cxf.interceptors; + +import org.apache.cxf.binding.soap.interceptor.SoapHeaderInterceptor; +import org.apache.cxf.interceptor.Fault; +import org.apache.cxf.message.Exchange; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; +import org.apache.cxf.service.model.BindingMessageInfo; +import org.apache.cxf.service.model.BindingOperationInfo; +import org.apache.cxf.service.model.MessageInfo; +import org.apache.cxf.service.model.MessagePartInfo; + +/** + * This interceptor traverses the {...@link BindingOperationInfo} and + * invokes the {...@link MessagePartInfo#setTypeQName(javax.xml.namespace.QName)} method to set + * the service class to null. The reason we may want to set the service class to null is + * because CXF will try to use JAXB if the service class is present. It affects DomSource + * payload to be processed correctly. + * + * @version @Revision: 789534 $ + */ +public class RemoveClassTypeInterceptor extends AbstractPhaseInterceptor<Message> { + + public RemoveClassTypeInterceptor() { + super(Phase.UNMARSHAL); + addBefore(SoapHeaderInterceptor.class.getName()); + + } + + public void handleMessage(Message message) throws Fault { + Exchange exchange = message.getExchange(); + BindingOperationInfo bop = exchange.getBindingOperationInfo(); + + if (bop == null) { + return; + } + + if (bop.isUnwrapped()) { + bop = bop.getWrappedOperation(); + } + + if (bop.isUnwrappedCapable()) { + removePartTypeClass(bop.getWrappedOperation().getOperationInfo().getInput()); + removePartTypeClass(bop.getWrappedOperation().getOperationInfo().getOutput()); + removePartTypeClass(bop.getWrappedOperation().getInput()); + removePartTypeClass(bop.getWrappedOperation().getOutput()); + } else { + removePartTypeClass(bop.getOperationInfo().getInput()); + removePartTypeClass(bop.getOperationInfo().getOutput()); + removePartTypeClass(bop.getInput()); + removePartTypeClass(bop.getOutput()); + } + + } + + protected void removePartTypeClass(BindingMessageInfo bmi) { + if (bmi != null) { + for (MessagePartInfo part : bmi.getMessageParts()) { + part.setTypeClass(null); + } + } + } + + protected void removePartTypeClass(MessageInfo msgInfo) { + if (msgInfo != null) { + for (MessagePartInfo part : msgInfo.getMessageParts()) { + part.setTypeClass(null); + } + } + } + +} Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/interceptors/RemoveClassTypeInterceptor.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Added: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java?rev=941623&view=auto ============================================================================== --- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java (added) +++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java Thu May 6 09:22:14 2010 @@ -0,0 +1,98 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.cxf; + +import java.net.URL; + +import javax.xml.namespace.QName; +import javax.xml.ws.Endpoint; +import javax.xml.ws.Holder; + +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.camel.wsdl_first.PersonMultiPartImpl; +import org.apache.camel.wsdl_first.PersonMultiPartPortType; +import org.apache.camel.wsdl_first.PersonMultiPartService; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit test that verifies multi part SOAP message functionality + * + * @version @Revision: 789534 $ + */ +public class CXFWsdlOnlyPayloadModeMultiPartNoSpringTest extends CamelTestSupport { + + protected static final String SERVICE_NAME_PROP = "serviceName="; + protected static final String PORT_NAME_PROP = "portName={http://camel.apache.org/wsdl-first}PersonMultiPartPort"; + protected static final String WSDL_URL_PROP = "wsdlURL=classpath:person.wsdl"; + protected static final String SERVICE_ADDRESS = "http://localhost:9093/PersonMultiPart"; + protected Endpoint endpoint; + + @Before + public void startService() { + endpoint = Endpoint.publish(SERVICE_ADDRESS, new PersonMultiPartImpl()); + } + + @After + public void stopService() { + if (endpoint != null) { + endpoint.stop(); + } + } + + @Override + protected RouteBuilder createRouteBuilder() { + return new RouteBuilder() { + public void configure() { + from("cxf://http://localhost:9000/PersonMultiPart?" + PORT_NAME_PROP + "&" + SERVICE_NAME_PROP + getServiceName() + "&" + WSDL_URL_PROP + "&dataFormat=" + + getDataFormat() + "&loggingFeatureEnabled=true") + .to("cxf://http://localhost:9093/PersonMultiPart?" + PORT_NAME_PROP + "&" + SERVICE_NAME_PROP + getServiceName() + "&" + WSDL_URL_PROP + "&dataFormat=" + + getDataFormat() + "&loggingFeatureEnabled=true"); + } + }; + } + + protected String getDataFormat() { + return "PAYLOAD"; + } + + @Test + public void testMultiPartMessage() { + URL wsdlURL = getClass().getClassLoader().getResource("person.wsdl"); + PersonMultiPartService ss = new PersonMultiPartService(wsdlURL, QName.valueOf(getServiceName())); + + PersonMultiPartPortType client = ss.getPersonMultiPartPort(); + + Holder<Integer> ssn = new Holder<Integer>(); + ssn.value = 0; + + Holder<String> name = new Holder<String>(); + name.value = "Unknown name"; + + client.getPersonMultiPartOperation("foo", 0, name, ssn); + assertEquals("New Person Name", name.value); + assertTrue(123456789 == ssn.value); + + } + + protected String getServiceName() { + return "{http://camel.apache.org/wsdl-first}PersonMultiPartService"; + } +} Propchange: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CXFWsdlOnlyPayloadModeMultiPartNoSpringTest.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfWsdlFirstPayloadModeTest.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfWsdlFirstPayloadModeTest.java?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfWsdlFirstPayloadModeTest.java (original) +++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfWsdlFirstPayloadModeTest.java Thu May 6 09:22:14 2010 @@ -68,10 +68,14 @@ public class CxfWsdlFirstPayloadModeTest assertTrue(t instanceof UnknownPersonFault); - // Note: Since unmarshal phase has been removed in PAYLOAD mode, - // it is not able to validate against the schema. + // schema validation will throw a parse exception personId.value = "Invoking getPerson with invalid length string, expecting exception...xxxxxxxxx"; - client.getPerson(personId, ssn, name); + try { + client.getPerson(personId, ssn, name); + fail("We expect to get a message schema validation failure"); + } catch (Exception ex) { + assertEquals("Could not parse the XML stream.", ex.getMessage()); + } verifyJaxwsHandlers(fromHandler, toHandler); } @@ -83,11 +87,11 @@ public class CxfWsdlFirstPayloadModeTest @Override protected void verifyJaxwsHandlers(JaxwsTestHandler fromHandler, JaxwsTestHandler toHandler) { - assertEquals(1, fromHandler.getFaultCount()); - assertEquals(5, fromHandler.getMessageCount()); + assertEquals(2, fromHandler.getFaultCount()); + assertEquals(4, fromHandler.getMessageCount()); //From CXF 2.2.7 the soap handler's getHeader() method will not be called if the SOAP message don't have headers //assertEquals(8, toHandler.getGetHeadersCount()); - assertEquals(10, toHandler.getMessageCount()); + assertEquals(8, toHandler.getMessageCount()); assertEquals(6, toHandler.getFaultCount()); } Added: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java?rev=941623&view=auto ============================================================================== --- camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java (added) +++ camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java Thu May 6 09:22:14 2010 @@ -0,0 +1,39 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.wsdl_first; + +import javax.xml.ws.Holder; + +/** + * Test Impl class for PersonMultiPartType port type that verifies multi part SOAP message + * functionality. + * + * @version @Revision: 789534 $ + */ + + +public class PersonMultiPartImpl implements PersonMultiPartPortType { + + public void getPersonMultiPartOperation(String nameIn, int ssnIn, Holder<String> nameOut, + Holder<Integer> ssnOut) { + + nameOut.value = "New Person Name"; + ssnOut.value = 123456789; + + } + +} Propchange: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: camel/trunk/components/camel-cxf/src/test/java/org/apache/camel/wsdl_first/PersonMultiPartImpl.java ------------------------------------------------------------------------------ svn:keywords = Rev Date Modified: camel/trunk/components/camel-cxf/src/test/resources/person.wsdl URL: http://svn.apache.org/viewvc/camel/trunk/components/camel-cxf/src/test/resources/person.wsdl?rev=941623&r1=941622&r2=941623&view=diff ============================================================================== --- camel/trunk/components/camel-cxf/src/test/resources/person.wsdl (original) +++ camel/trunk/components/camel-cxf/src/test/resources/person.wsdl Thu May 6 09:22:14 2010 @@ -64,6 +64,13 @@ </xsd:sequence> </xsd:complexType> </xsd:element> + + <xsd:element name="StringInputElem" type="xsd:string" /> + <xsd:element name="IntegerInputElem" type="xsd:int" /> + + <xsd:element name="StringOutputElem" type="xsd:string" /> + <xsd:element name="IntegerOutputElem" type="xsd:int" /> + </xsd:schema> </wsdl:types> @@ -76,6 +83,15 @@ <wsdl:message name="UnknownPersonFault"> <wsdl:part name="payload" element="typens:UnknownPersonFault"/> </wsdl:message> + + <wsdl:message name="GetPersonMultiPartRequest"> + <wsdl:part name="nameIn" element="typens:StringInputElem" /> + <wsdl:part name="ssnIn" element="typens:IntegerInputElem" /> + </wsdl:message> + <wsdl:message name="GetPersonMultiPartResponse"> + <wsdl:part name="nameOut" element="typens:StringOutputElem" /> + <wsdl:part name="ssnOut" element="typens:IntegerOutputElem" /> + </wsdl:message> <wsdl:portType name="Person"> <wsdl:operation name="GetPerson"> @@ -85,6 +101,13 @@ </wsdl:operation> </wsdl:portType> + <wsdl:portType name="PersonMultiPartPortType"> + <wsdl:operation name="GetPersonMultiPartOperation"> + <wsdl:input message="tns:GetPersonMultiPartRequest" /> + <wsdl:output message="tns:GetPersonMultiPartResponse" /> + </wsdl:operation> + </wsdl:portType> + <wsdl:binding name="PersonSOAPBinding" type="tns:Person"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="GetPerson"> @@ -116,11 +139,11 @@ </wsdl:operation> </wsdl:binding> - <wsdl:binding name="PersonSOAPBinding2" type="tns:Person"> - <soap:binding style="document" transport="http://cxf.apache.org/transports/camel" /> - <wsdl:operation name="GetPerson"> - <wsdl:input> - <soap:body use="literal" /> + <wsdl:binding name="PersonSOAPBinding2" type="tns:Person"> + <soap:binding style="document" transport="http://cxf.apache.org/transports/camel" /> + <wsdl:operation name="GetPerson"> + <wsdl:input> + <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> @@ -130,6 +153,22 @@ </wsdl:fault> </wsdl:operation> </wsdl:binding> + + <wsdl:binding name="PersonMultiPartSOAPBinding" + type="tns:PersonMultiPartPortType"> + <soap:binding style="document" + transport="http://schemas.xmlsoap.org/soap/http" /> + <wsdl:operation name="GetPersonMultiPartOperation"> + <soap:operation soapAction="" style="document" /> + <wsdl:input> + <soap:body use="literal" /> + </wsdl:input> + <wsdl:output> + <soap:body use="literal" /> + </wsdl:output> + + </wsdl:operation> + </wsdl:binding> <wsdl:service name="PersonService"> <wsdl:port binding="tns:PersonSOAPBinding" name="soap"> @@ -148,5 +187,11 @@ <soap12:address location="http://localhost:8092/PersonService/" /> </wsdl:port> </wsdl:service> + + <wsdl:service name="PersonMultiPartService"> + <wsdl:port name="PersonMultiPartPort" binding="tns:PersonMultiPartSOAPBinding"> + <soap:address location="http://localhost:9000/PersonMultiPart" /> + </wsdl:port> + </wsdl:service> </wsdl:definitions>