diff --git a/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi b/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi index 0615fbd2c..3aef07520 100644 --- a/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi +++ b/wst/trunk/type_lib_edtr/typ_lib_edtr.lpi @@ -123,6 +123,7 @@ + @@ -135,6 +136,7 @@ + @@ -164,6 +166,7 @@ + @@ -171,6 +174,7 @@ + @@ -178,6 +182,7 @@ + diff --git a/wst/trunk/type_lib_edtr/uwsttypelibraryedit.lfm b/wst/trunk/type_lib_edtr/uwsttypelibraryedit.lfm index 2f6f28fbc..fbaa4e39e 100644 --- a/wst/trunk/type_lib_edtr/uwsttypelibraryedit.lfm +++ b/wst/trunk/type_lib_edtr/uwsttypelibraryedit.lfm @@ -12,7 +12,7 @@ object fWstTypeLibraryEdit: TfWstTypeLibraryEdit OnDropFiles = FormDropFiles OnShow = FormShow Position = poDesktopCenter - LCLVersion = '1.2.2.0' + LCLVersion = '1.2.5.0' object SB: TStatusBar Left = 0 Height = 20 diff --git a/wst/trunk/type_lib_edtr/uwsttypelibraryedit.pas b/wst/trunk/type_lib_edtr/uwsttypelibraryedit.pas index a12a18b37..75d2d99cf 100644 --- a/wst/trunk/type_lib_edtr/uwsttypelibraryedit.pas +++ b/wst/trunk/type_lib_edtr/uwsttypelibraryedit.pas @@ -306,6 +306,7 @@ begin end; Result := TwstPasTreeContainer.Create(); try + Result.CaseSensitive := False; // Pascal is Case Insensitive ! DoNotify(mtInfo,Format('Parsing file %s ...',[AFileName])); CreateWstInterfaceSymbolTable(Result); ParseSource(Result,AFileName,s_ostype,''); @@ -535,7 +536,8 @@ end; procedure GenerateWSDL_ToStream( ASymbol : TwstPasTreeContainer; ADest : TStream; - const ADestPath : string + const ADestPath : string; + const ANotifier : TOnParserMessage ); var g : IGenerator; @@ -547,6 +549,8 @@ begin g := TWsdlGenerator.Create(doc); locLocator := TFileDocumentLocator.Create(IncludeTrailingPathDelimiter(ADestPath)); g.SetDocumentLocator(locLocator); + if Assigned(ANotifier) then + g.SetNotificationHandler(ANotifier); g.Execute(ASymbol,ASymbol.CurrentModule.Name); WriteXML(doc,ADest); finally @@ -557,7 +561,8 @@ end; procedure GenerateXSD_ToStream( ASymbol : TwstPasTreeContainer; ADest : TStream; - const ADestPath : string + const ADestPath : string; + const ANotifier : TOnParserMessage ); var g : IGenerator; @@ -569,6 +574,8 @@ begin g := TXsdGenerator.Create(doc); locLocator := TFileDocumentLocator.Create(IncludeLeadingPathDelimiter(ADestPath)); g.SetDocumentLocator(locLocator); + if Assigned(ANotifier) then + g.SetNotificationHandler(ANotifier); g.Execute(ASymbol,ASymbol.CurrentModule.Name); WriteXML(doc,ADest); finally @@ -1234,7 +1241,9 @@ var begin mstrm := TMemoryStream.Create(); try - GenerateWSDL_ToStream(FSymbolTable,mstrm,ExtractFilePath(FCurrentFileName)); + GenerateWSDL_ToStream( + FSymbolTable,mstrm,ExtractFilePath(FCurrentFileName),@ShowStatusMessage + ); mstrm.Position := 0; srcWSDL.Lines.LoadFromStream(mstrm); finally @@ -1380,9 +1389,9 @@ begin mstrm := TMemoryStream.Create(); try if SameText('.xsd',ExtractFileExt(AFileName)) then - GenerateXSD_ToStream(FSymbolTable,mstrm,ExtractFilePath(FCurrentFileName)) + GenerateXSD_ToStream(FSymbolTable,mstrm,ExtractFilePath(FCurrentFileName),@ShowStatusMessage) else - GenerateWSDL_ToStream(FSymbolTable,mstrm,ExtractFilePath(FCurrentFileName)); + GenerateWSDL_ToStream(FSymbolTable,mstrm,ExtractFilePath(FCurrentFileName),@ShowStatusMessage); mstrm.SaveToFile(AFileName); finally FreeAndNil(mstrm); diff --git a/wst/trunk/ws_helper/logger_intf.pas b/wst/trunk/ws_helper/logger_intf.pas index 16853f30e..2b6d6f726 100644 --- a/wst/trunk/ws_helper/logger_intf.pas +++ b/wst/trunk/ws_helper/logger_intf.pas @@ -20,13 +20,17 @@ uses type - TMessageType = ( mtInfo, mtError ); + TMessageType = ( mtInfo, mtWarning, mtError ); const - MessageTypeNames : array[TMessageType] of string = ( 'Information', 'Error' ); + MessageTypeNames : array[TMessageType] of string = ( + 'Information', 'Warning', 'Error' + ); type + TOnLogMessageEvent = procedure (const AMsgType : TMessageType; const AMsg : string) of object; + ILogger = interface ['{158C90B5-BAC3-40A1-B471-C9327692A3BF}'] procedure Log(const AMsgType : TMessageType; const AMsg : string);overload; diff --git a/wst/trunk/ws_helper/wsdl_generator.pas b/wst/trunk/ws_helper/wsdl_generator.pas index c38e684c2..a8e8f37bf 100644 --- a/wst/trunk/ws_helper/wsdl_generator.pas +++ b/wst/trunk/ws_helper/wsdl_generator.pas @@ -18,7 +18,7 @@ interface uses Classes, SysUtils, TypInfo, {$IFNDEF FPC}xmldom, wst_delphi_xml{$ELSE}DOM{$ENDIF}, - pastree, pascal_parser_intf, xsd_generator, locators; + pastree, pascal_parser_intf, xsd_generator, locators, logger_intf; type @@ -43,6 +43,7 @@ type FTypesNode : TDOMElement; FDefinitionsNode : TDOMElement; FDocumentLocator : IDocumentLocator; + FMessageHandler : TOnLogMessageEvent; private procedure GenerateTypes(ASymTable : TwstPasTreeContainer; AModule : TPasModule); procedure GenerateServiceMessages( @@ -70,6 +71,8 @@ type ARootNode : TDOMElement ); protected + function GetNotificationHandler() : TOnLogMessageEvent; + procedure SetNotificationHandler(const AValue : TOnLogMessageEvent); procedure Prepare(ASymTable : TwstPasTreeContainer; AModule : TPasModule); function GetDocumentLocator() : IDocumentLocator; procedure SetDocumentLocator(ALocator : IDocumentLocator); @@ -174,6 +177,8 @@ begin locLocator := GetDocumentLocator(); if (locLocator <> nil) then g.SetDocumentLocator(locLocator); + if not Assigned(g.GetNotificationHandler()) then + g.SetNotificationHandler(Self.GetNotificationHandler()); for i := 0 to Pred(mdlLs.Count) do begin mdl := TPasModule(mdlLs[i]); if (mdl <> AModule) then begin @@ -448,6 +453,16 @@ begin soapAdrNode.SetAttribute(s_location,ABinding.Address); end; +function TWsdlGenerator.GetNotificationHandler: TOnLogMessageEvent; +begin + Result := FMessageHandler; +end; + +procedure TWsdlGenerator.SetNotificationHandler(const AValue: TOnLogMessageEvent); +begin + FMessageHandler := AValue; +end; + procedure TWsdlGenerator.Prepare(ASymTable : TwstPasTreeContainer; AModule : TPasModule); function CreateRootNode():TDOMElement; diff --git a/wst/trunk/ws_helper/xsd_generator.pas b/wst/trunk/ws_helper/xsd_generator.pas index 205ce448b..3cbd3fb6a 100644 --- a/wst/trunk/ws_helper/xsd_generator.pas +++ b/wst/trunk/ws_helper/xsd_generator.pas @@ -18,7 +18,7 @@ interface uses Classes, SysUtils, TypInfo, {$IFNDEF FPC}xmldom, wst_delphi_xml{$ELSE}DOM, wst_fpc_xml{$ENDIF}, - pastree, pascal_parser_intf, locators; + pastree, pascal_parser_intf, locators, logger_intf; type @@ -37,6 +37,8 @@ type ); function GetDocumentLocator() : IDocumentLocator; procedure SetDocumentLocator(ALocator : IDocumentLocator); + function GetNotificationHandler() : TOnLogMessageEvent; + procedure SetNotificationHandler(const AValue : TOnLogMessageEvent); end; IXsdGenerator = interface(IGenerator) @@ -91,11 +93,13 @@ type FOptions: TGeneratorOptions; FShortNames : TStrings; FDocumentLocator : IDocumentLocator; + FMessageHandler : TOnLogMessageEvent; protected procedure GenerateImports( ASymTable : TwstPasTreeContainer; AModule : TPasModule ); + procedure NotifyMessage(const AMsgType : TMessageType; const AMsg : string); protected function GetSchemaNode(ADocument : TDOMDocument) : TDOMNode;virtual;abstract; procedure SetPreferedShortNames(const ALongName, AShortName : string); @@ -106,6 +110,8 @@ type ASymTable : TwstPasTreeContainer; AModuleName : string ); + function GetNotificationHandler() : TOnLogMessageEvent; + procedure SetNotificationHandler(const AValue : TOnLogMessageEvent); procedure Prepare( ASymTable : TwstPasTreeContainer; @@ -139,6 +145,7 @@ type FOwner : Pointer; FRegistry : IXsdTypeHandlerRegistry; protected + procedure NotifyMessage(const AMsgType : TMessageType; const AMsg : string); procedure Generate( AContainer : TwstPasTreeContainer; const ASymbol : TPasElement; @@ -166,6 +173,9 @@ type function GetXsdTypeHandlerRegistry():IXsdTypeHandlerRegistry; function CreateElement(const ANodeName : DOMString; AParent : TDOMNode; ADoc : TDOMDocument):TDOMElement;{$IFDEF USE_INLINE}inline;{$ENDIF} +resourcestring + SERR_SimpleTypeCannotHaveNotAttributeProp = 'Invalid type definition, a simple type cannot have "not attribute" properties : "%s.%s". Correction to Attribute done.'; + implementation uses xsd_consts, Contnrs, StrUtils, wst_types, parserutils; @@ -644,6 +654,18 @@ end; { TBaseTypeHandler } +procedure TBaseTypeHandler.NotifyMessage( + const AMsgType : TMessageType; + const AMsg : string +); +var + locEventHandler : TOnLogMessageEvent; +begin + locEventHandler := GetOwner().GetNotificationHandler(); + if Assigned(locEventHandler) then + locEventHandler(AMsgType,AMsg); +end; + function TBaseTypeHandler.GetOwner(): IXsdGenerator; begin Result := IXsdGenerator(FOwner); @@ -760,8 +782,11 @@ begin {$ENDIF WST_HANDLE_DOC} trueDestType := typItm.DestType; - if trueDestType.InheritsFrom(TPasUnresolvedTypeRef) then + if trueDestType.InheritsFrom(TPasUnresolvedTypeRef) then begin trueDestType := AContainer.FindElement(AContainer.GetExternalName(typItm.DestType)) as TPasType; + if (trueDestType = nil) then + trueDestType := typItm.DestType; + end; baseUnitExternalName := GetTypeNameSpace(AContainer,trueDestType); s := GetNameSpaceShortName(baseUnitExternalName,defSchemaNode,GetOwner().GetPreferedShortNames()); s := Format('%s:%s',[s,AContainer.GetExternalName(trueDestType)]); @@ -857,9 +882,16 @@ procedure TClassTypeDefinition_TypeHandler.Generate( p := TPasProperty(AClassType.Members[k]); if not AContainer.IsAttributeProperty(p) then begin if ( ACategory = tcSimpleContent ) then begin - raise EXsdGeneratorException.CreateFmt('Invalid type definition, a simple type cannot have "not attribute" properties : "%s"',[AContainer.GetExternalName(AClassType)]); + AContainer.SetPropertyAsAttribute(p,True); + NotifyMessage( + mtWarning, + Format( + SERR_SimpleTypeCannotHaveNotAttributeProp, + [AContainer.GetExternalName(AClassType),AContainer.GetExternalName(p)]) + ); + end else begin; + Result := True; end; - Result := True; end; end; end; @@ -970,7 +1002,8 @@ var begin p := AProp; if AnsiSameText(sWST_PROP_STORE_PREFIX,Copy(p.StoredAccessorName,1,Length(sWST_PROP_STORE_PREFIX))) or - AnsiSameText('True',p.StoredAccessorName) + AnsiSameText('True',p.StoredAccessorName) or + (p.StoredAccessorName = '') then begin if AContainer.IsAttributeProperty(p) then begin s := Format('%s:%s',[s_xs_short,s_attribute]); @@ -1371,6 +1404,16 @@ begin end; end; +function TCustomXsdGenerator.GetNotificationHandler: TOnLogMessageEvent; +begin + Result := FMessageHandler; +end; + +procedure TCustomXsdGenerator.SetNotificationHandler(const AValue: TOnLogMessageEvent); +begin + FMessageHandler := AValue; +end; + procedure TCustomXsdGenerator.Prepare(ASymTable : TwstPasTreeContainer; AModule : TPasModule); begin @@ -1440,6 +1483,19 @@ begin end; end; +procedure TCustomXsdGenerator.NotifyMessage( + const AMsgType : TMessageType; + const AMsg : string +); +begin + if Assigned(FMessageHandler) then begin + FMessageHandler(AMsgType,AMsg); + end else if IsConsole then begin + if HasLogger() then + GetLogger().Log(AMsgType, AMsg); + end; +end; + procedure TCustomXsdGenerator.SetPreferedShortNames(const ALongName, AShortName: string); begin FShortNames.Values[ALongName] := AShortName; diff --git a/wst/trunk/ws_helper/xsd_parser.pas b/wst/trunk/ws_helper/xsd_parser.pas index a403fc954..7092276bb 100644 --- a/wst/trunk/ws_helper/xsd_parser.pas +++ b/wst/trunk/ws_helper/xsd_parser.pas @@ -40,7 +40,7 @@ type EXsdInvalidElementDefinitionException = class(EXsdInvalidDefinitionException) end; - TOnParserMessage = procedure (const AMsgType : TMessageType; const AMsg : string) of object; + TOnParserMessage = TOnLogMessageEvent; IDocumentLocator = locators.IDocumentLocator;