/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2004-2013 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package testutil; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.OutputStream; import java.util.Iterator; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPFault; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import javax.xml.ws.Dispatch; import javax.xml.ws.Response; import com.sun.xml.ws.addressing.W3CAddressingConstants; import com.sun.xml.ws.addressing.v200408.MemberSubmissionAddressingConstants; import com.sun.xml.ws.api.addressing.AddressingVersion; import junit.framework.AssertionFailedError; import junit.framework.TestCase; public class W3CWsaUtils { public static final String UUID = "uuid:" + java.util.UUID.randomUUID(); public static final String W3C_WSA_NS = W3CAddressingConstants.WSA_NAMESPACE_NAME; public static final String MS_WSA_NS = MemberSubmissionAddressingConstants.WSA_NAMESPACE_NAME; public static final String S11_NS = SOAPConstants.URI_NS_SOAP_1_1_ENVELOPE; public static final String S12_NS = SOAPConstants.URI_NS_SOAP_1_2_ENVELOPE; private static final Source makeStreamSource(String msg) { byte[] bytes = msg.getBytes(); ByteArrayInputStream sinputStream = new ByteArrayInputStream(bytes); return new StreamSource(sinputStream); } private static final SOAPMessage getSOAPMessage(Source msg) throws Exception { MessageFactory factory = MessageFactory.newInstance(); SOAPMessage message = factory.createMessage(); message.getSOAPPart().setContent(msg); message.saveChanges(); return message; } private static final SOAPMessage getSOAP12Message(Source msg) throws Exception { MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL); SOAPMessage message = factory.createMessage(); message.getSOAPPart().setContent(msg); message.saveChanges(); return message; } public static String fileToXMLString(String filename) { return sourceToXMLString(new StreamSource(new File(filename))); } public static String sourceToXMLString(Source result) { String xmlResult = null; try { TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); OutputStream out = new ByteArrayOutputStream(); StreamResult streamResult = new StreamResult(); streamResult.setOutputStream(out); transformer.transform(result, streamResult); xmlResult = streamResult.getOutputStream().toString(); } catch (TransformerException e) { e.printStackTrace(); } return xmlResult; } public static final SOAPMessage invoke(Dispatch<SOAPMessage> dispatch, String request, String ... args) throws Exception { String fRequest = String.format(request, args); return dispatch.invoke(getSOAPMessage(makeStreamSource(fRequest))); } public static final Response<SOAPMessage> invokeAsync(Dispatch<SOAPMessage> dispatch, String request, String ... args) throws Exception { String fRequest = String.format(request, args); return dispatch.invokeAsync(getSOAPMessage(makeStreamSource(fRequest))); } public static final void invokeOneWay(Dispatch<SOAPMessage> dispatch, String request, String ... args) throws Exception { String fRequest = String.format(request, args); dispatch.invokeOneWay(getSOAPMessage(makeStreamSource(fRequest))); } public static final SOAPMessage invoke12(Dispatch<SOAPMessage> dispatch, String request, String ... args) throws Exception { String fRequest = String.format(request, args); return dispatch.invoke(getSOAP12Message(makeStreamSource(fRequest))); } public static final void invokeOneWay12(Dispatch<SOAPMessage> dispatch, String request, String ... args) throws Exception { String fRequest = String.format(request, args); dispatch.invokeOneWay(getSOAP12Message(makeStreamSource(fRequest))); } public static final String BAD_ACTION_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:To>%s</wsa:To>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>\n" + "<wsa:ReplyTo>\n" + " <wsa:Address>%s</wsa:Address>\n" + "</wsa:ReplyTo>\n" + "<wsa:Action>badSOAPAction</wsa:Action>\n" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String MISSING_ACTION_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:To>%s</wsa:To>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>\n" + "<wsa:ReplyTo>\n" + " <wsa:Address>%s</wsa:Address>\n" + "</wsa:ReplyTo>\n" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String REPLY_TO_REFPS_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:To>%s</wsa:To>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>\n" + "<wsa:ReplyTo>\n" + " <wsa:Address>%s</wsa:Address>\n" + " <wsa:ReferenceParameters>\n" + " <ck:CustomerKey xmlns:ck=\"http://example.org/customer\">Key#123456789</ck:CustomerKey>\n" + " </wsa:ReferenceParameters>" + "</wsa:ReplyTo>\n" + "<wsa:Action>%s</wsa:Action>\n" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String FAULT_TO_REFPS_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:To>%s</wsa:To>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>\n" + "<wsa:ReplyTo>\n" + " <wsa:Address>%s</wsa:Address>\n" + " <wsa:ReferenceParameters>\n" + " <ck:CustomerKey xmlns:ck=\"http://example.org/customer\">Key#123456789</ck:CustomerKey>\n" + " </wsa:ReferenceParameters>" + "</wsa:ReplyTo>\n" + "<wsa:FaultTo>\n" + " <wsa:Address>%s</wsa:Address>\n" + " <wsa:ReferenceParameters>\n" + " <ck:CustomerKey xmlns:ck=\"http://example.org/customer\">Fault#123456789</ck:CustomerKey>\n" + " </wsa:ReferenceParameters>" + "</wsa:FaultTo>\n" + "<wsa:Action>%s</wsa:Action>\n" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>-10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String DUPLICATE_TO_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:To>%s</wsa:To>\n" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String DUPLICATE_REPLY_TO_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:ReplyTo><wsa:Address>%s</wsa:Address></wsa:ReplyTo>" + // "<wsa:ReplyTo><wsa:Address>%s</wsa:Address></wsa:ReplyTo>" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String DUPLICATE_FAULT_TO_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:FaultTo><wsa:Address>%s</wsa:Address></wsa:FaultTo>" + "<wsa:FaultTo><wsa:Address>%s</wsa:Address></wsa:FaultTo>" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String DUPLICATE_ACTION_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:Action>%s</wsa:Action>" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String DUPLICATE_MESSAGE_ID_MESSAGE = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; public static final String DUPLICATE_MESSAGE_ID_MESSAGE_ONEWAY = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>" + "</S:Header>\n" + "<S:Body>\n" + "<addNumbers5 xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers5>\n" + "</S:Body></S:Envelope>"; private static final String ADD_NUMBERS_HEADER = "<S:Envelope xmlns:S=\"%s\" " + "xmlns:wsa=\"%s\">\n" + "<S:Header>\n" + "<wsa:To>%s</wsa:To>\n" + "<wsa:MessageID>" + UUID + "</wsa:MessageID>\n" + "<wsa:ReplyTo>\n" + " <wsa:Address>%s</wsa:Address>\n" + "</wsa:ReplyTo>\n" + "<wsa:Action>%s</wsa:Action>\n" + "</S:Header>\n"; private static final String ADD_NUMBERS_PAYLOAD = "<S:Body>\n" + "<addNumbers xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers>\n" + "</S:Body></S:Envelope>"; private static final String ADD_NUMBERS2_PAYLOAD = "<S:Body>\n" + "<addNumbers2 xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers2>\n" + "</S:Body></S:Envelope>"; private static final String ADD_NUMBERS3_PAYLOAD = "<S:Body>\n" + "<addNumbers2 xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers2>\n" + "</S:Body></S:Envelope>"; private static final String ADD_NUMBERS4_PAYLOAD = "<S:Body>\n" + "<addNumbers2 xmlns=\"http://example.com/\">\n" + " <number1>10</number1>\n" + " <number2>10</number2>\n" + "</addNumbers2>\n" + "</S:Body></S:Envelope>"; public static final String ACTION_DISPATCH_MESSAGE1 = ADD_NUMBERS_HEADER + ADD_NUMBERS_PAYLOAD; public static final String ACTION_DISPATCH_MESSAGE2 = ADD_NUMBERS_HEADER + ADD_NUMBERS2_PAYLOAD; public static final String ACTION_DISPATCH_MESSAGE3 = ADD_NUMBERS_HEADER + ADD_NUMBERS3_PAYLOAD; public static final String ACTION_DISPATCH_MESSAGE4 = ADD_NUMBERS_HEADER + ADD_NUMBERS4_PAYLOAD; public static final void assertInvalidHeaderFaultCode(QName got, AddressingVersion av) { try { TestCase.assertEquals(av.invalidCardinalityTag, got); } catch (AssertionFailedError e) { TestCase.assertEquals(av.invalidMapTag, got); } } public static final void assertHeaderRequiredFaultCode(QName got) { TestCase.assertEquals(W3CAddressingConstants.MAP_REQUIRED_QNAME, got); } public static final void assertHeaderRequiredFaultCode12(SOAPFault f) { TestCase.assertNotNull("Fault element is null", f); QName faultcode = f.getFaultCodeAsQName(); TestCase.assertEquals(SOAPConstants.SOAP_SENDER_FAULT, faultcode); Iterator iter = f.getFaultSubcodes(); TestCase.assertNotNull("Subcode iterator is null", iter); TestCase.assertTrue("Subcode iterator has no elements", iter.hasNext()); TestCase.assertEquals(iter.next(), W3CAddressingConstants.MAP_REQUIRED_QNAME); // TestCase.assertTrue("No subsubcode on the fault", iter.hasNext()); // TestCase.assertEquals(iter.next(), W3CAddressingConstants.INVALID_CARDINALITY); } public static final void assertInvalidCardinalityCode12(SOAPFault f, AddressingVersion av) { TestCase.assertNotNull("Fault element is null", f); QName faultcode = f.getFaultCodeAsQName(); TestCase.assertEquals(SOAPConstants.SOAP_SENDER_FAULT, faultcode); Iterator iter = f.getFaultSubcodes(); TestCase.assertNotNull("Subcode iterator is null", iter); TestCase.assertTrue("Subcode iterator has no elements", iter.hasNext()); TestCase.assertEquals(iter.next(), av.invalidMapTag); TestCase.assertTrue("No subsubcode on the fault", iter.hasNext()); TestCase.assertEquals(iter.next(), av.invalidCardinalityTag); } }