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;