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