susantha    2003/08/03 22:03:50

  Modified:    c/src/wcg WSClass.h WSClass.cpp Variable.h Variable.cpp
                        TranslationUnit.h TranslationUnit.cpp Method.h
                        Method.cpp
  Log:
  improved WCG so that it now generates wsdl
  
  Revision  Changes    Path
  1.4       +3 -0      xml-axis/c/src/wcg/WSClass.h
  
  Index: WSClass.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/WSClass.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- WSClass.h 18 Jul 2003 13:31:44 -0000      1.3
  +++ WSClass.h 4 Aug 2003 05:03:49 -0000       1.4
  @@ -81,6 +81,9 @@
   class WSClass  
   {
   public:
  +     int GenerateOperationsInBinding(File& file, string& sServiceName, int 
nBinding, int nStyle, string& sURI);
  +     int GenerateWSDLPortTypes(File& file, string& sServiceName);
  +     int GenerateWSDLMessages(File& file);
        int GenerateClassImpl(File& file);
        int GenerateClassDef(File& file);
        const string& GetName();
  
  
  
  1.5       +30 -1     xml-axis/c/src/wcg/WSClass.cpp
  
  Index: WSClass.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/WSClass.cpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- WSClass.cpp       24 Jul 2003 03:51:31 -0000      1.4
  +++ WSClass.cpp       4 Aug 2003 05:03:49 -0000       1.5
  @@ -233,4 +233,33 @@
                return 1;
        }
        return 0; //success}
  -}
  \ No newline at end of file
  +}
  +
  +int WSClass::GenerateWSDLMessages(File &file)
  +{
  +     for (list<Method*>::iterator it = m_Methods.begin(); it != m_Methods.end(); 
it++)
  +     {
  +             if ((*it)->GenerateWSDLMessages(file)) return 1; //error occured;
  +     }
  +     return 0; //success;
  +}
  +
  +int WSClass::GenerateWSDLPortTypes(File &file, string& sServiceName)
  +{
  +     file << "<portType name=\"" << sServiceName << "PortType\">" << endl;
  +     for (list<Method*>::iterator it = m_Methods.begin(); it != m_Methods.end(); 
it++)
  +     {
  +             if ((*it)->GenerateWSDLOperationInPortType(file)) return 1; //error 
occured;
  +     }
  +     file << "</portType>" << endl;
  +     return 0; //success;
  +}
  +
  +
  +int WSClass::GenerateOperationsInBinding(File &file, string &sServiceName, int 
nBinding, int nStyle, string &sURI)
  +{
  +     for (list<Method*>::iterator it = m_Methods.begin(); it != m_Methods.end(); 
it++)
  +     {
  +             if ((*it)->GenerateOperationInBinding(file, sServiceName, nBinding, 
nStyle, sURI)) return 1; //error occured;
  +     }
  +}
  
  
  
  1.6       +5 -0      xml-axis/c/src/wcg/Variable.h
  
  Index: Variable.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/Variable.h,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Variable.h        24 Jul 2003 04:13:40 -0000      1.5
  +++ Variable.h        4 Aug 2003 05:03:49 -0000       1.6
  @@ -84,6 +84,9 @@
   enum VARTYPE { VAR_UNKNOWN=0, VAR_INT=1, VAR_FLOAT, VAR_STRING, VAR_LONG, 
VAR_SHORT, \
                           VAR_CHAR, VAR_DOUBLE, VAR_BOOL, VAR_UNSIGNEDLONG, 
VAR_UNSIGNEDINT,\
                           VAR_UNSIGNEDSHORT, VAR_UNSIGNED_CHAR, VAR_USER};
  +enum WSDL_BINDINGS { SOAP_BINDING=1, HTTP_BINDING };
  +enum BINDING_STYLES { SOAP_RPC=1, SOAP_DOCUMENT, HTTP_GET, HTTP_POST};
  +enum WSDL_TRANSPORT { HTTP_TRANSPORT=1 };
   
   //Qualifiers
   const unsigned char Q_PRIVATE = 0x01;
  @@ -98,6 +101,8 @@
   class Variable  
   {
   public:      
  +     int GenerateWSDLPartInMessage(File& file, bool bInput);
  +     int GenerateWSDLSchema(File &file);
        static string& GetParamGetMethod(int nType);
        int GenerateDeserializerImpl(File& file);
        int GenerateSerializerImpl(File& file);
  
  
  
  1.6       +26 -1     xml-axis/c/src/wcg/Variable.cpp
  
  Index: Variable.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/Variable.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Variable.cpp      24 Jul 2003 04:13:40 -0000      1.5
  +++ Variable.cpp      4 Aug 2003 05:03:49 -0000       1.6
  @@ -278,4 +278,29 @@
                case VAR_UNSIGNED_CHAR: m_sAuxStr = "GetUnsignedChar"; break;
        }
        return m_sAuxStr;
  -}
  \ No newline at end of file
  +}
  +
  +int Variable::GenerateWSDLSchema(File &file)
  +{
  +     if (m_Type == VAR_UNKNOWN) return 1; //error
  +     file << "<element name=\"" << m_VarName << "\" type=\"";
  +     if (m_Type != VAR_USER) file << "xsd:" << m_TypeName << "\" />" << endl;
  +     else file << "xsdl:" << m_TypeName << "\" />" << endl;
  +}
  +
  +int Variable::GenerateWSDLPartInMessage(File &file, bool bInput)
  +{
  +     if (m_Type == VAR_UNKNOWN) return 1; //error
  +     file << "<part name=\"";
  +     if (bInput) 
  +     {
  +             file << "input" << m_TypeName << m_VarName;
  +     }
  +     else
  +     {
  +             file << "return";
  +     }
  +     file << "\" type=\"";
  +     if (m_Type != VAR_USER) file << "xsd:" << m_TypeName << "\" />" << endl;
  +     else file << "xsdl:" << m_TypeName << "\" />" << endl;
  +}
  
  
  
  1.4       +2 -1      xml-axis/c/src/wcg/TranslationUnit.h
  
  Index: TranslationUnit.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/TranslationUnit.h,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TranslationUnit.h 25 Jul 2003 13:49:37 -0000      1.3
  +++ TranslationUnit.h 4 Aug 2003 05:03:49 -0000       1.4
  @@ -82,6 +82,7 @@
   class TranslationUnit  
   {
   public:
  +     int GenerateWSDLBinding(File& file, string& sServiceName, int nBinding, int 
nStyle, int nTransport, string& sURI);
        int GenerateServiceFile(string& sServiceFile);
        void SetWsFileName(const char* sFileName);
        void AddBeanClass(BeanClass* pClass);
  @@ -90,7 +91,7 @@
        void AddInclude(string& sInclude);
        int GenerateWrapperClassImpl();
        int GenerateWrapperClassDef();
  -     int GenerateWSDL();
  +     int GenerateWSDL(string& sServiceFile, string& sURI);
        TranslationUnit();
        virtual ~TranslationUnit();
   private:
  
  
  
  1.4       +79 -5     xml-axis/c/src/wcg/TranslationUnit.cpp
  
  Index: TranslationUnit.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/TranslationUnit.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TranslationUnit.cpp       25 Jul 2003 13:49:37 -0000      1.3
  +++ TranslationUnit.cpp       4 Aug 2003 05:03:49 -0000       1.4
  @@ -90,11 +90,44 @@
        }
   }
   
  -int TranslationUnit::GenerateWSDL()
  +int TranslationUnit::GenerateWSDL(string& sServiceFile, string& sURI)
   {
        try {
  -
  -     
  +             if (!m_pWSClass) {
  +                     cout << "No web service class found" << endl;   
  +                     return 1;
  +             }
  +             string fname = sServiceFile + ".wsdl"; 
  +             File file(fname);
  +             file << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"<< endl;
  +             file << "<definitions targetNamespace=\"http://"; << sURI.c_str() << 
"/Axis/" << sServiceFile.c_str() << "\""<< endl;
  +             file << "xmlns=\"http://schemas.xmlsoap.org/wsdl/\"";<< endl;
  +             file << "xmlns:soap=\"http://schemas.xmlsoap.org/wsdl/soap/\"";<< endl;
  +             file << "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"";<< endl;
  +             file << "xmlns:xsdl=\""<< sServiceFile.c_str() << "-xsd\""<< endl; 
//xsd local
  +             file << "xmlns:impl=\"http://"; << sURI.c_str() << "/Axis/" << 
sServiceFile.c_str() << "\""<< endl; //implimentation
  +             file << "xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\";>" 
<< endl;
  +             //types section
  +             if (!m_Beans.empty())
  +             {
  +                     file << "<types>" << endl;
  +                     file << "<schema targetNamespace=\"" << sServiceFile.c_str() 
<< "-xsd\" "<< "xmlns=\"http://www.w3.org/2001/XMLSchema\"; " << 
"xmlns:wsdl=\"http://schemas.xmlsoap.org/wsdl/\";>" << endl;
  +                     //generate schema for types
  +                     for (list<BeanClass*>::iterator it = m_Beans.begin(); it != 
m_Beans.end(); it++)
  +                     {
  +                             (*it)->GenerateWSDLSchema(file);
  +                     }
  +                     file << "</schema>" << endl;
  +                     file << "</types>" << endl;
  +             }
  +             //messages section
  +             m_pWSClass->GenerateWSDLMessages(file);
  +             //porttypes section
  +             m_pWSClass->GenerateWSDLPortTypes(file, sServiceFile);
  +             //bindings section
  +             //create only soap - rpc - http binding for now
  +             GenerateWSDLBinding(file, sServiceFile, SOAP_BINDING, SOAP_RPC, 
HTTP_TRANSPORT, sURI);
  +             file << "</definitions>" << endl;
        }
        catch(...) //any exception
        {
  @@ -239,7 +272,7 @@
                file << "{" << endl;
                file << "\tif (inst) " << endl;
                file << "\t{" << endl;
  -             file << "\t\tWrapperClassHandler* pWCH = 
dynamic_cast<WrapperClassHandler*>(inst);" << endl;
  +             file << "\t\tWrapperClassHandler* pWCH = 
reinterpret_cast<WrapperClassHandler*>(inst);" << endl;
                file << "\t\tpWCH->Fini();" << endl;
                file << "\t\tdelete pWCH;" << endl;
                file << "\t\treturn SUCCESS;" << endl;
  @@ -254,4 +287,45 @@
                return 1;
        }
        return 0; //success
  -}
  \ No newline at end of file
  +}
  +
  +int TranslationUnit::GenerateWSDLBinding(File &file, string& sServiceName, int 
nBinding, int nStyle, int nTransport, string& sURI)
  +{
  +     file << "<binding name=\"" << sServiceName;
  +     switch (nBinding)
  +     {
  +     case SOAP_BINDING: file << "Soap"; break;
  +     case HTTP_BINDING: file << "Http"; break;
  +     default: return 1; //error
  +     }
  +     file << "Binding\" type=\"impl:" << sServiceName << "PortType\">" << endl;
  +     switch (nBinding)
  +     {
  +     case SOAP_BINDING: 
  +             {
  +                     file << "<soap:binding style=\"";
  +                     switch (nStyle)
  +                     {
  +                     case SOAP_RPC: file << "rpc"; break;
  +                     case SOAP_DOCUMENT: file << "document"; break;
  +                     default: return 1; //error
  +                     }
  +                     file << "\" transport=\"";
  +                     switch (nTransport)
  +                     {
  +                     case HTTP_TRANSPORT: file << 
"http://schemas.xmlsoap.org/soap/http";; break;
  +                     default: return 1; //error
  +                     }
  +                     file << "\" />" << endl;
  +             }
  +             break;
  +     case HTTP_BINDING: 
  +             {
  +                     
  +             }
  +             break;
  +     default: return 1; //error
  +     }
  +     m_pWSClass->GenerateOperationsInBinding(file, sServiceName, nBinding, nStyle, 
sURI); 
  +     file << "</binding>" << endl;
  +}
  
  
  
  1.5       +3 -0      xml-axis/c/src/wcg/Method.h
  
  Index: Method.h
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/Method.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Method.h  24 Jul 2003 04:13:40 -0000      1.4
  +++ Method.h  4 Aug 2003 05:03:49 -0000       1.5
  @@ -82,6 +82,9 @@
   class Method  
   {
   public:
  +     int GenerateOperationInBinding(File &file, string &sServiceName, int nBinding, 
int nStyle, string &sURI);
  +     int GenerateWSDLOperationInPortType(File& file);
  +     int GenerateWSDLMessages(File &file);
        int GenerateMethodImpl(string& sClassName, File& file);
        string& GetName();
        int GenerateMethodDef(File &file);
  
  
  
  1.6       +73 -0     xml-axis/c/src/wcg/Method.cpp
  
  Index: Method.cpp
  ===================================================================
  RCS file: /home/cvs/xml-axis/c/src/wcg/Method.cpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Method.cpp        24 Jul 2003 04:13:40 -0000      1.5
  +++ Method.cpp        4 Aug 2003 05:03:49 -0000       1.6
  @@ -191,3 +191,76 @@
        return 0;
   }
   
  +int Method::GenerateWSDLMessages(File &file)
  +{
  +     file << "<message name=\"" << m_Name << "Request\">" << endl;
  +     for (list<Variable*>::iterator it = m_Params.begin(); it != m_Params.end(); 
it++)
  +     {
  +             (*it)->GenerateWSDLPartInMessage(file, true);
  +     }
  +     file << "</message>" << endl;
  +     if (m_pReturnType)
  +     {
  +             file << "<message name=\"" << m_Name << "Response\">" << endl;
  +             m_pReturnType->GenerateWSDLPartInMessage(file, false);
  +             file << "</message>" << endl;
  +     }
  +     return 0; //success
  +}
  +
  +int Method::GenerateWSDLOperationInPortType(File &file)
  +{
  +     file << "<operation name=\"" << m_Name << "\">" << endl;
  +     file << "<input message=\"impl:" << m_Name << "Request\" />" << endl; 
  +     file << "<output message=\"impl:" << m_Name << "Response\" />" << endl; 
  +     file << "</operation>" << endl;
  +     return 0;
  +}
  +
  +int Method::GenerateOperationInBinding(File &file, string &sServiceName, int 
nBinding, int nStyle, string &sURI)
  +{
  +     file << "<operation name=\"" << m_Name << "\">" << endl;
  +     switch (nBinding)
  +     {
  +     case SOAP_BINDING: 
  +             {
  +                     file << "<soap:operation soapAction=\"" << sServiceName << "\" 
style=\""; //service name should be in soapAction
  +                     switch (nStyle)
  +                     {
  +                     case SOAP_RPC: 
  +                             {       
  +                                     file << "rpc\" />" << endl;
  +                                     file << "<input>" << endl;
  +                                     file << "<soap:body use=\"encoded\" 
namespace=\"http://"; << sURI << "/\" 
encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"; />" << endl; 
  +                                     file << "</input>" << endl;
  +                                     file << "<output>" << endl;
  +                                     file << "<soap:body use=\"encoded\" 
namespace=\"http://"; << sURI << "/\" 
encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"; />" << endl; 
  +                                     file << "</output>" << endl;
  +                             }
  +                             break;
  +                     case SOAP_DOCUMENT: 
  +                             {
  +                                     file << "document\" />" << endl; 
  +                                     file << "<input>" << endl;
  +                                     file << "<soap:body use=\"literal\" />" << 
endl; 
  +                                     file << "</input>" << endl;
  +                                     file << "<output>" << endl;
  +                                     file << "<soap:body use=\"literal\" />" << 
endl; 
  +                                     file << "</output>" << endl;
  +
  +                             }
  +                             break;
  +                     default: return 1; //error
  +                     }
  +             }
  +             break;
  +     case HTTP_BINDING: 
  +             {
  +                     
  +             }
  +             break;
  +     default: return 1; //error
  +     }
  +     file << "</operation>" << endl;
  +     return 0;
  +}
  
  
  

Reply via email to