Fixed: support for global elements of a complex type

This commit is contained in:
Mark van Renswoude 2008-03-31 21:15:13 +00:00
parent 107589b839
commit dba905ace4
4 changed files with 136 additions and 29 deletions

View File

@ -783,8 +783,8 @@ begin
end;
ptItem:
begin
dataTypeName := PrefixInterface + AItem.CollectionItem.TranslatedName;
dataClassName := PrefixClass + AItem.CollectionItem.TranslatedName;
dataTypeName := PrefixInterface + AItem.CollectionItemTranslatedName;
dataClassName := PrefixClass + AItem.CollectionItemTranslatedName;
dataIntfName := dataTypeName;
end;
end;
@ -886,7 +886,7 @@ begin
end;
AStream.Write(sourceCode.Format(['Name', AItem.TranslatedName,
'ItemName', AItem.CollectionItem.TranslatedName,
'ItemName', AItem.CollectionItemTranslatedName,
'ItemSourceName', AItem.CollectionItem.Name,
'DataType', dataTypeName,
'DataClass', dataClassName,

View File

@ -21,7 +21,8 @@ type
TXMLDataBindingOutputType = (otSingle, otMultiple);
TXMLDataBindingItemType = (itInterface, itCollection, itEnumeration,
itEnumerationMember, itProperty, itForward);
itEnumerationMember, itProperty, itForward,
itComplexTypeElement);
TXMLDataBindingInterfaceType = (ifElement, ifComplexType);
TXMLDataBindingPropertyType = (ptSimple, ptItem);
@ -37,6 +38,7 @@ type
FSourceFileName: String;
FSchemas: TObjectList;
FMustResolve: Boolean;
function GetSchemaCount(): Integer;
function GetSchemas(Index: Integer): TXMLDataBindingSchema;
@ -179,11 +181,16 @@ type
private
FCollectionItem: TXMLDataBindingProperty;
function GetActualCollectionItem(): TXMLDataBindingItem;
function GetCollectionItemName(): String;
function GetCollectionItemTranslatedName(): String;
procedure SetCollectionItem(const Value: TXMLDataBindingProperty);
protected
function GetItemType(): TXMLDataBindingItemType; override;
public
property CollectionItem: TXMLDataBindingProperty read FCollectionItem;
property CollectionItem: TXMLDataBindingProperty read FCollectionItem;
property CollectionItemName: String read GetCollectionItemName;
property CollectionItemTranslatedName: String read GetCollectionItemTranslatedName;
end;
@ -275,12 +282,23 @@ type
end;
TXMLDataBindingComplexTypeElementItem = class(TXMLDataBindingItem)
private
FItem: TXMLDataBindingItem;
protected
function GetItemType(): TXMLDataBindingItemType; override;
public
property Item: TXMLDataBindingItem read FItem write FItem;
end;
implementation
uses
SysUtils,
Windows,
XMLDoc,
XMLIntf,
XMLSchemaTags,
X2UtHashes;
@ -300,6 +318,25 @@ begin
end;
function GetActualItem(AItem: TXMLDataBindingItem): TXMLDataBindingItem;
begin
Result := AItem;
while Assigned(Result) do
begin
case Result.ItemType of
itForward:
Result := TXMLDataBindingForwardItem(Result).Item;
itComplexTypeElement:
Result := TXMLDataBindingComplexTypeElementItem(Result).Item;
else
break;
end;
end;
end;
{ TXMLDataBindingGenerator }
constructor TXMLDataBindingGenerator.Create();
begin
@ -340,11 +377,16 @@ begin
GenerateSchemaObjects(Schemas[schemaIndex], (schemaIndex = 0));
{ Process unresolved references }
{ Process unresolved references
- some references can't be resolved the first time (especially
ComplexTypeElement references). Fix this workaround some time. }
for schemaIndex := 0 to Pred(SchemaCount) do
ResolveSchema(Schemas[schemaIndex]);
for schemaIndex := 0 to Pred(SchemaCount) do
ResolveSchema(Schemas[schemaIndex]);
{ Collapse collections }
@ -551,6 +593,7 @@ var
elementIndex: Integer;
enumerationObject: TXMLDataBindingEnumeration;
interfaceObject: TXMLDataBindingInterface;
complexTypeElement: TXMLDataBindingComplexTypeElementItem;
begin
Result := nil;
@ -569,16 +612,25 @@ begin
end else
begin
if (not AElement.DataType.IsAnonymous) and
(AElement.DataType.IsComplex) then
AElement.DataType.IsComplex then
begin
{ Find data type. If not found, mark as "resolve later". }
Result := FindInterface(ASchema, AElement.DataTypeName, ifComplexType);
Result := FindInterface(ASchema, AElement.DataTypeName, ifComplexType);
if not Assigned(Result) then
begin
Result := TXMLDataBindingForwardItem.Create(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. }
complexTypeElement := TXMLDataBindingComplexTypeElementItem.Create(AElement, AElement.Name);
complexTypeElement.Item := Result;
ASchema.AddItem(complexTypeElement);
end;
end;
if not Assigned(Result) then
@ -643,7 +695,7 @@ begin
{ Create intermediate object for collections }
if Assigned(propertyType) then
propertyItem := TXMLDataBindingItemProperty.Create(AElement,
AElement.Name,
propertyType.Name,
propertyType)
else
propertyItem := TXMLDataBindingSimpleProperty.Create(AElement,
@ -719,13 +771,23 @@ type
procedure TXMLDataBindingGenerator.FindInterfaceProc(AItem: TXMLDataBindingItem; AData: Pointer; var AAbort: Boolean);
var
findInfo: PFindInterfaceInfo;
findInfo: PFindInterfaceInfo;
begin
AAbort := False;
findInfo := PFindInterfaceInfo(AData);
AAbort := (AItem.ItemType = itInterface) and
(TXMLDataBindingInterface(AItem).InterfaceType = findInfo^.InterfaceType) and
(AItem.Name = findInfo^.Name);
if AItem.Name = findInfo^.Name then
begin
case AItem.ItemType of
itInterface:
AAbort := (TXMLDataBindingInterface(AItem).InterfaceType = findInfo^.InterfaceType);
itComplexTypeElement:
AAbort := (findInfo^.InterfaceType = ifElement);
end;
end;
end;
@ -736,7 +798,7 @@ var
begin
findInfo.InterfaceType := AType;
findInfo.Name := AName;
Result := TXMLDataBindingInterface(IterateSchemaItems(ASchema, FindInterfaceProc, @findInfo));
Result := TXMLDataBindingInterface(GetActualItem(IterateSchemaItems(ASchema, FindInterfaceProc, @findInfo)));
end;
@ -791,7 +853,8 @@ begin
{ Resolve base interface }
interfaceItem := TXMLDataBindingInterface(item);
if Length(interfaceItem.BaseName) > 0 then
if (not Assigned(interfaceItem.BaseItem)) and
(Length(interfaceItem.BaseName) > 0) then
interfaceItem.BaseItem := FindInterface(ASchema, interfaceItem.BaseName, ifComplexType);
end;
@ -813,14 +876,17 @@ begin
{ Resolve forwarded item }
forwardItem := TXMLDataBindingForwardItem(AItem);
referenceItem := FindInterface(ASchema, AItem.Name, forwardItem.InterfaceType);
if not Assigned(forwardItem.Item) then
begin
referenceItem := FindInterface(ASchema, AItem.Name, forwardItem.InterfaceType);
if (not Assigned(referenceItem)) and
(forwardItem.InterfaceType = ifElement) then
referenceItem := FindEnumeration(ASchema, AItem.Name);
if (not Assigned(referenceItem)) and
(forwardItem.InterfaceType = ifElement) then
referenceItem := FindEnumeration(ASchema, AItem.Name);
if Assigned(referenceItem) then
forwardItem.Item := referenceItem;
if Assigned(referenceItem) then
forwardItem.Item := referenceItem;
end;
end;
@ -1164,6 +1230,43 @@ begin
end;
function TXMLDataBindingCollection.GetActualCollectionItem(): TXMLDataBindingItem;
begin
Result := nil;
if Assigned(CollectionItem) then
begin
case CollectionItem.PropertyType of
ptSimple: Result := CollectionItem;
ptItem: Result := TXMLDataBindingItemProperty(CollectionItem).Item;
end;
end;
end;
function TXMLDataBindingCollection.GetCollectionItemName(): String;
var
item: TXMLDataBindingItem;
begin
Result := '';
item := GetActualCollectionItem();
if Assigned(item) then
Result := item.Name;
end;
function TXMLDataBindingCollection.GetCollectionItemTranslatedName(): String;
var
item: TXMLDataBindingItem;
begin
Result := '';
item := GetActualCollectionItem();
if Assigned(item) then
Result := item.Name;
end;
procedure TXMLDataBindingCollection.SetCollectionItem(const Value: TXMLDataBindingProperty);
begin
FCollectionItem := Value;
@ -1278,10 +1381,7 @@ end;
function TXMLDataBindingItemProperty.GetItem(): TXMLDataBindingItem;
begin
Result := FItem;
while Assigned(Result) and (Result.ItemType = itForward) do
Result := TXMLDataBindingForwardItem(Result).Item;
Result := GetActualItem(FItem);
end;
@ -1299,6 +1399,13 @@ begin
Result := itForward;
end;
{ TXMLDataBindingComplexTypeElementItem }
function TXMLDataBindingComplexTypeElementItem.GetItemType(): TXMLDataBindingItemType;
begin
Result := itComplexTypeElement;
end;
end.

View File

@ -130,7 +130,7 @@
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams">"F:\XTxXSD\Offerte.xsd" "F:\XTxXSD\Output\xml_Offerte.pas"</Parameters>
<Parameters Name="RunParams">"F:\XTxXSD\Ombouw.xsd" "F:\XTxXSD\Output\xml_Offerte.pas"</Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>

View File

@ -32,9 +32,9 @@
-M
-$M16384,1048576
-K$00400000
-N"Lib"
-LE"c:\program files\borland\delphi7\Projects\Bpl"
-LN"c:\program files\borland\delphi7\Projects\Bpl"
-N0"Lib"
-LE"C:\Documents and Settings\PsychoMark\My Documents\Borland Studio Projects\Bpl"
-LN"C:\Documents and Settings\PsychoMark\My Documents\Borland Studio Projects\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST