private void WriteFromXml(PrintFile printFile, PropertyInfo[] properties)
        {
            using (var stream = _file.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) {
                var document = XDocument.Load(stream);

                var attributes =
                    document.Root == null
                                                ? new List <string>()
                                                : document
                    .Root
                    .Attributes()
                    .Select(x => x.Name.LocalName)
                    .ToList();

                WriteUnusedProperties(printFile, properties, attributes);
                WriteInvalidAttributes(printFile, properties, attributes);
            }
        }
        private static void WriteInvalidAttributes(PrintFile printFile, IEnumerable <PropertyInfo> properties, IEnumerable <string> attributes)
        {
            var list =
                attributes
                .Where(attribute => attribute != "xsd" && attribute != "xsi" && properties.All(x => x.Name != attribute))
                .ToList();

            if (list.Count == 0)
            {
                return;
            }

            printFile.WriteLine("The following attributes in the configuration file are invalid:");
            printFile.IncrementIndent();

            foreach (var item in list)
            {
                printFile.WriteLine("* {0}", item);
            }

            printFile.DecrementIndent();
            printFile.WriteLine();
        }
        private static void WriteUnusedProperties(PrintFile printFile, IEnumerable <PropertyInfo> properties, IEnumerable <string> attributes)
        {
            var list =
                properties
                .Where(property => attributes.All(x => x != property.Name))
                .Select(property => property.Name)
                .ToList();

            if (list.Count == 0)
            {
                return;
            }

            printFile.WriteLine("The following properties in the configuration file where not set:");
            printFile.IncrementIndent();

            foreach (var item in list)
            {
                printFile.WriteLine("* {0}", item);
            }

            printFile.DecrementIndent();
            printFile.WriteLine();
        }
        public void Write(Configuration configuration, PrintFile printFile)
        {
            var properties = typeof(Configuration).GetProperties(BindingFlags.Public | BindingFlags.Instance);

            if (_extension == ".xml")
            {
                WriteFromXml(printFile, properties);
            }

            if (_extension == ".properties")
            {
                WriteFromProperties(printFile, properties);
            }

            var list =
                properties
                .Select(property => {
                var value = property.GetValue(configuration, null);

                var metadata =
                    property
                    .GetCustomAttributes(typeof(MetadataAttribute), true)
                    .Cast <MetadataAttribute>()
                    .SingleOrDefault();

                var description =
                    metadata == null || string.IsNullOrEmpty(metadata.Value)
                                                                ? property.Name.ToSentenceCase()
                                                                : metadata.Value;

                string format;

                if (value == null)
                {
                    format = string.Empty;
                }
                else
                {
                    if (value is char)
                    {
                        var b = (byte)(char)value;

                        format = string.Format("{0} - {1}", b, AsciiTable.GetDescription(b));
                    }
                    else
                    {
                        format = value.ToString().Trim();
                    }
                }

                return(new {
                    property.Name,
                    Value = format,
                    Description = description
                });
            })
                .ToList();

            var maxKeyLength =
                list
                .Select(x => x.Name.Length)
                .Max();

            var maxValueLength =
                list
                .Select(x => x.Value.Length)
                .Max();

            foreach (var property in list)
            {
                printFile
                .WriteLine("{0}> {1} // {2}.",
                           property.Name.PadLeft(maxKeyLength),
                           property.Value.PadRight(maxValueLength),
                           property.Description);
            }

            printFile.WriteLine();
        }
 private void WriteFromProperties(PrintFile printFile, PropertyInfo[] properties)
 {
 }