Java tutorial
/* * 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.servicemix.camel.nmr; import java.io.InputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException; import javax.activation.DataHandler; import javax.mail.util.ByteArrayDataSource; import javax.xml.namespace.QName; import javax.xml.ws.BindingProvider; import javax.xml.ws.Holder; import javax.xml.ws.soap.SOAPBinding; import org.apache.camel.CamelContext; import org.apache.camel.ContextTestSupport; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.spring.SpringCamelContext; import org.apache.cxf.Bus; import org.apache.cxf.BusFactory; import org.apache.cxf.endpoint.Client; import org.apache.cxf.endpoint.ClientImpl; import org.apache.cxf.jaxws.JaxWsClientProxy; import org.apache.cxf.jaxws.binding.soap.SOAPBindingImpl; import org.apache.cxf.jaxws.support.JaxWsEndpointImpl; import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean; import org.apache.cxf.mime.TestMtom; import org.apache.cxf.service.Service; import org.apache.cxf.service.factory.ReflectionServiceFactoryBean; import org.apache.cxf.service.model.EndpointInfo; import org.springframework.context.support.AbstractXmlApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AttachmentTest extends ContextTestSupport { protected static final String SERVICE_ADDRESS = "local://smx/attachment"; protected static final String ROUTER_ADDRESS = "http://localhost:9036/mime-test"; protected static final String SERVICE_CLASS = "serviceClass=org.apache.cxf.mime.TestMtom"; public static final QName MTOM_PORT = new QName("http://cxf.apache.org/mime", "TestMtomPort"); public static final QName MTOM_SERVICE = new QName("http://cxf.apache.org/mime", "TestMtomService"); protected AbstractXmlApplicationContext applicationContext; @Override protected void setUp() throws Exception { applicationContext = createApplicationContext(); super.setUp(); assertNotNull("Should have created a valid spring context", applicationContext); startService(); } @Override protected void tearDown() throws Exception { if (applicationContext != null) { applicationContext.destroy(); } super.tearDown(); } protected void startService() { //start a service Object implementor = new MtomImpl(); javax.xml.ws.Endpoint.publish(SERVICE_ADDRESS, implementor); } protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { public void configure() { from("cxf:bean:routerEndpoint").to("smx:testEndpoint"); from("smx:testEndpoint").to("cxf:bean:serviceEndpoint"); } }; } @Override protected CamelContext createCamelContext() throws Exception { return SpringCamelContext.springCamelContext(applicationContext); } protected ClassPathXmlApplicationContext createApplicationContext() { return new ClassPathXmlApplicationContext("org/apache/servicemix/camel/spring/mtom.xml"); } public void testAttachment() throws Exception { TestMtom mtomPort = createPort(MTOM_SERVICE, MTOM_PORT, TestMtom.class, true); try { Holder<DataHandler> param = new Holder<DataHandler>(); param.value = new DataHandler(new ByteArrayDataSource("foobar".getBytes(), "application/octet-stream")); Holder<String> name = new Holder<String>("call detail"); mtomPort.testXop(name, param); assertEquals("call detailfoobar", name.value); assertNotNull(param.value); InputStream bis = param.value.getDataSource().getInputStream(); byte b[] = new byte[10]; bis.read(b, 0, 10); String attachContent = new String(b); assertEquals(attachContent, "testfoobar"); } catch (UndeclaredThrowableException ex) { throw (Exception) ex.getCause(); } } private <T> T createPort(QName serviceName, QName portName, Class<T> serviceEndpointInterface, boolean enableMTOM) throws Exception { Bus bus = BusFactory.getDefaultBus(); ReflectionServiceFactoryBean serviceFactory = new JaxWsServiceFactoryBean(); serviceFactory.setBus(bus); serviceFactory.setServiceName(serviceName); serviceFactory.setServiceClass(serviceEndpointInterface); serviceFactory.setWsdlURL(getClass().getResource("/wsdl/mtom_xop.wsdl")); Service service = serviceFactory.create(); EndpointInfo ei = service.getEndpointInfo(portName); JaxWsEndpointImpl jaxwsEndpoint = new JaxWsEndpointImpl(bus, service, ei); SOAPBinding jaxWsSoapBinding = new SOAPBindingImpl(ei.getBinding()); jaxWsSoapBinding.setMTOMEnabled(enableMTOM); Client client = new ClientImpl(bus, jaxwsEndpoint); InvocationHandler ih = new JaxWsClientProxy(client, jaxwsEndpoint.getJaxwsBinding()); Object obj = Proxy.newProxyInstance(serviceEndpointInterface.getClassLoader(), new Class[] { serviceEndpointInterface, BindingProvider.class }, ih); return serviceEndpointInterface.cast(obj); } }