blob: 95158fb24bc90ef8f0e3d71697900edea426870a [file] [log] [blame]
/*
* 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;
}
}