/* * 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.axis2.jaxws.type_substitution.tests; import junit.framework.Test; import junit.framework.TestSuite; import org.apache.axis2.jaxws.TestLogger; import org.apache.axis2.jaxws.framework.AbstractTestCase; import javax.xml.namespace.QName; import javax.xml.soap.MessageFactory; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPMessage; import javax.xml.ws.Dispatch; import javax.xml.ws.Service; import java.io.ByteArrayInputStream; import java.util.Iterator; public class TypeSubstitutionTests extends AbstractTestCase { private String NS = "http://apple.org"; private QName XSI_TYPE = new QName("http://www.w3.org/2001/XMLSchema-instance", "type"); private String endpointUrl = "http://localhost:6060/axis2/services/AppleFinderService.AppleFinderPort"; private QName serviceName = new QName(NS, "AppleFinderService"); private QName portName = new QName(NS, "AppleFinderPort"); private String reqMsgStart = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body>"; private String reqMsgEnd = "</soap:Body></soap:Envelope>"; private String GET_APPLES = "<ns2:getApples xmlns:ns2=\"" + NS + "\"/>"; public static Test suite() { return getTestSetup(new TestSuite(TypeSubstitutionTests.class)); } public void testTypeSubstitution() throws Exception { Dispatch<SOAPMessage> dispatch = createDispatch(); String msg = reqMsgStart + GET_APPLES + reqMsgEnd; MessageFactory factory = MessageFactory.newInstance(); SOAPMessage request = factory.createMessage(null, new ByteArrayInputStream(msg.getBytes())); SOAPMessage response = dispatch.invoke(request); SOAPBody body = response.getSOAPBody(); TestLogger.logger.debug(">> Response [" + body + "]"); QName expectedXsiType1 = new QName(NS, "fuji"); QName expectedXsiType2 = new QName(NS, "freyburg"); Iterator iter; SOAPElement element; QName xsiType; iter = body.getChildElements(new QName(NS, "getApplesResponse")); assertTrue(iter.hasNext()); element = (SOAPElement)iter.next(); iter = element.getChildElements(new QName("return")); // check value1 assertTrue(iter.hasNext()); element = (SOAPElement)iter.next(); xsiType = getXsiTypeAttribute(element); assertEquals("xsi:type 1", expectedXsiType1, xsiType); // check value2 assertTrue(iter.hasNext()); element = (SOAPElement)iter.next(); xsiType = getXsiTypeAttribute(element); assertEquals("xsi:type 2", expectedXsiType2, xsiType); } private QName getXsiTypeAttribute(SOAPElement element) throws Exception { String value = element.getAttributeValue(XSI_TYPE); QName xsiType = null; if (value != null) { int pos = value.indexOf(":"); if (pos != -1) { String prefix = value.substring(0, pos); String localName = value.substring(pos+1); String namespace = element.getNamespaceURI(prefix); xsiType = new QName(namespace, localName, prefix); } else { xsiType = new QName(value); } } return xsiType; } private Dispatch<SOAPMessage> createDispatch() throws Exception { Service svc = Service.create(serviceName); svc.addPort(portName, null, endpointUrl); Dispatch<SOAPMessage> dispatch = svc.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); return dispatch; } }