blob: c132efbbab01d3fb5f084ee23af3f6d37c047dd7 [file] [log] [blame]
package org.apache.axis2.rpc.receivers;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.om.impl.llom.factory.OMXMLBuilderFactory;
import org.apache.axiom.om.util.Base64;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.databinding.typemapping.SimpleTypeMapper;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.databinding.utils.reader.NullXMLStreamReader;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.engine.ObjectSupplier;
import org.apache.axis2.util.StreamWrapper;
import org.apache.ws.java2wsdl.utils.TypeTable;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamReader;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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.
*
*
*/
public class RPCUtil {
private static String RETURN_WRAPPER = "return";
public static void processResponse(SOAPFactory fac, Object resObject,
OMElement bodyContent,
OMNamespace ns,
SOAPEnvelope envelope,
Method method,
boolean qualified,
TypeTable typeTable) {
if (resObject != null) {
//simple type
if (resObject instanceof OMElement) {
OMElement result = (OMElement) resObject;
bodyContent = fac.createOMElement(
method.getName() + "Response", ns);
OMElement resWrapper;
if (qualified) {
resWrapper = fac.createOMElement(RETURN_WRAPPER, ns.getNamespaceURI(),
ns.getPrefix());
} else {
resWrapper = fac.createOMElement(RETURN_WRAPPER, null);
}
resWrapper.addChild(result);
bodyContent.addChild(resWrapper);
} else if (SimpleTypeMapper.isSimpleType(resObject)) {
bodyContent = fac.createOMElement(
method.getName() + "Response", ns);
OMElement child;
if (qualified) {
child = fac.createOMElement(RETURN_WRAPPER, ns);
} else {
child = fac.createOMElement(RETURN_WRAPPER, null);
}
child.addChild(fac.createOMText(child, SimpleTypeMapper.getStringValue(resObject)));
bodyContent.addChild(child);
} else {
bodyContent = fac.createOMElement(
method.getName() + "Response", ns);
// Java Beans
QName returnWrapper;
if (qualified) {
returnWrapper = new QName(ns.getNamespaceURI(), RETURN_WRAPPER, ns.getPrefix());
} else {
returnWrapper = new QName(RETURN_WRAPPER);
}
XMLStreamReader xr = BeanUtil.getPullParser(resObject,
returnWrapper, typeTable, qualified);
StAXOMBuilder stAXOMBuilder =
OMXMLBuilderFactory.createStAXOMBuilder(
OMAbstractFactory.getOMFactory(), new StreamWrapper(xr));
OMElement documentElement = stAXOMBuilder.getDocumentElement();
if (documentElement != null) {
bodyContent.addChild(documentElement);
}
}
}
if (bodyContent != null) {
envelope.getBody().addChild(bodyContent);
}
}
public static Object[] processRequest(OMElement methodElement,
Method method, ObjectSupplier objectSupplier) throws AxisFault {
Class[] parameters = method.getParameterTypes();
return BeanUtil.deserialize(methodElement, parameters, objectSupplier);
}
public static OMElement getResponseElement(QName resname, Object [] objs,
boolean qualified, TypeTable typeTable) {
if (qualified) {
return BeanUtil.getOMElement(resname, objs,
new QName(resname.getNamespaceURI(), RETURN_WRAPPER, resname.getPrefix()), qualified, typeTable);
} else {
return BeanUtil.getOMElement(resname, objs,
new QName(RETURN_WRAPPER), qualified, typeTable);
}
}
public static OMElement getResponseElementForArray(QName resname, Object [] objs,
boolean qualified, TypeTable typeTable) {
if (qualified) {
return BeanUtil.getOMElement(resname, objs,
new QName(resname.getNamespaceURI(), RETURN_WRAPPER, resname.getPrefix()), qualified, typeTable);
} else {
return BeanUtil.getOMElement(resname, objs,
new QName(RETURN_WRAPPER), qualified, typeTable);
}
}
public static void processResponse(Object resObject,
AxisService service,
Method method,
SOAPEnvelope envelope,
SOAPFactory fac,
OMNamespace ns,
OMElement bodyContent,
MessageContext outMessage
) throws Exception {
if (resObject == null) {
QName resName;
if (service.isElementFormDefault()) {
resName = new QName(service.getSchematargetNamespace(),
RETURN_WRAPPER,
service.getSchematargetNamespacePrefix());
} else {
resName = new QName(RETURN_WRAPPER);
}
XMLStreamReader xr = new NullXMLStreamReader(resName);
StreamWrapper parser = new StreamWrapper(xr);
StAXOMBuilder stAXOMBuilder =
OMXMLBuilderFactory.createStAXOMBuilder(
OMAbstractFactory.getSOAP11Factory(), parser);
ns = fac.createOMNamespace(service.getSchematargetNamespace(),
service.getSchematargetNamespacePrefix());
OMElement bodyChild = fac.createOMElement(method.getName() + "Response", ns);
bodyChild.addChild(stAXOMBuilder.getDocumentElement());
envelope.getBody().addChild(bodyChild);
} else {
if (resObject instanceof Object[]) {
QName resName = new QName(service.getSchematargetNamespace(),
method.getName() + "Response",
service.getSchematargetNamespacePrefix());
OMElement bodyChild = RPCUtil.getResponseElement(resName,
(Object[]) resObject, service.isElementFormDefault(), service.getTypeTable());
envelope.getBody().addChild(bodyChild);
} else {
if (resObject.getClass().isArray()) {
int length = Array.getLength(resObject);
Object objArray [];
if (resObject instanceof byte[]) {
objArray = new Object[1];
objArray[0] = Base64.encode((byte[]) resObject);
} else {
objArray = new Object[length];
for (int i = 0; i < length; i++) {
objArray[i] = Array.get(resObject, i);
}
}
QName resName = new QName(service.getSchematargetNamespace(),
method.getName() + "Response",
service.getSchematargetNamespacePrefix());
OMElement bodyChild = RPCUtil.getResponseElementForArray(resName,
objArray, service.isElementFormDefault(), service.getTypeTable());
envelope.getBody().addChild(bodyChild);
} else {
if (service.isElementFormDefault()) {
RPCUtil.processResponse(fac, resObject, bodyContent, ns,
envelope, method, service.isElementFormDefault(),
service.getTypeTable());
} else {
RPCUtil.processResponse(fac, resObject, bodyContent, ns,
envelope, method, service.isElementFormDefault(),
null);
}
}
}
}
outMessage.setEnvelope(envelope);
}
}