Ejemplo n.º 1
0
 private void ValidatePostCollection(IPostCollectionValidator collectionValidator, List <Post> postcollection)
 {
     if (!collectionValidator.CollectionContainsUniqueURLS(postcollection, out string errorMsg))
     {
         throw new FileLoadException(errorMsg);
     }
 }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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();
            }
        }