Hi,after looking a bit more into this, I think the problem could actually be in core/src/main/java/org/apache/yoko/orb/CORBA/InputStream.java
I think the marshalling of the unsigned short is correct, but when we unmarshall the value in the InputStream reader we reuse the read_short method, which assumes we are reading a signed short.
Cheers, - Matteo Vescovi, Matteo wrote:
Hi, I'm working on the unsigned short idltowsdl corba binding type test.When sending an unsigned short greater than 2^15, the value is incorrectly marshalled to a negative value. I tracked down the problem to an implicit conversion between Integer and short types occuring between the CorbaObjectWriter.writeUShort(Integer) invocation and OutputStream.write_ushort(short) (see stack trace below).Thread [main] (Suspended) OutputStream.write_short(short) line: 894 OutputStream.write_ushort(short) line: 900 CorbaObjectWriter.writeUShort(Integer) line: 155 CorbaObjectWriter.write(CorbaObjectHandler) line: 73 CorbaStreamable._write(OutputStream) line: 57 Any.write_value(OutputStream) line: 482 Request.marshal() line: 96 Request.invoke() line: 291 CorbaConduit.buildRequest(CorbaMessage, OperationType) line: 187 CorbaConduit.close(Message) line: 128 MessageSenderInterceptor.handleMessage(Message) line: 58 PhaseInterceptorChain.doIntercept(Message) line: 167 ClientImpl.invoke(BindingOperationInfo, Object[], Map<String,Object>) line: 152 JaxWsClientProxy(ClientProxy).invokeSync(Method, BindingOperationInfo, Object[], Map<String,Object>) line: 73 JaxWsClientProxy.invoke(Object, Method, Object[]) line: 116 $Proxy37.testUnsignedShort(int, Holder, Holder) line: not available IdlToWsdlTypeTest(AbstractIdlToWsdlTypeTestClient).testUnsignedShort() line: 184 NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method] NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39 DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25 Method.invoke(Object, Object...) line: 585 IdlToWsdlTypeTest(TestCase).runTest() line: 164 IdlToWsdlTypeTest(TestCase).runBare() line: 130 TestResult$1.protect() line: 106 TestResult.runProtected(Test, Protectable) line: 124 TestResult.run(TestCase) line: 109 IdlToWsdlTypeTest(TestCase).run(TestResult) line: 120 TestSuite.runTest(Test, TestResult) line: 230 TestSuite.run(TestResult) line: 225 TestRunner.doRun(Test, boolean) line: 121 TestRunner.doRun(Test) line: 114 TestRunner.run(Test) line: 77 TestRunner.run(Class) line: 62 IdlToWsdlTypeTest.main(String[]) line: 59 According to the CORBA 2.6 spec, unsigned short's range is 0...2^16 - 1I am going to fix this, and then post a patch for review before I commit the changes.Cheers, - Matteo Darren Middleman wrote:Hello Matteo,For most of the basic types, this information should be in the third chapterof the CORBA spec, under IDL Syntax and Semantics. The information isa bit spread out over the chapter but it does give a good idea of the validranges for each of the types. Cheers, Darren On 2/12/07, Vescovi, Matteo <[EMAIL PROTECTED]> wrote:That's great, thanks Darren.I debugged into that part of code and saw the char being assigned an outof range value, but I wasn't sure what the appropriate encoding should have been. For future reference, where would I find that kind of information? Would it be in the CORBA spec? The CDR encoding maybe? Cheers, - Matteo Darren Middleman wrote: > Hello Matteo, > > I think I've tracked down the cause of the problem. >> The reason this was happening was due to the way the conversion from the> Byte object to the Character object was being made. Using a negative > byte> value to create a new character resulted in the value of the character> wrapping > within its range and causing a large character value. (i.e. byte > value of > -128> resulted in a character with value 65408). When this value was passedto > the > ORB, the stream checked to ensure that the value was not greater than 255 > (the > OMG range for a character is 0 to 255) and since it was, threw a > DATA_CONVERSION exception. >> I'm going to add something to the PrimitiveHandler so that the correct> conversion > from a byte value to a character value is performed. This should > solve the > issues > you are seeing with the failing character test. > > Cheers, > Darren > > > On 2/12/07, Vescovi, Matteo <[EMAIL PROTECTED]> wrote: >> >> Hi, >> I am trying to fix some of the (currently disabled) idltowsdl corba >> binding type tests. >> >> The tests involve invoking an operation with the following corba >> binding: >> <wsdl:operation name="testChar"> >> <corba:operation name="testChar"> >> <corba:param mode="in" name="inChar" idltype="corba:char" /> >> <corba:param mode="inout" name="inoutChar" >> idltype="corba:char" />>> <corba:param mode="out" name="outChar" idltype="corba:char" />>> <corba:return name="return" idltype="corba:char" /> >> </corba:operation> >> >> In the client process, during the marshalling of the request, a>> CORBA.DATA_CONVERSION exception is thrown when we attempt to write out>> the character. >>>> I think the problem lies in the fact that the type mapping for a charis >> corba:char <-> xs:byte <-> java byte (or Byte).>> Class org.apache.yoko.bindings.corba.CorbaObjectWriter casts the object>> to be marshalled to a Character in its writeChar method. >> Should this be cast to a Byte instead? Or should the Byte be >> appropriately converted to a Character before being written out? >> >> I am not sure what the right approach to fix it is.>> Perhaps someone with a better understanding of the runtime can help me>> here? >> >> Any help or pointers to relevant resources will be appreciated. >> >> To reproduce this failure, enable the test by commenting out the >> testChar method in >> >>bindings/src/test/java/org/apache/yoko/bindings/corba/IdlToWsdlTypeTest.java>> >> >> >> Cheers, >> - Matteo >> >> >
