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 de...@apache.org on 2006/04/18 14:28:08 UTC
svn commit: r394926 - in /webservices/axis2/trunk/java/modules:
codegen/src/org/apache/axis2/rpc/receivers/
core/src/org/apache/axis2/receivers/
Author: deepal
Date: Tue Apr 18 05:28:04 2006
New Revision: 394926
URL: http://svn.apache.org/viewcvs?rev=394926&view=rev
Log:
- fixing http://issues.apache.org/jira/browse/AXIS2-582
- added two new async message receivers
Added:
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCUtil.java
webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java
Modified:
webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java
Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java?rev=394926&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCInOutAsyncMessageReceiver.java Tue Apr 18 05:28:04 2006
@@ -0,0 +1,123 @@
+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.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.engine.DependencyManager;
+import org.apache.axis2.receivers.AbstractInOutAsyncMessageReceiver;
+
+import javax.xml.namespace.QName;
+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 RPCInOutAsyncMessageReceiver extends AbstractInOutAsyncMessageReceiver {
+
+ private Method method;
+
+ /**
+ * 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 {
+ try {
+ // get the implementation class for the Web Service
+ Object obj = getTheImplementationObject(inMessage);
+
+ Class ImplClass = obj.getClass();
+ DependencyManager.configureBusinessLogicProvider(obj,
+ inMessage.getOperationContext());
+
+ AxisOperation op = inMessage.getOperationContext().getAxisOperation();
+ AxisService service = inMessage.getAxisService();
+ OMElement methodElement = inMessage.getEnvelope().getBody()
+ .getFirstElement();
+
+ OMNamespace namespace = methodElement.getNamespace();
+ if (namespace == null || !service.getSchematargetNamespace().equals(namespace.getName())) {
+ throw new AxisFault("namespace mismatch require " +
+ service.getSchematargetNamespace() +
+ " found " + methodElement.getNamespace().getName());
+ }
+ String methodName = op.getName().getLocalPart();
+ Method[] methods = ImplClass.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ if (methods[i].getName().equals(methodName)) {
+ this.method = methods[i];
+ break;
+ }
+ }
+
+
+ Object[] objectArray = RPCUtil.processRequest(methodElement, method);
+ Object resObject;
+ try {
+ resObject = method.invoke(obj, objectArray);
+ } catch (Exception e) {
+ throw new AxisFault(e.getMessage());
+ }
+ SOAPFactory fac = getSOAPFactory(inMessage);
+
+ // Handling the response
+ OMNamespace ns = fac.createOMNamespace(service.getSchematargetNamespace(),
+ service.getSchematargetNamespacePrefix());
+ SOAPEnvelope envelope = fac.getDefaultEnvelope();
+ OMElement bodyContent = null;
+
+ if (resObject instanceof Object[]) {
+ QName resName = new QName(service.getSchematargetNamespace(),
+ method.getName() + "Response",
+ service.getSchematargetNamespacePrefix());
+ OMElement bodyChild = RPCUtil.getResponseElement(resName, (Object[]) resObject);
+ envelope.getBody().addChild(bodyChild);
+ } else {
+ RPCUtil.processResponse(fac, resObject, bodyContent, ns, envelope, method);
+ }
+
+ outMessage.setEnvelope(envelope);
+
+ } catch (Exception e) {
+ throw AxisFault.makeFault(e);
+ }
+ }
+
+
+}
Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java?rev=394926&r1=394925&r2=394926&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCMessageReceiver.java Tue Apr 18 05:28:04 2006
@@ -21,32 +21,24 @@
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.soap.SOAPEnvelope;
import org.apache.axiom.soap.SOAPFactory;
import org.apache.axis2.AxisFault;
-import org.apache.axis2.util.StreamWrapper;
import org.apache.axis2.context.MessageContext;
-import org.apache.axis2.databinding.typemapping.SimpleTypeMapper;
-import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.engine.DependencyManager;
import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
import javax.xml.namespace.QName;
-import javax.xml.stream.XMLStreamReader;
import java.lang.reflect.Method;
public class RPCMessageReceiver extends AbstractInOutSyncMessageReceiver {
private Method method;
- private String RETURN_WRAPPER = "return";
/**
* reflect and get the Java method
@@ -100,7 +92,7 @@
}
- Object[] objectArray = processRequest(methodElement);
+ Object[] objectArray = RPCUtil.processRequest(methodElement, method);
Object resObject;
try {
resObject = method.invoke(obj, objectArray);
@@ -119,59 +111,16 @@
QName resName = new QName(service.getSchematargetNamespace(),
method.getName() + "Response",
service.getSchematargetNamespacePrefix());
- OMElement bodyChild = getResponseElement(resName, (Object[]) resObject);
+ OMElement bodyChild = RPCUtil.getResponseElement(resName, (Object[]) resObject);
envelope.getBody().addChild(bodyChild);
} else {
- processResponse(fac, resObject, bodyContent, ns, envelope);
+ RPCUtil.processResponse(fac, resObject, bodyContent, ns, envelope, method);
}
outMessage.setEnvelope(envelope);
} catch (Exception e) {
throw AxisFault.makeFault(e);
- }
- }
-
- private Object[] processRequest(OMElement methodElement) throws AxisFault {
- Class[] parameters = method.getParameterTypes();
- return BeanUtil.deserialize(methodElement, parameters);
- }
-
- private OMElement getResponseElement(QName resname, Object [] objs) {
- return BeanUtil.getOMElement(resname, objs, RETURN_WRAPPER);
- }
-
- private void processResponse(SOAPFactory fac, Object resObject,
- OMElement bodyContent,
- OMNamespace ns,
- SOAPEnvelope envelope) {
- if (resObject != null) {
- //simple type
- if (resObject instanceof OMElement) {
- bodyContent = (OMElement) resObject;
- } else if (SimpleTypeMapper.isSimpleType(resObject)) {
- bodyContent = fac.createOMElement(
- method.getName() + "Response", ns);
- OMElement 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
- XMLStreamReader xr = BeanUtil.getPullParser(resObject,
- new QName(RETURN_WRAPPER));
- 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);
}
}
Added: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCUtil.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCUtil.java?rev=394926&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCUtil.java (added)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/RPCUtil.java Tue Apr 18 05:28:04 2006
@@ -0,0 +1,84 @@
+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.soap.SOAPEnvelope;
+import org.apache.axiom.soap.SOAPFactory;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.databinding.typemapping.SimpleTypeMapper;
+import org.apache.axis2.databinding.utils.BeanUtil;
+import org.apache.axis2.util.StreamWrapper;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamReader;
+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) {
+ if (resObject != null) {
+ //simple type
+ if (resObject instanceof OMElement) {
+ bodyContent = (OMElement) resObject;
+ } else if (SimpleTypeMapper.isSimpleType(resObject)) {
+ bodyContent = fac.createOMElement(
+ method.getName() + "Response", ns);
+ OMElement 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
+ XMLStreamReader xr = BeanUtil.getPullParser(resObject,
+ new QName(RETURN_WRAPPER));
+ 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) throws AxisFault {
+ Class[] parameters = method.getParameterTypes();
+ return BeanUtil.deserialize(methodElement, parameters);
+ }
+
+ public static OMElement getResponseElement(QName resname, Object [] objs) {
+ return BeanUtil.getOMElement(resname, objs, RETURN_WRAPPER);
+ }
+
+}
Added: webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java?rev=394926&view=auto
==============================================================================
--- webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java (added)
+++ webservices/axis2/trunk/java/modules/core/src/org/apache/axis2/receivers/RawXMLINOutAsyncMessageReceiver.java Tue Apr 18 05:28:04 2006
@@ -0,0 +1,111 @@
+package org.apache.axis2.receivers;
+
+import org.apache.axiom.om.OMElement;
+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.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.engine.DependencyManager;
+import org.apache.axis2.i18n.Messages;
+
+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 RawXMLINOutAsyncMessageReceiver extends AbstractInOutAsyncMessageReceiver {
+
+ public Method findOperation(AxisOperation op, Class ImplClass) {
+ Method method = null;
+ 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;
+ }
+ }
+
+ return method;
+ }
+
+ public void invokeBusinessLogic(MessageContext msgContext, MessageContext newmsgContext)
+ throws AxisFault {
+ try {
+
+ // get the implementation class for the Web Service
+ Object obj = getTheImplementationObject(msgContext);
+
+ // find the WebService method
+ Class ImplClass = obj.getClass();
+
+ // Inject the Message Context if it is asked for
+ DependencyManager.configureBusinessLogicProvider(obj,
+ msgContext.getOperationContext());
+
+ AxisOperation opDesc = msgContext.getOperationContext().getAxisOperation();
+ Method method = findOperation(opDesc, ImplClass);
+
+ if (method != null) {
+ Class[] parameters = method.getParameterTypes();
+ Object[] args;
+
+ if ((parameters == null) || (parameters.length == 0)) {
+ args = new Object[0];
+ } else if (parameters.length == 1) {
+ OMElement omElement = msgContext.getEnvelope().getBody().getFirstElement();
+ args = new Object[]{omElement};
+ } else {
+ throw new AxisFault(Messages.getMessage("rawXmlProivdeIsLimited"));
+ }
+
+ OMElement result;
+ try {
+ result = (OMElement) method.invoke(obj, args);
+ } catch (Exception e) {
+ throw new AxisFault(e.getMessage());
+ }
+
+ AxisService service = msgContext.getAxisService();
+ service.getTargetNamespace();
+ result.declareNamespace(service.getTargetNamespace(),
+ service.getTargetNamespacePrefix());
+ OMElement bodyContent;
+
+ SOAPFactory fac = getSOAPFactory(msgContext);
+ bodyContent = result;
+
+ SOAPEnvelope envelope = fac.getDefaultEnvelope();
+
+ if (bodyContent != null) {
+ envelope.getBody().addChild(bodyContent);
+ }
+
+ newmsgContext.setEnvelope(envelope);
+ } else {
+ throw new AxisFault(Messages.getMessage("methodNotImplemented",
+ opDesc.getName().toString()));
+ }
+ } catch (Exception e) {
+ throw AxisFault.makeFault(e);
+ }
+ }
+}