Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
EclipseLink/Development/DBWS/OSGi/SimpleClient
< EclipseLink | Development | DBWS | OSGi
Revision as of 10:24, 7 October 2010 by Unnamed Poltroon (Talk) (New page: <css> .source-java5 {padding:1em;border:1px solid black; background-color: white;} .source-xml {padding:1em;border:1px solid black; background-color: white;} .source-text {padding:1e...)
A Simple(!) JAX-WS Client
Typically, JAX-WS Client are generated - either partially or completely - based on the published WSDL. In the example we can see that while the WSDL file is generated, it is not available via a 'live' URL (some tools exist to generate Clients from standalone WSDL files).
An alternate (simpler?) option is to use the javax.xml.ws.Dispatch
API to directly send pre-computed SOAP messages:
package simpletable; //javase imports import java.io.StringReader; import java.io.StringWriter; import org.w3c.dom.Document; //java eXtension imports import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPMessage; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.Dispatch; import javax.xml.ws.Service; import static javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_BINDING; //EclipseLink imports import org.eclipse.persistence.platform.xml.XMLComparer; import org.eclipse.persistence.platform.xml.XMLParser; import org.eclipse.persistence.platform.xml.XMLPlatform; import org.eclipse.persistence.platform.xml.XMLPlatformFactory; //test imports import static simpletable.Constants.ENDPOINT_ADDRESS; import static simpletable.Constants.TEST_NAMESPACE; import static simpletable.Constants.TEST_PORT; import static simpletable.Constants.TEST_SERVICE; import static simpletable.Constants.TEST_SERVICE_NAMESPACE; public class Client { static XMLComparer comparer = new XMLComparer(); static XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform(); static XMLParser xmlParser = xmlPlatform.newXMLParser(); static final String SOAP_FINDBYPK_REQUEST = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Body>" + "<findByPrimaryKey_simpletableType xmlns=\"urn:simpletableService\">" + "<id>1</id>" + "</findByPrimaryKey_simpletableType>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_FINDALL_REQUEST = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Body>" + "<findAll_simpletableType xmlns=\"urn:simpletableService\" xmlns:urn=\"urn:simpletable\"/>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_UPDATE_REQUEST = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Body>" + "<update_simpletableType xmlns=\"urn:simpletableService\" xmlns:urn=\"urn:simpletable\">" + "<theInstance>" + "<urn:simpletableType>" + "<urn:id>1</urn:id>" + "<urn:name>mike norman</urn:name>" + "<urn:since>2010-12-25</urn:since>" + "</urn:simpletableType>" + "</theInstance>" + "</update_simpletableType>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_CREATE_REQUEST = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Body>" + "<create_simpletableType xmlns=\"urn:simpletableService\" xmlns:urn=\"urn:simpletable\">" + "<theInstance>" + "<urn:simpletableType>" + "<urn:id>4</urn:id>" + "<urn:name>test</urn:name>" + "<urn:since>2009-03-27</urn:since>" + "</urn:simpletableType>" + "</theInstance>" + "</create_simpletableType>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_DELETE_REQUEST = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Body>" + "<delete_simpletableType xmlns=\"urn:simpletableService\" xmlns:urn=\"urn:simpletable\">" + "<id>4</id>" + "</delete_simpletableType>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_UPDATE2_REQUEST = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Body>" + "<update_simpletableType xmlns=\"urn:simpletableService\" xmlns:urn=\"urn:simpletable\">" + "<theInstance>" + "<urn:simpletableType>" + "<urn:id>1</urn:id>" + "<urn:name>mike</urn:name>" + "<urn:since>2001-12-25</urn:since>" + "</urn:simpletableType>" + "</theInstance>" + "</update_simpletableType>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; public static void main(String[] args) throws SOAPException, TransformerException { QName qname = new QName(TEST_SERVICE_NAMESPACE, TEST_PORT); Service service = Service.create(new QName(TEST_NAMESPACE, TEST_SERVICE)); service.addPort(qname, SOAP11HTTP_BINDING, ENDPOINT_ADDRESS); Dispatch<SOAPMessage> sourceDispatch = service.createDispatch(qname, SOAPMessage.class, Service.Mode.MESSAGE); SOAPMessage request = createSOAPMessage(SOAP_FINDBYPK_REQUEST); SOAPMessage result = sourceDispatch.invoke(request); if (result != null) { Source src = result.getSOAPPart().getContent(); DOMResult domResult = new DOMResult(); getTransformer().transform(src, domResult); Document resultDoc = (Document)domResult.getNode(); System.out.println(documentToString(resultDoc)); Document controlDoc = xmlParser.parse(new StringReader(SOAP_FINDBYPK_RESPONSE)); boolean nodeEqual = comparer.isNodeEqual(controlDoc, resultDoc); if (!nodeEqual) { System.out.println("findByPrimaryKey_simpletableType response not same as control document"); } } request = createSOAPMessage(SOAP_FINDALL_REQUEST); result = sourceDispatch.invoke(request); if (result != null) { Source src = result.getSOAPPart().getContent(); DOMResult domResult = new DOMResult(); getTransformer().transform(src, domResult); Document resultDoc = (Document)domResult.getNode(); Document controlDoc = xmlParser.parse(new StringReader(SOAP_FINDALL_RESPONSE)); boolean nodeEqual = comparer.isNodeEqual(controlDoc, resultDoc); if (!nodeEqual) { System.out.println("findAll_simpletableType response not same as control document"); } } request = createSOAPMessage(SOAP_UPDATE_REQUEST); result = sourceDispatch.invoke(request); if (result != null) { String localName = result.getSOAPBody().getFirstChild().getLocalName(); if (!SOAP_UPDATE_RESPONSE_ELEMENTNAME.equals(localName)) { System.out.println(SOAP_UPDATE_RESPONSE_ELEMENTNAME + " incorrect"); } } request = createSOAPMessage(SOAP_FINDBYPK_REQUEST); result = sourceDispatch.invoke(request); if (result != null) { Source src = result.getSOAPPart().getContent(); DOMResult domResult = new DOMResult(); getTransformer().transform(src, domResult); Document resultDoc = (Document)domResult.getNode(); Document controlDoc = xmlParser.parse(new StringReader(SOAP_FINDBYPK_AFTERUPDATE_RESPONSE)); boolean nodeEqual = comparer.isNodeEqual(controlDoc, resultDoc); if (!nodeEqual) { System.out.println("findByPrimaryKey_simpletableType response (after update) not same as control document"); } } request = createSOAPMessage(SOAP_CREATE_REQUEST); result = sourceDispatch.invoke(request); if (result != null) { String localName = result.getSOAPBody().getFirstChild().getLocalName(); if (!SOAP_CREATE_RESPONSE_ELEMENTNAME.equals(localName)) { System.out.println(SOAP_CREATE_RESPONSE_ELEMENTNAME + " incorrect"); } } request = createSOAPMessage(SOAP_DELETE_REQUEST); result = sourceDispatch.invoke(request); if (result != null) { String localName = result.getSOAPBody().getFirstChild().getLocalName(); if (!SOAP_DELETE_RESPONSE_ELEMENTNAME.equals(localName)) { System.out.println(SOAP_DELETE_RESPONSE_ELEMENTNAME + " incorrect"); } } request = createSOAPMessage(SOAP_UPDATE2_REQUEST); result = sourceDispatch.invoke(request); if (result != null) { String localName = result.getSOAPBody().getFirstChild().getLocalName(); if (!SOAP_UPDATE_RESPONSE_ELEMENTNAME.equals(localName)) { System.out.println(SOAP_UPDATE_RESPONSE_ELEMENTNAME + " incorrect"); } } } static final String SOAP_FINDBYPK_RESPONSE = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Header/>" + "<SOAP-ENV:Body>" + "<srvc:findByPrimaryKey_simpletableTypeResponse xmlns=\"urn:simpletable\" xmlns:srvc=\"urn:simpletableService\">" + "<srvc:result>" + "<simpletableType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<id>1</id>" + "<name>mike</name>" + "<since>2001-12-25</since>" + "</simpletableType>" + "</srvc:result>" + "</srvc:findByPrimaryKey_simpletableTypeResponse>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_FINDALL_RESPONSE = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Header/>" + "<SOAP-ENV:Body>" + "<srvc:findAll_simpletableTypeResponse xmlns=\"urn:simpletable\" xmlns:srvc=\"urn:simpletableService\">" + "<srvc:result>" + "<simpletableType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<id>1</id>" + "<name>mike</name>" + "<since>2001-12-25</since>" + "</simpletableType>" + "<simpletableType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<id>2</id>" + "<name>blaise</name>" + "<since>2001-12-25</since>" + "</simpletableType>" + "<simpletableType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<id>3</id>" + "<name>rick</name>" + "<since>2001-12-25</since>" + "</simpletableType>" + "</srvc:result>" + "</srvc:findAll_simpletableTypeResponse>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_UPDATE_RESPONSE_ELEMENTNAME = "update_simpletableTypeResponse"; static final String SOAP_FINDBYPK_AFTERUPDATE_RESPONSE = "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\">" + "<SOAP-ENV:Header/>" + "<SOAP-ENV:Body>" + "<srvc:findByPrimaryKey_simpletableTypeResponse xmlns=\"urn:simpletable\" xmlns:srvc=\"urn:simpletableService\">" + "<srvc:result>" + "<simpletableType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + "<id>1</id>" + "<name>mike norman</name>" + "<since>2010-12-25</since>" + "</simpletableType>" + "</srvc:result>" + "</srvc:findByPrimaryKey_simpletableTypeResponse>" + "</SOAP-ENV:Body>" + "</SOAP-ENV:Envelope>"; static final String SOAP_CREATE_RESPONSE_ELEMENTNAME = "create_simpletableTypeResponse"; static final String SOAP_DELETE_RESPONSE_ELEMENTNAME = "delete_simpletableTypeResponse"; static SOAPMessage createSOAPMessage(String message) { try { MessageFactory factory = MessageFactory.newInstance(); SOAPMessage soapMessage = factory.createMessage(); soapMessage.getSOAPPart().setContent( (Source)new StreamSource(new StringReader(message))); soapMessage.saveChanges(); return soapMessage; } catch (Exception e) { e.printStackTrace(); return null; } } static Transformer getTransformer() { Transformer transformer = null; try { TransformerFactory tf = TransformerFactory.newInstance(); transformer = tf.newTransformer(); } catch (TransformerConfigurationException e) { /* extremely rare, safe to ignore */ } return transformer; } static String documentToString(Document doc) { DOMSource domSource = new DOMSource(doc); StringWriter stringWriter = new StringWriter(); StreamResult result = new StreamResult(stringWriter); try { Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty("indent", "yes"); transformer.transform(domSource, result); return stringWriter.toString(); } catch (Exception e) { // e.printStackTrace(); return "<empty/>"; } } }