You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yoko-commits@incubator.apache.org by dm...@apache.org on 2006/09/08 20:12:51 UTC

svn commit: r441633 - in /incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba: CorbaBindingImpl.java CorbaDSIServant.java

Author: dmiddlem
Date: Fri Sep  8 13:12:51 2006
New Revision: 441633

URL: http://svn.apache.org/viewvc?view=rev&rev=441633
Log:
Committing fix for NullPointerException when using single OUT parameter (YOKO-162)

Modified:
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java
    incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaDSIServant.java

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java?view=diff&rev=441633&r1=441632&r2=441633
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingImpl.java Fri Sep  8 13:12:51 2006
@@ -32,6 +32,7 @@
 import java.util.logging.Logger;
 
 import javax.jws.WebParam;
+import javax.jws.WebResult;
 import javax.wsdl.Definition;
 import javax.wsdl.Import;
 import javax.xml.namespace.QName;
@@ -189,13 +190,15 @@
             }
 
             // Handle the parameters that are given for the operation
-            Object[] args = objContext.getMessageObjects();
-            addParams(callback, opElement, corbaCtx, args, inputFactory, outputFactory, writer);
+            List<ParamType> paramTypes = opElement.getParam();
+            boolean hasOutParamReturn = 
+                addMarshalParams(callback, paramTypes, corbaCtx, objContext, 
+                                 inputFactory, outputFactory, writer);
 
             // Check to see if we have an input or output message and handle the return type
             // appropriately
             boolean isInputMessage = (Boolean) mc.get(ObjectMessageContext.MESSAGE_INPUT);
-            if (!isInputMessage && callback.getWebResult() != null) {
+            if (!isInputMessage && callback.getWebResult() != null && !hasOutParamReturn) {
                 ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                 XMLEventWriter evtWriter = outputFactory.createXMLEventWriter(outStream);
                 writer.write(objContext.getReturn(), callback.getWebResultQName(), evtWriter);
@@ -207,7 +210,7 @@
                                                             false);
                 CorbaStreamable streamable = new CorbaStreamable(obj, callback.getWebResultQName());
                 corbaCtx.getMessage().setStreamableReturn(streamable);
-            } else if (isInputMessage && callback.getWebResult() != null) {
+            } else if (isInputMessage && callback.getWebResult() != null && !hasOutParamReturn) {
                 QName retName = callback.getWebResultQName();
                 QName retIdlType = opElement.getReturn().getIdltype();
                 CorbaObjectHandler obj = 
@@ -221,23 +224,48 @@
         }
     }
 
