diff --git a/wst/trunk/ide/lazarus/wst_indy.lpk b/wst/trunk/ide/lazarus/wst_indy.lpk index bcd2c04ce..fe1d5caeb 100644 --- a/wst/trunk/ide/lazarus/wst_indy.lpk +++ b/wst/trunk/ide/lazarus/wst_indy.lpk @@ -9,7 +9,7 @@ - + @@ -17,7 +17,8 @@ - + diff --git a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg index 40ce41371..cb9341f71 100644 --- a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg +++ b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.cfg @@ -35,10 +35,10 @@ -N"obj" -LE"c:\program files\borland\delphi7\Projects\Bpl" -LN"c:\program files\borland\delphi7\Projects\Bpl" --U"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src" --O"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src" --I"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src" --R"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src" +-U"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src" +-O"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src" +-I"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src" +-R"..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src" -w-UNSAFE_TYPE -w-UNSAFE_CODE -w-UNSAFE_CAST diff --git a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof index 1f4cae9e5..4536b7110 100644 --- a/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof +++ b/wst/trunk/tests/test_suite/delphi/gui_wst_test_suite.dof @@ -94,7 +94,7 @@ OutputDir= UnitOutputDir=obj PackageDLLOutputDir= PackageDCPOutputDir= -SearchPath=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +SearchPath=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src Packages=vcl;rtl;vclx;indy;inet;xmlrtl;vclie;inetdbbde;inetdbxpress;dbrtl;dsnap;dsnapcon;vcldb;soaprtl;VclSmp;dbexpress;dbxcds;inetdb;bdertl;vcldbx;webdsnap;websnap;adortl;ibxpress;teeui;teedb;tee;dss;visualclx;visualdbclx;vclactnband;vclshlctrls;IntrawebDB_50_70;Intraweb_50_70;dclOfficeXP;Rave70VCL;Rave70CLX;Jcl;JclVcl;JvCoreD7R;JvSystemD7R;JvStdCtrlsD7R;JvAppFrmD7R;JvBandsD7R;JvDBD7R;JvDlgsD7R;JvBDED7R;JvCmpD7R;JvCryptD7R;JvCtrlsD7R;JvCustomD7R;JvDockingD7R;JvDotNetCtrlsD7R;JvEDID7R;JvGlobusD7R;JvHMID7R;JvInterpreterD7R;JvJansD7R;JvManagedThreadsD7R;JvMMD7R;JvNetD7R;JvPageCompsD7R;JvPluginD7R;JvPrintPreviewD7R;JvRuntimeDesignD7R;JvTimeFrameworkD7R;JvUIBD7R;JvValidatorsD7R;JvWizardD7R;JvXPCtrlsD7R;FIBDBMidas7;daADPhysADSD7;daADPhysODBCD7;daADPhysD7;daADComID7;daADPhysDBExpD7;daADPhysASAD7;daADPhysOraclD7;daADPhysMySQLD7;daADPhysDb2D7;daADPhysMSSQLD7;daADPhysMSAccD7;daADGUIxFormsD7;daADCompD7;CRControls70;dac70;dacvcl70;odacvcl70;odac70;oraprov70;dxGDIPlusD7;cxLibraryVCLD7;dxsbD7;dxComnD7;cxEditorsVCLD7;dxThemeD7;cxDataD7;cxExtEditorsVCLD7;cxPageControlVCLD7;cxGridD7;cxSchedulerVCLD7;cxTreeListVCLD7;cxVerticalGridVCLD7;cxPivotGridD7;cxSpreadSheetVCLD7;dxDockingD7;dxNavBarD7;dxLayoutControlD7;dxLayoutControlcxEditAdaptersD7;cxWebD7;cxWebPascalScriptD7;cxWebSnapD7;cxWebTeeChartD7;dxMasterViewD7;dxmdsD7;dxdbtrD7;dxtrmdD7;dxorgcD7;dxdborD7;dxFlowChartD7;dxPSCoreD7;dxPSLnksD7;dxPScxCommonD7;dxPScxGrid6LnkD7;dxPScxPCProdD7;dxPScxPivotGridLnkD7;dxPScxScheduler2LnkD7;dxPScxSSLnkD7;dxPScxTLLnkD7;dxPScxVGridLnkD7;dxPSTeeChartD7;dxPSdxOCLnkD7;dxPSdxDBTVLnkD7;dxPSdxFCLnkD7;dxPSdxLCLnkD7;dxPSdxMVLnkD7;dxPSdxDBOCLnkD7;dxPScxExtCommonD7;dxPsPrVwAdvD7;dxBarExtItemsD7;dxBarD7;dxPSDBTeeChartD7;cxBarEditItemD7;dxBarDBNavD7;dxBarExtDBItemsD7;dxRibbonD7;S403_r70;S403br70 Conditionals= DebugSourceDirs= @@ -141,21 +141,22 @@ Item0=DUnit Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] -Count=14 -Item0=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item1=$(DELPHI)\Lib\Debug;C:\PROGRA~1\Borland\Delphi7\MyTools\JVCL\3.20\jcl\lib\d7\debug;..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item2=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\ws_helper -Item3=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\fcl-units\fcl-passrc\src -Item4=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item5=..\;..\..\;..\..\..\;C:\Programmes\lazarus\wst\trunk\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item6=..\;..\..\;..\..\..\;..\..\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item7=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item8=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;C:\Programmes\lazarus\wst\trunk\ws_helper -Item9=..\;..\..\;..\..\..\;..\..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item10=..\;..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item11=..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item12=C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src -Item13=..\ +Count=15 +Item0=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;$(DELPHI)\plate_forme\dunit\dunit-9.3.0\src +Item1=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item2=$(DELPHI)\Lib\Debug;C:\PROGRA~1\Borland\Delphi7\MyTools\JVCL\3.20\jcl\lib\d7\debug;..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;..\..\..\ws_helper;..\..\..\wst_rtti_filter;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item3=..\;..\..\;..\..\..\;..\..\..\fcl-units\fcl-passrc\src;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\ws_helper +Item4=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;..\..\..\fcl-units\fcl-passrc\src +Item5=..\;..\..\;..\..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item6=..\;..\..\;..\..\..\;C:\Programmes\lazarus\wst\trunk\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item7=..\;..\..\;..\..\..\;..\..\ws_helper;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item8=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item9=..\;..\..\;..\..\..\;..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src;C:\Programmes\lazarus\wst\trunk\ws_helper +Item10=..\;..\..\;..\..\..\;..\..\..\ws_helper\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item11=..\;..\..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item12=..\;C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item13=C:\Program Files\Borland\Delphi7\plate_forme\dunit\dunit-9.3.0\src +Item14=..\ [HistoryLists\hlUnitOutputDirectory] Count=1 Item0=obj diff --git a/wst/trunk/tests/test_suite/files/echo_service.wsdl b/wst/trunk/tests/test_suite/files/echo_service.wsdl new file mode 100644 index 000000000..d479a8372 --- /dev/null +++ b/wst/trunk/tests/test_suite/files/echo_service.wsdl @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wst/trunk/tests/test_suite/test_generators.pas b/wst/trunk/tests/test_suite/test_generators.pas index 2d545f24d..8ece290fb 100644 --- a/wst/trunk/tests/test_suite/test_generators.pas +++ b/wst/trunk/tests/test_suite/test_generators.pas @@ -20,7 +20,7 @@ uses {$ELSE} TestFrameWork, xmldom, wst_delphi_xml, {$ENDIF} - pastree, pascal_parser_intf, xsd_generator; + pastree, pascal_parser_intf, xsd_generator, wsdl_generator; type @@ -56,6 +56,16 @@ type function CreateGenerator(const ADoc : TXMLDocument) : IXsdGenerator;override; end; + { TTest_WsdlGenerator } + + TTest_WsdlGenerator = class(TTestCase) + protected + function CreateGenerator(const ADoc : TXMLDocument) : IGenerator; + function LoadXmlFromFilesList(const AFileName : string) : TXMLDocument; + published + procedure message_parts_type_hint(); + end; + implementation uses @@ -517,7 +527,7 @@ begin locDoc := CreateDoc(); g := CreateGenerator(locDoc); g.Execute(tr,mdl.Name); - WriteXMLFile(locDoc,'.\class_unicodestring_property.xsd'); + //WriteXMLFile(locDoc,'.\class_unicodestring_property.xsd'); locExistDoc := LoadXmlFromFilesList('class_unicodestring_property.xsd'); Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); finally @@ -899,7 +909,7 @@ begin locDoc := CreateDoc(); g := CreateGenerator(locDoc); g.Execute(tr,mdl.Name); - WriteXMLFile(locDoc,'.\class_ansichar_property.xsd'); + //WriteXMLFile(locDoc,'.\class_ansichar_property.xsd'); locExistDoc := LoadXmlFromFilesList('class_ansichar_property.xsd'); Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); finally @@ -960,7 +970,7 @@ begin locDoc := CreateDoc(); g := CreateGenerator(locDoc); g.Execute(tr,mdl.Name); - WriteXMLFile(locDoc,'.\class_widechar_property.xsd'); + //WriteXMLFile(locDoc,'.\class_widechar_property.xsd'); locExistDoc := LoadXmlFromFilesList('class_widechar_property.xsd'); Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); finally @@ -977,7 +987,82 @@ begin Result := TXsdGenerator.Create(ADoc) as IXsdGenerator; end; +{ TTest_WsdlGenerator } + +function TTest_WsdlGenerator.CreateGenerator(const ADoc : TXMLDocument) : IGenerator; +begin + Result := TWsdlGenerator.Create(ADoc) as IGenerator; +end; + +function TTest_WsdlGenerator.LoadXmlFromFilesList(const AFileName : string) : TXMLDocument; +begin + ReadXMLFile(Result,wstExpandLocalFileName(TestFilesPath + AFileName)); +end; + +procedure TTest_WsdlGenerator.message_parts_type_hint(); +var + tr : TwstPasTreeContainer; + mdl : TPasModule; + cltyp : TPasClassType; + + procedure AddMethod_EchoWideString(); + var + p : TPasFunction; + pt : TPasFunctionType; + prmDef : TPasArgument; + prmTypeDef : TPasType; + begin + p := TPasFunction(tr.CreateElement(TPasFunction,'EchoWideString',cltyp,visDefault,'',0)); + pt := tr.CreateFunctionType('','result',p,False,'',0); + pt.ResultEl.ResultType := tr.FindElementNS('WideString',s_xs) as TPasType; + pt.ResultEl.ResultType.AddRef(); + p.ProcType := pt; + + cltyp.Members.Add(p); + prmTypeDef := tr.FindElementNS('WideString',s_xs) as TPasType; + prmDef := TPasArgument(tr.CreateElement(TPasArgument,'AValue',pt,visDefault,'',0)); + pt.Args.Add(prmDef); + prmDef.ArgType := prmTypeDef; + prmTypeDef.AddRef(); + prmDef.Access := argConst; + end; + +var + g : IGenerator; + locDoc, locExistDoc : TXMLDocument; +begin + locDoc := nil; + locExistDoc := nil; + tr := TwstPasTreeContainer.Create(); + try + CreateWstInterfaceSymbolTable(tr); + mdl := TPasModule(tr.CreateElement(TPasModule,'echo_service',tr.Package,visDefault,'',0)); + tr.Package.Modules.Add(mdl); + tr.RegisterExternalAlias(mdl,'uri:echo-service'); + mdl.InterfaceSection := TPasSection(tr.CreateElement(TPasSection,'',mdl,visDefault,'',0)); + cltyp := TPasClassType(tr.CreateElement(TPasClassType,'IEchoService',mdl.InterfaceSection,visDefault,'',0)); + cltyp.ObjKind := okInterface; + cltyp.InterfaceGUID := '{FCD0F68F-3023-46C6-AD09-1DDA4A2989EB}'; + mdl.InterfaceSection.Declarations.Add(cltyp); + mdl.InterfaceSection.Types.Add(cltyp); + tr.AddBinding('IEchoServiceBinding',cltyp); + AddMethod_EchoWideString(); + + locDoc := CreateDoc(); + g := CreateGenerator(locDoc); + g.Execute(tr,mdl.Name); + //WriteXMLFile(locDoc,wstExpandLocalFileName('echo_service.wsdl')); + locExistDoc := LoadXmlFromFilesList('echo_service.wsdl'); + Check(CompareNodes(locExistDoc.DocumentElement,locDoc.DocumentElement),'generated document differs from the existent one.'); + finally + ReleaseDomNode(locExistDoc); + ReleaseDomNode(locDoc); + FreeAndNil(tr); + end; +end; + initialization - RegisterTest('XSD generator',TTest_XsdGenerator.Suite); + RegisterTest('XSD-WSDL generator',TTest_XsdGenerator.Suite); + RegisterTest('XSD-WSDL generator',TTest_WsdlGenerator.Suite); end. diff --git a/wst/trunk/tests/test_suite/test_parsers.pas b/wst/trunk/tests/test_suite/test_parsers.pas index 522caa6e8..28ac899bf 100644 --- a/wst/trunk/tests/test_suite/test_parsers.pas +++ b/wst/trunk/tests/test_suite/test_parsers.pas @@ -175,6 +175,7 @@ type procedure signature_return(); procedure xsd_not_declared_at_top_node(); procedure xsd_not_declared_at_top_node_2(); + procedure message_parts_type_hint(); end; implementation @@ -2199,6 +2200,55 @@ begin ParseDoc('xsd_not_declared_at_top_node_2').Free(); end; +procedure TTest_WsdlParser.message_parts_type_hint(); + + function FindProc(const AName : string; AIntf : TPasClassType) : TPasProcedure; + var + k : Integer; + begin + Result := nil; + for k := 0 to (AIntf.Members.Count - 1) do begin + if TObject(AIntf.Members[k]).InheritsFrom(TPasProcedure) and ( TPasProcedure(AIntf.Members[k]).Name = AName ) then begin + Result := TPasProcedure(AIntf.Members[k]); + Break; + end; + end; + end; + +var + tr : TwstPasTreeContainer; + elt : TPasElement; + intf : TPasClassType; + mth : TPasProcedure; + mthType : TPasProcedureType; + res : TPasResultElement; + arg : TPasArgument; +begin + tr := ParseDoc('echo_service'); + try + elt := tr.FindElement('IEchoService'); + CheckNotNull(elt,'IEchoService'); + CheckIs(elt,TPasClassType); + intf := elt as TPasClassType; + CheckEquals(Ord(okInterface),Ord(intf.ObjKind)); + mth := FindProc('EchoWideString',intf); + CheckNotNull(mth,'EchoWideString not found'); + CheckEquals('EchoWideString',mth.Name); + mthType := mth.ProcType; + CheckIs(mthType,TPasFunctionType); + res := TPasFunctionType(mthType).ResultEl; + CheckNotNull(res, 'Result'); + CheckEquals(LowerCase('WideString'), LowerCase(res.ResultType.Name),'Result'); + CheckEquals(1, mthType.Args.Count, 'Parameter count'); + arg := TPasArgument(mthType.Args[0]); + CheckNotNull(arg); + CheckEquals(LowerCase('AValue'), LowerCase(arg.Name)); + CheckEquals(LowerCase('WideString'), LowerCase(arg.ArgType.Name),'Parameter'); + finally + tr.Free(); + end; +end; + function TTest_WsdlParser.LoadComplexType_Class_default_values() : TwstPasTreeContainer; begin Result := ParseDoc(x_complexType_class_default); diff --git a/wst/trunk/tests/test_suite/wst_test_suite.lpi b/wst/trunk/tests/test_suite/wst_test_suite.lpi index 085a68454..f9a5c5db3 100644 --- a/wst/trunk/tests/test_suite/wst_test_suite.lpi +++ b/wst/trunk/tests/test_suite/wst_test_suite.lpi @@ -2,11 +2,13 @@ - + + + + - diff --git a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi index e8ca2dc21..9235163b9 100644 --- a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi +++ b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi @@ -2,11 +2,13 @@ - + + + + - @@ -141,6 +143,9 @@ + + + @@ -169,7 +174,7 @@ - diff --git a/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi b/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi index a40f5eb84..1acf69bcc 100644 --- a/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi +++ b/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi @@ -2,11 +2,13 @@ - + + + + - @@ -42,7 +44,6 @@ - @@ -50,7 +51,6 @@ - @@ -59,7 +59,6 @@ - @@ -83,7 +82,6 @@ - @@ -91,14 +89,12 @@ - - @@ -106,7 +102,6 @@ - @@ -123,7 +118,6 @@ - @@ -135,21 +129,18 @@ - - - @@ -157,7 +148,6 @@ - @@ -165,7 +155,6 @@ - @@ -173,7 +162,6 @@ - @@ -181,7 +169,6 @@ - diff --git a/wst/trunk/ws_helper/ws_helper.lpi b/wst/trunk/ws_helper/ws_helper.lpi index 86a77374e..81136105b 100644 --- a/wst/trunk/ws_helper/ws_helper.lpi +++ b/wst/trunk/ws_helper/ws_helper.lpi @@ -2,16 +2,16 @@ - + + - diff --git a/wst/trunk/ws_helper/wsdl_generator.pas b/wst/trunk/ws_helper/wsdl_generator.pas index 05d53875b..d51c25e96 100644 --- a/wst/trunk/ws_helper/wsdl_generator.pas +++ b/wst/trunk/ws_helper/wsdl_generator.pas @@ -176,6 +176,7 @@ procedure TWsdlGenerator.GenerateServiceMessages( tmpNode : TDOMElement; ns_shortName, s : string; typItm : TPasType; + typeHelper : IXsdSpecialTypeHelper; begin tmpNode := CreateElement(s_part,AMsgNode,Document); tmpNode.SetAttribute(s_name,ASymTable.GetExternalName(APrm)); @@ -187,6 +188,10 @@ procedure TWsdlGenerator.GenerateServiceMessages( ns_shortName := GetNameSpaceShortName(s,Document,nil); s := Format('%s:%s',[ns_shortName,ASymTable.GetExternalName(typItm)]); tmpNode.SetAttribute(s_type,s); + if typItm.InheritsFrom(TPasNativeSpecialSimpleType) then begin + if GetXsdTypeHandlerRegistry().FindHelper(typItm,typeHelper) then + typeHelper.HandleTypeUsage(tmpNode,ARootNode); + end; end; procedure GenerateResultParam(APrm : TPasResultElement; AMsgNode : TDOMElement); @@ -194,6 +199,7 @@ procedure TWsdlGenerator.GenerateServiceMessages( tmpNode : TDOMElement; ns_shortName, s : string; typItm : TPasType; + typeHelper : IXsdSpecialTypeHelper; begin tmpNode := CreateElement(s_part,AMsgNode,Document); tmpNode.SetAttribute(s_name,ASymTable.GetExternalName(APrm)); @@ -205,6 +211,10 @@ procedure TWsdlGenerator.GenerateServiceMessages( ns_shortName := GetNameSpaceShortName(s,Document,nil); s := Format('%s:%s',[ns_shortName,ASymTable.GetExternalName(typItm)]); tmpNode.SetAttribute(s_type,s); + if typItm.InheritsFrom(TPasNativeSpecialSimpleType) then begin + if GetXsdTypeHandlerRegistry().FindHelper(typItm,typeHelper) then + typeHelper.HandleTypeUsage(tmpNode,ARootNode); + end; end; var diff --git a/wst/trunk/ws_helper/wsdl_parser.pas b/wst/trunk/ws_helper/wsdl_parser.pas index 10078716b..ec4f4dd3b 100644 --- a/wst/trunk/ws_helper/wsdl_parser.pas +++ b/wst/trunk/ws_helper/wsdl_parser.pas @@ -75,7 +75,7 @@ type const ASoapBindingStyle : string ) : TPasProcedure; function GetParser(const ANamespace : string) : IXsdPaser; - function ParseType(const AName : string) : TPasType; + function ParseType(const AName : string; const AHint : string = '') : TPasType; procedure ParseTypes(); protected function GetXsShortNames() : TStrings; @@ -449,11 +449,17 @@ function TWsdlParser.ParseOperation( if Assigned(Result) then Result := CreateCursorOn(Result,CreateWsdlNameFilter(s_part)); end; + + function ExtractTypeHint(AElement : TDOMNode) : string; + begin + if not wst_findCustomAttributeXsd(FXSShortNames,AElement,s_WST_typeHint,Result) then + Result := ''; + end; - function GetDataType(const AName, ATypeOrElement : string):TPasType; + function GetDataType(const AName, ATypeOrElement : string; const ATypeHint : string = ''):TPasType; begin try - Result := ParseType(AName); + Result := ParseType(AName,ATypeHint); except on e : Exception do begin DoOnMessage(mtError, e.Message + ' ' + AName + ' ' + ATypeOrElement); @@ -490,7 +496,7 @@ function TWsdlParser.ParseOperation( if ( crs <> nil ) then begin crs.Reset(); while crs.MoveNext() do begin - tmpNode := (crs.GetCurrent() as TDOMNodeRttiExposer).InnerObject; + tmpNode := TDOMNodeRttiExposer(crs.GetCurrent()).InnerObject; if ( tmpNode.Attributes = nil ) or ( tmpNode.Attributes.Length < 1 ) then begin raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); end; @@ -503,7 +509,7 @@ function TWsdlParser.ParseOperation( if not tmpCrs.MoveNext() then begin raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); end; - prmName := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeValue; + prmName := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeValue; strBuffer := s_NODE_NAME + '=' + QuotedStr(s_element) + ' or ' + s_NODE_NAME + ' = ' + QuotedStr(s_type); tmpCrs := CreateCursorOn( CreateAttributesCursor(tmpNode,cetRttiNode), @@ -513,8 +519,8 @@ function TWsdlParser.ParseOperation( if not tmpCrs.MoveNext() then begin raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); end; - prmTypeName := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeValue; - prmTypeType := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeName; + prmTypeName := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeValue; + prmTypeType := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeName; if IsStrEmpty(prmName) or IsStrEmpty(prmTypeName) or IsStrEmpty(prmTypeType) then begin raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); end; @@ -534,7 +540,7 @@ function TWsdlParser.ParseOperation( prmInternameName := '_' + prmInternameName; end; prmHasInternameName := not AnsiSameText(prmInternameName,prmName); - prmTypeDef := GetDataType(prmTypeName,prmTypeType); + prmTypeDef := GetDataType(prmTypeName,prmTypeType,ExtractTypeHint(tmpNode)); prmDef := TPasArgument(SymbolTable.CreateElement(TPasArgument,prmInternameName,tmpMthdType,visDefault,'',0)); tmpMthdType.Args.Add(prmDef); prmDef.ArgType := prmTypeDef; @@ -610,7 +616,7 @@ function TWsdlParser.ParseOperation( prmDef := nil; crs.Reset(); while crs.MoveNext() do begin - tmpNode := (crs.GetCurrent() as TDOMNodeRttiExposer).InnerObject; + tmpNode := TDOMNodeRttiExposer(crs.GetCurrent()).InnerObject; if ( tmpNode.Attributes = nil ) or ( tmpNode.Attributes.Length < 1 ) then raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); strBuffer := s_NODE_NAME + '=' + QuotedStr(s_name); @@ -627,8 +633,8 @@ function TWsdlParser.ParseOperation( tmpCrs.Reset(); if not tmpCrs.MoveNext() then raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); - prmTypeName := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeValue; - prmTypeType := (tmpCrs.GetCurrent() as TDOMNodeRttiExposer).NodeName; + prmTypeName := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeValue; + prmTypeType := TDOMNodeRttiExposer(tmpCrs.GetCurrent()).NodeName; if IsStrEmpty(prmName) or IsStrEmpty(prmTypeName) or IsStrEmpty(prmTypeType) then raise EXsdInvalidDefinitionException.CreateFmt('Invalid message part : "%s"',[tmpNode.NodeName]); if SameText(s_document,ASoapBindingStyle) and @@ -650,7 +656,7 @@ function TWsdlParser.ParseOperation( if ( prmDef = nil ) then begin prmDef := TPasArgument(SymbolTable.CreateElement(TPasArgument,prmInternameName,tmpMthdType,visDefault,'',0)); tmpMthdType.Args.Add(prmDef); - prmDef.ArgType := GetDataType(prmTypeName,prmTypeType); + prmDef.ArgType := GetDataType(prmTypeName,prmTypeType,ExtractTypeHint(tmpNode)); prmDef.ArgType.AddRef(); prmDef.Access := argOut; if prmHasInternameName then begin @@ -662,7 +668,7 @@ function TWsdlParser.ParseOperation( end else begin prmInternameName := '_' + prmInternameName; prmDef := TPasArgument(SymbolTable.CreateElement(TPasArgument,prmInternameName,tmpMthdType,visDefault,'',0)); - prmDef.ArgType := GetDataType(prmTypeName,prmTypeType); + prmDef.ArgType := GetDataType(prmTypeName,prmTypeType,ExtractTypeHint(tmpNode)); prmDef.ArgType.AddRef(); prmDef.Access := argOut; tmpMthdType.Args.Add(prmDef); @@ -1110,7 +1116,7 @@ begin end; end; -function TWsdlParser.ParseType(const AName : string) : TPasType; +function TWsdlParser.ParseType(const AName : string; const AHint : string) : TPasType; var localName, spaceShort, spaceLong : string; locPrs : IXsdPaser; @@ -1119,7 +1125,11 @@ begin ExplodeQName(AName,localName,spaceShort); if ( FXSShortNames.IndexOf(spaceShort) >= 0 ) then begin xsdModule := SymbolTable.FindModule(s_xs); - Result := SymbolTable.FindElementInModule(localName,xsdModule) as TPasType; + Result := nil; + if not IsStrEmpty(AHint) then + Result := SymbolTable.FindElementInModule(AHint,xsdModule,[elkName]) as TPasType; + if ( Result = nil ) then + Result := SymbolTable.FindElementInModule(localName,xsdModule) as TPasType; if ( Result = nil ) then raise EXsdTypeNotFoundException.CreateFmt('Type not found : "%s".',[AName]); end else begin