You've already forked lazarus-ccr
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
This commit is contained in:
@ -153,6 +153,7 @@ const
|
|||||||
sSIMPLE_TYPE = 'simpleType';
|
sSIMPLE_TYPE = 'simpleType';
|
||||||
sSTYLE = 'style';
|
sSTYLE = 'style';
|
||||||
sTRANSPORT = 'transport';
|
sTRANSPORT = 'transport';
|
||||||
|
sTRUE_LOWERCASE = 'true';
|
||||||
sTYPE = 'type';
|
sTYPE = 'type';
|
||||||
sUNBOUNDED = 'unbounded';
|
sUNBOUNDED = 'unbounded';
|
||||||
sUSE = 'use';
|
sUSE = 'use';
|
||||||
@ -768,7 +769,7 @@ begin
|
|||||||
if ( parentClss <> nil ) then begin
|
if ( parentClss <> nil ) then begin
|
||||||
if ( parentClss = THeaderBlock ) then begin
|
if ( parentClss = THeaderBlock ) then begin
|
||||||
s := Format('%s:%s',[GetNameSpaceShortName(sWST_BASE_NS,defSchemaNode,sWST_BASE_NS_ABR),sWST_HEADER_BLOCK]);
|
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;
|
end;
|
||||||
if IsParentVisible(parentRegItem) then begin
|
if IsParentVisible(parentRegItem) then begin
|
||||||
if ( parentRegItem.NameSpace = typItm.NameSpace ) then begin
|
if ( parentRegItem.NameSpace = typItm.NameSpace ) then begin
|
||||||
@ -955,17 +956,6 @@ procedure TBaseArrayRemotable_TypeHandler.Generate(
|
|||||||
AWsdlDocument: TXMLDocument;
|
AWsdlDocument: TXMLDocument;
|
||||||
ATypeRegistry : TTypeRegistry
|
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
|
var
|
||||||
typItm, propTypItm : TTypeRegistryItem;
|
typItm, propTypItm : TTypeRegistryItem;
|
||||||
s, prop_ns_shortName : string;
|
s, prop_ns_shortName : string;
|
||||||
@ -981,7 +971,7 @@ begin
|
|||||||
( typItm.DataType^.Kind = tkClass ) and
|
( typItm.DataType^.Kind = tkClass ) and
|
||||||
( arrayTypeData^.ClassType.InheritsFrom(TBaseArrayRemotable) )
|
( arrayTypeData^.ClassType.InheritsFrom(TBaseArrayRemotable) )
|
||||||
then begin
|
then begin
|
||||||
GetNameSpaceShortName(typItm.NameSpace);
|
GetNameSpaceShortName(typItm.NameSpace,AWsdlDocument);
|
||||||
defTypesNode := FindNode(AWsdlDocument.DocumentElement,sWSDL_TYPES) as TDOMElement;
|
defTypesNode := FindNode(AWsdlDocument.DocumentElement,sWSDL_TYPES) as TDOMElement;
|
||||||
Assert(Assigned(defTypesNode));
|
Assert(Assigned(defTypesNode));
|
||||||
defSchemaNode := defTypesNode.FirstChild as TDOMElement;
|
defSchemaNode := defTypesNode.FirstChild as TDOMElement;
|
||||||
@ -1001,10 +991,16 @@ begin
|
|||||||
s := sITEM;
|
s := sITEM;
|
||||||
propNode.SetAttribute(sNAME,s);
|
propNode.SetAttribute(sNAME,s);
|
||||||
if Assigned(propTypItm) then begin
|
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(sTYPE,Format('%s:%s',[prop_ns_shortName,propTypItm.DeclaredName]));
|
||||||
propNode.SetAttribute(sMIN_OCCURS,'0');
|
propNode.SetAttribute(sMIN_OCCURS,'0');
|
||||||
propNode.SetAttribute(sMAX_OCCURS,sUNBOUNDED);
|
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;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1040,7 +1036,7 @@ begin
|
|||||||
s := Format('%s:%s',[sXSD,sCOMPLEX_TYPE]);
|
s := Format('%s:%s',[sXSD,sCOMPLEX_TYPE]);
|
||||||
cplxNode := CreateElement(s,defSchemaNode,AWsdlDocument);
|
cplxNode := CreateElement(s,defSchemaNode,AWsdlDocument);
|
||||||
cplxNode.SetAttribute(sNAME, typItm.DeclaredName);
|
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);
|
sqcNode := CreateElement(Format('%s:%s',[sXSD,sSEQUENCE]),cplxNode,AWsdlDocument);
|
||||||
if ( objTypeData^.FieldCount > 0 ) then begin
|
if ( objTypeData^.FieldCount > 0 ) then begin
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<definitions name="runtime_generator"
|
||||||
|
xmlns="http://schemas.xmlsoap.org/wsdl/"
|
||||||
|
xmlns:tns="urn:sample-namespace"
|
||||||
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
|
||||||
|
targetNamespace="urn:sample-namespace">
|
||||||
|
<types>
|
||||||
|
<xsd:schema
|
||||||
|
xmlns="http://www.w3.org/2001/XMLSchema"
|
||||||
|
xmlns:wst="urn:wst_base"
|
||||||
|
targetNamespace="urn:sample-namespace">
|
||||||
|
<xsd:complexType name="TClass_A">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="A_StringProp" type="xsd:string" maxOccurs="1" minOccurs="1"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
<xsd:complexType name="TClass_A_Collection">
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="item" type="tns:TClass_A" maxOccurs="unbounded" minOccurs="0" wst:wst_collection="true"/>
|
||||||
|
</xsd:sequence>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:schema>
|
||||||
|
</types>
|
||||||
|
</definitions>
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<definitions name="runtime_generator" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:sample-namespace" xmlns:wst="urn:wst_base" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="urn:sample-namespace">
|
<definitions name="runtime_generator" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:sample-namespace" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" targetNamespace="urn:sample-namespace">
|
||||||
<types>
|
<types>
|
||||||
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:sample-namespace">
|
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wst="urn:wst_base" targetNamespace="urn:sample-namespace">
|
||||||
<xsd:complexType name="TTestSmallRecord" wst:wst_record="true">
|
<xsd:complexType name="TTestSmallRecord" wst:wst_record="true">
|
||||||
<xsd:sequence>
|
<xsd:sequence>
|
||||||
<xsd:element name="fieldSmallint" type="xsd:short" maxOccurs="1" minOccurs="0"/>
|
<xsd:element name="fieldSmallint" type="xsd:short" maxOccurs="1" minOccurs="0"/>
|
||||||
|
@ -80,6 +80,16 @@ type
|
|||||||
property Password : string read FPassword write FPassword;
|
property Password : string read FPassword write FPassword;
|
||||||
end;
|
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 }
|
||||||
|
|
||||||
TTestWSDLGenerator= class(TTestCase)
|
TTestWSDLGenerator= class(TTestCase)
|
||||||
@ -89,6 +99,7 @@ type
|
|||||||
procedure generate_complex_type_derivation();
|
procedure generate_complex_type_derivation();
|
||||||
procedure generate_enum();
|
procedure generate_enum();
|
||||||
procedure generate_array();
|
procedure generate_array();
|
||||||
|
procedure generate_collection();
|
||||||
procedure generate_record();
|
procedure generate_record();
|
||||||
procedure generate_soap_headerblock();
|
procedure generate_soap_headerblock();
|
||||||
end;
|
end;
|
||||||
@ -113,6 +124,28 @@ begin
|
|||||||
end;
|
end;
|
||||||
{$ENDIF WST_RECORD_RTTI}
|
{$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 }
|
{ TTestWSDLGenerator }
|
||||||
|
|
||||||
function TTestWSDLGenerator.CreateRepository() : PServiceRepository;
|
function TTestWSDLGenerator.CreateRepository() : PServiceRepository;
|
||||||
@ -228,6 +261,37 @@ begin
|
|||||||
end;
|
end;
|
||||||
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();
|
procedure TTestWSDLGenerator.generate_record();
|
||||||
var
|
var
|
||||||
locRep : PServiceRepository;
|
locRep : PServiceRepository;
|
||||||
|
Reference in New Issue
Block a user