* Added small improvement to JSONRPCHandlermanager to ease creating descendents with customized behaviour:

moved creation of defs to virtual procedure. Uses a global classvar to determine default item type.
* Implemented GetClassNames and GetMethodsOfClass
* Added Clear.

git-svn-id: trunk@28190 -
This commit is contained in:
michael 2014-07-11 06:49:19 +00:00
parent e65c4e13e0
commit c3f24cc775

View File

@ -240,6 +240,7 @@ Type
Property ArgumentCount : Integer Read FArgumentCount Write FArgumentCount; Property ArgumentCount : Integer Read FArgumentCount Write FArgumentCount;
Property ParamDefs : TJSONParamDefs Read GetParamDefs Write SetParamDefs; Property ParamDefs : TJSONParamDefs Read GetParamDefs Write SetParamDefs;
end; end;
TJSONRPCHandlerDefClass = Class of TJSONRPCHandlerDef;
{ TJSONRPCHandlerDefs } { TJSONRPCHandlerDefs }
@ -261,6 +262,7 @@ Type
FRegistering: Boolean; FRegistering: Boolean;
Protected Protected
procedure Initialize; virtual; procedure Initialize; virtual;
procedure DoClear; virtual;
// Handler support // Handler support
Procedure RemoveHandlerDef(Const Index : Integer); virtual; abstract; Procedure RemoveHandlerDef(Const Index : Integer); virtual; abstract;
function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; virtual; abstract; function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; virtual; abstract;
@ -279,6 +281,7 @@ Type
Function GetHandler(Const AClassName,AMethodName : TJSONStringType; AOwner : TComponent; Out AContainer : TComponent): TCustomJSONRPCHandler; Function GetHandler(Const AClassName,AMethodName : TJSONStringType; AOwner : TComponent; Out AContainer : TComponent): TCustomJSONRPCHandler;
Procedure GetClassNames (List : TStrings); // Should be a stringlist of TJSONStringType Procedure GetClassNames (List : TStrings); // Should be a stringlist of TJSONStringType
Procedure GetMethodsOfClass(Const AClassName : TJSONStringType; List : TStrings); // Should be a stringlist of TJSONStringType Procedure GetMethodsOfClass(Const AClassName : TJSONStringType; List : TStrings); // Should be a stringlist of TJSONStringType
Procedure Clear;
// properties // properties
Property Registering : Boolean Read FRegistering; Property Registering : Boolean Read FRegistering;
Property HandlerCount : Integer Read GetHandlerDefCount; Property HandlerCount : Integer Read GetHandlerDefCount;
@ -292,6 +295,8 @@ Type
Private Private
FHandlerDefs : TJSONRPCHandlerDefs; FHandlerDefs : TJSONRPCHandlerDefs;
Protected Protected
procedure DoClear; override;
Function CreateDefs : TJSONRPCHandlerDefs; virtual;
Procedure RemoveHandlerDef(Const Index : Integer); override; Procedure RemoveHandlerDef(Const Index : Integer); override;
function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; override; function AddHandlerDef(Const AClassName,AMethodName : TJSONStringType) : TJSONRPCHandlerDef; override;
function IndexOfHandlerDef(Const AClassName,AMethodName : TJSONStringType) : Integer; override; function IndexOfHandlerDef(Const AClassName,AMethodName : TJSONStringType) : Integer; override;
@ -329,10 +334,11 @@ Function CreateErrorForRequest(Const Req,Error : TJSONData) : TJSONData;
Function JSONRPCHandlerManager : TCustomJSONRPCHandlerManager; Function JSONRPCHandlerManager : TCustomJSONRPCHandlerManager;
// Class that will be created. Must be set before first call to JSONRPCHandlerManager.
Var Var
// Class that will be created. Must be set before first call to JSONRPCHandlerManager.
JSONRPCHandlerManagerClass : TCustomJSONRPCHandlerManagerClass = TJSONRPCHandlerManager; JSONRPCHandlerManagerClass : TCustomJSONRPCHandlerManagerClass = TJSONRPCHandlerManager;
// Class of Defs that will be created by TJSONRPCHandlerManager. Must be set before first call to JSONRPCHandlerManager.
DefaultJSONRPCHandlerDefClass : TJSONRPCHandlerDefClass = TJSONRPCHandlerDef;
Const Const
// JSON RPC 2.0 error codes // JSON RPC 2.0 error codes
@ -1167,7 +1173,22 @@ begin
// Do nothing // Do nothing
end; end;
procedure TCustomJSONRPCHandlerManager.UnregisterHandler(const AClassName, procedure TCustomJSONRPCHandlerManager.DoClear;
Var
I : Integer;
D : TJSONRPCHandlerDef;
C,M : String;
begin
For I:=HandlerCount-1 downto 0 do
begin
D:=HandlerDefs[i];
C:=D.HandlerClassName;
M:=D.HandlerMethodName;
UnregisterHandler(C,M);
end;
end;
Procedure TCustomJSONRPCHandlerManager.UnregisterHandler(Const AClassName,
AMethodName: TJSONStringType); AMethodName: TJSONStringType);
Var Var
@ -1184,8 +1205,8 @@ begin
JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]); JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]);
end; end;
procedure TCustomJSONRPCHandlerManager.RegisterDatamodule( Procedure TCustomJSONRPCHandlerManager.RegisterDatamodule(
const AClass: TDatamoduleClass; const AHandlerClassName: TJSONStringType); Const AClass: TDatamoduleClass; Const AHandlerClassName: TJSONStringType);
Var Var
DM : TDatamodule; DM : TDatamodule;
@ -1228,19 +1249,17 @@ begin
end; end;
end; end;
function TCustomJSONRPCHandlerManager.RegisterHandler( Function TCustomJSONRPCHandlerManager.RegisterHandler(
const AMethodName: TJSONStringType; Const AMethodName: TJSONStringType; AClass: TCustomJSONRPCHandlerClass;
AClass: TCustomJSONRPCHandlerClass; AArgumentCount: Integer): TJSONRPCHandlerDef;
AArgumentCount : Integer = 0): TJSONRPCHandlerDef;
begin begin
Result:=RegisterHandler('',AMethodName,AClass,AArgumentCount); Result:=RegisterHandler('',AMethodName,AClass,AArgumentCount);
end; end;
function TCustomJSONRPCHandlerManager.RegisterHandler( Function TCustomJSONRPCHandlerManager.RegisterHandler(Const AClassName,
const AClassName,AMethodName: String; AMethodName: TJSONStringType; AClass: TCustomJSONRPCHandlerClass;
AClass: TCustomJSONRPCHandlerClass; AArgumentCount: Integer): TJSONRPCHandlerDef;
AArgumentCount : Integer = 0): TJSONRPCHandlerDef;
Var Var
I : Integer; I : Integer;
@ -1264,7 +1283,7 @@ begin
end; end;
end; end;
function TCustomJSONRPCHandlerManager.FindHandlerDefByName(const AClassName, Function TCustomJSONRPCHandlerManager.FindHandlerDefByName(Const AClassName,
AMethodName: TJSONStringType): TJSONRPCHandlerDef; AMethodName: TJSONStringType): TJSONRPCHandlerDef;
Var Var
@ -1278,7 +1297,7 @@ begin
Result:=GetHandlerDef(I); Result:=GetHandlerDef(I);
end; end;
function TCustomJSONRPCHandlerManager.GetHandlerDefByName(const AClassName, Function TCustomJSONRPCHandlerManager.GetHandlerDefByName(Const AClassName,
AMethodName: TJSONStringType): TJSONRPCHandlerDef; AMethodName: TJSONStringType): TJSONRPCHandlerDef;
begin begin
Result:=FindHandlerDefByName(AClassName,AMethodName); Result:=FindHandlerDefByName(AClassName,AMethodName);
@ -1289,8 +1308,8 @@ begin
JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]); JSONRPCError(SErrUnknownJSONRPCMethodHandler,[AMethodName]);
end; end;
function TCustomJSONRPCHandlerManager.GetHandler( Function TCustomJSONRPCHandlerManager.GetHandler(
const ADef: TJSONRPCHandlerDef; AOwner: TComponent; out AContainer: TComponent Const ADef: TJSONRPCHandlerDef; AOwner: TComponent; Out AContainer: TComponent
): TCustomJSONRPCHandler; ): TCustomJSONRPCHandler;
Var Var
@ -1304,8 +1323,8 @@ begin
Result:=ADef.CreateInstance(O,AContainer); Result:=ADef.CreateInstance(O,AContainer);
end; end;
function TCustomJSONRPCHandlerManager.GetHandler(const AClassName, Function TCustomJSONRPCHandlerManager.GetHandler(Const AClassName,
AMethodName: TJSONStringType; AOwner: TComponent; out AContainer: TComponent AMethodName: TJSONStringType; AOwner: TComponent; Out AContainer: TComponent
): TCustomJSONRPCHandler; ): TCustomJSONRPCHandler;
Var Var
@ -1316,31 +1335,65 @@ begin
Result:=GetHandler(D,AOwner,AContainer); Result:=GetHandler(D,AOwner,AContainer);
end; end;
procedure TCustomJSONRPCHandlerManager.GetClassNames(List: TStrings); Procedure TCustomJSONRPCHandlerManager.GetClassNames(List: TStrings);
begin
Var
D : TJSONRPCHandlerDef;
I : Integer;
begin
For I:=0 to HandlerCount-1 do
begin
D:=HandlerDefs[i];
If List.IndexOf(D.HandlerClassName)=-1 then
List.Add(D.HandlerClassName);
end;
end; end;
procedure TCustomJSONRPCHandlerManager.GetMethodsOfClass( Procedure TCustomJSONRPCHandlerManager.GetMethodsOfClass(
const AClassName: TJSONStringType; List: TStrings); Const AClassName: TJSONStringType; List: TStrings);
begin Var
D : TJSONRPCHandlerDef;
I : Integer;
begin
For I:=0 to HandlerCount-1 do
begin
D:=HandlerDefs[i];
If AClassName=D.HandlerClassName then
List.Add(D.HandlerMethodName);
end;
end;
Procedure TCustomJSONRPCHandlerManager.Clear;
begin
DoClear;
end; end;
{ TJSONRPCHandlerManager } { TJSONRPCHandlerManager }
procedure TJSONRPCHandlerManager.RemoveHandlerDef(const Index: Integer); procedure TJSONRPCHandlerManager.DoClear;
begin
FHandlerDefs.Clear;
end;
Function TJSONRPCHandlerManager.CreateDefs: TJSONRPCHandlerDefs;
begin
Result:=TJSONRPCHandlerDefs.Create(DefaultJSONRPCHandlerDefClass);
end;
Procedure TJSONRPCHandlerManager.RemoveHandlerDef(Const Index: Integer);
begin begin
FHandlerDefs.Delete(Index); FHandlerDefs.Delete(Index);
end; end;
function TJSONRPCHandlerManager.AddHandlerDef(const AClassName, function TJSONRPCHandlerManager.AddHandlerDef(Const AClassName,
AMethodName: TJSONStringType): TJSONRPCHandlerDef; AMethodName: TJSONStringType): TJSONRPCHandlerDef;
begin begin
Result:=FHandlerDefs.AddHandler(AClassName,AMethodName); Result:=FHandlerDefs.AddHandler(AClassName,AMethodName);
end; end;
function TJSONRPCHandlerManager.IndexOfHandlerDef(const AClassName, function TJSONRPCHandlerManager.IndexOfHandlerDef(Const AClassName,
AMethodName: TJSONStringType): Integer; AMethodName: TJSONStringType): Integer;
begin begin
Result:=FHandlerDefs.IndexOfHandler(AClassName,AMethodName); Result:=FHandlerDefs.IndexOfHandler(AClassName,AMethodName);
@ -1357,13 +1410,13 @@ begin
Result:=FHandlerDefs.Count; Result:=FHandlerDefs.Count;
end; end;
constructor TJSONRPCHandlerManager.Create(AOwner: TComponent); Constructor TJSONRPCHandlerManager.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
FHandlerDefs:=TJSONRPCHandlerDefs.Create(TJSONRPCHandlerDef); FHandlerDefs:=CreateDefs;
end; end;
destructor TJSONRPCHandlerManager.Destroy; Destructor TJSONRPCHandlerManager.Destroy;
begin begin
FreeAndNil(FHandlerDefs); FreeAndNil(FHandlerDefs);
inherited Destroy; inherited Destroy;