diff --git a/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node.wsdl b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node.wsdl new file mode 100644 index 000000000..7e586b0b1 --- /dev/null +++ b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node.wsdl @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node_2.wsdl b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node_2.wsdl new file mode 100644 index 000000000..d639461ac --- /dev/null +++ b/wst/trunk/tests/test_suite/files/xsd_not_declared_at_top_node_2.wsdl @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wst/trunk/tests/test_suite/test_parsers.pas b/wst/trunk/tests/test_suite/test_parsers.pas index b23970127..0c3126f6b 100644 --- a/wst/trunk/tests/test_suite/test_parsers.pas +++ b/wst/trunk/tests/test_suite/test_parsers.pas @@ -157,6 +157,8 @@ type procedure signature_last(); procedure signature_result(); procedure signature_return(); + procedure xsd_not_declared_at_top_node(); + procedure xsd_not_declared_at_top_node_2(); end; implementation @@ -1573,7 +1575,7 @@ begin Result := ParseDoc(x_complexType_class_properties_extended_metadata); end; -function TTest_XsdParser.LoadComplexType_Class_properties_extended_metadata2: TwstPasTreeContainer; +function TTest_XsdParser.LoadComplexType_Class_properties_extended_metadata2(): TwstPasTreeContainer; begin Result := ParseDoc(x_complexType_class_properties_extended_metadata + '_2'); end; @@ -1926,6 +1928,16 @@ begin end; end; +procedure TTest_WsdlParser.xsd_not_declared_at_top_node(); +begin + ParseDoc('xsd_not_declared_at_top_node').Free(); +end; + +procedure TTest_WsdlParser.xsd_not_declared_at_top_node_2(); +begin + ParseDoc('xsd_not_declared_at_top_node_2').Free(); +end; + function TTest_WsdlParser.LoadComplexType_Class_default_values() : TwstPasTreeContainer; begin Result := ParseDoc(x_complexType_class_default); @@ -1936,7 +1948,7 @@ begin Result := ParseDoc(x_complexType_class_properties_extended_metadata); end; -function TTest_WsdlParser.LoadComplexType_Class_properties_extended_metadata2: TwstPasTreeContainer; +function TTest_WsdlParser.LoadComplexType_Class_properties_extended_metadata2(): TwstPasTreeContainer; begin Result := ParseDoc(x_complexType_class_properties_extended_metadata + '_2'); end; 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 6e5821490..cc270e7c5 100644 --- a/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi +++ b/wst/trunk/tests/test_suite/wst_test_suite_gui.lpi @@ -1,12 +1,12 @@ - + - + @@ -14,13 +14,14 @@ + - + @@ -96,12 +97,12 @@ - + - + @@ -129,9 +130,10 @@ + - - + + diff --git a/wst/trunk/ws_helper/parserutils.pas b/wst/trunk/ws_helper/parserutils.pas index ecca5615a..5357d561f 100644 --- a/wst/trunk/ws_helper/parserutils.pas +++ b/wst/trunk/ws_helper/parserutils.pas @@ -33,6 +33,20 @@ type const sNEW_LINE = sLineBreak; +type + + { TQualifiedNameObjectFilter } + + TQualifiedNameObjectFilter = class(TInterfacedObject,IObjectFilter) + private + FNameSpace : string; + FName : string; + protected + function Evaluate(const AObject : TObject) : Boolean; + public + constructor Create(const AName,ANameSpace : string); + end; + function IsStrEmpty(Const AStr : String):Boolean; function ExtractIdentifier(const AValue : string) : string ; {$IFDEF WST_HANDLE_DOC} @@ -430,4 +444,45 @@ begin end; +{ TQualifiedNameObjectFilter } + +function TQualifiedNameObjectFilter.Evaluate(const AObject: TObject): Boolean; +var + locObj : TDOMNodeRttiExposer; + startPos, i : PtrInt; + shortNameSpace : string; + locContinue : Boolean; + tmpNode : TDOMNode; +begin + Result := False; + if ( AObject <> nil ) then begin + locObj := TDOMNodeRttiExposer(AObject); + i := Length(FName); + startPos := ( Length(locObj.NodeName) - i + 1 ); + if ( startPos > 0 ) and ( FName = Copy(locObj.NodeName,startPos,i) ) then begin + if ( startPos = 1 ) then begin + shortNameSpace := 'xmlns'; + locContinue := True; + end else begin + locContinue := ( startPos > 2 ) and ( locObj.NodeName[startPos-1] = ':' ); + if locContinue then + shortNameSpace := 'xmlns:' + Copy(locObj.NodeName,1,( startPos - 2 )); + end; + if locContinue then begin + if ( locObj.InnerObject.Attributes <> nil ) then begin + tmpNode := locObj.InnerObject.Attributes.GetNamedItem(shortNameSpace); + if ( tmpNode <> nil ) and ( tmpNode.NodeValue = FNameSpace ) then + Result := True; + end; + end; + end; + end; +end; + +constructor TQualifiedNameObjectFilter.Create(const AName, ANameSpace: string); +begin + FName := AName; + FNameSpace := ANameSpace;; +end; + end. diff --git a/wst/trunk/ws_helper/ws_parser_imp.pas b/wst/trunk/ws_helper/ws_parser_imp.pas index 0aa13c9d3..832b188be 100644 --- a/wst/trunk/ws_helper/ws_parser_imp.pas +++ b/wst/trunk/ws_helper/ws_parser_imp.pas @@ -19,7 +19,7 @@ uses {$IFNDEF FPC}xmldom, wst_delphi_xml{$ELSE}DOM, wst_fpc_xml{$ENDIF}, cursor_intf, rtti_filters, pastree, pascal_parser_intf, logger_intf, - xsd_parser; + xsd_parser, wst_types; type diff --git a/wst/trunk/ws_helper/wsdl_parser.pas b/wst/trunk/ws_helper/wsdl_parser.pas index b9352c8d5..9d6a299a4 100644 --- a/wst/trunk/ws_helper/wsdl_parser.pas +++ b/wst/trunk/ws_helper/wsdl_parser.pas @@ -1229,8 +1229,16 @@ begin FSchemaCursor.Reset(); FSchemaCursor := CreateCursorOn( FSchemaCursor, - ParseFilter(CreateQualifiedNameFilterStr(s_schema,FXSShortNames),TDOMNodeRttiExposer) + TAggregatedFilter.Create( + ParseFilter(CreateQualifiedNameFilterStr(s_schema,FXSShortNames),TDOMNodeRttiExposer), + TQualifiedNameObjectFilter.Create(s_schema,s_xs), + fcOr + ) ); + { FSchemaCursor := CreateCursorOn( + FSchemaCursor, + ParseFilter(CreateQualifiedNameFilterStr(s_schema,FXSShortNames),TDOMNodeRttiExposer) + );} FSchemaCursor.Reset(); if FSchemaCursor.MoveNext() then begin FSchemaCursor.Reset();