Mini Kabibi Habibi
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.SessionState
Imports System.Xml.Linq
Public Class Data
Private Const PopularCountriesCount As Integer = 20
Private Const SearchQuerySID As String = "SQ"
Private Const AllHotelsSID As String = "AH"
Public Shared ReadOnly Property Instance() As Data
Get
If HttpContext.Current.Items("DG") Is Nothing Then
HttpContext.Current.Items("DG") = New Data()
End If
Return CType(HttpContext.Current.Items("DG"), Data)
End Get
End Property
Public Sub New()
FakeDataHelper = New FakeDataHelper()
LoadXmlData()
End Sub
Public Property CurrentQuery() As SearchQuery
Get
Return TryCast(Session(SearchQuerySID), SearchQuery)
End Get
Set(ByVal value As SearchQuery)
Session(SearchQuerySID) = value
End Set
End Property
' Data
Private privateCountries As List(Of Country)
Public Property Countries() As List(Of Country)
Get
Return privateCountries
End Get
Protected Set(ByVal value As List(Of Country))
privateCountries = value
End Set
End Property
Private privateHotelServices As List(Of String)
Public Property HotelServices() As List(Of String)
Get
Return privateHotelServices
End Get
Protected Set(ByVal value As List(Of String))
privateHotelServices = value
End Set
End Property
Private privateRoomServices As List(Of String)
Public Property RoomServices() As List(Of String)
Get
Return privateRoomServices
End Get
Protected Set(ByVal value As List(Of String))
privateRoomServices = value
End Set
End Property
Private privateRoomTypes As List(Of String)
Public Property RoomTypes() As List(Of String)
Get
Return privateRoomTypes
End Get
Protected Set(ByVal value As List(Of String))
privateRoomTypes = value
End Set
End Property
Private privateCommonDescriptions As List(Of String)
Public Property CommonDescriptions() As List(Of String)
Get
Return privateCommonDescriptions
End Get
Protected Set(ByVal value As List(Of String))
privateCommonDescriptions = value
End Set
End Property
Private privateHotelDescriptions As List(Of String)
Public Property HotelDescriptions() As List(Of String)
Get
Return privateHotelDescriptions
End Get
Protected Set(ByVal value As List(Of String))
privateHotelDescriptions = value
End Set
End Property
Private privateRoomDescriptions As List(Of String)
Public Property RoomDescriptions() As List(Of String)
Get
Return privateRoomDescriptions
End Get
Protected Set(ByVal value As List(Of String))
privateRoomDescriptions = value
End Set
End Property
Private privateRoomTypesMaxChildrenCount As List(Of Integer)
Public Property RoomTypesMaxChildrenCount() As List(Of Integer)
Get
Return privateRoomTypesMaxChildrenCount
End Get
Protected Set(ByVal value As List(Of Integer))
privateRoomTypesMaxChildrenCount = value
End Set
End Property
Private privateHotelStars As List(Of Integer)
Public Property HotelStars() As List(Of Integer)
Get
Return privateHotelStars
End Get
Protected Set(ByVal value As List(Of Integer))
privateHotelStars = value
End Set
End Property
Public ReadOnly Property Hotels() As List(Of Hotel)
Get
If Session(AllHotelsSID) Is Nothing Then
Session(AllHotelsSID) = New List(Of Hotel)()
End If
Return CType(Session(AllHotelsSID), List(Of Hotel))
End Get
End Property
Public Function GetPopularCountries() As IEnumerable(Of Country)
Return FakeDataHelper.GetPopularCountries(Countries, PopularCountriesCount)
End Function
Public Function GetExclusiveHotels() As List(Of Hotel)
If (Not Hotels.Any(Function(hotel) hotel.IsExclusive)) Then
Hotels.AddRange(FakeDataHelper.GetHotels(SearchQuery.MostExclusive, TitleGroups, 10))
End If
Return Hotels.Where(Function(hotel) hotel.IsExclusive).ToList()
End Function
Public Function GetSearchResults() As IEnumerable(Of Hotel)
FakeDataHelper.UpdateHotelsList(TitleGroups)
Return Hotels.Where(Function(h) CurrentQuery.IsMatch(h))
End Function
Public Sub ClearMemory()
Session.Clear()
Session.Timeout = 3 * 24 * 60
End Sub
Private privateTitleGroups As List(Of XElement)
Protected Property TitleGroups() As List(Of XElement)
Get
Return privateTitleGroups
End Get
Set(ByVal value As List(Of XElement))
privateTitleGroups = value
End Set
End Property
Private privateFakeDataHelper As FakeDataHelper
Protected Property FakeDataHelper() As FakeDataHelper
Get
Return privateFakeDataHelper
End Get
Set(ByVal value As FakeDataHelper)
privateFakeDataHelper = value
End Set
End Property
Protected ReadOnly Property Session() As HttpSessionState
Get
Return HttpContext.Current.Session
End Get
End Property
' Xml load
Private Sub LoadXmlData()
Countries = LoadXmlDataInternal(Of Country)("Countries", "HotelDestinations", Function(el) New Country(el.Attribute("Title").Value, el.Attribute("Image").Value, el.Elements().Select(Function(c) c.Value).OrderBy(Function(oc) oc), FakeDataHelper.GetPopularity(el.Attribute("MostPopular") IsNot Nothing)))
HotelServices = LoadXmlDataInternal("HotelParameters", "HotelServices")
RoomServices = LoadXmlDataInternal("HotelParameters", "RoomServices")
RoomTypes = LoadXmlDataInternal("HotelParameters", "RoomTypes")
RoomTypesMaxChildrenCount = LoadXmlDataInternal("HotelParameters", "RoomTypes", "Children").ConvertAll(Of Integer)(Function(v) Convert.ToInt32(v))
HotelStars = New List(Of Integer)(New Integer() { 1, 2, 3, 4, 5 })
TitleGroups = LoadXmlDataInternal("TitleWordsDictionary", "Dictionary", Function(el) el)
CommonDescriptions = LoadXmlDataInternal("HotelParameters", "CommonDesc", "Text")
HotelDescriptions = LoadXmlDataInternal("HotelParameters", "HotelDesc", "Text")
RoomDescriptions = LoadXmlDataInternal("HotelParameters", "RoomDesc", "Text")
End Sub
Private Function LoadXmlDataInternal(ByVal fileName As String, ByVal rootNodeName As String) As List(Of String)
Return LoadXmlDataInternal(fileName, rootNodeName, "Title")
End Function
Private Function LoadXmlDataInternal(ByVal fileName As String, ByVal rootNodeName As String, ByVal attrName As String) As List(Of String)
Return LoadXmlDataInternal(fileName, rootNodeName, Function(el) el.Attribute(attrName).Value)
End Function
Private Function LoadXmlDataInternal(Of T)(ByVal fileName As String, ByVal rootNodeName As String, ByVal getElement As Func(Of XElement, T)) As List(Of T)
Dim doc As XDocument = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~\App_Data\{0}.xml", fileName)))
Return ( _
From node In doc.Root.Element(rootNodeName).Elements() _
Select getElement(node)).ToList()
End Function
End Class