incubator-yoko-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Vescovi, Matteo" <matteo.vesc...@iona.com>
Subject Re: Unsigned short IdlToWsdl corba binding type tests
Date Tue, 13 Feb 2007 16:56:40 GMT
Hi,
it turned out that the problem was in 
bindings/src/main/java/org/apache/yoko/bindings/corba/CorbaObjectReader.java

Attached is a patch that fixes the problem - apply by copying patch file 
in trunk directory and running `patch -p0 < 
idlwtowsdl_unsigned_short_type_test.diff' from trunk.

I'd like someone with a better understanding of the corba binding and 
runtime module to give me the ok before I commit the change.

Cheers,
- Matteo




Vescovi, Matteo wrote:
> 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 - 1
>>
>> I 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 
>>> chapter
>>> of the CORBA spec, under IDL Syntax and Semantics.  The information is
>>> a bit spread out over the chapter but it does give a good idea of 
>>> the valid
>>> ranges for each of the types.
>>>
>>> Cheers,
>>> Darren
>>>
>>>
>>>
>>> On 2/12/07, Vescovi, Matteo <matteo.vescovi@iona.com> wrote:
>>>>
>>>> That's great, thanks Darren.
>>>>
>>>> I debugged into that part of code and saw the char being assigned 
>>>> an out
>>>> of 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 
>>>> passed
>>>> to
>>>> > 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 <matteo.vescovi@iona.com> 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

>>>> char
>>>> is
>>>> >> 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
>>>> >>
>>>> >>
>>>> >
>>>>
>>>>
>>>
>>
>


Mime
View raw message