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] |