From 606f1ef31447526b908244933d5b716397a6bad8 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Mon, 9 Apr 2018 23:09:41 +0200 Subject: [PATCH] THRIFT-4549 Thrift exceptions should derive from TException Client: Delphi Patch: Jens Geyer --- lib/delphi/src/Thrift.Exception.pas | 62 +++++ lib/delphi/src/Thrift.Protocol.pas | 3 +- lib/delphi/src/Thrift.Transport.pas | 3 +- lib/delphi/src/Thrift.pas | 30 +-- lib/delphi/test/client.dpr | 1 + .../multiplexed/Multiplex.Test.Client.dpr | 1 + .../multiplexed/Multiplex.Test.Server.dpr | 1 + lib/delphi/test/serializer/TestSerializer.dpr | 1 + lib/delphi/test/server.dpr | 1 + lib/delphi/test/skip/skiptest_version1.dpr | 1 + lib/delphi/test/skip/skiptest_version2.dpr | 1 + .../test/typeregistry/TestTypeRegistry.dpr | 1 + tutorial/delphi/DelphiClient/DelphiClient.dpr | 20 +- .../delphi/DelphiClient/DelphiClient.dproj | 238 +++++++++--------- tutorial/delphi/DelphiServer/DelphiServer.dpr | 18 +- .../delphi/DelphiServer/DelphiServer.dproj | 236 ++++++++--------- 16 files changed, 336 insertions(+), 282 deletions(-) create mode 100644 lib/delphi/src/Thrift.Exception.pas diff --git a/lib/delphi/src/Thrift.Exception.pas b/lib/delphi/src/Thrift.Exception.pas new file mode 100644 index 00000000000..5d15c365690 --- /dev/null +++ b/lib/delphi/src/Thrift.Exception.pas @@ -0,0 +1,62 @@ +(* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + *) + +{$SCOPEDENUMS ON} + +unit Thrift.Exception; + +interface + +uses + Classes, SysUtils; + +type + // base class for all Thrift exceptions + TException = class( SysUtils.Exception) + public + function Message : string; // hide inherited property: allow read, but prevent accidental writes + procedure UpdateMessageProperty; // update inherited message property with toString() + end; + + + + +implementation + +{ TException } + +function TException.Message; +// allow read (exception summary), but prevent accidental writes +// read will return the exception summary +begin + result := Self.ToString; +end; + +procedure TException.UpdateMessageProperty; +// Update the inherited Message property to better conform to standard behaviour. +// Nice benefit: The IDE is now able to show the exception message again. +begin + inherited Message := Self.ToString; // produces a summary text +end; + + + + +end. + diff --git a/lib/delphi/src/Thrift.Protocol.pas b/lib/delphi/src/Thrift.Protocol.pas index 24f67914505..36509ca1882 100644 --- a/lib/delphi/src/Thrift.Protocol.pas +++ b/lib/delphi/src/Thrift.Protocol.pas @@ -27,6 +27,7 @@ interface Classes, SysUtils, Contnrs, + Thrift.Exception, Thrift.Stream, Thrift.Collections, Thrift.Transport; @@ -116,7 +117,7 @@ TThriftStringBuilder = class( TStringBuilder) function Append(const Value: IThriftContainer): TStringBuilder; overload; end; - TProtocolException = class( Exception ) + TProtocolException = class( TException) public const // TODO(jensg): change into enum UNKNOWN = 0; diff --git a/lib/delphi/src/Thrift.Transport.pas b/lib/delphi/src/Thrift.Transport.pas index 4af65f95f24..997f4064d48 100644 --- a/lib/delphi/src/Thrift.Transport.pas +++ b/lib/delphi/src/Thrift.Transport.pas @@ -39,6 +39,7 @@ interface {$ENDIF} {$ENDIF} Thrift.Collections, + Thrift.Exception, Thrift.Utils, Thrift.Stream; @@ -79,7 +80,7 @@ TTransportImpl = class( TInterfacedObject, ITransport) procedure Flush; virtual; end; - TTransportException = class( Exception ) + TTransportException = class( TException) public type TExceptionType = ( diff --git a/lib/delphi/src/Thrift.pas b/lib/delphi/src/Thrift.pas index 6eca3c9cb30..ddd4c11f976 100644 --- a/lib/delphi/src/Thrift.pas +++ b/lib/delphi/src/Thrift.pas @@ -22,15 +22,19 @@ interface uses - SysUtils, Thrift.Protocol; + SysUtils, + Thrift.Exception, + Thrift.Protocol; const Version = '1.0.0-dev'; type + TException = Thrift.Exception.TException; // compatibility alias + TApplicationExceptionSpecializedClass = class of TApplicationExceptionSpecialized; - TApplicationException = class( SysUtils.Exception ) + TApplicationException = class( TException) public type {$SCOPEDENUMS ON} @@ -83,31 +87,9 @@ TApplicationExceptionInvalidTransform = class (TApplicationExceptionSpecialize TApplicationExceptionInvalidProtocol = class (TApplicationExceptionSpecialized); TApplicationExceptionUnsupportedClientType = class (TApplicationExceptionSpecialized); - // base class for IDL-generated exceptions - TException = class( SysUtils.Exception) - public - function Message : string; // hide inherited property: allow read, but prevent accidental writes - procedure UpdateMessageProperty; // update inherited message property with toString() - end; implementation -{ TException } - -function TException.Message; -// allow read (exception summary), but prevent accidental writes -// read will return the exception summary -begin - result := Self.ToString; -end; - -procedure TException.UpdateMessageProperty; -// Update the inherited Message property to better conform to standard behaviour. -// Nice benefit: The IDE is now able to show the exception message again. -begin - inherited Message := Self.ToString; // produces a summary text -end; - { TApplicationException } function TApplicationException.GetType: TExceptionType; diff --git a/lib/delphi/test/client.dpr b/lib/delphi/test/client.dpr index 1791c18b84f..06dbd3df767 100644 --- a/lib/delphi/test/client.dpr +++ b/lib/delphi/test/client.dpr @@ -29,6 +29,7 @@ uses Thrift in '..\src\Thrift.pas', Thrift.Transport in '..\src\Thrift.Transport.pas', Thrift.Socket in '..\src\Thrift.Socket.pas', + Thrift.Exception in '..\src\Thrift.Exception.pas', Thrift.Transport.Pipes in '..\src\Thrift.Transport.Pipes.pas', Thrift.Protocol in '..\src\Thrift.Protocol.pas', Thrift.Protocol.JSON in '..\src\Thrift.Protocol.JSON.pas', diff --git a/lib/delphi/test/multiplexed/Multiplex.Test.Client.dpr b/lib/delphi/test/multiplexed/Multiplex.Test.Client.dpr index 14d643137ce..4278d8f0c58 100644 --- a/lib/delphi/test/multiplexed/Multiplex.Test.Client.dpr +++ b/lib/delphi/test/multiplexed/Multiplex.Test.Client.dpr @@ -27,6 +27,7 @@ uses Multiplex.Client.Main in 'Multiplex.Client.Main.pas', Thrift in '..\..\src\Thrift.pas', Thrift.Socket in '..\..\src\Thrift.Socket.pas', + Thrift.Exception in '..\..\src\Thrift.Exception.pas', Thrift.Transport in '..\..\src\Thrift.Transport.pas', Thrift.Transport.Pipes in '..\..\src\Thrift.Transport.Pipes.pas', Thrift.Protocol in '..\..\src\Thrift.Protocol.pas', diff --git a/lib/delphi/test/multiplexed/Multiplex.Test.Server.dpr b/lib/delphi/test/multiplexed/Multiplex.Test.Server.dpr index 0e51a9ca0ab..120462bf955 100644 --- a/lib/delphi/test/multiplexed/Multiplex.Test.Server.dpr +++ b/lib/delphi/test/multiplexed/Multiplex.Test.Server.dpr @@ -26,6 +26,7 @@ uses Multiplex.Server.Main in 'Multiplex.Server.Main.pas', ConsoleHelper in '..\ConsoleHelper.pas', Thrift in '..\..\src\Thrift.pas', + Thrift.Exception in '..\..\src\Thrift.Exception.pas', Thrift.Socket in '..\..\src\Thrift.Socket.pas', Thrift.Transport in '..\..\src\Thrift.Transport.pas', Thrift.Transport.Pipes in '..\..\src\Thrift.Transport.Pipes.pas', diff --git a/lib/delphi/test/serializer/TestSerializer.dpr b/lib/delphi/test/serializer/TestSerializer.dpr index a621b7e2699..4360a73d4de 100644 --- a/lib/delphi/test/serializer/TestSerializer.dpr +++ b/lib/delphi/test/serializer/TestSerializer.dpr @@ -24,6 +24,7 @@ program TestSerializer; uses Classes, Windows, SysUtils, Generics.Collections, Thrift in '..\..\src\Thrift.pas', + Thrift.Exception in '..\..\src\Thrift.Exception.pas', Thrift.Socket in '..\..\src\Thrift.Socket.pas', Thrift.Transport in '..\..\src\Thrift.Transport.pas', Thrift.Protocol in '..\..\src\Thrift.Protocol.pas', diff --git a/lib/delphi/test/server.dpr b/lib/delphi/test/server.dpr index 9af85422218..b5e48a6b6e6 100644 --- a/lib/delphi/test/server.dpr +++ b/lib/delphi/test/server.dpr @@ -27,6 +27,7 @@ uses TestServerEvents in 'TestServerEvents.pas', Thrift.Test, // in gen-delphi folder Thrift in '..\src\Thrift.pas', + Thrift.Exception in '..\src\Thrift.Exception.pas', Thrift.Transport in '..\src\Thrift.Transport.pas', Thrift.Socket in '..\src\Thrift.Socket.pas', Thrift.Transport.Pipes in '..\src\Thrift.Transport.Pipes.pas', diff --git a/lib/delphi/test/skip/skiptest_version1.dpr b/lib/delphi/test/skip/skiptest_version1.dpr index 219db6d013d..803d6bd00fd 100644 --- a/lib/delphi/test/skip/skiptest_version1.dpr +++ b/lib/delphi/test/skip/skiptest_version1.dpr @@ -25,6 +25,7 @@ uses Classes, Windows, SysUtils, Skiptest.One, Thrift in '..\..\src\Thrift.pas', + Thrift.Exception in '..\..\src\Thrift.Exception.pas', Thrift.Socket in '..\..\src\Thrift.Socket.pas', Thrift.Transport in '..\..\src\Thrift.Transport.pas', Thrift.Protocol in '..\..\src\Thrift.Protocol.pas', diff --git a/lib/delphi/test/skip/skiptest_version2.dpr b/lib/delphi/test/skip/skiptest_version2.dpr index e0c31117e0e..633b247edf2 100644 --- a/lib/delphi/test/skip/skiptest_version2.dpr +++ b/lib/delphi/test/skip/skiptest_version2.dpr @@ -25,6 +25,7 @@ uses Classes, Windows, SysUtils, Skiptest.Two, Thrift in '..\..\src\Thrift.pas', + Thrift.Exception in '..\..\src\Thrift.Exception.pas', Thrift.Socket in '..\..\src\Thrift.Socket.pas', Thrift.Transport in '..\..\src\Thrift.Transport.pas', Thrift.Protocol in '..\..\src\Thrift.Protocol.pas', diff --git a/lib/delphi/test/typeregistry/TestTypeRegistry.dpr b/lib/delphi/test/typeregistry/TestTypeRegistry.dpr index 3a1fd2bcab2..18a7c7df3e6 100644 --- a/lib/delphi/test/typeregistry/TestTypeRegistry.dpr +++ b/lib/delphi/test/typeregistry/TestTypeRegistry.dpr @@ -25,6 +25,7 @@ uses Classes, Windows, SysUtils, Generics.Collections, TypInfo, Thrift in '..\..\src\Thrift.pas', Thrift.Transport in '..\..\src\Thrift.Transport.pas', + Thrift.Exception in '..\..\src\Thrift.Exception.pas', Thrift.Socket in '..\..\src\Thrift.Socket.pas', Thrift.Protocol in '..\..\src\Thrift.Protocol.pas', Thrift.Protocol.JSON in '..\..\src\Thrift.Protocol.JSON.pas', diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dpr b/tutorial/delphi/DelphiClient/DelphiClient.dpr index 0f380b0a698..74d0d45c6a5 100644 --- a/tutorial/delphi/DelphiClient/DelphiClient.dpr +++ b/tutorial/delphi/DelphiClient/DelphiClient.dpr @@ -26,7 +26,7 @@ uses Generics.Collections, Thrift in '..\..\..\lib\delphi\src\Thrift.pas', Thrift.Collections in '..\..\..\lib\delphi\src\Thrift.Collections.pas', - Thrift.Console in '..\..\..\lib\delphi\src\Thrift.Console.pas', + Thrift.Exception in '..\..\..\lib\delphi\src\Thrift.Exception.pas', Thrift.Utils in '..\..\..\lib\delphi\src\Thrift.Utils.pas', Thrift.Stream in '..\..\..\lib\delphi\src\Thrift.Stream.pas', Thrift.Protocol in '..\..\..\lib\delphi\src\Thrift.Protocol.pas', @@ -62,10 +62,10 @@ begin transport.Open; client.ping; - Console.WriteLine('ping()'); + WriteLn('ping()'); sum := client.add( 1, 1); - Console.WriteLine( Format( '1+1=%d', [sum])); + WriteLn( Format( '1+1=%d', [sum])); work := TWorkImpl.Create; @@ -74,11 +74,11 @@ begin work.Num2 := 0; try quotient := client.calculate(1, work); - Console.WriteLine( 'Whoa we can divide by 0'); - Console.WriteLine( Format('1/0=%d',[quotient])); + WriteLn( 'Whoa we can divide by 0'); + WriteLn( Format('1/0=%d',[quotient])); except on io: TInvalidOperation - do Console.WriteLine( 'Invalid operation: ' + io.Why); + do WriteLn( 'Invalid operation: ' + io.Why); end; work.Op := TOperation.SUBTRACT; @@ -86,20 +86,20 @@ begin work.Num2 := 10; try diff := client.calculate( 1, work); - Console.WriteLine( Format('15-10=%d', [diff])); + WriteLn( Format('15-10=%d', [diff])); except on io: TInvalidOperation - do Console.WriteLine( 'Invalid operation: ' + io.Why); + do WriteLn( 'Invalid operation: ' + io.Why); end; log := client.getStruct(1); - Console.WriteLine( Format( 'Check log: %s', [log.Value])); + WriteLn( Format( 'Check log: %s', [log.Value])); transport.Close(); except on e : Exception - do Console.WriteLine( e.ClassName+': '+e.Message); + do WriteLn( e.ClassName+': '+e.Message); end; end; diff --git a/tutorial/delphi/DelphiClient/DelphiClient.dproj b/tutorial/delphi/DelphiClient/DelphiClient.dproj index 34aa53388ea..ead7bceb742 100644 --- a/tutorial/delphi/DelphiClient/DelphiClient.dproj +++ b/tutorial/delphi/DelphiClient/DelphiClient.dproj @@ -1,119 +1,119 @@ - - - {2B8FB3A1-2F9E-4883-8C53-0F56220B34F6} - DelphiClient.dpr - 12.3 - True - Debug - Win32 - Console - None - DCC32 - - - true - - - true - Base - true - - - true - Base - true - - - ..\..\..\lib\delphi\src;$(DCC_UnitSearchPath) - 00400000 - .\dcu\$(Config)\$(Platform) - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias) - ..\bin\$(Config)\$(Platform) - false - false - false - false - false - - - DEBUG;$(DCC_Define) - false - true - - - false - RELEASE;$(DCC_Define) - 0 - false - - - - MainSource - - - - - - - - - - - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - - - Delphi.Personality.12 - - - - - True - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - Thrift Tutorial - 1.0.0.0 - DelphiClient - Copyright © 2012 The Apache Software Foundation - - DelphiClient.exe - Thrift - 1.0.0.0 - - - - DelphiClient.dpr - - - - True - - - 12 - - + + + {2B8FB3A1-2F9E-4883-8C53-0F56220B34F6} + DelphiClient.dpr + 12.3 + True + Debug + Win32 + Console + None + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + ..\..\..\lib\delphi\src;$(DCC_UnitSearchPath) + 00400000 + .\dcu\$(Config)\$(Platform) + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias) + ..\bin\$(Config)\$(Platform) + false + false + false + false + false + + + DEBUG;$(DCC_Define) + false + true + + + false + RELEASE;$(DCC_Define) + 0 + false + + + + MainSource + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + + + Delphi.Personality.12 + + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + Thrift Tutorial + 1.0.0.0 + DelphiClient + Copyright © 2012 The Apache Software Foundation + + DelphiClient.exe + Thrift + 1.0.0.0 + + + + DelphiClient.dpr + + + + True + + + 12 + + diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dpr b/tutorial/delphi/DelphiServer/DelphiServer.dpr index 9d54a2e66ec..5f42e7e1089 100644 --- a/tutorial/delphi/DelphiServer/DelphiServer.dpr +++ b/tutorial/delphi/DelphiServer/DelphiServer.dpr @@ -28,7 +28,7 @@ uses Generics.Collections, Thrift in '..\..\..\lib\delphi\src\Thrift.pas', Thrift.Collections in '..\..\..\lib\delphi\src\Thrift.Collections.pas', - Thrift.Console in '..\..\..\lib\delphi\src\Thrift.Console.pas', + Thrift.Exception in '..\..\..\lib\delphi\src\Thrift.Exception.pas', Thrift.Utils in '..\..\..\lib\delphi\src\Thrift.Utils.pas', Thrift.Stream in '..\..\..\lib\delphi\src\Thrift.Stream.pas', Thrift.Protocol in '..\..\..\lib\delphi\src\Thrift.Protocol.pas', @@ -86,13 +86,13 @@ end; procedure TCalculatorHandler.ping; begin - Console.WriteLine( 'ping()'); + WriteLn( 'ping()'); end; function TCalculatorHandler.add(num1: Integer; num2: Integer): Integer; begin - Console.WriteLine( Format( 'add( %d, %d)', [num1, num2])); + WriteLn( Format( 'add( %d, %d)', [num1, num2])); result := num1 + num2; end; @@ -101,7 +101,7 @@ function TCalculatorHandler.calculate(logid: Integer; const w: IWork): Integer; var entry : ISharedStruct; begin try - Console.WriteLine( Format('calculate( %d, [%d,%d,%d])', [logid, Ord(w.Op), w.Num1, w.Num2])); + WriteLn( Format('calculate( %d, [%d,%d,%d])', [logid, Ord(w.Op), w.Num1, w.Num2])); case w.Op of TOperation.ADD : result := w.Num1 + w.Num2; @@ -126,14 +126,14 @@ end; function TCalculatorHandler.getStruct(key: Integer): ISharedStruct; begin - Console.WriteLine( Format( 'getStruct(%d)', [key])); + WriteLn( Format( 'getStruct(%d)', [key])); result := FLog[key]; end; procedure TCalculatorHandler.zip; begin - Console.WriteLine( 'zip()'); + WriteLn( 'zip()'); end; @@ -152,14 +152,14 @@ begin transport := TServerSocketImpl.Create( 9090); server := TSimpleServer.Create( processor, transport); - Console.WriteLine( 'Starting the server...'); + WriteLn( 'Starting the server...'); server.Serve(); except - on e: Exception do Console.WriteLine( e.Message); + on e: Exception do WriteLn( e.Message); end; - Console.WriteLine('done.'); + WriteLn('done.'); end; diff --git a/tutorial/delphi/DelphiServer/DelphiServer.dproj b/tutorial/delphi/DelphiServer/DelphiServer.dproj index 74811bc10e6..a26d95295a7 100644 --- a/tutorial/delphi/DelphiServer/DelphiServer.dproj +++ b/tutorial/delphi/DelphiServer/DelphiServer.dproj @@ -1,118 +1,118 @@ - - - {2B8FB3A1-2F9E-4883-8C53-0F56220B34F6} - DelphiServer.dpr - 12.3 - True - Debug - Win32 - Console - None - DCC32 - - - true - - - true - Base - true - - - true - Base - true - - - 00400000 - .\dcu\$(Config)\$(Platform) - WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias) - ..\bin\$(Config)\$(Platform) - false - false - false - false - false - - - DEBUG;$(DCC_Define) - false - true - - - false - RELEASE;$(DCC_Define) - 0 - false - - - - MainSource - - - - - - - - - - - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - - - Delphi.Personality.12 - - - - - True - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1033 - 1252 - - - - Thrift Tutorial - 1.0.0.0 - DelphiServer - Copyright © 2012 The Apache Software Foundation - - DelphiServer.exe - Thrift - 1.0.0.0 - - - - DelphiServer.dpr - - - - True - - - 12 - - + + + {2B8FB3A1-2F9E-4883-8C53-0F56220B34F6} + DelphiServer.dpr + 12.3 + True + Debug + Win32 + Console + None + DCC32 + + + true + + + true + Base + true + + + true + Base + true + + + 00400000 + .\dcu\$(Config)\$(Platform) + WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;$(DCC_UnitAlias) + ..\bin\$(Config)\$(Platform) + false + false + false + false + false + + + DEBUG;$(DCC_Define) + false + true + + + false + RELEASE;$(DCC_Define) + 0 + false + + + + MainSource + + + + + + + + + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + + + Delphi.Personality.12 + + + + + True + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1033 + 1252 + + + + Thrift Tutorial + 1.0.0.0 + DelphiServer + Copyright © 2012 The Apache Software Foundation + + DelphiServer.exe + Thrift + 1.0.0.0 + + + + DelphiServer.dpr + + + + True + + + 12 + +