[
https://issues.apache.org/jira/browse/AXIS2-3034?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13047155#comment-13047155
]
Vilnis Termanis commented on AXIS2-3034:
----------------------------------------
Unfortunately the "fix" breaks WSDL generation in that the fromValue() function
is not compilable in certain situations. For example, with the following type:
<xs:simpleType name="tSomeType">
<xs:restriction base="xs:int">
<xs:enumeration value="1">
<xs:annotation>
<xs:documentation>Something</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="2">
<xs:annotation>
<xs:documentation>Something else</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
Corresponding fromValue function now contains:
public static TSomeType fromValue(int value)
throws java.lang.IllegalArgumentException {
TSomeType enumeration = (TSomeType)
_table_.get(value + "");
if ((enumeration == null) && !((value == null) ||
(value.equals("")))) {
throw new java.lang.IllegalArgumentException();
}
return enumeration;
}
Since value is of type 'int', the updated if statement results in compilation
failure ("int cannot be dereferenced").
Tested with Axis2 1.6.0 wsdl2java.
Regards,
VT
> Axis2 Serialization problem with emptyset bitflag enums.
> --------------------------------------------------------
>
> Key: AXIS2-3034
> URL: https://issues.apache.org/jira/browse/AXIS2-3034
> Project: Axis2
> Issue Type: Bug
> Components: codegen
> Affects Versions: 1.2
> Reporter: David R. Kraus
> Assignee: Amila Chinthaka Suriarachchi
>
> I created a bitflag enum, where one value is associated with each bit of the
> enum, and multiple values/bits can be set for the value of the enum (see
> dotnet generated WSDL below). The DotNet generated WSDL was taken and used
> to create Java serialization classes (wsdl2java).The problem is that Axis2
> can't handle the zero length string that is passed representing the empty
> set. A bitflag enum can have more than one value, because each possible enum
> value is represented by a bit. The problem occurs when none of the values is
> set, and a bitflag value of zero(0) is serialized as "" (zero length string).
> Enums are a tricky type since their representation as a numeric entity (bits)
> making them a non-nullable type, although their value is transfered as a
> string with multiple concatenated enum values.
> There are two classes generated by wsdl2java to handle the bitflag enum at
> the server (eg. EnumMWSSearchFlags, EnumMWSSearchFlags_type0).
> EnumMWSSearchFlags contains an array of EnumMWSearchFlags_type0, each element
> of which can refer to a bit value.
>
> Both dotnet and java clients serialize the empty set as a zero length string.
> This zero length string is parsed, at the server, looking for individual enum
> values. Of course, none are found, and when the zero length string is used in
> a table lookup for valid members of the enum (in EnumMWSSearchFlags_type0) an
> IllegalArgumentException is generated. I have been able to get this to work
> by commenting out the check for valid enum members being passed in (server
> side only), but obviously this isn't the best way to do this (see specific
> commented out code below).
> I have been able to workaround this on the server side by commenting out an
> exception (described in email thread below), BUT the real problem now is that
> this only handles the case where the enum is being passed into the service
> from the client. Patching the client side is not an option (when empty enum
> is passed to the client from the service). We do not have a workaround for
> this problem (client side can't be patched) and are near the end of our
> development cycle, so we are very concerned!
> If Axis2 serialization code interprets the empty bitflag as a zero length
> string when it serializes it, then the receiving code should then be able to
> handle this zero length string. Right now that is not happening correctly. I
> think this is a bug.
>
> Thanks, Dave Kraus
> Altered server side code - see comment:
> public static EnumMWSSearchFlags_type0
> fromValue(java.lang.String value)
> throws java.lang.IllegalArgumentException {
> EnumMWSSearchFlags_type0 enumeration =
> (EnumMWSSearchFlags_type0)
> _table_.get(value);
>
> //drk: Comment out so that bitflag enum can accept an
> emptyset enum
> /*if (enumeration==null) throw new
> java.lang.IllegalArgumentException();*/
> return enumeration;
> }
> WSDL representation of a bitflag enum:
> <s:simpleType name="EnumMWSSearchFlags">
> <s:list>
> <s:simpleType>
> <s:restriction base="s:string">
> <s:enumeration value="MWSAbbreviationWildCard"/>
> <s:enumeration value="MWSDescriptionWildCard"/>
> <s:enumeration value="MWSFolderBrowseStyle"/>
> <s:enumeration value="MWSModificationTime"/>
> <s:enumeration value="MWSNameWildCard"/>
> <s:enumeration value="MWSRootRecursive"/>
> <s:enumeration value="MWSUsedByOneOf"/>
> <s:enumeration value="MWSUsedByRecursive"/>
> <s:enumeration value="MWSUsesOneOf"/>
> <s:enumeration value="MWSUsesRecursive"/>
> <s:enumeration value="MWSVisibleOnly"/>
> <s:enumeration value="MWSBrowseAsync"/>
> <s:enumeration value="MWSOwnedByCurrentUser"/>
> </s:restriction>
> </s:simpleType>
> </s:list>
> </s:simpleType>
>
> WSDL representation of usage of the bitflag enum as a parameter showing
> minoccurs=1 because it's a non-nullable type. So it really doesn't make sense
> to pass in a null instead of the emptyset.
> <s:element maxOccurs="1" minOccurs="1" name="eFlags"
> type="tns:EnumMWSSearchFlags"/>
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]