You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Deepal Jayasinghe (JIRA)" <ji...@apache.org> on 2007/05/03 17:20:15 UTC
[jira] Assigned: (AXIS2-2634) When several requests are processed
simultaneously, parent nodes are mixed
[ https://issues.apache.org/jira/browse/AXIS2-2634?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Deepal Jayasinghe reassigned AXIS2-2634:
----------------------------------------
Assignee: Deepal Jayasinghe
> When several requests are processed simultaneously, parent nodes are mixed
> --------------------------------------------------------------------------
>
> Key: AXIS2-2634
> URL: https://issues.apache.org/jira/browse/AXIS2-2634
> Project: Axis 2.0 (Axis2)
> Issue Type: Bug
> Components: adb
> Affects Versions: 1.1.1
> Reporter: Eugeny Tretiakov
> Assigned To: Deepal Jayasinghe
>
> Problem description:
> 2 simultaneous requests (SOAP-Envelopes) are sent to 2 different
> web-services. Expected responses are:
> First:
> <aaaResponse>
> <res>1</res>
> </aaaResponse>
> Second:
> <bbbResponse>
> <result>2</result>
> </bbbResponse>
> Instead we get responses like:
> First:
> <bbbResponse>
> <res>1</res>
> </bbbResponse>
> Second:
> <aaaResponse>
> <result>2</result>
> </aaaResponse>
> ===============================================================
> Fix description:
> Class org.apache.axis2.rpc.receivers.RPCMessageReceiver;
> Global variable of the class - private Method method
> was moved into the method invokeBusinessLogic
> Besides the class org.apache.axis2.rpc.receivers.RPCUtil was changed (the
> problem was in processResponse methods: it receives Method method parameter
> while it uses only method name.
> After applying the changes the classes look as follows:
> =============================================================
> после изменений классы приняли вид:
> /*
> * 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.
> */
> /*
> * Reflection based RPCMessageReceiver , request will be processed by looking at the method signature
> * of the invocation method
> */
> package org.apache.axis2.rpc.receivers;
> import org.apache.axiom.om.OMElement;
> import org.apache.axiom.om.OMNamespace;
> 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.description.AxisMessage;
> import org.apache.axis2.description.AxisOperation;
> import org.apache.axis2.description.AxisService;
> import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
> import org.apache.axis2.wsdl.WSDLConstants;
> import javax.xml.namespace.QName;
> import java.lang.reflect.InvocationTargetException;
> import java.lang.reflect.Method;
> public class RPCMessageReceiver extends AbstractInOutSyncMessageReceiver {
> /**
> * reflect and get the Java method
> * - for each i'th param in the java method
> * - get the first child's i'th child
> * -if the elem has an xsi:type attr then find the deserializer for it
> * - if not found,
> * lookup deser for th i'th param (java type)
> * - error if not found
> * - deserialize & save in an object array
> * - end for
> * <p/>
> * - invoke method and get the return value
> * <p/>
> * - look up serializer for return value based on the value and type
> * <p/>
> * - create response msg and add return value as grand child of <soap:body>
> *
> * @param inMessage
> * @param outMessage
> * @throws AxisFault
> */
>
> public void invokeBusinessLogic(MessageContext inMessage, MessageContext outMessage) throws AxisFault {
> Method method = null;
> try {
> // get the implementation class for the Web Service
> Object obj = getTheImplementationObject(inMessage);
> Class ImplClass = obj.getClass();
> AxisOperation op = inMessage.getOperationContext().getAxisOperation();
> AxisService service = inMessage.getAxisService();
> OMElement methodElement = inMessage.getEnvelope().getBody()
> .getFirstElement();
> AxisMessage inAxisMessage = op.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
> String messageNameSpace = null;
> QName elementQName;
> String methodName = op.getName().getLocalPart();
> Method[] methods = ImplClass.getMethods();
> for (int i = 0; i < methods.length; i++) {
> if (methods[i].getName().equals(methodName)) {
> method = methods[i];
> break;
> }
> }
>
> Object resObject = null;
> if (inAxisMessage != null) {
> if (inAxisMessage.getElementQName() == null) {
> // method accept empty SOAPbody
> resObject = method.invoke(obj, new Object[0]);
> } else {
> elementQName = inAxisMessage.getElementQName();
> messageNameSpace = elementQName.getNamespaceURI();
> OMNamespace namespace = methodElement.getNamespace();
> if (messageNameSpace != null) {
> if (namespace == null) {
> throw new AxisFault("namespace mismatch require " +
> messageNameSpace +
> " found none");
> }
> if (!messageNameSpace.equals(namespace.getNamespaceURI()))
> {
> throw new AxisFault("namespace mismatch require " +
> messageNameSpace +
> " found " + methodElement.getNamespace().getNamespaceURI());
> }
> } else if (namespace != null) {
> throw new AxisFault("namespace mismatch. Axis Oepration expects non-namespace " +
> "qualified element. But received a namespace qualified element");
> }
> Object[] objectArray = RPCUtil.processRequest(methodElement, method,
> inMessage.getAxisService().getObjectSupplier());
> resObject = method.invoke(obj, objectArray);
> }
> }
> SOAPFactory fac = getSOAPFactory(inMessage);
> // Handling the response
> AxisMessage outaxisMessage = op.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
> if (inAxisMessage != null) {
> messageNameSpace = outaxisMessage.getElementQName().getNamespaceURI();
> }
> OMNamespace ns = fac.createOMNamespace(messageNameSpace,
> service.getSchematargetNamespacePrefix());
> SOAPEnvelope envelope = fac.getDefaultEnvelope();
> OMElement bodyContent = null;
> RPCUtil.processResponse(resObject, service,
> methodName, envelope, fac, ns,
> bodyContent, outMessage);
> outMessage.setEnvelope(envelope);
> } catch (InvocationTargetException e) {
> String msg = null;
> Throwable cause = e.getCause();
> if (cause != null) {
> msg = cause.getMessage();
> }
> if (msg == null) {
> msg = "Exception occurred while trying to invoke service method " +
> (method != null ? method.getName() : null);
> }
> if (cause instanceof AxisFault) {
> throw (AxisFault) cause;
> }
> throw new AxisFault(msg);
> } catch (Exception e) {
> String msg = "Exception occurred while trying to invoke service method " +
> (method != null ? method.getName() : null);
> throw new AxisFault(msg, e);
> }
> }
> }
> =========================================================================================
> 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";
> /**
> * @deprecated
> */
> public static void processResponse(SOAPFactory fac, Object resObject,
> OMElement bodyContent,
> OMNamespace ns,
> SOAPEnvelope envelope,
> Method method,
> boolean qualified,
> TypeTable typeTable) {
> processResponse(fac, resObject, bodyContent, ns, envelope,
> method.getName(), qualified, typeTable);
> }
> public static void processResponse(SOAPFactory fac, Object resObject,
> OMElement bodyContent,
> OMNamespace ns,
> SOAPEnvelope envelope,
> String methodName,
> boolean qualified,
> TypeTable typeTable) {
> if (resObject != null) {
> //simple type
> if (resObject instanceof OMElement) {
> OMElement result = (OMElement) resObject;
> bodyContent = fac.createOMElement(
> methodName + "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(
> methodName + "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(
> methodName + "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);
> }
> }
> /**
> * @deprecated
> */
> public static void processResponse(Object resObject,
> AxisService service,
> Method method,
> SOAPEnvelope envelope,
> SOAPFactory fac,
> OMNamespace ns,
> OMElement bodyContent,
> MessageContext outMessage
> ) throws Exception {
> processResponse(resObject, service, method.getName(), envelope,
> fac, ns, bodyContent, outMessage);
> }
> public static void processResponse(Object resObject,
> AxisService service,
> String methodName,
> 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(methodName + "Response", ns);
> bodyChild.addChild(stAXOMBuilder.getDocumentElement());
> envelope.getBody().addChild(bodyChild);
> } else {
> if (resObject instanceof Object[]) {
> QName resName = new QName(service.getSchematargetNamespace(),
> methodName + "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(),
> methodName + "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, methodName, service.isElementFormDefault(),
> service.getTypeTable());
> } else {
> RPCUtil.processResponse(fac, resObject, bodyContent, ns,
> envelope, methodName, service.isElementFormDefault(),
> null);
> }
> }
> }
> }
> outMessage.setEnvelope(envelope);
> }
> }
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org