[ http://issues.apache.org/jira/browse/AXISCPP-720?page=all ]
     
Adrian Dick resolved AXISCPP-720:
---------------------------------

    Fix Version: current (nightly)
     Resolution: Fixed

I have corrected the destructors to be virtual.  Can't remember why I didn't do 
that originally, but I've just tried re-running the test suite and there are no 
problems.

> Returning Array of complex type is broken
> -----------------------------------------
>
>          Key: AXISCPP-720
>          URL: http://issues.apache.org/jira/browse/AXISCPP-720
>      Project: Axis-C++
>         Type: Bug
>   Components: Serialization, WSDL processing - Doc
>     Versions: current (nightly)
>  Environment: Windows & Linux
>     Reporter: Henrik Nordberg
>      Fix For: current (nightly)
>  Attachments: konga_database_infoprovider.1.2.wsdl, 
> konga_database_infoprovider.wsdl
>
> There is a problem with the way arrays of complex types are being serialized 
> before they are returned to the client from the web service. The problem went 
> away when returned an object that contained the array (different classes 
> where then generated for the array, see below). I think the problem is the 
> way the stubs are generated for the case when a complex array is retured 
> directly and not as part of a class.
> First I had the following interface on which I ran Java2WSDL and then WSDL2WS:
> public interface DatabaseInfoProvider {
>     WsDatabaseObject[] getDatabaseObjects(String sUser, String sPassword,  
> String connect, String objectTypes[], String searchString);
> }
> where
> public class WsDatabaseObject {
>       public String sObjectType; // TABLE, VIEW, SP, SYNONYM
>       public String sObjectName;
>       public WsDatabaseColumn[] Columns;
> }
> where
> public class WsDatabaseColumn {
>       public String name;
>       public Boolean isPrimaryKey;
> }
> Here is the important part:
> The generated code for the array looks like:
> typedef struct WsDatabaseObject_ArrayTag
> {
>       WsDatabaseObject** m_Array;  // <-- BUG MAY BE HERE
>       int m_Size;
> } WsDatabaseObject_Array;
> Then I change the interface to:
> public interface DatabaseInfoProvider {
>       WsDatabaseInfo getDatabaseObjects(String sUser, String sPassword, 
> String connect, String objectTypes[], String searchString);
> }
> where
> public class WsDatabaseInfo {
>       public WsDatabaseObject[] dbInfo;
> }
> Note that the only difference is that I now return a class containing the 
> array, instead of returning the array itself as was the case above.
> The code for the array now looks like:
> typedef struct WsDatabaseObject_ArrayTag
> {
>       WsDatabaseObject* m_Array;     // NOTE: just one * used
>       int m_Size;
> } WsDatabaseObject_Array;
> The same thing is true for the nested array ( public WsDatabaseColumn[] 
> Columns; ). I.e., in the code generated by from the first version of the 
> interface defined in Java, WsDatabaseColumn_ArrayTag has WsDatabaseColumn** 
> m_Array;, but in the second version it has WsDatabaseColumn* m_Array;.
> The first version crashes when serializing the result to be sent back to the 
> client. The engine code seems to assume that the arrays are defined as T* 
> m_Array and not T** m_Array.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to