Imports Microsoft.WindowsAzure.Storage
Imports Microsoft.WindowsAzure.Storage.Auth
Imports Microsoft.WindowsAzure.Storage.Table
Imports System.Text.RegularExpressions
Public Class AzureEventEntity
Private Const VERSION_FORMAT As String = "0000000000000000000"
Private Const PROPERTYNAME_EVENTTYPE As String = "EventType"
Private Const PROPERTYNAME_SEQUENCE As String = "SequenceNumber"
''' <summary>
''' Turn the version into a consistently ordered string
''' </summary>
''' <param name="version">
''' The incremental number that represents the row version
''' </param>
''' <returns>
''' The version number formatted with leading zeros so the string order matches
''' the number order
''' </returns>
''' <remarks>
''' If version is less than 0, assume it to be zero.
''' </remarks>
Public Shared Function VersionToRowkey(ByVal version As Long) As String
If (version <= 0) Then
Return VERSION_FORMAT
Else
Return version.ToString(VERSION_FORMAT)
End If
End Function
''' <summary>
''' Turn the row key into a version number
''' </summary>
''' <param name="rowkey">
''' The row unique identifier
''' </param>
''' <returns>
''' The version number formatted with leading zeros so the string order matches
''' the number order
''' </returns>
''' <remarks>
''' If version is less than 0, assume it to be zero.
''' </remarks>
Public Shared Function RowKeyToVersion(ByVal rowkey As String) As Long
If (String.IsNullOrWhiteSpace(rowkey)) Then
Return 0
Else
Dim ret As Long
If (Long.TryParse(rowkey, ret)) Then
Return ret
Else
Return 0
End If
End If
End Function
Public Shared Function MakeDynamicTableEntity(ByVal eventToSave As IEventContext) As DynamicTableEntity
Dim ret As New DynamicTableEntity
ret.PartitionKey = eventToSave.GetAggregateIdentifier()
ret.RowKey = VersionToRowkey(eventToSave.Version)
'Add the event type - currently this is the
ret.Properties.Add(PROPERTYNAME_EVENTTYPE, New EntityProperty(eventToSave.EventInstance.GetType().Name))
'Add the context
If (eventToSave.SequenceNumber <= 0) Then
'Default sequence number is the current UTC date
ret.Properties.Add(PROPERTYNAME_SEQUENCE, New EntityProperty(DateTime.UtcNow.Ticks))
Else
ret.Properties.Add(PROPERTYNAME_SEQUENCE, New EntityProperty(eventToSave.SequenceNumber))
End If
If (Not String.IsNullOrWhiteSpace(eventToSave.Commentary)) Then
ret.Properties.Add("Commentary", New EntityProperty(eventToSave.Commentary))
End If
If (Not String.IsNullOrWhiteSpace(eventToSave.Who)) Then
ret.Properties.Add("Who", New EntityProperty(eventToSave.Who))
End If
If (Not String.IsNullOrWhiteSpace(eventToSave.Source)) Then
ret.Properties.Add("Source", New EntityProperty(eventToSave.Source))
End If
'Now add in the different properties of the payload
For Each pi As System.Reflection.PropertyInfo In eventToSave.EventInstance.GetType().GetProperties()
If (pi.CanRead) Then
ret.Properties.Add(pi.Name, MakeEntityProperty(pi, eventToSave.EventInstance))
End If
Next pi
Return ret
End Function
Public Shared Function MakeEventFromTableEntity(ByVal tableEntityRow As DynamicTableEntity) As IEventContext
'get the event type
'get the context parts
If (tableEntityRow.Properties.ContainsKey(PROPERTYNAME_SEQUENCE)) Then
End If
End Function
Private Const TABLE_ILLEGAL_CHAR_REGEX As String = "[\W_]"
Public Shared Function MakeValidTableName(strIn As String) As String
' Replace invalid characters with empty strings.
Try
Return Regex.Replace(strIn, TABLE_ILLEGAL_CHAR_REGEX, "").ToLower()
' If we timeout when replacing invalid characters,
' we should return String.Empty.
Catch e As RegexMatchTimeoutException
Return String.Empty
End Try
End Function
End Class