brookmiddleware.pas 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. (*
  2. Brook framework, Middleware Classes
  3. Copyright (C) 2014 Silvio Clecio
  4. See the file LICENSE.txt, included in this distribution,
  5. for details about the copyright.
  6. This library is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. *)
  10. unit BrookMiddleware;
  11. {$i brook.inc}
  12. interface
  13. uses
  14. BrookClasses, BrookAction, BrookRouter, BrookException, BrookHttpDefs,
  15. BrookUtils;
  16. type
  17. { Handles exceptions for @link(TBrookMiddleware). }
  18. EBrookMiddleware = class(EBrook);
  19. { Is a metaclass for @link(TBrookMiddleware) class. }
  20. TBrookMiddlewareClass = class of TBrookMiddleware;
  21. { Is a type to @code(*Middleware.OnExecute) event. }
  22. TBrookMiddlewareExecuteEvent = procedure(ASender: TObject;
  23. AAction: TBrookAction; ARoute: TBrookRoute) of object;
  24. { Defines a pointer to the @code(TBrookMiddlewareExecuteEvent) type.}
  25. PBrookMiddlewareExecuteEvent = ^TBrookMiddlewareExecuteEvent;
  26. { Intermediates two classes through a @code(TBrookExecuteActionEvent) event. }
  27. TBrookMiddleware = class(TBrookComponent)
  28. private
  29. FOldExecute: TBrookExecuteActionEvent;
  30. FOnExecute: TBrookMiddlewareExecuteEvent;
  31. protected
  32. procedure DoExecute(ASender: TObject; AAction: TBrookAction;
  33. ARequest: TBrookRequest; AResponse: TBrookResponse; const ANames,
  34. AValues: TBrookArrayOfString; ARoute: TBrookRoute;
  35. var AHandled: Boolean); virtual;
  36. public
  37. { Creates an instance of a @link(TBrookMiddleware) class. }
  38. constructor Create(ABoundEvent: PBrookExecuteActionEvent); overload; virtual;
  39. { Is triggered when the @code(DoExecute) method bound in this class is
  40. executed. }
  41. procedure Execute(ASender: TObject; AAction: TBrookAction;
  42. ARoute: TBrookRoute); virtual;
  43. { Bindes a @code(TBrookExecuteActionEvent) event to this class keeping the
  44. implementation of a previously declared event. }
  45. procedure BindExecution(AEvent: PBrookExecuteActionEvent);
  46. { Is triggered when the @code(Execute) method bound in this class is
  47. executed. }
  48. property OnExecute: TBrookMiddlewareExecuteEvent read FOnExecute
  49. write FOnExecute;
  50. end;
  51. implementation
  52. { TBrookCustomMiddleware }
  53. constructor TBrookMiddleware.Create(ABoundEvent: PBrookExecuteActionEvent);
  54. begin
  55. inherited Create(nil);
  56. BindExecution(ABoundEvent);
  57. end;
  58. procedure TBrookMiddleware.DoExecute(ASender: TObject; AAction: TBrookAction;
  59. ARequest: TBrookRequest; AResponse: TBrookResponse; const ANames,
  60. AValues: TBrookArrayOfString; ARoute: TBrookRoute; var AHandled: Boolean);
  61. begin
  62. Execute(ASender, AAction, ARoute);
  63. if Assigned(FOldExecute) then
  64. FOldExecute(ASender, AAction, ARequest, AResponse, ANames, AValues, ARoute,
  65. AHandled);
  66. end;
  67. {$PUSH}{$WARN 5024 OFF}
  68. procedure TBrookMiddleware.Execute(ASender: TObject; AAction: TBrookAction;
  69. ARoute: TBrookRoute);
  70. begin
  71. if Assigned(FOnExecute) then
  72. FOnExecute(Self, AAction, ARoute);
  73. end;
  74. {$POP}
  75. procedure TBrookMiddleware.BindExecution(AEvent: PBrookExecuteActionEvent);
  76. begin
  77. if Assigned(AEvent) then
  78. begin
  79. FOldExecute := AEvent^;
  80. AEvent^ := @DoExecute;
  81. end;
  82. end;
  83. end.