| (* |
| * 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. |
| *) |
| |
| unit Thrift; |
| |
| interface |
| |
| uses |
| SysUtils, |
| Thrift.Exception, |
| Thrift.Protocol; |
| |
| const |
| Version = '0.12.0'; |
| |
| type |
| TException = Thrift.Exception.TException; // compatibility alias |
| |
| TApplicationExceptionSpecializedClass = class of TApplicationExceptionSpecialized; |
| |
| TApplicationException = class( TException) |
| public |
| type |
| {$SCOPEDENUMS ON} |
| TExceptionType = ( |
| Unknown, |
| UnknownMethod, |
| InvalidMessageType, |
| WrongMethodName, |
| BadSequenceID, |
| MissingResult, |
| InternalError, |
| ProtocolError, |
| InvalidTransform, |
| InvalidProtocol, |
| UnsupportedClientType |
| ); |
| {$SCOPEDENUMS OFF} |
| private |
| function GetType: TExceptionType; |
| protected |
| constructor HiddenCreate(const Msg: string); |
| public |
| // purposefully hide inherited constructor |
| class function Create(const Msg: string): TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; |
| class function Create: TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; |
| class function Create( AType: TExceptionType): TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; |
| class function Create( AType: TExceptionType; const msg: string): TApplicationException; overload; deprecated 'Use specialized TApplicationException types (or regenerate from IDL)'; |
| |
| class function GetSpecializedExceptionType(AType: TExceptionType): TApplicationExceptionSpecializedClass; |
| |
| class function Read( const iprot: IProtocol): TApplicationException; |
| procedure Write( const oprot: IProtocol ); |
| end; |
| |
| // Needed to remove deprecation warning |
| TApplicationExceptionSpecialized = class abstract (TApplicationException) |
| public |
| constructor Create(const Msg: string); |
| end; |
| |
| TApplicationExceptionUnknown = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionUnknownMethod = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionInvalidMessageType = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionWrongMethodName = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionBadSequenceID = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionMissingResult = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionInternalError = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionProtocolError = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionInvalidTransform = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionInvalidProtocol = class (TApplicationExceptionSpecialized); |
| TApplicationExceptionUnsupportedClientType = class (TApplicationExceptionSpecialized); |
| |
| |
| implementation |
| |
| { TApplicationException } |
| |
| function TApplicationException.GetType: TExceptionType; |
| begin |
| if Self is TApplicationExceptionUnknownMethod then Result := TExceptionType.UnknownMethod |
| else if Self is TApplicationExceptionInvalidMessageType then Result := TExceptionType.InvalidMessageType |
| else if Self is TApplicationExceptionWrongMethodName then Result := TExceptionType.WrongMethodName |
| else if Self is TApplicationExceptionBadSequenceID then Result := TExceptionType.BadSequenceID |
| else if Self is TApplicationExceptionMissingResult then Result := TExceptionType.MissingResult |
| else if Self is TApplicationExceptionInternalError then Result := TExceptionType.InternalError |
| else if Self is TApplicationExceptionProtocolError then Result := TExceptionType.ProtocolError |
| else if Self is TApplicationExceptionInvalidTransform then Result := TExceptionType.InvalidTransform |
| else if Self is TApplicationExceptionInvalidProtocol then Result := TExceptionType.InvalidProtocol |
| else if Self is TApplicationExceptionUnsupportedClientType then Result := TExceptionType.UnsupportedClientType |
| else Result := TExceptionType.Unknown; |
| end; |
| |
| constructor TApplicationException.HiddenCreate(const Msg: string); |
| begin |
| inherited Create(Msg); |
| end; |
| |
| class function TApplicationException.Create(const Msg: string): TApplicationException; |
| begin |
| Result := TApplicationExceptionUnknown.Create(Msg); |
| end; |
| |
| class function TApplicationException.Create: TApplicationException; |
| begin |
| Result := TApplicationExceptionUnknown.Create(''); |
| end; |
| |
| class function TApplicationException.Create( AType: TExceptionType): TApplicationException; |
| begin |
| {$WARN SYMBOL_DEPRECATED OFF} |
| Result := Create(AType, ''); |
| {$WARN SYMBOL_DEPRECATED DEFAULT} |
| end; |
| |
| class function TApplicationException.Create( AType: TExceptionType; const msg: string): TApplicationException; |
| begin |
| Result := GetSpecializedExceptionType(AType).Create(msg); |
| end; |
| |
| class function TApplicationException.GetSpecializedExceptionType(AType: TExceptionType): TApplicationExceptionSpecializedClass; |
| begin |
| case AType of |
| TExceptionType.UnknownMethod: Result := TApplicationExceptionUnknownMethod; |
| TExceptionType.InvalidMessageType: Result := TApplicationExceptionInvalidMessageType; |
| TExceptionType.WrongMethodName: Result := TApplicationExceptionWrongMethodName; |
| TExceptionType.BadSequenceID: Result := TApplicationExceptionBadSequenceID; |
| TExceptionType.MissingResult: Result := TApplicationExceptionMissingResult; |
| TExceptionType.InternalError: Result := TApplicationExceptionInternalError; |
| TExceptionType.ProtocolError: Result := TApplicationExceptionProtocolError; |
| TExceptionType.InvalidTransform: Result := TApplicationExceptionInvalidTransform; |
| TExceptionType.InvalidProtocol: Result := TApplicationExceptionInvalidProtocol; |
| TExceptionType.UnsupportedClientType: Result := TApplicationExceptionUnsupportedClientType; |
| else |
| Result := TApplicationExceptionUnknown; |
| end; |
| end; |
| |
| class function TApplicationException.Read( const iprot: IProtocol): TApplicationException; |
| var |
| field : TThriftField; |
| msg : string; |
| typ : TExceptionType; |
| struc : TThriftStruct; |
| begin |
| msg := ''; |
| typ := TExceptionType.Unknown; |
| struc := iprot.ReadStructBegin; |
| while ( True ) do |
| begin |
| field := iprot.ReadFieldBegin; |
| if ( field.Type_ = TType.Stop) then |
| begin |
| Break; |
| end; |
| |
| case field.Id of |
| 1 : begin |
| if ( field.Type_ = TType.String_) then |
| begin |
| msg := iprot.ReadString; |
| end else |
| begin |
| TProtocolUtil.Skip( iprot, field.Type_ ); |
| end; |
| end; |
| |
| 2 : begin |
| if ( field.Type_ = TType.I32) then |
| begin |
| typ := TExceptionType( iprot.ReadI32 ); |
| end else |
| begin |
| TProtocolUtil.Skip( iprot, field.Type_ ); |
| end; |
| end else |
| begin |
| TProtocolUtil.Skip( iprot, field.Type_); |
| end; |
| end; |
| iprot.ReadFieldEnd; |
| end; |
| iprot.ReadStructEnd; |
| Result := GetSpecializedExceptionType(typ).Create(msg); |
| end; |
| |
| procedure TApplicationException.Write( const oprot: IProtocol); |
| var |
| struc : TThriftStruct; |
| field : TThriftField; |
| begin |
| Init(struc, 'TApplicationException'); |
| Init(field); |
| |
| oprot.WriteStructBegin( struc ); |
| if Message <> '' then |
| begin |
| field.Name := 'message'; |
| field.Type_ := TType.String_; |
| field.Id := 1; |
| oprot.WriteFieldBegin( field ); |
| oprot.WriteString( Message ); |
| oprot.WriteFieldEnd; |
| end; |
| |
| field.Name := 'type'; |
| field.Type_ := TType.I32; |
| field.Id := 2; |
| oprot.WriteFieldBegin(field); |
| oprot.WriteI32(Integer(GetType)); |
| oprot.WriteFieldEnd(); |
| oprot.WriteFieldStop(); |
| oprot.WriteStructEnd(); |
| end; |
| |
| { TApplicationExceptionSpecialized } |
| |
| constructor TApplicationExceptionSpecialized.Create(const Msg: string); |
| begin |
| inherited HiddenCreate(Msg); |
| end; |
| |
| end. |