/** * 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 demo.colocated.client; import java.io.ByteArrayInputStream; import java.io.IOException; import javax.xml.namespace.QName; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.Dispatch; import javax.xml.ws.Service; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.soap.SOAPBinding; import javax.xml.ws.soap.SOAPFaultException; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import demo.colocated.server.Server; public final class DispatchSourceClient { private static final String ADDRESS = "http://localhost:9000/SoapContext/GreeterPort"; private static final String SERVICE_NS = "http://apache.org/hello_world_soap_http"; private static final QName SERVICE_NAME = new QName(SERVICE_NS, "SOAPService"); private static final QName PORT_NAME = new QName(SERVICE_NS, "SoapPort"); private static final String PAYLOAD_NAMESPACE_URI = "http://apache.org/hello_world_soap_http/types"; private static final String SAYHI_REQUEST_TEMPLATE = "<ns1:sayHi xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\" />"; private static final String GREETME_REQUEST_TEMPLATE = "<ns1:greetMe xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\">" + "<ns1:requestType>%s</ns1:requestType></ns1:greetMe>"; private static final String PINGME_REQUEST_TEMPLATE = "<ns1:pingMe xmlns:ns1=\"http://apache.org/hello_world_soap_http/types\" />"; private static final QName SAYHI_OPERATION_NAME = new QName(SERVICE_NS, "sayHi"); private static final QName GREETME_OPERATION_NAME = new QName(SERVICE_NS, "greetMe"); private static final QName PINGME_OPERATION_NAME = new QName(SERVICE_NS, "pingMe"); private DispatchSourceClient() { } public static void main(String args[]) throws Exception { Server.main(new String[]{"inProcess"}); Service service = Service.create(SERVICE_NAME); service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, ADDRESS); Dispatch<Source> dispatch = service.createDispatch(PORT_NAME, Source.class, Service.Mode.PAYLOAD); String resp; Source response; System.out.println("Invoking sayHi..."); setOperation(dispatch, SAYHI_OPERATION_NAME); response = dispatch.invoke(encodeSource(SAYHI_REQUEST_TEMPLATE, null)); resp = decodeSource(response, PAYLOAD_NAMESPACE_URI, "responseType"); System.out.println("Server responded with: " + resp); System.out.println(); System.out.println("Invoking greetMe..."); setOperation(dispatch, GREETME_OPERATION_NAME); response = dispatch.invoke(encodeSource(GREETME_REQUEST_TEMPLATE, System.getProperty("user.name"))); resp = decodeSource(response, PAYLOAD_NAMESPACE_URI, "responseType"); System.out.println("Server responded with: " + resp); System.out.println(); try { System.out.println("Invoking pingMe, expecting exception..."); setOperation(dispatch, PINGME_OPERATION_NAME); response = dispatch.invoke(encodeSource(PINGME_REQUEST_TEMPLATE, null)); } catch (SOAPFaultException ex) { System.out.println("Expected exception: SoapFault has occurred: " + ex.getMessage()); } System.exit(0); } private static void setOperation(Dispatch<Source> dispatch, QName operationName) { dispatch.getRequestContext().put(MessageContext.WSDL_OPERATION, operationName); } private static Source encodeSource(String template, String value) throws IOException { String payload = value == null ? template : String.format(template, value); Source source = new StreamSource(new ByteArrayInputStream(payload.getBytes("utf-8"))); return source; } private static String decodeSource(Source source, String uri, String name) throws Exception { TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setFeature(javax.xml.XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer transformer = transformerFactory.newTransformer(); ContentHandler handler = new ContentHandler(uri, name); transformer.transform(source, new SAXResult(handler)); return handler.getValue(); } static class ContentHandler extends DefaultHandler { StringBuffer buffer; String namespaceURI; String elementName; boolean recording; ContentHandler(String namespaceURI, String elementName) { this.namespaceURI = namespaceURI; this.elementName = elementName; } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, * java.lang.String, java.lang.String, org.xml.sax.Attributes) */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (namespaceURI.equals(uri) && elementName.equals(localName)) { recording = true; } } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, * java.lang.String, java.lang.String) */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (namespaceURI.equals(uri) && elementName.equals(localName)) { recording = false; } } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) */ @Override public void characters(char[] ch, int start, int length) throws SAXException { if (recording) { if (buffer == null) { buffer = new StringBuffer(); } buffer.append(new String(ch, start, length)); } } /** * @return */ public String getValue() { return buffer == null ? null : buffer.toString(); } } }