// *************************************************************************** // // Delphi MVC Framework // // Copyright (c) 2010-2021 Daniele Teti and the DMVCFramework Team // // https://github.com/danieleteti/delphimvcframework // // *************************************************************************** // // Licensed 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 MVCFramework.Serializer.HTML; {$I dmvcframework.inc} {$WARN SYMBOL_DEPRECATED OFF} interface uses System.SysUtils, System.Classes, System.Rtti, System.TypInfo, System.Variants, System.Generics.Collections, Data.SqlTimSt, Data.FmtBcd, Data.DB, MVCFramework.Commons, MVCFramework.Serializer.Intf, MVCFramework.Serializer.Abstract, MVCFramework.DuckTyping, MVCFramework.Serializer.Commons; type TMVCHTMLSerializer = class(TMVCAbstractSerializer, IMVCSerializer) protected procedure RaiseNotImplemented; public procedure AfterConstruction; override; { IMVCSerializer } procedure RegisterTypeSerializer(const ATypeInfo: PTypeInfo; AInstance: IMVCTypeSerializer); function SerializeObject( const AObject: TObject; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil; const ASerializationAction: TMVCSerializationAction = nil ): string; overload; function SerializeObject( const AObject: IInterface; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil; const ASerializationAction: TMVCSerializationAction = nil ): string; overload; function SerializeCollection( const AList: TObject; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil; const ASerializationAction: TMVCSerializationAction = nil ): string; overload; function SerializeCollection( const AList: IInterface; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil; const ASerializationAction: TMVCSerializationAction = nil ): string; overload; function SerializeDataSet( const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList = []; const ANameCase: TMVCNameCase = ncAsIs; const ASerializationAction: TMVCDatasetSerializationAction = nil ): string; function SerializeDataSetRecord( const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList = []; const ANameCase: TMVCNameCase = ncAsIs; const ASerializationAction: TMVCDatasetSerializationAction = nil ): string; procedure DeserializeObject( const ASerializedObject: string; const AObject: TObject; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil; const ARootNode: string = '' ); overload; procedure DeserializeObject( const ASerializedObject: string; const AObject: IInterface; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil ); overload; procedure DeserializeCollection( const ASerializedList: string; const AList: TObject; const AClazz: TClass; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil; const ARootNode: string = '' ); overload; procedure DeserializeCollection( const ASerializedList: string; const AList: IInterface; const AClazz: TClass; const AType: TMVCSerializationType = stDefault; const AIgnoredAttributes: TMVCIgnoredList = nil ); overload; procedure DeserializeDataSet( const ASerializedDataSet: string; const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList = []; const ANameCase: TMVCNameCase = ncAsIs ); procedure DeserializeDataSetRecord( const ASerializedDataSetRecord: string; const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList = []; const ANameCase: TMVCNameCase = ncAsIs ); end; implementation uses System.NetEncoding, MVCFramework, MVCFramework.Logger, MVCFramework.DataSet.Utils, MVCFramework.Nullables; const HTML_HEADER = 'DMVCFramework Exception' + '' + '
'; HTML_FOOTER = '
'; function HTMLEntitiesEncode(const Text: string): String; begin Result := TNetEncoding.HTML.Encode(Text); end; { TMVCHTMLSerializer } procedure TMVCHTMLSerializer.AfterConstruction; begin inherited AfterConstruction; end; procedure TMVCHTMLSerializer.DeserializeCollection( const ASerializedList: string; const AList: IInterface; const AClazz: TClass; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList); begin RaiseNotImplemented; end; procedure TMVCHTMLSerializer.DeserializeCollection( const ASerializedList: string; const AList: TObject; const AClazz: TClass; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList; const ARootNode: string); begin RaiseNotImplemented; end; procedure TMVCHTMLSerializer.DeserializeDataSet( const ASerializedDataSet: string; const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList; const ANameCase: TMVCNameCase); begin RaiseNotImplemented; end; procedure TMVCHTMLSerializer.DeserializeDataSetRecord( const ASerializedDataSetRecord: string; const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList; const ANameCase: TMVCNameCase); begin RaiseNotImplemented; end; procedure TMVCHTMLSerializer.DeserializeObject(const ASerializedObject: string; const AObject: TObject; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList; const ARootNode: string); begin RaiseNotImplemented; end; procedure TMVCHTMLSerializer.DeserializeObject(const ASerializedObject: string; const AObject: IInterface; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList); begin RaiseNotImplemented; end; procedure TMVCHTMLSerializer.RaiseNotImplemented; begin raise EMVCException.Create('Not Implemented'); end; procedure TMVCHTMLSerializer.RegisterTypeSerializer(const ATypeInfo: PTypeInfo; AInstance: IMVCTypeSerializer); begin RaiseNotImplemented; end; function TMVCHTMLSerializer.SerializeCollection(const AList: TObject; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList; const ASerializationAction: TMVCSerializationAction): string; begin RaiseNotImplemented; end; function TMVCHTMLSerializer.SerializeCollection(const AList: IInterface; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList; const ASerializationAction: TMVCSerializationAction): string; begin RaiseNotImplemented; end; function TMVCHTMLSerializer.SerializeDataSet(const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList; const ANameCase: TMVCNameCase; const ASerializationAction: TMVCDatasetSerializationAction): string; begin RaiseNotImplemented; end; function TMVCHTMLSerializer.SerializeDataSetRecord(const ADataSet: TDataSet; const AIgnoredFields: TMVCIgnoredList; const ANameCase: TMVCNameCase; const ASerializationAction: TMVCDatasetSerializationAction): string; begin RaiseNotImplemented; end; function TMVCHTMLSerializer.SerializeObject(const AObject: TObject; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList; const ASerializationAction: TMVCSerializationAction): string; var lBody: string; lMVCException: EMVCException; lException: Exception; lErrResponse: TMVCErrorResponse; lErrResponseItem: TMVCErrorResponseItem; lErr: string; function EmitExceptionClass(const Value: string): string; begin Result := Result + '
Exception Class Name: ' + HTMLEntitiesEncode(Value) + '
'; end; function EmitTitle(const HTTPStatusCode: Word; const Value: string): string; begin Result := ''; if Assigned(FConfig) then begin Result := '

