private void ValidateDirectory(IDiskArchiveValidator archiveValidator, string path, string xsd) { if (!archiveValidator.DirectoryExists(path)) { throw new DirectoryNotFoundException($"Directory not found. Make sure the path is correct."); } if (!archiveValidator.AFileExists(path)) { throw new FileNotFoundException($"No files found in directory. Make sure the path is correct."); } }
public PostDeserializer(IDiskArchiveValidator validator, IPostCollectionValidator collectionValidator, string path, string xsd) { ValidateDirectory(validator, path, xsd); Posts = new List <Post>(); foreach (var fileName in Directory.GetFiles(path)) { var ser = new XmlSerializer(typeof(Post)); Post post = null; using (Stream reader = new FileStream(fileName, FileMode.Open)) { post = (Post)ser.Deserialize(reader); } Posts.Add(post); } ValidatePostCollection(collectionValidator, Posts); // We want posts to be shown in chronological order, newest-to-oldest, so we just do this here because it's silly to redo it every time we reload. Posts = Posts.OrderByDescending(post => post.Date).ToList(); }
public PostDeserializer(IDiskArchiveValidator validator, IPostCollectionValidator collectionValidator, string path, string xsd) { ValidateDirectory(validator, path, xsd); XmlSchemaSet schemas = new XmlSchemaSet(); using (var input = new StreamReader(xsd)) { schemas.Add(XmlSchema.Read(input, (sender, args) => throw args.Exception)); } Posts = new List <Post>(); // Load our main posts first foreach (var extension in new string[] { "main" }) { var fullPath = Path.Combine(path, extension); if (!Directory.Exists(fullPath)) { continue; } Posts.AddRange(Directory.GetFiles(fullPath).Select(fileName => ReadPost(fileName, schemas))); } // Now load all our timed posts string timedFilename = Path.Combine(path, "timed.xml"); if (File.Exists(timedFilename)) { var doc = XDocument.Load(timedFilename); foreach (var elem in doc.Root.Elements()) { var time = elem.Attribute("time").Value; var fname = elem.Value; var post = ReadPost(Path.Combine(path, fname), schemas); post.Date = DateTime.Parse(time); // just kinda sneak this in Posts.Add(post); } } Console.WriteLine($"Loaded {Posts.Count} posts"); // We want posts to be shown in chronological order, newest-to-oldest, so we just do this here because it's silly to redo it every time we reload. Posts = Posts.OrderByDescending(post => post.Date).ToList(); // used for sorting var categoryCount = new Dictionary <string, int>(); foreach (var post in Posts) { foreach (var cat in post.Category) { if (!QCVault.Utilities.Constants.Categories.ContainsKey(cat)) { throw new InvalidDataException($"Invalid category {cat} in {post.Title}"); } if (!categoryCount.ContainsKey(cat)) { categoryCount[cat] = 1; } else { categoryCount[cat] = categoryCount[cat] + 1; } } } // order by frequency increasing, so the rarest category is at the front var categories = categoryCount.OrderBy(kvp => kvp.Value).Select(kvp => kvp.Key).ToList(); // go back through the posts and reorder the categories foreach (var post in Posts) { post.Category = categories.Where(cat => post.Category.Contains(cat)).ToList(); } ValidatePostCollection(collectionValidator, Posts); foreach (var post in Posts) { // get any parsing errors out of the way sooner rather than later, at the cost of a tiny slice of startup time post.GenerateCachedData(); } }