martes, 16 de diciembre de 2008

Negocio.Core.ObjetoBase.vb

Namespace Negocio

  <Serializable()> _
  Public MustInherit Class ObjetoBase : Implements IExportable : Implements Dal.ILoader
    Public MustOverride Property Id() As Integer
    Public MustOverride Overloads Function ToString(ByVal CustomFormat As Boolean) As String

    Public Sub New()
    End Sub

    Public Overridable Function DeleteString() As String
      Return "Confirma la eliminacion del elemento: {0}"
    End Function


#Region " Interface ILoader "
    <NonSerialized()> _
    Private _ConnectionProvider As Dal.ConnectionProviderDelegate = Nothing
    <Xml.Serialization.XmlIgnore()> _
    Public Property ConnectionProvider() As Dal.ConnectionProviderDelegate Implements Dal.ILoader.ConnectionProvider
      Get
        Return _ConnectionProvider
      End Get
      Set(ByVal value As Dal.ConnectionProviderDelegate)
        _ConnectionProvider = value
      End Set
    End Property

    <NonSerialized()> _
    Private _TransactionProvider As Dal.TransactionProviderDelegate = Nothing
    <Xml.Serialization.XmlIgnore()> _
    Public Property TransactionProvider() As Dal.TransactionProviderDelegate Implements Dal.ILoader.transactionProvider
      Get
        Return _TransactionProvider
      End Get
      Set(ByVal value As Dal.TransactionProviderDelegate)
        _TransactionProvider = value
      End Set
    End Property

    Public Overridable Function GetBinder() As Dal.ObjectLoader Implements Dal.ILoader.GetObjectLoader
      Return Nothing
    End Function
#End Region

    Public Overridable Function ToXml() As String Implements IExportable.FormatoXml
      With New Xml.Serialization.XmlSerializer(Me.GetType)
        Dim _SWriter As New IO.StringWriter()
        .Serialize(_SWriter, Me)
        Dim xml As String = _SWriter.ToString()
        With New System.Xml.XmlDocument()
          .LoadXml(xml)
          Return .DocumentElement.InnerXml
        End With
      End With
    End Function

    Public Overridable Function ToCSV(ByVal separador As String) As String Implements IExportable.FormatoCsv
      With New Xml.Serialization.XmlSerializer(Me.GetType)
        Dim _SWriter As New IO.StringWriter()
        .Serialize(_SWriter, Me)
        With New System.Xml.XmlDocument()
          .LoadXml(_SWriter.ToString())
          Dim s As New System.Text.StringBuilder
          For i As Integer = 0 To .ChildNodes(1).ChildNodes.Count - 1
            s.Append(.ChildNodes(1).ChildNodes(i).InnerText.Replace(separador, ".") & separador)
          Next
          s.Remove(s.Length - 1, 1)
          Return s.ToString
        End With
      End With
    End Function

    Public Overridable Function HeaderCSV(ByVal separador As String) As String Implements IExportable.HeaderCsv
      With New Xml.Serialization.XmlSerializer(Me.GetType)
        Dim _SWriter As New IO.StringWriter()
        .Serialize(_SWriter, Me)
        With New System.Xml.XmlDocument()
          .LoadXml(_SWriter.ToString())
          Dim s As New System.Text.StringBuilder
          For i As Integer = 0 To .ChildNodes(1).ChildNodes.Count - 1
            s.Append(.ChildNodes(1).ChildNodes(i).Name & separador)
          Next
          s.Remove(s.Length - 1, 1)
          Return s.ToString
        End With
      End With
    End Function

    Public Function this() As ObjetoBase
      Return Me
    End Function

    <NonSerialized()> _
    Private _Tag As Object = Nothing
    <Xml.Serialization.XmlIgnore()> _
    Public Property Tag() As Object
      Get
        Return _Tag
      End Get
      Set(ByVal Value As Object)
        _Tag = Value
      End Set
    End Property

    Public Shared Function ToBase64XmlString(Of T)(ByVal input As T) As String
      If input Is Nothing Then Return Nothing
      Dim writer As New IO.MemoryStream()
      Dim formatter As Xml.Serialization.XmlSerializer = New Xml.Serialization.XmlSerializer(input.GetType)
      formatter.Serialize(writer, input)
      Return Convert.ToBase64String(writer.ToArray)
    End Function

    Public Shared Function FromBase64XmlString(Of T)(ByVal input As String) As T
      If input Is Nothing Or input.Length = 0 Then Return Nothing
      Dim formatter As Xml.Serialization.XmlSerializer = New Xml.Serialization.XmlSerializer(GetType(T))
      Return formatter.Deserialize(New IO.MemoryStream(Convert.FromBase64String(input)))
    End Function


#Region " Compresion "


    Public Shared Function ToBase64XmlStringCompress(Of T)(ByVal input As T) As String
      If input Is Nothing Then Return Nothing
      Dim writer As New IO.MemoryStream()
      Dim formatter As Xml.Serialization.XmlSerializer = New Xml.Serialization.XmlSerializer(input.GetType)
      'Dim formatter As Runtime.Serialization.Formatters.Binary.BinaryFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
      formatter.Serialize(writer, input)
      writer.Position = 0
      Return Convert.ToBase64String(Compress(writer))
    End Function

    Public Shared Function FromBase64XmlStringCompress(Of T)(ByVal input As String) As T
      If input Is Nothing Or input.Length = 0 Then Return Nothing
      Dim formatter As Xml.Serialization.XmlSerializer = New Xml.Serialization.XmlSerializer(GetType(T))
      'Dim formatter As Runtime.Serialization.Formatters.Binary.BinaryFormatter = New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
      Return formatter.Deserialize(New IO.MemoryStream(Decompress(New IO.MemoryStream(Convert.FromBase64String(input)))))
    End Function

    Private Shared Function Compress(ByVal stream As IO.Stream) As Byte()
      Using resultStream As IO.MemoryStream = New IO.MemoryStream()
        Using writeStream As IO.Compression.GZipStream = New IO.Compression.GZipStream(resultStream, IO.Compression.CompressionMode.Compress, True)
          CopyBuffered(stream, writeStream)
        End Using
        Return resultStream.ToArray()
      End Using
    End Function

    Private Shared ReadOnly bufferSize As Integer = 10000
    Private Shared Sub CopyBuffered(ByVal readStream As IO.Stream, ByVal writeStream As IO.Stream)
      Dim bytes(bufferSize) As Byte
      Dim byteCount As Integer = readStream.Read(bytes, 0, bytes.Length)
      While byteCount <> 0
        writeStream.Write(bytes, 0, byteCount)
        byteCount = readStream.Read(bytes, 0, bytes.Length)
      End While
    End Sub

    Private Shared Function Decompress(ByVal stream As IO.Stream) As Byte()
      Using decompressedStream As IO.Stream = New IO.Compression.GZipStream(stream, IO.Compression.CompressionMode.Decompress, False)
        Using resultStream As IO.MemoryStream = New IO.MemoryStream()
          CopyBuffered(decompressedStream, resultStream)
          Return resultStream.ToArray()
        End Using
      End Using
    End Function
#End Region


  End Class

End Namespace

No hay comentarios: