|
From: <sr...@us...> - 2007-01-15 21:55:07
|
Revision: 748
http://svn.sourceforge.net/instantobjects/revision/?rev=748&view=rev
Author: srmitch
Date: 2007-01-14 22:18:23 -0800 (Sun, 14 Jan 2007)
Log Message:
-----------
- Added modifications to IO to produce metadata information in XML file format at design-time and use it at run-time instead of the current, less portable, resource file approach. This modification also allows the IO model to be contained in a statically linked package.
- Unit tests have been modified to work with the XML run-time metadata format.
Modified Paths:
--------------
branches/MetadataInXMLDev/Source/Core/InstantCode.pas
branches/MetadataInXMLDev/Source/Core/InstantConsts.pas
branches/MetadataInXMLDev/Source/Core/InstantMetadata.pas
branches/MetadataInXMLDev/Source/Core/InstantPersistence.pas
branches/MetadataInXMLDev/Source/Core/InstantPresentation.pas
branches/MetadataInXMLDev/Source/Design/InstantModelExpert.pas
branches/MetadataInXMLDev/Tests/TestIO.dpr
branches/MetadataInXMLDev/Tests/TestInstantAttribute.pas
branches/MetadataInXMLDev/Tests/TestInstantBlob.pas
branches/MetadataInXMLDev/Tests/TestInstantBoolean.pas
branches/MetadataInXMLDev/Tests/TestInstantCache.pas
branches/MetadataInXMLDev/Tests/TestInstantCircularReferences.pas
branches/MetadataInXMLDev/Tests/TestInstantClassMetadata.pas
branches/MetadataInXMLDev/Tests/TestInstantComplex.pas
branches/MetadataInXMLDev/Tests/TestInstantCurrency.pas
branches/MetadataInXMLDev/Tests/TestInstantDate.pas
branches/MetadataInXMLDev/Tests/TestInstantDateTime.pas
branches/MetadataInXMLDev/Tests/TestInstantFloat.pas
branches/MetadataInXMLDev/Tests/TestInstantInteger.pas
branches/MetadataInXMLDev/Tests/TestInstantNumeric.pas
branches/MetadataInXMLDev/Tests/TestInstantObject.pas
branches/MetadataInXMLDev/Tests/TestInstantObjectReference.pas
branches/MetadataInXMLDev/Tests/TestInstantObjectStore.pas
branches/MetadataInXMLDev/Tests/TestInstantPart.pas
branches/MetadataInXMLDev/Tests/TestInstantParts.pas
branches/MetadataInXMLDev/Tests/TestInstantReference.pas
branches/MetadataInXMLDev/Tests/TestInstantReferences.pas
branches/MetadataInXMLDev/Tests/TestInstantScheme.pas
branches/MetadataInXMLDev/Tests/TestInstantString.pas
branches/MetadataInXMLDev/Tests/TestInstantTableMetadata.pas
branches/MetadataInXMLDev/Tests/TestInstantTime.pas
branches/MetadataInXMLDev/Tests/TestMockBroker.pas
branches/MetadataInXMLDev/Tests/TestMockConnector.pas
branches/MetadataInXMLDev/Tests/TestModel.pas
Added Paths:
-----------
branches/MetadataInXMLDev/Docs/Runtime Model Metadata In XML Files.txt
branches/MetadataInXMLDev/Tests/TestModel.irs
Removed Paths:
-------------
branches/MetadataInXMLDev/Tests/TestIO.mdr
Added: branches/MetadataInXMLDev/Docs/Runtime Model Metadata In XML Files.txt
===================================================================
--- branches/MetadataInXMLDev/Docs/Runtime Model Metadata In XML Files.txt (rev 0)
+++ branches/MetadataInXMLDev/Docs/Runtime Model Metadata In XML Files.txt 2007-01-15 06:18:23 UTC (rev 748)
@@ -0,0 +1,35 @@
+Runtime Model Metadata In XML Files
+===================================================
+Author: Steven Mitchell, 01/2007.
+
+Abstract
+--------
+A modification to IO to produce metadata information in XML file format at design-time and use it at run-time instead of the current, less portable, resource file approach. This modification also allows the IO model to be contained in a statically linked package. The possibility to extend this approach to allow (a) a model in dynamically linked packages or (b) to include extra metadata information has not been investigated at this time.
+
+Conversion of IO projects
+-------------------------
+Use the following procedure to convert IO projects that use the previous IO Windows Resource metadata system.
+
+1. Build the modified IO Core and Design packages. Install IO Design package.
+2. Open IO Application Project in IDE.
+3. Launch IO Model Explorer (IOME). Explorer dialog will be empty.
+4. In IOME select Model code units. If all goes well IOME should now show the class model for the project. The '{$R *.mdr} {<ModelUnitNameList>}' entry in the project file should have been removed and each model code unit should have additions as indicated in the following example:
+
+unit Model2;
+{IOMODEL} <-------------
+...
+initialization
+
+ InstantRegisterClasses([
+ TCompany,
+ TPerson
+ ]);
+
+ LoadMetadatas('Model2.irs'); <-------------
+
+end.
+
+5. Build or compile the Application. There should be a '<ModelUnitName>.irs' file produced for each model unit. These files contain the metadata information, in XML format, for each model unit. Note: The old '<ApplicationName>.mdr' file is no longer needed and can be deleted.
+
+6. Before running the Application ensure that the '*.irs' files are in the same folder as the Application's executable.
+
Property changes on: branches/MetadataInXMLDev/Docs/Runtime Model Metadata In XML Files.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: branches/MetadataInXMLDev/Source/Core/InstantCode.pas
===================================================================
--- branches/MetadataInXMLDev/Source/Core/InstantCode.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Source/Core/InstantCode.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -1305,6 +1305,7 @@
Scope: TInstantCodeScope = scInterface): TInstantCodeModule; overload;
function LoadModule(const Str: string; const FileName: string = '';
Scope: TInstantCodeScope = scInterface): TInstantCodeModule; overload;
+ procedure SaveToFile(const FileName: string);
procedure SaveToResFile(const FileName: string);
property ClassCount: Integer read GetClassCount;
property Classes[Index: Integer]: TInstantCodeClass read GetClasses;
@@ -1461,6 +1462,8 @@
procedure SkipText;
procedure UpdateClassForward(OldClass, NewClass: TInstantCodeClass);
procedure UpdateClassRegistration(OldClass, NewClass: TInstantCodeClass);
+ procedure UpdateLoadMetadatas(const FileName: string; Required: Boolean);
+ procedure UpdateModelUnitTag(const FileName: string; Required: Boolean);
procedure UpdateUnit;
property CursorPos: TInstantCodePos read GetCursorPos write SetCursorPos;
property InsertMode: TInstantCodeInsertMode read FInsertMode write FInsertMode;
@@ -7157,8 +7160,12 @@
begin
AClass := Classes[I];
with AClass do
+ begin
if (BaseClassName <> '') and not Assigned(BaseClass) then
BaseClass := FindClass(BaseClassName);
+ if Metadata.ParentName = '' then
+ Metadata.ParentName := BaseClassName;
+ end;
end;
end;
@@ -7251,6 +7258,11 @@
FTypes.Remove(AType);
end;
+procedure TInstantCodeProject.SaveToFile(const FileName: string);
+begin
+ Model.SaveToFile(FileName);
+end;
+
procedure TInstantCodeProject.SaveToResFile(const FileName: string);
begin
Model.SaveToResFile(FileName);
@@ -8818,6 +8830,92 @@
InsertText(RegistrationText);
end;
+procedure TInstantCodeModifier.UpdateLoadMetadatas(const FileName: string;
+ Required: Boolean);
+const
+ LoadMetadatasProcName = 'LoadMetadatas';
+
+ function LoadMetadatasText: string;
+ var
+ Stream: TInstantStringStream;
+ Writer: TInstantCodeWriter;
+ begin
+ Result := '';
+ Stream := TInstantStringStream.Create('');
+ Writer := TInstantCodeWriter.Create(Stream);
+ try
+ Writer.Indent;
+ Writer.Write(CRLF);
+ Writer.Write(LoadMetadatasProcName + '(''' + FileName + ''');' + CRLF);
+ Writer.Unindent;
+ Result := Stream.DataString;
+ finally
+ Writer.Free;
+ Stream.Free;
+ end;
+ end;
+
+var
+ Section: TInstantCodeInitializationSection;
+ Pos: TInstantCodePos;
+begin
+ Section := Module.InitializationSection;
+ if not Section.IsFiled then
+ begin
+ CursorPos := Module.ImplementationSection.EndPos;
+ InsertMode := imAfter;
+ InsertObjectText(Section);
+ end;
+ CursorPos := Section.StartPos;
+ SkipLine;
+ if FindText(LoadMetadatasProcName) then
+ begin
+ Pos := CursorPos;
+ Skip(';');
+ DeleteFrom(Pos);
+ CloseGap;
+ CloseGap;
+ end;
+ if Required then
+ begin
+ CursorPos := Section.EndPos;
+ MoveCursor(-Length(CRLF));
+ InsertText(LoadMetadatasText);
+ end;
+end;
+
+procedure TInstantCodeModifier.UpdateModelUnitTag(const FileName: string;
+ Required: Boolean);
+var
+ SavePos: TInstantCodePos;
+ SaveIgnoreComments: boolean;
+begin
+ if FindText(InstantUnitTag) then
+ begin
+ with FReader do
+ begin
+ SaveIgnoreComments := IgnoreComments;
+ IgnoreComments := False;
+ try
+ ReadNext(CRLF);
+ SavePos := Position;
+ if Readmatching(InstantModelUnitTag) then
+ begin
+ ReadNext(CRLF);
+ DeleteFrom(SavePos);
+ end
+ else
+ Position := SavePos;
+ finally
+ IgnoreComments := SaveIgnoreComments;
+ end;
+ end;
+
+ if Required then
+ InsertText(InstantModelUnitTag + CRLF);
+ end;
+end;
+
procedure TInstantCodeModifier.UpdateModule(Origin, Delta: TInstantCodePos;
Before: Boolean);
begin
Modified: branches/MetadataInXMLDev/Source/Core/InstantConsts.pas
===================================================================
--- branches/MetadataInXMLDev/Source/Core/InstantConsts.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Source/Core/InstantConsts.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -69,6 +69,9 @@
InstantSequenceNoFieldName = 'SequenceNo';
InstantChildClassFieldName = 'ChildClass';
+ InstantModelUnitTag = '{IOMODEL}';
+ InstantUnitTag = 'unit ';
+
{$IFNDEF D6+}
const
sLineBreak = #13#10;
Modified: branches/MetadataInXMLDev/Source/Core/InstantMetadata.pas
===================================================================
--- branches/MetadataInXMLDev/Source/Core/InstantMetadata.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Source/Core/InstantMetadata.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -576,14 +576,24 @@
{ TInstantClassMetadata }
procedure TInstantClassMetadata.Assign(Source: TPersistent);
+var
+ I: Integer;
+ AttributeMetadata: TInstantAttributeMetadata;
begin
inherited;
if Source is TInstantClassMetadata then
with TInstantClassMetadata(Source) do
begin
+ Self.FParentName := FParentName;
Self.FDefaultContainerName := FDefaultContainerName;
Self.FStorageName := FStorageName;
Self.FPersistence := FPersistence;
+ if Assigned(FAttributeMetadatas) then
+ for I := 0 to Pred(FAttributeMetadatas.Count) do
+ begin
+ AttributeMetadata := Self.AttributeMetadatas.Add;
+ AttributeMetadata.Assign(FAttributeMetadatas[I]);
+ end;
end;
end;
Modified: branches/MetadataInXMLDev/Source/Core/InstantPersistence.pas
===================================================================
--- branches/MetadataInXMLDev/Source/Core/InstantPersistence.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Source/Core/InstantPersistence.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -1577,6 +1577,9 @@
procedure AssignInstantDataTypeStrings(Strings: TStrings);
+procedure LoadMetadatas(const AFileName: string);
+procedure LoadModelFromFiles;
+
const
InstantClassPrefix: string = 'T';
InstantAttributePrefix: string = '_';
@@ -1606,6 +1609,7 @@
var
ConnectorClasses: TList;
ClassList: TList;
+ MetadataFileList: TStringList;
GraphicClassList: array[TInstantGraphicFileFormat] OF TGraphicClass;
RuntimeModel: TInstantModel;
ObjectNotifiers: TInstantObjectNotifiers;
@@ -8097,6 +8101,56 @@
end;
end;
+procedure LoadModelFromFiles;
+var
+ I: Integer;
+begin
+ if Assigned(MetadataFileList) and (MetadataFileList.Count > 0) then
+ begin
+ InstantModel.ClassMetadatas.Clear;
+ for I := 0 to Pred(MetadataFileList.Count) do
+ LoadMetadatas(MetadataFileList[I]);
+ end;
+end;
+
+procedure InstantRegisterMetadataFile(const AFileName: string);
+begin
+ if MetadataFileList.IndexOf(AFileName) = -1 then
+ MetadataFileList.Add(AFileName);
+end;
+
+procedure LoadMetadatas(const AFileName: string);
+var
+ Model: TInstantModel;
+ I: Integer;
+ ClassMetadata: TInstantClassMetadata;
+begin
+ if not FileExists(AFileName)then
+ raise EInstantError.CreateFmt('Model unit metadata file [%s] not found!',
+ [AFileName])
+ else
+ begin
+ Model := TInstantModel.Create;
+ try
+ Model.LoadFromFile(AFileName);
+ for I := 0 to Pred(Model.ClassMetadatas.Count) do
+ begin
+ if not Assigned(InstantModel.ClassMetadatas.Find(Model.ClassMetadatas[I].Name)) then
+ begin
+ ClassMetadata := InstantModel.ClassMetadatas.Add;
+ ClassMetadata.Assign(Model.ClassMetadatas[I]);
+ end
+ else
+ raise EInstantError.CreateFmt('Duplicate class [%s] in unit metadata file [%s]!',
+ [Model.ClassMetadatas[I].Name, AFileName]);
+ end;
+ InstantRegisterMetadataFile(AFileName);
+ finally
+ Model.Free;
+ end;
+ end;
+end;
+
{ TInstantGraphic }
class function TInstantGraphic.AttributeType: TInstantAttributeType;
@@ -8962,6 +9016,7 @@
TInstantAttributeMetadatas, TInstantAttributeMetadata,
TInstantObjectReference, TInstantConnectionDefs, TInstantConnectionDef]);
ClassList := TList.Create;
+ MetadataFileList := TStringList.Create;
{$IFDEF MSWINDOWS}
GraphicClassList[gffIco] := Graphics.TIcon;
GraphicClassList[gffBmp] := Graphics.TBitmap;
@@ -8976,11 +9031,11 @@
GraphicClassList[gffJpeg]:= QGraphics.TBitmap;
{$ENDIF}
ConnectorClasses := TList.Create;
- LoadClassMetadatas;
ObjectNotifiers := TInstantObjectNotifiers.Create;
finalization
ClassList.Free;
+ MetadataFileList.Free;
ConnectorClasses.Free;
RuntimeModel.Free;
ObjectNotifiers.Free;
Modified: branches/MetadataInXMLDev/Source/Core/InstantPresentation.pas
===================================================================
--- branches/MetadataInXMLDev/Source/Core/InstantPresentation.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Source/Core/InstantPresentation.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -367,7 +367,11 @@
protected
{ IProviderSupport }
procedure PSGetAttributes(List: TList); override;
+ {$IFNDEF D10+}
function PSGetTableName: string; override;
+ {$ELSE}
+ function PSGetTableNameW: WideString; override;
+ {$ENDIF}
procedure PSReset; override;
protected
procedure AddClassFieldDefs(const FieldName: string; AClass: TClass); overload;
@@ -3748,10 +3752,17 @@
begin
end;
+{$IFNDEF D10+}
function TInstantCustomExposer.PSGetTableName: string;
begin
Result := ObjectClassName;
end;
+{$ELSE}
+function TInstantCustomExposer.PSGetTableNameW: WideString;
+begin
+ Result := ObjectClassName;
+end;
+{$ENDIF}
procedure TInstantCustomExposer.PSReset;
begin
Modified: branches/MetadataInXMLDev/Source/Design/InstantModelExpert.pas
===================================================================
--- branches/MetadataInXMLDev/Source/Design/InstantModelExpert.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Source/Design/InstantModelExpert.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -87,6 +87,7 @@
FUpdateTimer: TTimer;
MetaDataCheckState : TIOMetaDataCheckState;
MetaDataCheckUnits : string;
+ function EditorModified(Module: IOTAModule): Boolean;
procedure ExplorerApplyClass(Sender: TObject; AClass: TInstantCodeClass;
ChangeInfo: TInstantCodeClassChangeInfo);
procedure ExplorerGotoSource(Sender: TObject; const FileName: string;
@@ -100,11 +101,13 @@
function GetIsDirty: Boolean;
function GetName: string;
function GetState: TWizardState;
+ function ModelFileModified(const FileName: string): Boolean;
+ function ModuleModified(Module: IOTAModule): Boolean;
procedure SetIsDirty(const Value: Boolean);
protected
procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
- procedure AccessModelUnits(Project: IOTAProject; Units: TStrings;
- Write: Boolean);
+ procedure AccessModelUnits(Project: IOTAProject; Units: TStrings; Write:
+ Boolean; RemovedUnits: TStrings = nil);
procedure AddToolError(const FileName, Msg: string; Line, Column: Integer);
procedure AddToolMessage(const FileName, Msg, Prefix: string; Line, Column: Integer);
procedure AddToolText(const Text: string);
@@ -122,6 +125,7 @@
procedure CheckIOMetadataKeyword(const FileName, Source: string);
procedure ExplorerItemClick(Sender: TObject);
procedure GetModelModules(Modules: TInterfaceList);
+ procedure GetModelUnits(Project: IOTAProject; Units: TStrings);
procedure IDEAfterCompilation(Sender: TObject; Succeeded: Boolean);
procedure IDEBeforeCompilation(Sender: TObject; Project: IOTAProject;
IsCodeInsight: Boolean; var Cancel: Boolean);
@@ -135,6 +139,8 @@
function IsProjectUnit(FileName: string): Boolean;
function IsModelUnit(FileName: string): Boolean;
procedure ShowExplorer;
+ procedure TagModelUnits(Project: IOTAProject; Units: TStrings; RemovedUnits:
+ TStrings);
procedure UpdateModel;
procedure UpdateTimerTick(Sender: TObject);
property CurrentSource: string read GetCurrentSource;
@@ -148,8 +154,8 @@
ChangeInfo: TInstantCodeClassChangeInfo);
procedure BuildDatabase(CodeModel: TInstantCodeModel);
procedure Execute;
- function LoadModel(Model: TInstantCodeModel; Project: IOTAProject = nil;
- CheckTime: TDateTime = 0): Boolean;
+ function LoadModel(Model: TInstantCodeModel; Project: IOTAProject = nil; Force:
+ Boolean = True): Boolean;
procedure SelectUnits;
function UpdateEnabled: Boolean;
procedure UpdateModelUnits;
@@ -175,7 +181,7 @@
SExplorerItemCaption = 'InstantObjects &Model Explorer';
SExplorerItemName = 'InstantExplorerItem';
SModelCompiler = 'Model Compiler';
- SResFileExt = '.mdr';
+ SResFileExt = '.irs';
UpdateInterval = 500;
procedure ReaderIdle(Reader: TInstantCodeReader; var Continue: Boolean);
@@ -250,150 +256,15 @@
{ TInstantModelExpert}
-procedure TInstantModelExpert.AccessModelUnits(Project: IOTAProject;
- Units: TStrings; Write: Boolean);
-const
-
- ModelTag = #10'{$R *' + SResFileExt + '}';
- ResourceTag = #10'{$R *.res}';
-
- function ListToStr(List: TStrings): string;
- var
- I: Integer;
- S: string;
- begin
- S := '';
- for I := 0 to Pred(List.Count) do
- begin
- Result := Result + S + List[I];
- S := ', ' + sLineBreak + ' ';
- end;
- end;
-
- function FindModelDef(const Source: string; out ModelDef: string;
- var Line, Column: Integer): Integer;
- var
- I: Integer;
- begin
- Result := 1;
- if FindText(ModelTag, Source, Result, Line, Column) then
- begin
- I := Result + Length(ModelTag);
- while I <= Length(Source) do
- begin
- case Source[I] of
- ' ': Inc(I);
- '{':
- while I < Length(Source) do
- begin
- Inc(I);
- if Source[I] = '}' then
- begin
- ModelDef := Copy(Source, Result, I - Result + 1);
- Exit;
- end;
- end;
- else
- Break;
- end;
- end;
- ModelDef := Copy(Source, Result, Length(ModelTag));
- end else
- Result := 0;
- end;
-
- function RemoveBrackets(const Str: string): string;
- begin
- Result := Trim(Str);
- if (Length(Result) > 0) and (Result[1] = '{') then
- Delete(Result, 1, 1);
- if (Length(Result) > 0) and (Result[Length(Result)] = '}') then
- Delete(Result, Length(Result), 1);
- Result := Trim(Result);
- end;
-
- procedure WriteUses(var Source: string; UnitNames: array of string;
- Include: Boolean);
- var
- UsesClause: TInstantCodeUsesClause;
- UsesItem: TInstantCodeUses;
- Found: Boolean;
- I: Integer;
- S: string;
- begin
- with TInstantCodeModifier.Create(Source, nil) do
- try
- if Module.ModuleType = mtProgram then
- begin
- UsesClause := Module.ProgramSection.FindUsesClause;
- if Assigned(UsesClause) and (UsesClause.Count > 0) then
- begin
- Found := False;
- for I := Low(UnitNames) to High(UnitNames) do
- begin
- UsesItem := UsesClause.Find(UnitNames[I]);
- Found := Assigned(UsesItem);
- if Found then
- begin
- if not Include then
- begin
- EraseObject(UsesItem);
- if NextChar = ',' then
- DeleteText(1);
- CloseGap;
- end else
- Break;
- end;
- end;
- if Include and not Found then
- begin
- CursorPos := UsesClause[0].StartPos;
- InsertMode := imBefore;
- S := '';
- for I := Low(UnitNames) to High(UnitNames) do
- S := S + UnitNames[I] + ','#10' ';
- InsertText(S);
- end;
- end;
- end;
- finally
- Free;
- end;
- end;
-
-var
- Editor: IOTASourceEditor;
- Source: string;
- Pos, Line, Column, SourceLen: Integer;
- CurModelDef, NewModelDef: string;
+procedure TInstantModelExpert.AccessModelUnits(Project: IOTAProject; Units:
+ TStrings; Write: Boolean; RemovedUnits: TStrings = nil);
begin
- Editor := FIDEInterface.SourceEditor(Project);
- Source := FIDEInterface.ReadEditorSource(Editor);
- Pos := FindModelDef(Source, CurModelDef, Line, Column);
- if Write then
+ if Assigned(Project) then
begin
- SourceLen := Length(Source);
- if Units.Count > 0 then
- NewModelDef := Format('%s {%s}', [ModelTag, ListToStr(Units)])
+ if Write then
+ TagModelUnits(Project, Units, RemovedUnits)
else
- NewModelDef := '';
- if CurModelDef = NewModelDef then
- Exit
- else if Pos > 0 then
- Delete(Source, Pos, Length(CurModelDef))
- else if not FindText(ResourceTag, Source, Pos, Line, Column) then
- Exit
- else
- Inc(Pos, Length(ResourceTag));
- Insert(NewModelDef, Source, Pos);
- FIDEInterface.WriteEditorSource(Editor, Source, SourceLen);
- end else if Pos > 0 then
- begin
- Delete(CurModelDef, 1, Length(ModelTag));
- CurModelDef := RemoveBrackets(CurModelDef);
- if CurModelDef = '' then
- AddToolError(Editor.FileName, 'No model units specified', Line, Column);
- InstantStrToList(CurModelDef, Units, [',']);
+ GetModelUnits(Project, Units);
end;
end;
@@ -616,35 +487,70 @@
end;
procedure TInstantModelExpert.CompileProject(Project: IOTAProject);
+
+ procedure ReadModel(AModel: TInstantCodeModel; AModule: IOTAModule);
+ var
+ Editor: IOTASourceEditor;
+ Source: string;
+ Stream: TStringStream;
+ begin
+ Editor := FIDEInterface.SourceEditor(AModule);
+ Source := FIDEInterface.ReadEditorSource(Editor);
+ Stream := TStringStream.Create(Source);
+ try
+ AModel.LoadModule(Stream, Editor.FileName);
+ finally
+ Stream.Free;
+ end;
+ end;
+
var
Model: TInstantCodeModel;
ResFileName: string;
+ {$IFNDEF D10+}
ResFileAge: Integer;
- ResFileTime: TDateTime;
+ {$ENDIF}
+ Modules: TInterfaceList;
+ I: Integer;
+ Module: IOTAModule;
+
begin
DisableUpdate;
- Model := TInstantCodeModel.Create;
+ Modules := TInterfaceList.Create;
try
- ResFileName := ChangeFileExt(Project.FileName, SResFileExt);
- ResFileAge := FileAge(ResFileName);
- if ResFileAge = -1 then
- ResFileTime := 0 else
- ResFileTime := FileDateToDateTime(ResFileAge);
+ GetModelModules(Modules);
+ if Modules.Count = 0 then
+ Exit;
+
+ Model := TInstantCodeModel.Create;
try
- if LoadModel(Model, Project, ResFileTime) then
- Model.SaveToResFile(ResFileName);
- except
- on E: EInstantCodeError do
+ try
+ for I := 0 to Pred(Modules.Count) do
begin
- AddToolError(E.FileName, E.Message, E.Position.Line,
- E.Position.Column);
- Abort;
- end
- else
- raise;
+ Module := Modules[I] as IOTAModule;
+ if ModuleModified(Module) then
+ begin
+ ReadModel(Model, Module);
+ ResFileName := ChangeFileExt(Module.FileName, SResFileExt);
+ Model.SaveToFile(ResFileName);
+ end;
+ Model.Clear;
+ end;
+ except
+ on E: EInstantCodeError do
+ begin
+ AddToolError(E.FileName, E.Message, E.Position.Line,
+ E.Position.Column);
+ Abort;
+ end
+ else
+ raise;
+ end;
+ finally
+ Model.Free;
end;
finally
- Model.Free;
+ Modules.Free;
EnableUpdate;
end;
end;
@@ -953,42 +859,18 @@
end;
end;
-function TInstantModelExpert.LoadModel(Model: TInstantCodeModel;
- Project: IOTAProject; CheckTime: TDateTime): Boolean;
+function TInstantModelExpert.LoadModel(Model: TInstantCodeModel; Project:
+ IOTAProject = nil; Force: Boolean = True): Boolean;
- function EditorModified(Module: IOTAModule): Boolean;
+ function ModulesModified(Modules: TInterfaceList): Boolean;
var
- Editor: IOTASourceEditor;
- begin
- Editor := FIDEInterface.SourceEditor(Module);
- Result := Editor.Modified;
- end;
-
- function FileModified(const FileName: string; Since: TDateTime): Boolean;
- var
- Age: Integer;
- begin
- Age := FileAge(FileName);
- if Age = -1 then
- Result := False
- else
- Result := FileDateToDateTime(Age) > Since;
- end;
-
- function ModuleModified(Module: IOTAModule; Since: TDateTime): Boolean;
- begin
- Result := EditorModified(Module) or FileModified(Module.FileName, Since);
- end;
-
- function ModulesModified(Modules: TInterfaceList; Since: TDateTime): Boolean;
- var
I: Integer;
Module: IOTAModule;
begin
for I := 0 to Pred(Modules.Count) do
begin
Module := Modules[I] as IOTAModule;
- Result := ModuleModified(Module, Since);
+ Result := ModuleModified(Module);
if Result then
Exit;
end;
@@ -1041,9 +923,9 @@
'%s'+sLineBreak+'Please refer to IOMETADATA_keyword.txt in instantobjects\doc folder.',
[FActiveProjectName, MetadataCheckUnits]), mtWarning, [mbOK], 0);
end;
- Result := (CheckTime = 0) or
- ModuleModified(Project, CheckTime) or
- ModulesModified(Modules, CheckTime);
+ Result := Force or
+ EditorModified(Project as IOTAModule) or
+ ModulesModified(Modules);
if Result then
ReadModel(Modules);
finally
@@ -1085,22 +967,25 @@
var
Project: IOTAProject;
- ModelUnits, OtherUnits: TStringList;
+ ModelUnits, OtherUnits, RemovedUnits: TStringList;
begin
if not Assigned(FIDEInterface.ProjectGroup) then
Exit;
ModelUnits := TStringList.Create;
OtherUnits := TStringList.Create;
+ RemovedUnits := TStringList.Create;
try
Project := ActiveProject;
AccessModelUnits(Project, ModelUnits, False);
+ RemovedUnits.AddStrings(ModelUnits);
GetUnitNames(Project, OtherUnits);
SubtractList(OtherUnits, ModelUnits);
with TInstantUnitSelectForm.Create(nil) do
try
if Execute(ModelUnits, OtherUnits) then
begin
- AccessModelUnits(Project, ModelUnits, True);
+ SubtractList(RemovedUnits, ModelUnits);
+ AccessModelUnits(Project, ModelUnits, True, RemovedUnits);
UpdateModel;
end;
finally
@@ -1109,6 +994,7 @@
finally
ModelUnits.Free;
OtherUnits.Free;
+ RemovedUnits.Free;
end;
end;
@@ -1206,4 +1092,264 @@
end;
end;
+function TInstantModelExpert.EditorModified(Module: IOTAModule): Boolean;
+var
+ Editor: IOTASourceEditor;
+begin
+ Editor := FIDEInterface.SourceEditor(Module);
+ Result := Editor.Modified;
+end;
+
+procedure TInstantModelExpert.GetModelUnits(Project: IOTAProject; Units:
+ TStrings);
+
+ function HasModelUnitTag(const ASource: string): Boolean;
+ var
+ Pos, Line, Column: Integer;
+ Str, SubStr: string;
+ begin
+ Result := False;
+ if ASource = '' then
+ Exit;
+
+ Pos := 1;
+ Str := ASource;
+ if FindText(InstantUnitTag, Str, Pos, Line, Column) and
+ (Column = Length(InstantUnitTag) + 1) then
+ begin
+ while not (Str[Pos] in [#10, #13]) do
+ Inc(Pos);
+ SubStr := Copy(Str, Pos + Length(sLineBreak), Length(InstantModelUnitTag));
+ Result := SameText(SubStr, InstantModelUnitTag);
+ end;
+ end;
+
+var
+ I: Integer;
+ ModuleInfo: IOTAModuleInfo;
+ Source: string;
+begin
+ for I := 0 to Pred(Project.GetModuleCount) do
+ begin
+ ModuleInfo := Project.GetModule(I);
+ if (ModuleInfo.ModuleType = omtForm) and
+ (ModuleInfo.FileName <> '') then
+ begin
+ Source := FIDEInterface.ReadModuleSource(ModuleInfo.OpenModule);
+ if HasModelUnitTag(Source) then
+ begin
+ Units.Add(ModuleInfo.Name);
+ end;
+ end;
+ end;
+end;
+
+// function FileModified(const FileName: string; Since: TDateTime): Boolean;
+// var
+// {$IFDEF D10+}
+// ResFileTime: TDateTime;
+// {$ELSE}
+// Age: Integer;
+// {$ENDIF}
+// begin
+// {$IFDEF D10+}
+// if not FileAge(FileName, ResFileTime) then
+// Result := False
+// else
+// Result := ResFileTime > Since;;
+// {$ELSE}
+// Age := FileAge(ResFileName);
+// if Age = -1 then
+// Result := False
+// else
+// Result := FileDateToDateTime(Age) > Since;
+// {$ENDIF}
+// end;
+//
+function TInstantModelExpert.ModelFileModified(const FileName: string): Boolean;
+var
+ ResFileName: string;
+{$IFDEF D10+}
+ ResFileTime: TDateTime;
+ ModuleFileTime: TDateTime;
+{$ELSE}
+ FileAge: Integer;
+{$ENDIF}
+begin
+ ResFileName := ChangeFileExt(FileName, SResFileExt);
+ {$IFDEF D10+}
+ if not FileAge(FileName, ModuleFileTime) then
+ Result := False
+ else if not FileAge(ResFileName, ResFileTime) then
+ Result := True
+ else
+ Result := ModuleFileTime > ResFileTime;
+ {$ELSE}
+ ResFileAge := FileAge(ResFileName);
+ if ResFileAge = -1 then
+ ResFileTime := 0
+ else
+ ResFileTime := FileDateToDateTime(ResFileAge);
+
+ FileAge := FileAge(FileName);
+ if FileAge = -1 then
+ Result := False
+ else
+ begin
+ ResFileAge := FileAge(ResFileName);
+ if ResFileAge = -1 then
+ Result := True
+ else
+ begin
+ ResFileTime := FileDateToDateTime(ResFileAge);
+ Result := FileDateToDateTime(FileAge) > ResFileTime;
+ end;
+ end;
+ {$ENDIF}
+end;
+
+function TInstantModelExpert.ModuleModified(Module: IOTAModule): Boolean;
+begin
+ Result := EditorModified(Module) or ModelFileModified(Module.FileName);
+end;
+
+procedure TInstantModelExpert.TagModelUnits(Project: IOTAProject; Units:
+ TStrings; RemovedUnits: TStrings);
+
+ function RemoveOldModelDef(Project: IOTAProject): Boolean;
+ const
+ OldModelTag = #10'{$R *.mdr}';
+ var
+ Editor: IOTASourceEditor;
+ Source: string;
+ Pos, Line, Column, SourceLen: Integer;
+ I: Integer;
+ begin
+ Result := False;
+ Editor := FIDEInterface.SourceEditor(Project);
+ Source := FIDEInterface.ReadEditorSource(Editor);
+ Pos := 1;
+ if FindText(OldModelTag, Source, Pos, Line, Column) then
+ begin
+ SourceLen := Length(Source);
+ I := Pos + Length(OldModelTag);
+ if Source[Pos-1] = #13 then
+ Dec(Pos);
+ while I <= Length(Source) do
+ begin
+ case Source[I] of
+ ' ': Inc(I);
+ '{':
+ while I < Length(Source) do
+ begin
+ Inc(I);
+ if Source[I] = '}' then
+ begin
+ Delete(Source, Pos, I - Pos + 1);
+ FIDEInterface.WriteEditorSource(Editor, Source, SourceLen);
+ Result := True;
+ Exit;
+ end;
+ end;
+ else
+ Break;
+ end;
+ end;
+ end;
+ end;
+
+ procedure CheckModelUnitTag(Editor: IOTASourceEditor; var ASource: string;
+ Required: Boolean);
+ begin
+ with TInstantCodeModifier.Create(ASource, nil) do
+ try
+ UpdateModelUnitTag(ChangeFileExt(ExtractFileName(Editor.Module.FileName),
+ SResFileExt), Required);
+ finally
+ Free;
+ end;
+ end;
+
+ procedure CheckLoadMetadatas(Editor: IOTASourceEditor; var ASource: string;
+ Required: Boolean);
+ begin
+ with TInstantCodeModifier.Create(ASource, nil) do
+ try
+ UpdateLoadMetadatas(ChangeFileExt(ExtractFileName(Editor.Module.FileName),
+ SResFileExt), Required);
+ finally
+ Free;
+ end;
+ end;
+
+ procedure UpdateEditorSource(Editor: IOTASourceEditor; const ASource: string;
+ ReplaceLen: Integer);
+ begin
+ DisableUpdate;
+ try
+ FIDEInterface.WriteEditorSource(Editor, ASource, ReplaceLen);
+ finally
+ EnableUpdate;
+ end;
+ end;
+
+ procedure CheckModelUnit(var ASource: string; Editor: IOTASourceEditor;
+ Required: Boolean);
+ var
+ Pos, Line, Column, SrcLen: Integer;
+ begin
+ if ASource = '' then
+ Exit;
+
+ Pos := 1;
+ SrcLen := Length(ASource);
+ if FindText(InstantUnitTag, ASource, Pos, Line, Column) and
+ (Column = Length(InstantUnitTag) + 1) then
+ begin
+ CheckModelUnitTag(Editor, ASource, Required);
+ CheckLoadMetadatas(Editor, ASource, Required);
+ UpdateEditorSource(Editor, ASource, SrcLen);
+ end;
+ end;
+
+var
+ I: Integer;
+ Editor: IOTASourceEditor;
+ Modules: TInterfaceList;
+ Module: IOTAModule;
+ Source: string;
+begin
+ if (Units.Count = 0) and (RemovedUnits.Count = 0) then
+ Exit;
+
+ RemoveOldModelDef(Project);
+
+ Modules := TInterfaceList.Create;
+ try
+ CollectModules(Project, Modules, Units);
+ for I := 0 to Pred(Modules.Count) do
+ begin
+ Module := Modules[I] as IOTAModule;
+ Editor := FIDEInterface.SourceEditor(Module);
+ Source := FIDEInterface.ReadEditorSource(Editor);
+ CheckModelUnit(Source, Editor, True);
+ end;
+
+ if RemovedUnits.Count > 0 then
+ begin
+ Modules.Clear;
+ CollectModules(Project, Modules, RemovedUnits);
+ for I := 0 to Pred(Modules.Count) do
+ begin
+ Module := Modules[I] as IOTAModule;
+ Editor := FIDEInterface.SourceEditor(Module);
+ Source := FIDEInterface.ReadEditorSource(Editor);
+ CheckModelUnit(Source, Editor, False);
+ end;
+ end;
+ finally
+ Modules.Free;
+ end;
+end;
+
end.
Modified: branches/MetadataInXMLDev/Tests/TestIO.dpr
===================================================================
--- branches/MetadataInXMLDev/Tests/TestIO.dpr 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestIO.dpr 2007-01-15 06:18:23 UTC (rev 748)
@@ -57,7 +57,6 @@
TestInstantObjectReference in 'TestInstantObjectReference.pas';
{$R *.res}
-{$R *.mdr} {TestModel}
begin
Application.Initialize;
Deleted: branches/MetadataInXMLDev/Tests/TestIO.mdr
===================================================================
(Binary files differ)
Modified: branches/MetadataInXMLDev/Tests/TestInstantAttribute.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantAttribute.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantAttribute.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -65,9 +65,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantAttribute := FOwner._Name;
Modified: branches/MetadataInXMLDev/Tests/TestInstantBlob.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantBlob.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantBlob.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -66,9 +66,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantBlob := FOwner._Picture;
Modified: branches/MetadataInXMLDev/Tests/TestInstantBoolean.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantBoolean.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantBoolean.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -70,9 +70,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantBoolean := FOwner._Employed;
Modified: branches/MetadataInXMLDev/Tests/TestInstantCache.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantCache.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantCache.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -63,10 +63,8 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
+ LoadModelFromFiles;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
FInstantCache := TInstantCache.Create;
end;
Modified: branches/MetadataInXMLDev/Tests/TestInstantCircularReferences.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantCircularReferences.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantCircularReferences.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -106,9 +106,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FCompany := TCompany.Create(FConn);
end;
Modified: branches/MetadataInXMLDev/Tests/TestInstantClassMetadata.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantClassMetadata.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantClassMetadata.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -81,9 +81,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
// Load a default ClassMetadata
FInstantClassMetadata := InstantModel.ClassMetadatas.Find('TContact');
end;
@@ -159,7 +157,7 @@
procedure TestTInstantClassMetadata.TestParentName;
begin
- AssertEquals('', FInstantClassMetadata.ParentName);
+ AssertEquals('TInstantObject', FInstantClassMetadata.ParentName);
FInstantClassMetadata := InstantModel.ClassMetadatas.Find('TPerson');
AssertEquals('TContact', FInstantClassMetadata.ParentName);
@@ -212,9 +210,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FInstantClassMetadatas := InstantModel.ClassMetadatas;
end;
Modified: branches/MetadataInXMLDev/Tests/TestInstantComplex.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantComplex.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantComplex.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -63,9 +63,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantComplex := FOwner._Address;
Modified: branches/MetadataInXMLDev/Tests/TestInstantCurrency.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantCurrency.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantCurrency.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -67,9 +67,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantCurrency := FOwner._Salary;
Modified: branches/MetadataInXMLDev/Tests/TestInstantDate.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantDate.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantDate.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -72,9 +72,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantDate := FOwner._EmploymentDate;
Modified: branches/MetadataInXMLDev/Tests/TestInstantDateTime.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantDateTime.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantDateTime.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -72,9 +72,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantDateTime := FOwner._BirthDate;
Modified: branches/MetadataInXMLDev/Tests/TestInstantFloat.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantFloat.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantFloat.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -65,9 +65,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantFloat := FOwner._AL_hours;
Modified: branches/MetadataInXMLDev/Tests/TestInstantInteger.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantInteger.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantInteger.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -65,9 +65,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TCompany.Create(FConn);
FInstantInteger := FOwner._NoOfBranches;
Modified: branches/MetadataInXMLDev/Tests/TestInstantNumeric.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantNumeric.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantNumeric.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -62,9 +62,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TCompany.Create(FConn);
FInstantNumeric := FOwner._NoOfBranches;
Modified: branches/MetadataInXMLDev/Tests/TestInstantObject.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantObject.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantObject.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -94,10 +94,8 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
+ LoadModelFromFiles;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
vInstantClassMetadata := InstantModel.ClassMetadatas.Find('TPerson');
vInstantClassMetadata.DefaultContainerName := 'Emails';
FInstantObject := TPerson.Create(FConn);
Modified: branches/MetadataInXMLDev/Tests/TestInstantObjectReference.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantObjectReference.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantObjectReference.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -70,9 +70,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FInstantObject := TCompany.Create(FConn);
FInstantReferences := FInstantObject._Employees;
Modified: branches/MetadataInXMLDev/Tests/TestInstantObjectStore.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantObjectStore.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantObjectStore.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -71,9 +71,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockCRBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FInstantObjectStore := FConn.EnsureObjectStore(TPerson);
AssertNotNull(FInstantObjectStore);
@@ -189,9 +187,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FInstantObjectStores := FConn.ObjectStores;
FConn.EnsureObjectStore(TPerson);
Modified: branches/MetadataInXMLDev/Tests/TestInstantPart.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantPart.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantPart.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -87,9 +87,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantPart := FOwner._Address;
@@ -281,9 +279,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantPart := FOwner._ExternalAddress;
Modified: branches/MetadataInXMLDev/Tests/TestInstantParts.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantParts.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantParts.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -121,9 +121,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantParts := FOwner._ExternalPhones;
@@ -387,9 +385,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantParts := FOwner._Phones;
@@ -616,9 +612,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
end;
Modified: branches/MetadataInXMLDev/Tests/TestInstantReference.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantReference.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantReference.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -68,9 +68,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantReference := FOwner._Category;
Modified: branches/MetadataInXMLDev/Tests/TestInstantReferences.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantReferences.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantReferences.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -121,9 +121,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TCompany.Create(FConn);
FInstantReferences := FOwner._Employees;
@@ -432,9 +430,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TCompany.Create(FConn);
FInstantReferences := FOwner._Projects;
Modified: branches/MetadataInXMLDev/Tests/TestInstantScheme.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantScheme.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantScheme.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -58,9 +58,7 @@
procedure TestTInstantScheme.SetUp;
begin
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FInstantScheme := TInstantScheme.Create;
FInstantScheme.Catalog := TInstantModelCatalog.Create(FInstantScheme, InstantModel);
Modified: branches/MetadataInXMLDev/Tests/TestInstantString.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantString.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantString.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -70,9 +70,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TContact.Create(FConn);
FInstantString := FOwner._Name;
Modified: branches/MetadataInXMLDev/Tests/TestInstantTableMetadata.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantTableMetadata.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantTableMetadata.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -70,9 +70,7 @@
procedure TestTInstantTableMetadata.SetUp;
begin
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TInstantScheme.Create;
FOwner.Catalog := TInstantModelCatalog.Create(FOwner, InstantModel);
Modified: branches/MetadataInXMLDev/Tests/TestInstantTime.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestInstantTime.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestInstantTime.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -72,9 +72,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
FOwner := TPerson.Create(FConn);
FInstantTime := FOwner._BirthTime;
Modified: branches/MetadataInXMLDev/Tests/TestMockBroker.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestMockBroker.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestMockBroker.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -176,9 +176,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
end;
procedure TTestMockBroker.TearDown;
@@ -194,9 +192,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockCRBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
end;
procedure TTestMockRelationalBroker.TearDown;
Modified: branches/MetadataInXMLDev/Tests/TestMockConnector.pas
===================================================================
--- branches/MetadataInXMLDev/Tests/TestMockConnector.pas 2007-01-15 05:12:20 UTC (rev 747)
+++ branches/MetadataInXMLDev/Tests/TestMockConnector.pas 2007-01-15 06:18:23 UTC (rev 748)
@@ -60,9 +60,7 @@
FConn := TInstantMockConnector.Create(nil);
FConn.BrokerClass := TInstantMockBroker;
- if InstantModel.ClassMetadatas.Count > 0 then
- InstantModel.ClassMetadatas.Clear;
- InstantModel.LoadFromResFile(ChangeFileExt(ParamStr(0), '.mdr'));
+ LoadModelFromFiles;
end;
procedure TTestMockConnector.TearDown;
Added: branches/MetadataInXMLDev/Tests/TestModel.irs
===================================================================
--- branches/MetadataInXMLDev/Tests/TestModel.irs (rev 0)
+++ branches/MetadataInXMLDev/Tests/TestModel.irs 2007-01-15 06:18:23 UTC (rev 748)
@@ -0,0 +1 @@
+<TInstantClassMetadatas><TInstantClassMetadata><Name>TAddress</Name><ParentName>TInstantObject</ParentName><Persistence>peEmbedded</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>City</Name><AttributeType>atString</AttributeType><IsIndexed>TRUE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Country</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TCountry</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>State</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>4</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Street</Name><AttributeType>atMemo</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Zip</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>10</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCountry</Name><ParentName>TInstantObject</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TPhone</Name><ParentName>TInstantObject</ParentName><Persistence>peEmbedded</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Number</Name><AttributeType>atString</AttributeType><EditMask>(000) 000-0000;0;_</EditMask><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>20</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TEmail</Name><ParentName>TInstantObject</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Address</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>100</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TCategory</Name><ParentName>TInstantObject</ParentName><Persistence>peStored</Persistence><StorageName>Categories</StorageName><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Name</Name><AttributeType>atString</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><Size>30</Size></TInstantAttributeMetadata></TInstantAttributeMetadatas></AttributeMetadatas></TInstantClassMetadata><TInstantClassMetadata><Name>TContact</Name><ParentName>TInstantObject</ParentName><Persistence>peStored</Persistence><AttributeMetadatas><TInstantAttributeMetadatas><TInstantAttributeMetadata><Name>Address</Name><AttributeType>atPart</AttributeType><IsIndexed>FALSE</IsIndexed><IsRequired>FALSE</IsRequired><ObjectClassName>TAddress</ObjectClassName></TInstantAttributeMetadata><TInstantAttributeMetadata><Name>Category</Name><AttributeType>atReference</AttributeType><IsIndexed>FALSE</IsInd...
[truncated message content] |