using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; namespace Amazon.Lambda.TestTool.SampleRequests { /// /// This class manages the sample Lambda input requests. This includes the precanned requests and saved requests. /// public class SampleRequestManager { public const string SAVED_REQUEST_GROUP = "Saved Requests"; public const string SAVED_REQUEST_DIRECTORY = "SavedRequests"; private string _preferenceDirectory; public SampleRequestManager(string preferenceDirectory) { this._preferenceDirectory = preferenceDirectory; } public IDictionary> GetSampleRequests() { var content = GetEmbeddedResource("manifest.xml"); XDocument xmlDoc = XDocument.Parse(content); var query = from item in xmlDoc.Descendants("request") select new { Name = item.Element("name").Value, Filename = item.Element("filename").Value }; var requests = from item in xmlDoc.Descendants("request") select new LambdaRequest { Group = item.Attribute("category")?.Value ?? string.Empty, Name = item.Element("name")?.Value ?? string.Empty, Filename = item.Element("filename")?.Value ?? string.Empty, }; var hash = new Dictionary>(); foreach (var request in requests) { IList r; if (!hash.TryGetValue(request.Group, out r)) { r = new List(); hash[request.Group] = r; } r.Add(request); } var savedRequestDirectory = GetSavedRequestDirectory(); if(Directory.Exists(savedRequestDirectory)) { var savedRequestFiles = Directory.GetFiles(GetSavedRequestDirectory(), "*.json"); if (savedRequestFiles.Length > 0) { var savedRequests = new List(); hash[SAVED_REQUEST_GROUP] = savedRequests; foreach (var file in savedRequestFiles) { var r = new LambdaRequest { Filename = $"{SAVED_REQUEST_DIRECTORY}@{Path.GetFileName(file)}", Group = SAVED_REQUEST_GROUP, Name = Path.GetFileNameWithoutExtension(file) }; savedRequests.Add(r); } } } foreach (var key in hash.Keys.ToList()) { hash[key] = hash[key].OrderBy(x => x.Name).ToList(); } return hash; } public static bool TryDetermineSampleRequestName(string value, out string sampleName) { sampleName = null; if (value == null) return false; if (!value.StartsWith(SAVED_REQUEST_DIRECTORY)) return false; // The minus 6 is for the "@" and the trailing ".json" sampleName = value.Substring(SAVED_REQUEST_DIRECTORY.Length + 1, value.Length - SAVED_REQUEST_DIRECTORY.Length - 6); return true; } public string GetRequest(string name) { if(name.StartsWith(SAVED_REQUEST_DIRECTORY + "@")) { name = name.Substring(name.IndexOf("@") + 1); var path = Path.Combine(this.GetSavedRequestDirectory(), name); return File.ReadAllText(path); } return GetEmbeddedResource(name); } public string SaveRequest(string name, string content) { var filename = $"{name}.json"; var savedRequestDirectory = GetSavedRequestDirectory(); if (!Directory.Exists(savedRequestDirectory)) Directory.CreateDirectory(savedRequestDirectory); File.WriteAllText(Path.Combine(savedRequestDirectory, filename), content); return $"{SAVED_REQUEST_DIRECTORY}@{filename}"; } public string GetSaveRequestRelativePath(string name) { var relativePath = $"{SAVED_REQUEST_DIRECTORY}{Path.DirectorySeparatorChar}{name}"; if (!name.EndsWith(".json")) relativePath += ".json"; return relativePath; } private string GetEmbeddedResource(string name) { using (var stream = typeof(Amazon.Lambda.TestTool.Services.IAWSService).Assembly.GetManifestResourceStream( "Amazon.Lambda.TestTool.Resources.SampleRequests." + name)) using(var reader = new StreamReader(stream)) { return reader.ReadToEnd(); } } public string GetSavedRequestDirectory() { var path = Path.Combine(this._preferenceDirectory, SAVED_REQUEST_DIRECTORY); return path; } } }