Browse Source

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

michael 11 years ago
parent
commit
c3f24cc775
1 changed files with 82 additions and 29 deletions
  1. 82 29
      packages/fcl-web/src/jsonrpc/fpjsonrpc.pp

+ 82 - 29
packages/fcl-web/src/jsonrpc/fpjsonrpc.pp

@@ -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(
-  const AClass: TDatamoduleClass; const AHandlerClassName: TJSONStringType);
+Procedure TCustomJSONRPCHandlerManager.RegisterDatamodule(
+  Const AClass: TDatamoduleClass; Const AHandlerClassName: TJSONStringType);
 
 
 Var
 Var
   DM : TDatamodule;
   DM : TDatamodule;
@@ -1228,19 +1249,17 @@ begin
   end;
   end;
 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
 begin
   Result:=RegisterHandler('',AMethodName,AClass,AArgumentCount);
   Result:=RegisterHandler('',AMethodName,AClass,AArgumentCount);
 end;
 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
 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(
-  const ADef: TJSONRPCHandlerDef; AOwner: TComponent; out AContainer: TComponent
+Function TCustomJSONRPCHandlerManager.GetHandler(
+  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,
-  AMethodName: TJSONStringType; AOwner: TComponent; out AContainer: TComponent
+Function TCustomJSONRPCHandlerManager.GetHandler(Const AClassName,
+  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);
-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;
 end;
 
 
-procedure TCustomJSONRPCHandlerManager.GetMethodsOfClass(
-  const AClassName: TJSONStringType; List: TStrings);
+Procedure TCustomJSONRPCHandlerManager.GetMethodsOfClass(
+  Const AClassName: TJSONStringType; List: TStrings);
+Var
+  D : TJSONRPCHandlerDef;
+  I : Integer;
+
 begin
 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;