1 (*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 *)
19
20 unit TestServerEvents;
21
22 interface
23
24 uses
25 SysUtils,
26 Thrift,
27 Thrift.Protocol,
28 Thrift.Transport,
29 Thrift.Server,
30 ConsoleHelper;
31
32 type
33 TRequestEventsImpl = class( TInterfacedObject, IRequestEvents)
34 protected
35 FStart : TDateTime;
36 // IRequestProcessingEvents
37 procedure PreRead;
38 procedure PostRead;
39 procedure PreWrite;
40 procedure PostWrite;
41 procedure OnewayComplete;
42 procedure UnhandledError( const e : Exception);
43 procedure CleanupContext;
44 public
45 constructor Create;
46 end;
47
48
49 TProcessorEventsImpl = class( TInterfacedObject, IProcessorEvents)
50 protected
51 FReqs : Integer;
52 // IProcessorEvents
53 procedure Processing( const transport : ITransport);
CreateRequestContextnull54 function CreateRequestContext( const aFunctionName : string) : IRequestEvents;
55 procedure CleanupContext;
56 public
57 constructor Create;
58 end;
59
60
61 TServerEventsImpl = class( TInterfacedObject, IServerEvents)
62 protected
63 // IServerEvents
64 procedure PreServe;
65 procedure PreAccept;
CreateProcessingContextnull66 function CreateProcessingContext( const input, output : IProtocol) : IProcessorEvents;
67 end;
68
69
70 implementation
71
72 { TServerEventsImpl }
73
74 procedure TServerEventsImpl.PreServe;
75 begin
76 Console.WriteLine('ServerEvents: Server starting to serve requests');
77 end;
78
79
80 procedure TServerEventsImpl.PreAccept;
81 begin
82 Console.WriteLine('ServerEvents: Server transport is ready to accept incoming calls');
83 end;
84
85
TServerEventsImpl.CreateProcessingContextnull86 function TServerEventsImpl.CreateProcessingContext(const input, output: IProtocol): IProcessorEvents;
87 begin
88 result := TProcessorEventsImpl.Create;
89 end;
90
91
92 { TProcessorEventsImpl }
93
94 constructor TProcessorEventsImpl.Create;
95 begin
96 inherited Create;
97 FReqs := 0;
98 Console.WriteLine('ProcessorEvents: Client connected, processing begins');
99 end;
100
101 procedure TProcessorEventsImpl.Processing(const transport: ITransport);
102 begin
103 Console.WriteLine('ProcessorEvents: Processing of incoming request begins');
104 end;
105
106
TProcessorEventsImpl.CreateRequestContextnull107 function TProcessorEventsImpl.CreateRequestContext( const aFunctionName: string): IRequestEvents;
108 begin
109 result := TRequestEventsImpl.Create;
110 Inc( FReqs);
111 end;
112
113
114 procedure TProcessorEventsImpl.CleanupContext;
115 begin
116 Console.WriteLine( 'ProcessorEvents: completed after handling '+IntToStr(FReqs)+' requests.');
117 end;
118
119
120 { TRequestEventsImpl }
121
122
123 constructor TRequestEventsImpl.Create;
124 begin
125 inherited Create;
126 FStart := Now;
127 Console.WriteLine('RequestEvents: New request');
128 end;
129
130
131 procedure TRequestEventsImpl.PreRead;
132 begin
133 Console.WriteLine('RequestEvents: Reading request message ...');
134 end;
135
136
137 procedure TRequestEventsImpl.PostRead;
138 begin
139 Console.WriteLine('RequestEvents: Reading request message completed');
140 end;
141
142 procedure TRequestEventsImpl.PreWrite;
143 begin
144 Console.WriteLine('RequestEvents: Writing response message ...');
145 end;
146
147
148 procedure TRequestEventsImpl.PostWrite;
149 begin
150 Console.WriteLine('RequestEvents: Writing response message completed');
151 end;
152
153
154 procedure TRequestEventsImpl.OnewayComplete;
155 begin
156 Console.WriteLine('RequestEvents: Oneway message processed');
157 end;
158
159
160 procedure TRequestEventsImpl.UnhandledError(const e: Exception);
161 begin
162 Console.WriteLine('RequestEvents: Unhandled exception of type '+e.classname);
163 end;
164
165
166 procedure TRequestEventsImpl.CleanupContext;
167 var millis : Double;
168 begin
169 millis := (Now - FStart) * (24*60*60*1000);
170 Console.WriteLine( 'Request processing completed in '+IntToStr(Round(millis))+' ms');
171 end;
172
173
174 end.
175