-    private void addParams(DataBindingCallback callback,
-                           OperationType opElement,
-                           CorbaMessageContext corbaCtx,
-                           Object[] args,
-                           XMLInputFactory inputFactory,
-                           XMLOutputFactory outputFactory,
-                           DataWriter<XMLEventWriter> writer) throws java.lang.Exception {
-        int numParams = callback.getParamsLength();
-        List<ParamType> paramTypes = opElement.getParam();
-        for (int i = 0; i < numParams; ++i) {
-            WebParam param = callback.getWebParam(i);
-            Object partValue = args[i];
-            if (param.mode() != WebParam.Mode.IN) {
-                partValue = ((Holder) args[i]).value;
+    private boolean addMarshalParams(DataBindingCallback callback,
+                                     List<ParamType> paramTypes,
+                                     CorbaMessageContext corbaCtx,
+                                     ObjectMessageContext objContext,
+                                     XMLInputFactory inputFactory,
+                                     XMLOutputFactory outputFactory,
+                                     DataWriter<XMLEventWriter> writer) throws java.lang.Exception {
+        
+        Object[] args = objContext.getMessageObjects();
+        Object ret = objContext.getReturn();
+        boolean hasOutParamReturn = false;
+        
+        // We need to count the number of out parameters to determine how Celtix is going to handle things.
+        int outParamCount = 0;
+        for (Iterator<ParamType> paramIter = paramTypes.iterator(); paramIter.hasNext();) {
+            ParamType p = paramIter.next();
+            if (p.getMode().equals(ModeType.OUT)) {
+                outParamCount++;
+            }
+        }
+
+        int cbParamCount = 0;
+        for (Iterator<ParamType> paramIter = paramTypes.iterator(); paramIter.hasNext();) {
+            ParamType param = paramIter.next();
+            QName elName = null;
+            Object partValue = null;
+            if (param.getMode().equals(ModeType.OUT) && outParamCount == 1) {
+                // This is actually an OUT parameter to a CORBA application
+                WebResult wr = callback.getWebResult();
+                elName = new QName(wr.targetNamespace(), wr.name());
+                partValue = ret;
+                hasOutParamReturn = true;
+            } else {
+                WebParam wp = callback.getWebParam(cbParamCount);
+                elName = new QName(wp.targetNamespace(), wp.name());
+                if (wp.mode() != WebParam.Mode.IN) {
+                    partValue = ((Holder)args[cbParamCount]).value;
+                } else {
+                    partValue = args[cbParamCount];
+                }
+                cbParamCount++;
             }
-            
-            QName elName = new QName(param.targetNamespace(), param.name());
             
             ByteArrayOutputStream outStream = new ByteArrayOutputStream();
             XMLEventWriter evtWriter = outputFactory.createXMLEventWriter(outStream);
@@ -245,23 +273,23 @@
             
             ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
             XMLEventReader evtReader = inputFactory.createXMLEventReader(inStream);
-            QName idlType = paramTypes.get(i).getIdltype();
-            CorbaObjectHandler obj;
+            QName idlType = param.getIdltype();
+            CorbaObjectHandler obj = null;
             boolean skipRead = false;
             if (isServer) {
-                if (param.mode() == WebParam.Mode.IN) {
+                if (param.getMode().equals(ModeType.IN)) {
                     skipRead = true;
                 }
-            } else if (param.mode() == WebParam.Mode.OUT) {
+            } else if (param.getMode().equals(ModeType.OUT)) {
                 skipRead = true;
             } 
             if (skipRead) {
-                obj = CorbaHandlerUtils.createTypeHandler(orb, elName, idlType, typeMaps);
+                obj = CorbaHandlerUtils.initializeObjectHandler(orb, elName, idlType, typeMaps);
             } else {
                 obj = readObjectFromStax(evtReader, idlType, false);
             }
             CorbaStreamable streamable = new CorbaStreamable(obj, elName);
-            ModeType paramMode = paramTypes.get(i).getMode();
+            ModeType paramMode = param.getMode();
             if (paramMode.value().equals("in")) {
                 streamable.setMode(org.omg.CORBA.ARG_IN.value);
             } else if (paramMode.value().equals("inout")) {
@@ -271,6 +299,7 @@
             }
             corbaCtx.getMessage().addStreamableArgument(streamable);
         }
+        return hasOutParamReturn;
     }
 
     public void marshalFault(ObjectMessageContext objContext, 
@@ -352,50 +381,29 @@
                 throw new WebServiceException("Unable to create data reader");
             }
 
-            // Handle the parameters that are given for the operation
-            int numParams = callback.getParamsLength();
-            Object[] args = objContext.getMessageObjects();
-            CorbaStreamable[] streamables = corbaCtx.getMessage().getStreamableArguments();
+            OperationType opElement = 
+                CorbaUtils.getCorbaOperationType(callback.getOperationName(), bus, endpointRef);
+            if (opElement == null) {
+                throw new CorbaBindingException("Unable to find operation definition");
+            }
 
+            // We need the list of CORBA parameters to see if we have a single OUT parameter with no
+            // return type.  Celtix handles this case a bit differently than everything else
+            List<ParamType> params = opElement.getParam();
+
+            // Handle the parameters that are given for the operation
             XMLInputFactory inputFactory = XMLInputFactory.newInstance();
             XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
             outputFactory.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, Boolean.TRUE);
 
-            for (int i = 0; i < numParams; ++i) {
-                WebParam param = callback.getWebParam(i);
-                Object obj = null;
-                boolean skipRead = false;
-                if (isServer) {
-                    if (param.mode() == WebParam.Mode.OUT) {
-                        skipRead = true;
-                    }
-                } else if (param.mode() == WebParam.Mode.IN) {
-                    skipRead = true;
-                }
-                if (!skipRead) {
-                    QName elName = new QName(param.targetNamespace(), param.name());                
-                    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
-                    XMLEventWriter evtWriter = outputFactory.createXMLEventWriter(outStream);
-                
-                    writeObjectToStax(streamables[i].getObject(), evtWriter, 
-                                      XMLEventFactory.newInstance(), false);
-                    evtWriter.flush();
-
-                    ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
-                    XMLEventReader evtReader = inputFactory.createXMLEventReader(inStream);
-                    obj = reader.read(elName, i, evtReader);
-                }
-                if (param.mode() != WebParam.Mode.IN) {
-                    args[i].getClass().getField("value").set(args[i], obj);
-                } else {
-                    args[i] = obj;
-                }
-            }
-
+            boolean hasOutParamReturn = 
+                addUnmarshalParams(callback, params, inputFactory, outputFactory, 
+                                   corbaCtx, objContext, reader);
+            
             // Check to see if we have an input or output message and handle the return type
             // appropriately
             boolean isInputMessage = (Boolean) mc.get(ObjectMessageContext.MESSAGE_INPUT);
-            if (!isInputMessage && callback.getWebResult() != null) {
+            if (!isInputMessage && callback.getWebResult() != null && !hasOutParamReturn) {
                 ByteArrayOutputStream outStream = new ByteArrayOutputStream();
                 XMLEventWriter evtWriter = outputFactory.createXMLEventWriter(outStream);
                 writeObjectToStax(corbaCtx.getMessage().getStreamableReturn().getObject(), 
@@ -412,6 +420,80 @@
             LOG.log(Level.SEVERE, "CORBA unmarshal exception", ex);
             throw new CorbaBindingException("CORBA Unmarshal Exception", ex);
         }
+    }
+    
+    public boolean addUnmarshalParams(DataBindingCallback callback,
+                                   List<ParamType> params,
+                                   XMLInputFactory inputFactory,
+                                   XMLOutputFactory outputFactory, 
+                                   CorbaMessageContext corbaContext,
+                                   ObjectMessageContext objContext,
+                                   DataReader<XMLEventReader> reader) throws java.lang.Exception {
+        int cbParamIndex = 0;
+        int paramOffset = 0;
+
+        Object[] args = objContext.getMessageObjects();
+        CorbaStreamable[] streamables = corbaContext.getMessage().getStreamableArguments();
+        boolean hasOutParamReturn = false;
+        if (args != null) {
+            hasOutParamReturn = params.size() != args.length;
+        } else {
+            hasOutParamReturn = params.size() > 0;
+        }
+        
+        for (Iterator<ParamType> iter = params.iterator(); iter.hasNext();) {
+            ParamType param = iter.next();
+            int paramIndex = cbParamIndex + paramOffset;
+            
+            boolean skipRead = false;
+            if (isServer) {
+                if (param.getMode().equals(ModeType.OUT)) {
+                    skipRead = true;
+                }
+            } else if (param.getMode().equals(ModeType.IN)) {
+                skipRead = true;
+            }
+            
+            Object obj = null;
+            if (!skipRead) {
+                QName elName = null;
+                ByteArrayOutputStream outStream = new ByteArrayOutputStream();
+                XMLEventWriter evtWriter = outputFactory.createXMLEventWriter(outStream);
+        
+                writeObjectToStax(streamables[paramIndex].getObject(), evtWriter, 
+                                  XMLEventFactory.newInstance(), false);
+                evtWriter.flush();
+
+                ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
+                XMLEventReader evtReader = inputFactory.createXMLEventReader(inStream);
+                if (param.getMode().equals(ModeType.OUT) && hasOutParamReturn) {
+                    WebResult wr = callback.getWebResult();
+                    elName = new QName(wr.targetNamespace(), wr.name());
+                    obj = reader.read(elName, -1, evtReader);
+                    objContext.setReturn(obj);
+                    paramOffset = 1;
+                } else {
+                    WebParam wp = callback.getWebParam(cbParamIndex);
+                    elName = new QName(wp.targetNamespace(), wp.name());
+                    obj = reader.read(elName, cbParamIndex, evtReader);
+                    if (param.getMode().equals(ModeType.INOUT) || param.getMode().equals(ModeType.OUT)) {
+                        args[cbParamIndex].getClass().getField("value").set(args[cbParamIndex], obj);
+                    } else {
+                        args[cbParamIndex] = obj;
+                    }
+                    cbParamIndex++;
+                } 
+            } else  {
+                if (param.getMode().equals(ModeType.OUT) && hasOutParamReturn) {
+                    objContext.setReturn(obj);
+                } else if (param.getMode().equals(ModeType.INOUT) || param.getMode().equals(ModeType.OUT)) {
+                    args[cbParamIndex].getClass().getField("value").set(args[cbParamIndex], obj);
+                } else {
+                    args[cbParamIndex] = obj;
+                }
+            }
+        }
+        return hasOutParamReturn;
     }
 
     public void unmarshalFault(MessageContext mc, ObjectMessageContext objContext,

Modified: incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaDSIServant.java
URL: http://svn.apache.org/viewvc/incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaDSIServant.java?view=diff&rev=441633&r1=441632&r2=441633
==============================================================================
--- incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaDSIServant.java (original)
+++ incubator/yoko/trunk/bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaDSIServant.java Fri Sep  8 13:12:51 2006
@@ -20,6 +20,7 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import javax.xml.namespace.QName;
@@ -163,29 +164,48 @@
                                      DataBindingCallback callback) {
         NVList list = orb.create_list(streamables.length);
 
-        for (int i = 0; i < params.size(); ++i) {
-            ParamType pType = params.get(i);
-            QName paramName = new QName(callback.getWebParam(i).targetNamespace(),
-                                        callback.getWebParam(i).name());
+        int outParamCount = 0;
+        for (Iterator<ParamType> iter = params.iterator(); iter.hasNext();) {
+            ParamType param = iter.next();
+            if (param.getMode().equals(ModeType.OUT)) {
+                outParamCount++;
+            }
+        }
+        
+        int paramOffset = 0;
+        int cbParamCount = 0;
+        for (Iterator<ParamType> iter = params.iterator(); iter.hasNext();) {
+            int index = cbParamCount + paramOffset;
+            ParamType pType = iter.next();
+            QName paramName = null;
+            if (pType.getMode().equals(ModeType.OUT) && outParamCount == 1) {
+                paramName = new QName(callback.getWebResult().targetNamespace(),
+                                      callback.getWebResult().name());
+                paramOffset = 1;
+            } else {
+                paramName = new QName(callback.getWebParam(cbParamCount).targetNamespace(),
+                                      callback.getWebParam(cbParamCount).name());
+                cbParamCount++;
+            }
             QName paramIdlType = pType.getIdltype();
             ModeType paramMode = pType.getMode();
 
             CorbaObjectHandler obj = 
                 CorbaHandlerUtils.initializeObjectHandler(orb, paramName, paramIdlType, typeMaps);
 
-            streamables[i] = new CorbaStreamable(obj, paramName);
+            streamables[index] = new CorbaStreamable(obj, paramName);
             if (paramMode.value().equals("in")) {
-                streamables[i].setMode(org.omg.CORBA.ARG_IN.value);
+                streamables[index].setMode(org.omg.CORBA.ARG_IN.value);
             } else if (paramMode.value().equals("out")) {
-                streamables[i].setMode(org.omg.CORBA.ARG_OUT.value);
+                streamables[index].setMode(org.omg.CORBA.ARG_OUT.value);
             } else {
-                streamables[i].setMode(org.omg.CORBA.ARG_INOUT.value);
+                streamables[index].setMode(org.omg.CORBA.ARG_INOUT.value);
             }
 
             Any value = orb.create_any();
-            value.insert_Streamable(streamables[i]);
-            list.add_value(streamables[i].getName(), value, streamables[i].getMode());
-            corbaCtx.getMessage().addStreamableArgument(streamables[i]);
+            value.insert_Streamable(streamables[index]);
+            list.add_value(streamables[index].getName(), value, streamables[index].getMode());
+            corbaCtx.getMessage().addStreamableArgument(streamables[index]);
         }
         return list;
     }