From 2ac2f77e12ef2ad7ba671a58ad2d23d2382abd37 Mon Sep 17 00:00:00 2001 From: inoussa Date: Fri, 26 Jun 2009 12:36:05 +0000 Subject: [PATCH] Runtime WSDL generation : object collection handling and test case. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@864 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- wst/trunk/metadata_wsdl.pas | 26 ++++---- .../files/wsdl_gen_generate_collection.wsdl | 25 ++++++++ .../files/wsdl_gen_generate_record.wsdl | 4 +- .../test_suite/test_generators_runtime.pas | 64 +++++++++++++++++++ 4 files changed, 102 insertions(+), 17 deletions(-) create mode 100644 wst/trunk/tests/test_suite/files/wsdl_gen_generate_collection.wsdl diff --git a/wst/trunk/metadata_wsdl.pas b/wst/trunk/metadata_wsdl.pas index c230552ad..3d6db53c2 100644 --- a/wst/trunk/metadata_wsdl.pas +++ b/wst/trunk/metadata_wsdl.pas @@ -153,6 +153,7 @@ const sSIMPLE_TYPE = 'simpleType'; sSTYLE = 'style'; sTRANSPORT = 'transport'; + sTRUE_LOWERCASE = 'true'; sTYPE = 'type'; sUNBOUNDED = 'unbounded'; sUSE = 'use'; @@ -768,7 +769,7 @@ begin if ( parentClss <> nil ) then begin if ( parentClss = THeaderBlock ) then begin s := Format('%s:%s',[GetNameSpaceShortName(sWST_BASE_NS,defSchemaNode,sWST_BASE_NS_ABR),sWST_HEADER_BLOCK]); - cplxNode.SetAttribute(s, 'true'); + cplxNode.SetAttribute(s, sTRUE_LOWERCASE); end; if IsParentVisible(parentRegItem) then begin if ( parentRegItem.NameSpace = typItm.NameSpace ) then begin @@ -955,17 +956,6 @@ procedure TBaseArrayRemotable_TypeHandler.Generate( AWsdlDocument: TXMLDocument; ATypeRegistry : TTypeRegistry ); - - function GetNameSpaceShortName(const ANameSpace : string):string;//inline; - begin - if FindAttributeByValueInNode(ANameSpace,AWsdlDocument.DocumentElement,Result,0,sXMLNS) then begin - Result := Copy(Result,Length(sXMLNS+':')+1,MaxInt); - end else begin - Result := Format('ns%d',[GetNodeListCount(AWsdlDocument.DocumentElement.Attributes)]) ; - AWsdlDocument.DocumentElement.SetAttribute(Format('%s:%s',[sXMLNS,Result]),ANameSpace); - end; - end; - var typItm, propTypItm : TTypeRegistryItem; s, prop_ns_shortName : string; @@ -981,7 +971,7 @@ begin ( typItm.DataType^.Kind = tkClass ) and ( arrayTypeData^.ClassType.InheritsFrom(TBaseArrayRemotable) ) then begin - GetNameSpaceShortName(typItm.NameSpace); + GetNameSpaceShortName(typItm.NameSpace,AWsdlDocument); defTypesNode := FindNode(AWsdlDocument.DocumentElement,sWSDL_TYPES) as TDOMElement; Assert(Assigned(defTypesNode)); defSchemaNode := defTypesNode.FirstChild as TDOMElement; @@ -1001,10 +991,16 @@ begin s := sITEM; propNode.SetAttribute(sNAME,s); if Assigned(propTypItm) then begin - prop_ns_shortName := GetNameSpaceShortName(propTypItm.NameSpace); + prop_ns_shortName := GetNameSpaceShortName(propTypItm.NameSpace,AWsdlDocument); propNode.SetAttribute(sTYPE,Format('%s:%s',[prop_ns_shortName,propTypItm.DeclaredName])); propNode.SetAttribute(sMIN_OCCURS,'0'); propNode.SetAttribute(sMAX_OCCURS,sUNBOUNDED); + if arrayTypeClass.InheritsFrom(TObjectCollectionRemotable) then begin + propNode.SetAttribute( + Format('%s:wst_collection',[GetNameSpaceShortName(sWST_BASE_NS,defSchemaNode,sWST_BASE_NS_ABR)]), + sTRUE_LOWERCASE + ); + end; end; end; end; @@ -1040,7 +1036,7 @@ begin s := Format('%s:%s',[sXSD,sCOMPLEX_TYPE]); cplxNode := CreateElement(s,defSchemaNode,AWsdlDocument); cplxNode.SetAttribute(sNAME, typItm.DeclaredName); - cplxNode.SetAttribute(Format('%s:wst_record',[GetNameSpaceShortName(sWST_BASE_NS,AWsdlDocument,'wst')]),'true'); + cplxNode.SetAttribute(Format('%s:wst_record',[GetNameSpaceShortName(sWST_BASE_NS,defSchemaNode,'wst')]),sTRUE_LOWERCASE); sqcNode := CreateElement(Format('%s:%s',[sXSD,sSEQUENCE]),cplxNode,AWsdlDocument); if ( objTypeData^.FieldCount > 0 ) then begin diff --git a/wst/trunk/tests/test_suite/files/wsdl_gen_generate_collection.wsdl b/wst/trunk/tests/test_suite/files/wsdl_gen_generate_collection.wsdl new file mode 100644 index 000000000..f75c9eaae --- /dev/null +++ b/wst/trunk/tests/test_suite/files/wsdl_gen_generate_collection.wsdl @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + diff --git a/wst/trunk/tests/test_suite/files/wsdl_gen_generate_record.wsdl b/wst/trunk/tests/test_suite/files/wsdl_gen_generate_record.wsdl index 45cea0061..bc3faba35 100644 --- a/wst/trunk/tests/test_suite/files/wsdl_gen_generate_record.wsdl +++ b/wst/trunk/tests/test_suite/files/wsdl_gen_generate_record.wsdl @@ -1,7 +1,7 @@ - + - + diff --git a/wst/trunk/tests/test_suite/test_generators_runtime.pas b/wst/trunk/tests/test_suite/test_generators_runtime.pas index bf7a15e70..c2651b73a 100644 --- a/wst/trunk/tests/test_suite/test_generators_runtime.pas +++ b/wst/trunk/tests/test_suite/test_generators_runtime.pas @@ -80,6 +80,16 @@ type property Password : string read FPassword write FPassword; end; + TClass_A_Collection = class(TObjectCollectionRemotable) + private + function GetItem(AIndex: Integer): TClass_A; + public + class function GetItemClass():TBaseRemotableClass;override; + function Add(): TClass_A; {$IFDEF USE_INLINE}inline;{$ENDIF} + function AddAt(const APosition : Integer) : TClass_A; {$IFDEF USE_INLINE}inline;{$ENDIF} + property Item[AIndex:Integer] : TClass_A Read GetItem;Default; + end; + { TTestWSDLGenerator } TTestWSDLGenerator= class(TTestCase) @@ -89,6 +99,7 @@ type procedure generate_complex_type_derivation(); procedure generate_enum(); procedure generate_array(); + procedure generate_collection(); procedure generate_record(); procedure generate_soap_headerblock(); end; @@ -113,6 +124,28 @@ begin end; {$ENDIF WST_RECORD_RTTI} +{ TClass_A_Collection } + +function TClass_A_Collection.GetItem(AIndex: Integer): TClass_A; +begin + Result := TClass_A(Inherited GetItem(AIndex)); +end; + +class function TClass_A_Collection.GetItemClass(): TBaseRemotableClass; +begin + Result:= TClass_A; +end; + +function TClass_A_Collection.Add() : TClass_A; +begin + Result := TClass_A(inherited Add()); +end; + +function TClass_A_Collection.AddAt(const APosition : Integer) : TClass_A; +begin + Result := TClass_A(inherited AddAt(APosition)); +end; + { TTestWSDLGenerator } function TTestWSDLGenerator.CreateRepository() : PServiceRepository; @@ -228,6 +261,37 @@ begin end; end; +procedure TTestWSDLGenerator.generate_collection(); +var + locRep : PServiceRepository; + locDoc, locExistDoc : TXMLDocument; + typeReg : TTypeRegistry; + handlerReg : IWsdlTypeHandlerRegistry; +begin + locExistDoc := nil; + typeReg := nil; + locDoc := nil; + locRep := CreateRepository(); + try + typeReg := TTypeRegistry.Create(); + RegisterStdTypes(typeReg); + typeReg.Register(sNAMESPACE_SAMPLE,TypeInfo(TClass_A)); + typeReg.Register(sNAMESPACE_SAMPLE,TypeInfo(TClass_A_Collection)); + handlerReg := CreateWsdlTypeHandlerRegistry(typeReg); + RegisterFondamentalTypesHandler(handlerReg); + locDoc := CreateDoc(); + GenerateWSDL(locRep,locDoc,typeReg,handlerReg); + //WriteXML(locDoc,wstExpandLocalFileName('wsdl_gen_generate_collection.wsdl')); + ReadXMLFile(locExistDoc,wstExpandLocalFileName(TestFilesPath + 'wsdl_gen_generate_collection.wsdl')); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + typeReg.Free(); + ReleaseDomNode(locExistDoc); + ReleaseDomNode(locDoc); + Dispose(locRep); + end; +end; + procedure TTestWSDLGenerator.generate_record(); var locRep : PServiceRepository;