' + FConfig[TMVCConfigKey.ServerName] + '

'; end; Result := Result + '

HTTP ' + HTTPStatusCode.ToString + '

'; Result := Result + '

' + HTMLEntitiesEncode(Value) + '

'; end; begin lBody := ''; if AObject is Exception then begin if AObject is EMVCException then begin lMVCException := EMVCException(AObject); lBody := EmitTitle(lMVCException.HttpErrorCode, lMVCException.Message) + sLineBreak + EmitExceptionClass(lMVCException.ClassName) + sLineBreak + '

' + HTMLEntitiesEncode(lMVCException.DetailedMessage) + '

' + sLineBreak + '
' + '

Application Error Code: ' + lMVCException.ApplicationErrorCode.ToString + '

' + sLineBreak + '

Error Items:

'; end else begin lException := Exception(AObject); lBody := EmitTitle(500, lException.Message) + sLineBreak + EmitExceptionClass(lException.ClassName) + sLineBreak; end; end; if AObject is TMVCErrorResponse then begin lErrResponse := TMVCErrorResponse(AObject); lBody := EmitTitle(lErrResponse.StatusCode, lErrResponse.Message) + sLineBreak + EmitExceptionClass(lErrResponse.ClassName) + sLineBreak + '
' + '

' + HTMLEntitiesEncode(lErrResponse.DetailedMessage) + '

' + sLineBreak + '

Application Error Code: ' + lErrResponse.AppErrorCode.ToString + '

' + sLineBreak + '

Error Items:

'; end; if lBody.IsEmpty then begin RaiseNotImplemented end else begin Result := HTML_HEADER + lBody + HTML_FOOTER; end; end; function TMVCHTMLSerializer.SerializeObject(const AObject: IInterface; const AType: TMVCSerializationType; const AIgnoredAttributes: TMVCIgnoredList; const ASerializationAction: TMVCSerializationAction): string; begin RaiseNotImplemented; end; end.