From 0c38a497f9c60e9255188e6569b893da859947c3 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Fri, 18 Apr 2008 14:36:17 +0000 Subject: [PATCH] Merged last changes into trunk --- Units/DelphiXMLDataBindingGenerator.pas | 27 ++++- Units/DelphiXMLDataBindingResources.pas | 2 + Units/XMLDataBindingGenerator.pas | 149 ++++++++++++++++++------ X2XMLDataBindingCmdLine.dof | 19 +-- X2XMLDataBindingCmdLine.dpr | 5 +- 5 files changed, 143 insertions(+), 59 deletions(-) diff --git a/Units/DelphiXMLDataBindingGenerator.pas b/Units/DelphiXMLDataBindingGenerator.pas index 7fed9e0..0af3613 100644 --- a/Units/DelphiXMLDataBindingGenerator.pas +++ b/Units/DelphiXMLDataBindingGenerator.pas @@ -318,17 +318,36 @@ end; function TDelphiXMLDataBindingGenerator.DelphiSafeName(const AName: String): String; var + charIndex: Integer; wordIndex: Integer; begin Result := AName; - for wordIndex := Low(ReservedWords) to High(ReservedWords) do + + { Remove unsafe characters } + for charIndex := Length(Result) downto 1 do begin - if Result = ReservedWords[wordIndex] then - begin + if not (Result[charIndex] in SafeChars) then + Delete(Result, charIndex, 1); + end; + + + if Length(Result) > 0 then + begin + { Number as the first character is not allowed } + if Result[1] in ['0'..'9'] then Result := '_' + Result; - Break; + + + { Check for reserved words } + for wordIndex := Low(ReservedWords) to High(ReservedWords) do + begin + if Result = ReservedWords[wordIndex] then + begin + Result := '_' + Result; + Break; + end; end; end; end; diff --git a/Units/DelphiXMLDataBindingResources.pas b/Units/DelphiXMLDataBindingResources.pas index 71a90f3..8d2d252 100644 --- a/Units/DelphiXMLDataBindingResources.pas +++ b/Units/DelphiXMLDataBindingResources.pas @@ -158,6 +158,8 @@ const 'virtual', 'while', 'with', 'write', 'writeonly', 'xor' ); + SafeChars = ['A'..'Z', 'a'..'z', '0'..'9', '_', '-']; + type TTypeConversion = (tcNone, tcBoolean, tcFloat, tcDateTime); diff --git a/Units/XMLDataBindingGenerator.pas b/Units/XMLDataBindingGenerator.pas index f9d1f62..d22d6a0 100644 --- a/Units/XMLDataBindingGenerator.pas +++ b/Units/XMLDataBindingGenerator.pas @@ -19,7 +19,8 @@ type TXMLDataBindingOutputType = (otSingle, otMultiple); TXMLDataBindingItemType = (itInterface, itEnumeration, itEnumerationMember, - itProperty, itUnresolved, itAlias); + itProperty, itUnresolved, + itComplexTypeAlias, itSimpleTypeAlias); TXMLDataBindingInterfaceType = (ifElement, ifComplexType); TXMLDataBindingPropertyType = (ptSimple, ptItem); TXMLDataBindingOccurance = (boMinOccurs, boMaxOccurs); @@ -300,7 +301,7 @@ type end; - TXMLDataBindingAliasItem = class(TXMLDataBindingItem) + TXMLDataBindingComplexTypeAliasItem = class(TXMLDataBindingItem) private FItem: TXMLDataBindingItem; protected @@ -312,6 +313,16 @@ type end; + TXMLDataBindingSimpleTypeAliasItem = class(TXMLDataBindingItem) + private + FDataType: IXMLTypeDef; + protected + function GetItemType(): TXMLDataBindingItemType; override; + public + property DataType: IXMLTypeDef read FDataType write FDataType; + end; + + implementation uses SysUtils, @@ -587,7 +598,12 @@ begin for complexTypeIndex := 0 to Pred(schemaDef.ComplexTypes.Count) do begin complexType := schemaDef.ComplexTypes[complexTypeIndex]; + interfaceItem := TXMLDataBindingInterface.Create(Self, complexType, complexType.Name); + + if complexType.DerivationMethod <> dmNone then + interfaceItem.BaseName := complexType.BaseTypeName; + ASchema.AddItem(interfaceItem); for elementIndex := 0 to Pred(complexType.ElementDefs.Count) do @@ -664,7 +680,8 @@ var attributeIndex: Integer; enumerationObject: TXMLDataBindingEnumeration; interfaceObject: TXMLDataBindingInterface; - aliasItem: TXMLDataBindingAliasItem; + complexAliasItem: TXMLDataBindingComplexTypeAliasItem; + simpleAliasItem: TXMLDataBindingSimpleTypeAliasItem; begin Result := nil; @@ -682,25 +699,35 @@ begin end; end else begin - if (not AElement.DataType.IsAnonymous) and - AElement.DataType.IsComplex then + if not AElement.DataType.IsAnonymous then begin - { Find data type. If not found, mark as "resolve later". } - Result := FindInterface(ASchema, AElement.DataTypeName, ifComplexType); - - if not Assigned(Result) then + if AElement.DataType.IsComplex then begin - Result := TXMLDataBindingUnresolvedItem.Create(Self, AElement, AElement.DataTypeName, ifComplexType); - ASchema.AddItem(Result); - end; + { Find data type. If not found, mark as "resolve later". } + Result := FindInterface(ASchema, AElement.DataTypeName, ifComplexType); - if AElement.IsGlobal then + if not Assigned(Result) then + begin + Result := TXMLDataBindingUnresolvedItem.Create(Self, AElement, AElement.DataTypeName, ifComplexType); + ASchema.AddItem(Result); + end; + + if AElement.IsGlobal then + begin + { The element is global, but only references a complex type. Keep track + to properly resolve references to the element. } + complexAliasItem := TXMLDataBindingComplexTypeAliasItem.Create(Self, AElement, AElement.Name); + complexAliasItem.Item := Result; + ASchema.AddItem(complexAliasItem); + end; + end else if AElement.IsGlobal then begin - { The element is global, but only references a complex type. Keep track - to properly resolve references to the element. } - aliasItem := TXMLDataBindingAliasItem.Create(Self, AElement, AElement.Name); - aliasItem.Item := Result; - ASchema.AddItem(aliasItem); + { The element is global, but only references a simple type. } + simpleAliasItem := TXMLDataBindingSimpleTypeAliasItem.Create(Self, AElement, AElement.Name); + simpleAliasItem.DataType := AElement.DataType; + ASchema.AddItem(simpleAliasItem); + + Result := simpleAliasItem; end; end; @@ -840,7 +867,8 @@ begin itInterface: AAbort := (TXMLDataBindingInterface(AItem).InterfaceType = findInfo^.InterfaceType); - itAlias: + itComplexTypeAlias, + itSimpleTypeAlias: AAbort := (findInfo^.InterfaceType = ifElement); end; end; @@ -912,20 +940,36 @@ end; procedure TXMLDataBindingGenerator.ResolveAlias(ASchema: TXMLDataBindingSchema); var - itemIndex: Integer; - item: TXMLDataBindingItem; - aliasItem: TXMLDataBindingAliasItem; - + itemIndex: Integer; + item: TXMLDataBindingItem; + complexAliasItem: TXMLDataBindingComplexTypeAliasItem; + simpleAliasItem: TXMLDataBindingSimpleTypeAliasItem; + begin for itemIndex := Pred(ASchema.ItemCount) downto 0 do begin item := ASchema.Items[itemIndex]; - if item.ItemType = itAlias then - begin - aliasItem := TXMLDataBindingAliasItem(item); - if Assigned(aliasItem.Item) then - ReplaceItem(aliasItem, aliasItem.Item); + case item.ItemType of + itComplexTypeAlias: + begin + { Replace alias element with the actual complex type } + complexAliasItem := TXMLDataBindingComplexTypeAliasItem(item); + if Assigned(complexAliasItem.Item) then + begin + ReplaceItem(complexAliasItem, complexAliasItem.Item); + FreeAndNil(complexAliasItem); + end; + end; + + itSimpleTypeAlias: + begin + { Remove the alias element - TXMLDataBindingInterfaceItem.ReplaceItem + will take care of fixing it's properties. } + simpleAliasItem := TXMLDataBindingSimpleTypeAliasItem(item); + ReplaceItem(simpleAliasItem, nil); + FreeAndNil(simpleAliasItem); + end; end; end; end; @@ -1371,13 +1415,43 @@ end; procedure TXMLDataBindingInterface.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); var - propertyIndex: Integer; + propertyIndex: Integer; + propertyItem: TXMLDataBindingProperty; + itemProperty: TXMLDataBindingItemProperty; + simpleProperty: TXMLDataBindingSimpleProperty; begin inherited; for propertyIndex := Pred(PropertyCount) downto 0 do - Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem); + begin + propertyItem := Properties[propertyIndex]; + + if propertyItem = AOldItem then + FProperties.Extract(AOldItem) + else + begin + if (AOldItem.ItemType = itSimpleTypeAlias) and + (propertyItem.PropertyType = ptItem) then + begin + itemProperty := TXMLDataBindingItemProperty(propertyItem); + + if itemProperty.Item = AOldItem then + begin + { Replace item property with simple property } + simpleProperty := TXMLDataBindingSimpleProperty.Create(Owner, + itemProperty.SchemaItem, + itemProperty.Name, + TXMLDataBindingSimpleTypeAliasItem(AOldItem).DataType); + + { FProperties owns itemProperty and will free it } + FProperties[propertyIndex] := simpleProperty; + end else + Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem); + end else + Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem); + end; + end; end; @@ -1535,8 +1609,8 @@ begin end; -{ TXMLDataBindingAliasItem } -procedure TXMLDataBindingAliasItem.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +{ TXMLDataBindingComplexTypeAliasItem } +procedure TXMLDataBindingComplexTypeAliasItem.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); begin inherited; @@ -1545,9 +1619,16 @@ begin end; -function TXMLDataBindingAliasItem.GetItemType(): TXMLDataBindingItemType; +function TXMLDataBindingComplexTypeAliasItem.GetItemType(): TXMLDataBindingItemType; begin - Result := itAlias; + Result := itComplexTypeAlias; +end; + + +{ TXMLDataBindingSimpleTypeAliasItem } +function TXMLDataBindingSimpleTypeAliasItem.GetItemType: TXMLDataBindingItemType; +begin + Result := itSimpleTypeAlias; end; end. diff --git a/X2XMLDataBindingCmdLine.dof b/X2XMLDataBindingCmdLine.dof index 95cee4e..8d20dea 100644 --- a/X2XMLDataBindingCmdLine.dof +++ b/X2XMLDataBindingCmdLine.dof @@ -100,7 +100,7 @@ Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] -RunParams="P:\xtx\xtx\xsd\Offerte.xsd" "P:\xtx\xtx\xsd\" +RunParams="Z:\SAM\Mitsubishi\Copernica\Koppelingbeschijving.xsd" "C:\Temp\Koppelingbeschrijving.pas" HostApplication= Launcher= UseLauncher=0 @@ -139,21 +139,6 @@ C:\Program Files\Borland\Indy\D7\dclIndy70.bpl=Internet Direct (Indy) for D7 Pro [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -[HistoryLists\hlSearchPath] -Count=3 -Item0=P:\xtx\xtx\xsd -Item1=..\.. -Item2=F:\Development\VDarts\Packages [HistoryLists\hlUnitOutputDirectory] -Count=6 +Count=1 Item0=Lib -Item1=P:\Algemeen\lib -Item2=..\..\Lib\D7 -Item3=..\..\Dcu -Item4=..\..\..\Dcu -Item5=Dcu -[HistoryLists\hlBPLOutput] -Count=3 -Item0=..\..\Lib\D7 -Item1=Lib\D7 -Item2=..\Lib\D7 diff --git a/X2XMLDataBindingCmdLine.dpr b/X2XMLDataBindingCmdLine.dpr index 1489b81..d9434a4 100644 --- a/X2XMLDataBindingCmdLine.dpr +++ b/X2XMLDataBindingCmdLine.dpr @@ -6,10 +6,7 @@ uses DelphiXMLDataBindingGenerator in 'Units\DelphiXMLDataBindingGenerator.pas', XMLDataBindingGenerator in 'Units\XMLDataBindingGenerator.pas', XMLDataBindingHelpers in 'Units\XMLDataBindingHelpers.pas', - DelphiXMLDataBindingResources in 'Units\DelphiXMLDataBindingResources.pas', - xml_ExternalLeadFeed in '..\xml_ExternalLeadFeed.pas', - xml_Offerte in '..\..\xtx\xtx\xsd\xml_Offerte.pas'; - + DelphiXMLDataBindingResources in 'Units\DelphiXMLDataBindingResources.pas'; begin CoInitialize(nil);