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 <[EMAIL PROTECTED]> 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 <[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 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
>>
>>
>