Author: jsdelfino
Date: Sat Sep 23 15:58:02 2006
New Revision: 449327

URL: http://svn.apache.org/viewvc?view=rev&rev=449327
Log:
Completed support for open content. Incomingoopen content is now deserialized 
correctly (to do this without running into JIRA TUSCANY-747 we pass the SOAP 
body to the Axiom Helper instead of the Body part). Outgoing open content is 
represented as OpenDataObjects and we pass the correct SOAP body part element 
name to the Axiom Helper to get it serialized under the correct element name.

Modified:
    
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp
    
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp
    
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp
    
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp

Modified: 
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp?view=diff&rev=449327&r1=449326&r2=449327
==============================================================================
--- 
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp
 (original)
+++ 
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/Axis2Client.cpp
 Sat Sep 23 15:58:02 2006
@@ -253,14 +253,14 @@
             }
             
             axiom_node_t* Axis2Client::createPayload(Operation& operation, 
-                const WSDLOperation& wsdlOp,
+                const WSDLOperation& wsdlOperation,
                 axis2_env_t* env)
             {  
                 LOGENTRY(1, "Axis2Client::createPayload");
-                axiom_node_t* requestOM = NULL;
+                axiom_node_t* request_node = NULL;
                 
                 // map the operation request to the wsdl
-                if (wsdlOp.isDocumentStyle())
+                if (wsdlOperation.isDocumentStyle())
                 {
                     // Document style 
                     // only support single part messages - WS-I compliant
@@ -269,15 +269,28 @@
                     
                     // Get the data factory for the composite (it will already 
have the typecreates loaded for the xsds)
                     DataFactoryPtr dataFactory = 
compositeReference->getComposite()->getDataFactory();
-                    DataObjectPtr requestDO = 
dataFactory->create(wsdlOp.getInputTypeUri().c_str(), 
-                        wsdlOp.getInputTypeName().c_str());
-
+                    
+                    DataObjectPtr inputDataObject;
+                    try
+                    {
+                        
+                        // Create the output wrapper
+                        const Type& inputType = 
dataFactory->getType(wsdlOperation.getInputTypeUri().c_str(), 
+                            wsdlOperation.getInputTypeName().c_str());
+                        inputDataObject = dataFactory->create(inputType);
+                    }
+                    catch (SDORuntimeException e)
+                    {
+                        // The input wrapper type is not known, create an open 
DataObject 
+                        inputDataObject = 
dataFactory->create(Type::SDOTypeNamespaceURI, "OpenDataObject");
+                    }
+                            
                     // Go through data object to set the input parameters
-                    PropertyList pl = requestDO->getType().getProperties();
+                    PropertyList pl = 
inputDataObject->getType().getProperties();
                 
                     if(pl.size() == 0)
                     {
-                        if(requestDO->getType().isOpenType() && 
requestDO->getType().isDataObjectType())
+                        if(inputDataObject->getType().isOpenType() && 
inputDataObject->getType().isDataObjectType())
                         {
                             /*
                              * This code deals with sending xsd:any elements
@@ -285,7 +298,7 @@
                             for (int i=0; i<operation.getNParms(); i++)
                             {
                                 string pname = "param" + (i+1);
-                                DataObjectList& l = requestDO->getList(pname);
+                                DataObjectList& l = 
inputDataObject->getList(pname);
                                 
                                 Operation::Parameter& parm = 
operation.getParameter(i);
                                 switch(parm.getType())
@@ -370,67 +383,67 @@
                             {
                             case Operation::BOOL: 
                                 {
-                                    requestDO->setBoolean(i, 
*(bool*)parm.getValue());
+                                    inputDataObject->setBoolean(i, 
*(bool*)parm.getValue());
                                     break;
                                 }
                             case Operation::SHORT: 
                                 {
-                                    requestDO->setShort(i, 
*(short*)parm.getValue());
+                                    inputDataObject->setShort(i, 
*(short*)parm.getValue());
                                     break;
                                 }
                             case Operation::INT: 
                                 {
-                                    requestDO->setInteger(i, 
*(int*)parm.getValue());
+                                    inputDataObject->setInteger(i, 
*(int*)parm.getValue());
                                     break;
                                 }
                             case Operation::LONG: 
                                 {
-                                    requestDO->setLong(i, 
*(long*)parm.getValue());
+                                    inputDataObject->setLong(i, 
*(long*)parm.getValue());
                                     break;
                                 }
                             case Operation::USHORT: 
                                 {
-                                    requestDO->setInteger(i, *(unsigned 
short*)parm.getValue());
+                                    inputDataObject->setInteger(i, *(unsigned 
short*)parm.getValue());
                                     break;
                                 }
                             case Operation::UINT: 
                                 {
-                                    requestDO->setInteger(i, *(unsigned 
int*)parm.getValue());
+                                    inputDataObject->setInteger(i, *(unsigned 
int*)parm.getValue());
                                     break;
                                 }
                             case Operation::ULONG: 
                                 {
-                                    requestDO->setInteger(i, *(unsigned 
long*)parm.getValue());
+                                    inputDataObject->setInteger(i, *(unsigned 
long*)parm.getValue());
                                     break;
                                 }
                             case Operation::FLOAT: 
                                 {
-                                    requestDO->setFloat(i, 
*(float*)parm.getValue());
+                                    inputDataObject->setFloat(i, 
*(float*)parm.getValue());
                                     break;
                                 }
                             case Operation::DOUBLE: 
                                 {
-                                    requestDO->setDouble(i, 
*(double*)parm.getValue());
+                                    inputDataObject->setDouble(i, 
*(double*)parm.getValue());
                                     break;
                                 }
                             case Operation::LONGDOUBLE: 
                                 {
-                                    requestDO->setDouble(i, *(long 
double*)parm.getValue());
+                                    inputDataObject->setDouble(i, *(long 
double*)parm.getValue());
                                     break;
                                 }
                             case Operation::CHARS: 
                                 {
-                                    requestDO->setCString(i, 
*(char**)parm.getValue());
+                                    inputDataObject->setCString(i, 
*(char**)parm.getValue());
                                     break;
                                 }
                             case Operation::STRING: 
                                 {
-                                    requestDO->setCString(i, 
(*(string*)parm.getValue()).c_str());
+                                    inputDataObject->setCString(i, 
(*(string*)parm.getValue()).c_str());
                                     break;
                                 }
                             case Operation::DATAOBJECT: 
                                 {
-                                    requestDO->setDataObject(i, 
*(DataObjectPtr*)parm.getValue());
+                                    inputDataObject->setDataObject(i, 
*(DataObjectPtr*)parm.getValue());
                                     break;
                                 }
                             default: throw "unsupported parameter type";
@@ -439,59 +452,80 @@
                     }
                     
                     // Create the Axiom object from the request dataobject
-                    AxiomHelper myHelper;
-                    requestOM = myHelper.toAxiomNode(requestDO);
+                    AxiomHelper* axiomHelper = AxiomHelper::getHelper();
+                    request_node = axiomHelper->toAxiomNode(inputDataObject,
+                        wsdlOperation.getInputTypeUri().c_str(), 
wsdlOperation.getInputTypeName().c_str());
+                    AxiomHelper::releaseHelper(axiomHelper);
                 }
                 else
                 {
                     // RPC
                 }
                 
-                // Logging start
-                axiom_xml_writer_t* xml_writer = 
axiom_xml_writer_create_for_memory(env, NULL, AXIS2_FALSE, AXIS2_FALSE, 
AXIS2_XML_PARSER_TYPE_BUFFER);
-                axiom_output_t* om_output = axiom_output_create( env, 
xml_writer);
-                
-                AXIOM_NODE_SERIALIZE(requestOM, env, om_output);
-                axis2_char_t* buffer = 
(axis2_char_t*)AXIOM_XML_WRITER_GET_XML(xml_writer, env);         
-                LOGINFO_1(3, "Sending this OM node in XML : %s \n",  buffer); 
-                
-                AXIOM_OUTPUT_FREE(om_output, env);
-                AXIS2_FREE((env)->allocator, buffer);
-                // Logging end
+                char* str =  AXIOM_NODE_TO_STRING(request_node, env);
+                LOGINFO_1(3, "Sending this OM node in XML : %s \n",  str); 
                 
                 LOGEXIT(1, "Axis2Client::createPayload");
-                
-                return requestOM;
+                return request_node;
              }
              
              void Axis2Client::setReturn(axiom_node_t* ret_node,
                  Operation& operation, 
-                 const WSDLOperation& wsdlOp,
+                 const WSDLOperation& wsdlOperation,
                  axis2_env_t* env)
              { 
                  LOGENTRY(1, "Axis2Client::setReturn");
-                 /* Get the response value from the SOAP message */
-                 
-                 // logging start
-                 axiom_xml_writer_t* writer = 
axiom_xml_writer_create_for_memory(env, NULL, AXIS2_TRUE, 0, 
AXIS2_XML_PARSER_TYPE_BUFFER);
-                 axiom_output_t* om_output = axiom_output_create (env, writer);
-                 AXIOM_NODE_SERIALIZE (ret_node, env, om_output);
-                 axis2_char_t* buffer = 
(axis2_char_t*)AXIOM_XML_WRITER_GET_XML(writer, env);
-                 LOGINFO_1(3,"Received OM node in XML : %s\n", buffer);
-                 AXIOM_OUTPUT_FREE(om_output, env);
-                 AXIS2_FREE((env)->allocator, buffer);
-                 // Logging end
-                 
                  
-                 if (wsdlOp.isDocumentStyle())
+                 if (wsdlOperation.isDocumentStyle())
                  {
                      // Document style 
+                    DataFactoryPtr dataFactory = 
compositeReference->getComposite()->getDataFactory();
+
+                    // Get the AXIOM node representing the SOAP Body 
+                    axiom_node_t* body = AXIOM_NODE_GET_PARENT(ret_node, env);
                      
-                     DataFactoryPtr dataFactory = 
compositeReference->getComposite()->getDataFactory();
-                     AxiomHelper myHelper;
-                     DataObjectPtr returnDO = myHelper.toSdo(ret_node, 
dataFactory);
+                    // Convert the AXIOM node to an SDO DataObject
+                    char* str = NULL;
+                    str = AXIOM_NODE_TO_STRING(body, env);
+                    if (str)
+                    {
+                        AXIS2_LOG_INFO((env)->log, "Axis2Client invoke has 
response OM: %s\n", str);
+                    }
+
+                    // Convert the SOAP body to an SDO DataObject
+                    AxiomHelper* axiomHelper = AxiomHelper::getHelper();
+                    DataObjectPtr outputBodyDataObject = 
axiomHelper->toSdo(body, dataFactory);
+                    AxiomHelper::releaseHelper(axiomHelper);
+
+                    if(!outputBodyDataObject)
+                    {
+                        AXIS2_LOG_ERROR((env)->log, AXIS2_LOG_SI, 
"Axis2Service invoke: Could not convert received Axiom node to SDO");
+                        /** TODO: return a SOAP fault here */
+                        return;
+                    }                    
+
+                    // Get the first body part representing the 
doc-lit-wrapped wrapper element
+                    DataObjectPtr outputDataObject = NULL; 
+                    PropertyList bpl = 
outputBodyDataObject->getInstanceProperties();
+                    if (bpl.size()!=0)
+                    {
+                        if (bpl[0].isMany())
+                        {
+                            DataObjectList& parts = 
outputBodyDataObject->getList((unsigned int)0);
+                            outputDataObject = parts[0];
+                        }
+                        else
+                        {
+                            outputDataObject = 
outputBodyDataObject->getDataObject(bpl[0]);
+                        }
+                    }
+                    if (outputDataObject == NULL)
+                    {
+                        AXIS2_LOG_ERROR((env)->log, AXIS2_LOG_SI, "Axis2Client 
invoke: Could not convert body part to SDO");
+                        return;
+                    }
                      
-                    PropertyList pl = returnDO->getInstanceProperties();
+                    PropertyList pl = 
outputDataObject->getInstanceProperties();
                     unsigned int i = 0;
                      
                     switch(pl[i].getTypeEnum())
@@ -499,24 +533,22 @@
                     case Type::BooleanType:
                         {
                             bool* boolData = new bool;
-                            *boolData = returnDO->getBoolean(pl[i]);
-                            //printf("returnDO has BooleanType named %s with 
value %d\n", name, boolData);
+                            *boolData = outputDataObject->getBoolean(pl[i]);
                             operation.setReturnValue(boolData);
                         }
                         break;
                     case Type::ByteType:
                         {
                             char* byteData = new char;
-                            //printf("returnDO has ByteType named %s\n", name);
-                            *byteData = returnDO->getByte(pl[i]);
+                            *byteData = outputDataObject->getByte(pl[i]);
                             operation.setReturnValue(byteData);
                         }
                         break;
                     case Type::BytesType:
                         {
-                            int len = returnDO->getLength(pl[i]);
+                            int len = outputDataObject->getLength(pl[i]);
                             char* bytesData = new char[len+1];
-                            int bytesWritten = returnDO->getBytes(pl[i], 
bytesData, len);
+                            int bytesWritten = 
outputDataObject->getBytes(pl[i], bytesData, len);
                             // Ensure the bytes end with the null char. Not 
sure if this is neccessary
                             if(bytesWritten <= len)
                             {
@@ -526,7 +558,7 @@
                             {
                                 bytesData[len] = 0;
                             }
-                            //printf("returnDO has BytesType named %s with 
length %d\n", name, bytesWritten);
+                            //printf("outputDataObject has BytesType named %s 
with length %d\n", name, bytesWritten);
                             operation.setReturnValue(&bytesData);
                         }
                         break;
@@ -534,57 +566,49 @@
                         {
                             // This code should work but won't be used as 
there is no mapping from an XSD type to the SDO CharacterType
                             wchar_t* charData = new wchar_t;
-                            //printf("returnDO has CharacterType named %s\n", 
name);
-                            *charData = returnDO->getCharacter(pl[i]);
+                            *charData = outputDataObject->getCharacter(pl[i]);
                             operation.setReturnValue(charData);
                         }
                         break;
                     case Type::DoubleType:
                         {
                             long double* doubleData = new long double;
-                            *doubleData = returnDO->getDouble(pl[i]);
-                            //printf("returnDO has DoubleType named %s\n", 
name);            
+                            *doubleData = outputDataObject->getDouble(pl[i]);
                             operation.setReturnValue(doubleData);
                         }
                         break;
                     case Type::FloatType:
                         {
                             float* floatData = new float;
-                            *floatData = returnDO->getFloat(pl[i]);
-                            //printf("returnDO has FloatType named %s with 
value %f\n", name, *floatData);
+                            *floatData = outputDataObject->getFloat(pl[i]);
                             operation.setReturnValue(floatData); 
                         }
                         break;
                     case Type::IntegerType:
                         {
                             long* intData = new long;
-                            //printf("returnDO has IntegerType named %s\n", 
name);
-                            *intData = returnDO->getInteger(pl[i]);
+                            *intData = outputDataObject->getInteger(pl[i]);
                             operation.setReturnValue(intData);
                         }
                         break;
                     case Type::ShortType:
                         {
                             short* shortData = new short;
-                            //printf("returnDO has ShortType named %s\n", 
name);
-                            *shortData = returnDO->getShort(pl[i]);
+                            *shortData = outputDataObject->getShort(pl[i]);
                             operation.setReturnValue(shortData);
                         }
                         break;
                     case Type::StringType:
                         {
                             const char** stringData = new const char*; 
-                            string* str = new 
string(returnDO->getCString(pl[i]));
+                            string* str = new 
string(outputDataObject->getCString(pl[i]));
                             *stringData = str->c_str();
-                            //printf("returnDO has StringType named %s with 
value %s\n", name, stringData);
                             operation.setReturnValue(stringData);
                         }
                         break;
                     case Type::DataObjectType:
                         {
-                            DataObjectPtr dataObjectData = 
returnDO->getDataObject(pl[i]);
-                            //printf("returnDO has DataObjectType named %s 
(#%d)\n", name, dataObjectData);
-            
+                            DataObjectPtr dataObjectData = 
outputDataObject->getDataObject(pl[i]);
                             if(!dataObjectData)
                             {
                                 LOGINFO(4, "SDO DataObject return value was 
null");
@@ -599,8 +623,7 @@
                              * Get each element as a DataObject and add in to 
the parameter list
                              */
             
-                            //printf("returnDO has OpenDataObjectType named 
%s\n", name);
-                            DataObjectList& dataObjectList = 
returnDO->getList(pl[i]);
+                            DataObjectList& dataObjectList = 
outputDataObject->getList(pl[i]);
                             
                             for(int j=0; j<dataObjectList.size(); j++)
                             {

Modified: 
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp?view=diff&rev=449327&r1=449326&r2=449327
==============================================================================
--- 
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp
 (original)
+++ 
incubator/tuscany/cpp/sca/runtime/extensions/ws/reference/axis2c/src/tuscany/sca/ws/WSServiceWrapper.cpp
 Sat Sep 23 15:58:02 2006
@@ -25,8 +25,13 @@
 #include "WSServiceWrapper.h"
 #include "tuscany/sca/core/Operation.h"
 #include "tuscany/sca/model/Service.h"
+#include "tuscany/sca/model/Component.h"
+#include "tuscany/sca/model/Composite.h"
 #include "tuscany/sca/model/ServiceType.h"
 
+#include "commonj/sdo/SDO.h"
+using namespace commonj::sdo;
+
 using namespace tuscany::sca;
 using namespace tuscany::sca::model;
 
@@ -39,6 +44,29 @@
             
             WSServiceWrapper::WSServiceWrapper(Service* service) : 
ServiceWrapper(service)
             {
+                // Define the SOAP Body type and element to allow a SOAP body 
to
+                // be loaded in a DataObject
+                DataFactoryPtr dataFactory = 
service->getComponent()->getComposite()->getDataFactory();
+                try {
+                    const Type& bodyType = 
dataFactory->getType("http://www.w3.org/2003/05/soap-envelope";, "Body");
+                } catch (SDORuntimeException e)
+                {
+                    
dataFactory->addType("http://www.w3.org/2003/05/soap-envelope";, "RootType", 
false, false, false);                
+                    
dataFactory->addType("http://www.w3.org/2003/05/soap-envelope";, "Body", false, 
true, false);                
+                    dataFactory->addPropertyToType(
+                        "http://www.w3.org/2003/05/soap-envelope";, "RootType",
+                        "Body",
+                        "http://www.w3.org/2003/05/soap-envelope";, "Body",
+                        false, false, true);
+    
+                    
dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/";, "RootType", 
false, false, false);
+                    
dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/";, "Body", 
false, true, false);
+                    dataFactory->addPropertyToType(
+                        "http://schemas.xmlsoap.org/soap/envelope/";, 
"RootType",
+                        "Body",
+                        "http://schemas.xmlsoap.org/soap/envelope/";, "Body",
+                        false, false, true);
+                }
             }
             
             WSServiceWrapper::~WSServiceWrapper()

Modified: 
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp?view=diff&rev=449327&r1=449326&r2=449327
==============================================================================
--- 
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp
 (original)
+++ 
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/Axis2Service.cpp
 Sat Sep 23 15:58:02 2006
@@ -28,6 +28,8 @@
 #include <sdo_axiom.h>
 using commonj::sdo::DataObjectPtr;
 using commonj::sdo::DataFactoryPtr;
+using commonj::sdo::DataObjectList;
+using commonj::sdo::PropertyList;
 using commonj::sdo_axiom::AxiomHelper;
 
 #include "tuscany/sca/util/Exceptions.h"
@@ -196,7 +198,7 @@
 
 
 /*
- * This method invokes the right service method 
+ * This method invokes the target service method 
  */
 axiom_node_t* AXIS2_CALL
 Axis2Service_invoke(axis2_svc_skeleton_t *svc_skeleton,
@@ -204,11 +206,6 @@
             axiom_node_t *node,
             axis2_msg_ctx_t *msg_ctx)
 {
-       axiom_node_t *returnNode = node;
-
-    /* Depending on the function name invoke the
-     *  corresponding Axis2Service method
-     */
     if (node)
     {
         if (AXIOM_NODE_GET_NODE_TYPE(node, env) == AXIOM_ELEMENT)
@@ -264,14 +261,6 @@
                         return 0;
                     }
 
-                    AxiomHelper* axiomHelper = AxiomHelper::getHelper();
-                    char* om_str = NULL;
-                    om_str = AXIOM_NODE_TO_STRING(node, env);
-                    if (om_str)
-                    {
-                        AXIS2_LOG_INFO((env)->log, "Axis2Service invoke has 
request OM: %s\n", om_str);
-                    }
-
                     // Get the WS binding and the WSDL operation
                     Composite* composite = compositeService->getComposite();
                     Reference* reference = compositeService->getReference();
@@ -357,26 +346,51 @@
                     }
 
                     // Convert the input AXIOM node to an SDO DataObject
-                    DataObjectPtr inputDataObject = axiomHelper->toSdo(
-                            node, dataFactory, 
wsdlOperation.getInputTypeUri().c_str());
+                    axiom_node_t* body = AXIOM_NODE_GET_PARENT(node, env);
+                    char* str = NULL;
+                    str = AXIOM_NODE_TO_STRING(body, env);
+                    if (str)
+                    {
+                        AXIS2_LOG_INFO((env)->log, "Axis2Service invoke has 
request OM: %s\n", str);
+                    }
 
-                    //printf("Axis2ServiceType inputDataObject: (%d)\n", 
inputDataObject);
+                    // Convert the SOAP body to an SDO DataObject
+                    AxiomHelper* axiomHelper = AxiomHelper::getHelper();
+                    
+                    DataObjectPtr inputBodyDataObject = 
axiomHelper->toSdo(body, dataFactory);
 
-                    if(!inputDataObject)
+                    if(!inputBodyDataObject)
                     {
                         AXIS2_LOG_ERROR((env)->log, AXIS2_LOG_SI, 
"Axis2Service_invoke: Could not convert received Axiom node to SDO");
-                        //LOGERROR(0, "Axis2Service_invoke: Failure whilst 
invoking CompositeService");
                         /** TODO: return a SOAP fault here */
                         return 0;
                     }                    
 
-                    //
+                    // Get the first body part representing the 
doc-lit-wrapped wrapper element
+                    DataObjectPtr inputDataObject = NULL; 
+                    PropertyList bpl = 
inputBodyDataObject->getInstanceProperties();
+                    if (bpl.size()!=0)
+                    {
+                        if (bpl[0].isMany())
+                        {
+                            DataObjectList& parts = 
inputBodyDataObject->getList((unsigned int)0);
+                            inputDataObject = parts[0];
+                        }
+                        else
+                        {
+                            inputDataObject = 
inputBodyDataObject->getDataObject(bpl[0]);
+                        }
+                    }
+                    if (inputDataObject == NULL)
+                    {
+                        AXIS2_LOG_ERROR((env)->log, AXIS2_LOG_SI, 
"Axis2Service_invoke: Could not convert body part to SDO");
+                        return 0;
+                    }
+
                     //  Dispatch to the WS proxy
-                    //
-                    
                     WSServiceProxy* proxy = 
(WSServiceProxy*)binding->getServiceProxy();
                     DataObjectPtr outputDataObject = 
proxy->invoke(wsdlOperation, inputDataObject);
-
+                    
                     if(!outputDataObject)
                     {
                                AXIS2_LOG_ERROR((env)->log, AXIS2_LOG_SI, 
"Axis2Service_invoke: Failure whilst invoking CompositeService");
@@ -384,20 +398,22 @@
                         /** TODO: return a SOAP fault here */
                         return 0;
                     }
+                    
+                    // Convert the output DataObject to an Axiom node
+                    axiom_node_t* outputNode = 
axiomHelper->toAxiomNode(outputDataObject,
+                        wsdlOperation.getOutputTypeUri().c_str(), 
wsdlOperation.getOutputTypeName().c_str());
 
-                                       returnNode = 
axiomHelper->toAxiomNode(outputDataObject);
-                                               
-                    om_str = NULL;
-                    om_str = AXIOM_NODE_TO_STRING(returnNode, env);
-                    if (om_str)
+                    AxiomHelper::releaseHelper(axiomHelper);                   
                             
+                    
+                    str = AXIOM_NODE_TO_STRING(outputNode, env);
+                    if (str)
                     {
-                        AXIS2_LOG_INFO((env)->log, "Axis2Service invoke has 
response OM : %s\n", om_str);
+                        AXIS2_LOG_INFO((env)->log, "Axis2Service invoke has 
response OM : %s\n", str);
                     }
                         
-                                       
AxiomHelper::releaseHelper(axiomHelper);                                        
                                                        
 
                        //LOGEXIT(1, "Axis2Service_invoke");                    
                        
-                                       return returnNode;
+                                       return outputNode;
                 }
             }
         }
@@ -407,7 +423,7 @@
     //LOGERROR(0, "Axis2Service service ERROR: invalid OM parameters in 
request\n");
     
     /** TODO: return a SOAP fault here */
-    return node;
+    return 0;
 }
 
 

Modified: 
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp?view=diff&rev=449327&r1=449326&r2=449327
==============================================================================
--- 
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp
 (original)
+++ 
incubator/tuscany/cpp/sca/runtime/extensions/ws/service/axis2c/src/tuscany/sca/ws/WSServiceProxy.cpp
 Sat Sep 23 15:58:02 2006
@@ -60,6 +60,33 @@
                 WSReferenceBinding* referenceBinding = 
(WSReferenceBinding*)reference->getBinding();
                 serviceWrapper = 
referenceBinding->getTargetServiceBinding()->getServiceWrapper();
                 
+                // Define the SOAP Body type and element to allow a SOAP body 
to
+                // be loaded in a DataObject
+                DataFactoryPtr dataFactory = 
reference->getComponent()->getComposite()->getDataFactory();
+                try {
+                    const Type& bodyType = 
dataFactory->getType("http://www.w3.org/2003/05/soap-envelope";, "Body");
+                } catch (SDORuntimeException e)
+                {
+                    
+                    // Define the SOAP 1.2 Body type
+                    
dataFactory->addType("http://www.w3.org/2003/05/soap-envelope";, "RootType", 
false, false, false);                
+                    
dataFactory->addType("http://www.w3.org/2003/05/soap-envelope";, "Body", false, 
true, false);                
+                    dataFactory->addPropertyToType(
+                        "http://www.w3.org/2003/05/soap-envelope";, "RootType",
+                        "Body",
+                        "http://www.w3.org/2003/05/soap-envelope";, "Body",
+                        false, false, true);
+    
+                    // Define the SOAP 1.1 Body type
+                    
dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/";, "RootType", 
false, false, false);
+                    
dataFactory->addType("http://schemas.xmlsoap.org/soap/envelope/";, "Body", 
false, true, false);
+                    dataFactory->addPropertyToType(
+                        "http://schemas.xmlsoap.org/soap/envelope/";, 
"RootType",
+                        "Body",
+                        "http://schemas.xmlsoap.org/soap/envelope/";, "Body",
+                        false, false, true);
+                }
+                
                 LOGEXIT(1,"WSServiceProxy::constructor");
             }
             
@@ -79,10 +106,6 @@
             {
                 LOGENTRY(1,"WSServiceProxy::invoke");
     
-                //printf("inputDataObject %s#%s\n", 
inputDataObject->getType().getURI(), inputDataObject->getType().getName());
-                //Utils::printType(inputDataObject->getType());
-                //Utils::printDO(inputDataObject);
-            
                 Reference* reference = getReference();
                 Component* component = reference->getComponent();
                 Composite* composite = component ->getComposite();
@@ -114,7 +137,7 @@
                         // Create new Operation object and set parameters and 
return value
                         Operation 
operation(wsdlOperation.getOperationName().c_str());
                     
-                        // Go through input data object to set the operation 
parameters
+                        // Go through the input data object to set the 
operation parameters
                         PropertyList pl = 
inputDataObject->getInstanceProperties();
                     
                         for(int i=0; i<pl.size(); i++)
@@ -127,14 +150,12 @@
                                 {
                                     bool* boolData = new bool;
                                     *boolData = 
inputDataObject->getBoolean(pl[i]);
-                                    //printf("inputDataObject has BooleanType 
named %s with value %d\n", name, boolData);
                                     operation.addParameter(boolData);
                                 }
                                 break;
                             case Type::ByteType:
                                 {
                                     char* byteData = new char;
-                                    //printf("inputDataObject has ByteType 
named %s\n", name);
                                     *byteData = 
inputDataObject->getByte(pl[i]);
                                     operation.addParameter(byteData);
                                 }
@@ -153,7 +174,6 @@
                                     {
                                         bytesData[len] = 0;
                                     }
-                                    //printf("inputDataObject has BytesType 
named %s with length %d\n", name, bytesWritten);
                                     operation.addParameter(&bytesData);
                                 }
                                 break;
@@ -161,7 +181,6 @@
                                 {
                                     // This code should work but won't be used 
as there is no mapping from an XSD type to the SDO CharacterType
                                     wchar_t* charData = new wchar_t;
-                                    //printf("inputDataObject has 
CharacterType named %s\n", name);
                                     *charData = 
inputDataObject->getCharacter(pl[i]);
                                     operation.addParameter(charData);
                                 }
@@ -170,7 +189,6 @@
                                 {
                                     long double* doubleData = new long double;
                                     *doubleData = 
inputDataObject->getDouble(pl[i]);
-                                    //printf("inputDataObject has DoubleType 
named %s\n", name);            
                                     operation.addParameter(doubleData);
                                 }
                                 break;
@@ -185,7 +203,6 @@
                             case Type::IntegerType:
                                 {
                                     long* intData = new long;
-                                    //printf("inputDataObject has IntegerType 
named %s\n", name);
                                     *intData = 
inputDataObject->getInteger(pl[i]);
                                     operation.addParameter(intData);
                                 }
@@ -193,7 +210,6 @@
                             case Type::ShortType:
                                 {
                                     short* shortData = new short;
-                                    //printf("inputDataObject has ShortType 
named %s\n", name);
                                     *shortData = 
inputDataObject->getShort(pl[i]);
                                     operation.addParameter(shortData);
                                 }
@@ -202,14 +218,12 @@
                                 {
                                     const char** stringData = new const char*; 
                                     *stringData = 
inputDataObject->getCString(pl[i]);
-                                    //printf("inputDataObject has StringType 
named %s with value %s\n", name, stringData);
                                     operation.addParameter(stringData);
                                 }
                                 break;
                             case Type::DataObjectType:
                                 {
                                     DataObjectPtr dataObjectData = 
inputDataObject->getDataObject(pl[i]);
-                                    //printf("inputDataObject has 
DataObjectType named %s (#%d)\n", name, dataObjectData);
                     
                                     if(!dataObjectData)
                                     {
@@ -308,17 +322,21 @@
                             serviceWrapper->invoke(operation);
                     
                             // Set the data in the outputDataObject to be 
returned
-                            DataObjectPtr outputDataObject = 
dataFactoryPtr->create(outputTypeURI, outputTypeName);
+                            DataObjectPtr outputDataObject;
+                            try
+                            {
+                                
+                                // Create the output wrapper
+                                const Type& outputType = 
dataFactoryPtr->getType(outputTypeURI, outputTypeName);
+                                outputDataObject = 
dataFactoryPtr->create(outputType);
+                            }
+                            catch (SDORuntimeException e)
+                            {
+                                // The output wrapper type is not known, 
create an open DataObject 
+                                outputDataObject = 
dataFactoryPtr->create(Type::SDOTypeNamespaceURI, "OpenDataObject");
+                            }
                             
-                            //const Type& rootType = 
dataFactoryPtr->getType(outputDataObject->getType().getURI(), "RootType");
-                            //printf("rootType %s#%s\n", rootType.getURI(), 
rootType.getName());
-                            //Utils::printType(rootType);
-                            //printf("outputDataObject %s#%s\n", 
outputDataObject->getType().getURI(), outputDataObject->getType().getName());
-                            //Utils::printType(outputDataObject->getType());
-
                             setOutputData(operation, outputDataObject, 
dataFactoryPtr);                            
-
-                            Utils::printDO(outputDataObject);
 
                             LOGEXIT(1,"WSServiceProxy::invoke");
                         



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to