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;
}