using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Windows.Data.Json;
using Windows.Storage;
namespace TestProject
{
/// <summary>
/// 컨트롤 정보 데이터 소스
/// </summary>
public sealed class ControlInfoDataSource
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 잠금 객체
/// </summary>
private static readonly object _lockObject = new object();
/// <summary>
/// 인스턴스
/// </summary>
private static ControlInfoDataSource _instance;
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 데이터 그룹 리스트
/// </summary>
private IList<ControlInfoDataGroup> dataGroupList = new List<ControlInfoDataGroup>();
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 인스턴스 - Instance
/// <summary>
/// 인스턴스
/// </summary>
public static ControlInfoDataSource Instance
{
get
{
return _instance;
}
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Public
#region 데이터 그룹 리스트 - DataGroupList
/// <summary>
/// 데이터 그룹 리스트
/// </summary>
public IList<ControlInfoDataGroup> DataGroupList
{
get
{
return this.dataGroupList;
}
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
////////////////////////////////////////////////////////////////////////////////////////// Static
#region 생성자 - ControlInfoDataSource()
/// <summary>
/// 생성자
/// </summary>
static ControlInfoDataSource()
{
_instance = new ControlInfoDataSource();
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Instance
//////////////////////////////////////////////////////////////////////////////// Private
#region 생성자 - ControlInfoDataSource()
/// <summary>
/// 생성자
/// </summary>
private ControlInfoDataSource()
{
}
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 데이터 그룹 열거 가능형 구하기 (비동기) - GetDataGroupEnumerableAsync()
/// <summary>
/// 데이터 그룹 열거 가능형 구하기 (비동기)
/// </summary>
/// <returns>데이터 그룹 열거 가능형</returns>
public async Task<IEnumerable<ControlInfoDataGroup>> GetDataGroupEnumerableAsync()
{
await _instance.GetControlInfoDataAsync();
return _instance.DataGroupList;
}
#endregion
#region 데이터 그룹 구하기 (비동기) - GetDataGroupAsync(uniqueID)
/// <summary>
/// 데이터 그룹 구하기 (비동기)
/// </summary>
/// <param name="uniqueID">고유 ID</param>
/// <returns>데이터 그룹 태스크</returns>
public async Task<ControlInfoDataGroup> GetDataGroupAsync(string uniqueID)
{
await _instance.GetControlInfoDataAsync();
IEnumerable<ControlInfoDataGroup> dataGroupEnumerable = _instance.DataGroupList.Where((group) => group.UniqueID.Equals(uniqueID));
if(dataGroupEnumerable.Count() == 1)
{
return dataGroupEnumerable.First();
}
return null;
}
#endregion
#region 데이터 항목 구하기 (비동기) - GetDataItemAsync(uniqueID)
/// <summary>
/// 데이터 항목 구하기 (비동기)
/// </summary>
/// <param name="uniqueID">고유 ID</param>
/// <returns>데이터 항목 태스크</returns>
public async Task<ControlInfoDataItem> GetDataItemAsync(string uniqueID)
{
await _instance.GetControlInfoDataAsync();
IEnumerable<ControlInfoDataItem> dataItemEnumerable = _instance.DataGroupList.SelectMany(group => group.DataItemCollection)
.Where((item) => item.UniqueID.Equals(uniqueID));
if(dataItemEnumerable.Count() > 0)
{
return dataItemEnumerable.First();
}
return null;
}
#endregion
#region 항목에서 데이터 그룹 구하기 (비동기) - GetDataGroupFromItemAsync(uniqueID)
/// <summary>
/// 항목에서 데이터 그룹 구하기 (비동기)
/// </summary>
/// <param name="uniqueID">고유 ID</param>
/// <returns>데이터 그룹 태스크</returns>
public async Task<ControlInfoDataGroup> GetDataGroupFromItemAsync(string uniqueID)
{
await _instance.GetControlInfoDataAsync();
IEnumerable<ControlInfoDataGroup> dataGroupEnumerable = _instance.DataGroupList.Where
(
(group) => group.DataItemCollection.FirstOrDefault(item => item.UniqueID.Equals(uniqueID)) != null
);
if(dataGroupEnumerable.Count() == 1)
{
return dataGroupEnumerable.First();
}
return null;
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////// Private
#region 컨트롤 정보 데이터 구하기 - GetControlInfoDataAsync()
/// <summary>
/// 컨트롤 정보 데이터 구하기
/// </summary>
/// <returns>태스크</returns>
private async Task GetControlInfoDataAsync()
{
lock(_lockObject)
{
if(DataGroupList.Count() != 0)
{
return;
}
}
Uri dataURI = new Uri("ms-appx:///DATA/ControlInfoData.json");
StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(dataURI);
string json = await FileIO.ReadTextAsync(storageFile);
JsonObject jsonObject = JsonObject.Parse(json);
JsonArray jsonArray = jsonObject["Groups"].GetArray();
lock(_lockObject)
{
foreach(JsonValue groupValue in jsonArray)
{
JsonObject groupObject = groupValue.GetObject();
ControlInfoDataGroup group = new ControlInfoDataGroup
(
groupObject["UniqueId" ].GetString(),
groupObject["Title" ].GetString(),
groupObject["Subtitle" ].GetString(),
groupObject["ImagePath" ].GetString(),
groupObject["Description"].GetString()
);
foreach(JsonValue itemValue in groupObject["Items"].GetArray())
{
JsonObject itemObject = itemValue.GetObject();
string badgeString = null;
bool isNew = itemObject.ContainsKey("IsNew" ) ? itemObject["IsNew" ].GetBoolean() : false;
bool isUpdated = itemObject.ContainsKey("IsUpdated") ? itemObject["IsUpdated"].GetBoolean() : false;
bool isPreview = itemObject.ContainsKey("IsPreview") ? itemObject["IsPreview"].GetBoolean() : false;
if(isNew)
{
badgeString = "New";
}
else if(isUpdated)
{
badgeString = "Updated";
}
else if(isPreview)
{
badgeString = "Preview";
}
ControlInfoDataItem item = new ControlInfoDataItem
(
itemObject["UniqueId" ].GetString(),
itemObject["Title" ].GetString(),
itemObject["Subtitle" ].GetString(),
itemObject["ImagePath" ].GetString(),
badgeString,
itemObject["Description"].GetString(),
itemObject["Content" ].GetString(),
isNew,
isUpdated,
isPreview
);
if(itemObject.ContainsKey("Docs"))
{
foreach(JsonValue documentValue in itemObject["Docs"].GetArray())
{
JsonObject documentObject = documentValue.GetObject();
item.DocumentLinkCollection.Add
(
new ControlInfoDocumentLink
(
documentObject["Title"].GetString(),
documentObject["Uri" ].GetString()
)
);
}
}
if(itemObject.ContainsKey("RelatedControls"))
{
foreach(JsonValue relatedControlValue in itemObject["RelatedControls"].GetArray())
{
item.RelatedControlCollection.Add(relatedControlValue.GetString());
}
}
group.DataItemCollection.Add(item);
}
if(!DataGroupList.Any(g => g.Title == group.Title))
{
DataGroupList.Add(group);
}
}
}
}
#endregion
}
}