Quick.Config.Base.pas 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. { ***************************************************************************
  2. Copyright (c) 2015-2019 Kike Pérez
  3. Unit : Quick.Config.Base
  4. Description : Quick Config Base classes
  5. Author : Kike Pérez
  6. Version : 1.5
  7. Created : 26/01/2017
  8. Modified : 12/02/2019
  9. This file is part of QuickLib: https://github.com/exilon/QuickLib
  10. ***************************************************************************
  11. Licensed under the Apache License, Version 2.0 (the "License");
  12. you may not use this file except in compliance with the License.
  13. You may obtain a copy of the License at
  14. http://www.apache.org/licenses/LICENSE-2.0
  15. Unless required by applicable law or agreed to in writing, software
  16. distributed under the License is distributed on an "AS IS" BASIS,
  17. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18. See the License for the specific language governing permissions and
  19. limitations under the License.
  20. *************************************************************************** }
  21. unit Quick.Config.Base;
  22. interface
  23. {$i QuickLib.inc}
  24. uses
  25. Classes,
  26. SysUtils,
  27. Quick.Json.Serializer;
  28. type
  29. TAppConfig = class;
  30. IAppConfigProvider = interface
  31. ['{D55B1EBF-47F6-478B-8F70-9444575CB825}']
  32. procedure Load(cConfig : TAppConfig);
  33. procedure Save(cConfig : TAppConfig);
  34. end;
  35. TSerializeProperty = (spPublic, spPublished);
  36. TAppConfigProvider = class(TInterfacedObject,IAppConfigProvider)
  37. private
  38. fCreateIfNotExists : Boolean;
  39. fSerializeLevel : TSerializeProperty;
  40. fUseEnumNames : Boolean;
  41. protected
  42. procedure Load(cConfig : TAppConfig); virtual; abstract;
  43. procedure Save(cConfig : TAppConfig); virtual; abstract;
  44. public
  45. constructor Create;
  46. property CreateIfNotExists : Boolean read fCreateIfNotExists write fCreateIfNotExists;
  47. property SerializeLevel : TSerializeProperty read fSerializeLevel write fSerializeLevel;
  48. property UseEnumNames : Boolean read fUseEnumNames write fUseEnumNames;
  49. end;
  50. TApplyConfigEvent = procedure of object;
  51. TAppConfig = class
  52. private
  53. fOnApplyConfig : TApplyConfigEvent;
  54. fJsonIndent: Boolean;
  55. fLastSaved : TDateTime;
  56. protected
  57. fProvider : TAppConfigProvider;
  58. public
  59. constructor Create(aConfigProvider : TAppConfigProvider);
  60. destructor Destroy; override;
  61. {$IFNDEF FPC}[TNotSerializableProperty]{$ENDIF}
  62. property OnApplyConfig : TApplyConfigEvent read fOnApplyConfig write fOnApplyConfig;
  63. {$IFNDEF FPC}[TNotSerializableProperty]{$ENDIF}
  64. property JsonIndent : Boolean read fJsonIndent write fJsonIndent;
  65. {$IFNDEF FPC}[TNotSerializableProperty]{$ENDIF}
  66. property LastSaved : TDateTime read fLastSaved write fLastSaved;
  67. procedure Apply;
  68. //override this method to provide your class initialization
  69. procedure Init; virtual;
  70. procedure DefaultValues; virtual;
  71. procedure Load; virtual;
  72. procedure Save; virtual;
  73. function ToJSON : string;
  74. procedure FromJSON(const json : string);
  75. end;
  76. EAppConfig = class(Exception);
  77. implementation
  78. { TAppConfigProviderBase }
  79. constructor TAppConfigProvider.Create;
  80. begin
  81. fCreateIfNotExists := True;
  82. fSerializeLevel := spPublished;
  83. fUseEnumNames := True;
  84. end;
  85. { TAppConfig }
  86. constructor TAppConfig.Create(aConfigProvider : TAppConfigProvider);
  87. begin
  88. fProvider := aConfigProvider;
  89. fJsonIndent := True;
  90. fLastSaved := 0;
  91. Init;
  92. end;
  93. procedure TAppConfig.Apply;
  94. begin
  95. if Assigned(fOnApplyConfig) then fOnApplyConfig;
  96. end;
  97. procedure TAppConfig.DefaultValues;
  98. begin
  99. //inherit to set default values if no config exists before
  100. end;
  101. destructor TAppConfig.Destroy;
  102. begin
  103. if Assigned(fProvider) then fProvider.Free;
  104. inherited;
  105. end;
  106. function TAppConfig.ToJSON : string;
  107. var
  108. Serializer : TJsonSerializer;
  109. begin
  110. Result := '';
  111. try
  112. serializer := TJsonSerializer.Create(slPublishedProperty,fProvider.UseEnumNames);
  113. try
  114. Result := serializer.ObjectToJSON(Self,fJsonIndent);
  115. finally
  116. serializer.Free;
  117. end;
  118. except
  119. on e : Exception do raise Exception.Create(e.Message);
  120. end;
  121. end;
  122. procedure TAppConfig.FromJSON(const json : string);
  123. var
  124. Serializer : TJsonSerializer;
  125. begin
  126. try
  127. serializer := TJsonSerializer.Create(slPublishedProperty,fProvider.UseEnumNames);
  128. try
  129. serializer.JsonToObject(Self,json);
  130. finally
  131. serializer.Free;
  132. end;
  133. except
  134. on e : Exception do raise Exception.Create(e.Message);
  135. end;
  136. end;
  137. procedure TAppConfig.Init;
  138. begin
  139. //override to create private classes
  140. end;
  141. procedure TAppConfig.Load;
  142. begin
  143. if not Assigned(fProvider) then raise EAppConfig.Create('No provider assigned!');
  144. fProvider.Load(Self);
  145. end;
  146. procedure TAppConfig.Save;
  147. begin
  148. if not Assigned(fProvider) then raise EAppConfig.Create('No provider assigned!');
  149. fProvider.Save(Self);
  150. fLastSaved := Now();
  151. end;
  152. end.