/// /// Copyright (c) 2013-2016 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.IO; using log4net; using Config.Entities; using TBF.BenchControl; using TBF.Resources; namespace TBF.BenchControl.Output.FileWriters.Basic { public class Writer : ComponentBase, IOperation, GenericDevices.IResultsWriter { private static readonly ILog log = LogManager.GetLogger(typeof(Writer)); public override string ToString() { return string.Format("Output.FileWriters.Basic({0})", Cfg.ToString(1)); } readonly WriterCfg writerCfg; readonly string separatorStr; /// /// Result items to print /// IList rsltItems; /// /// Results to print /// Results.Entities.Batch batch; StreamWriter writer; public Writer() {} public Writer(WriterCfg cfg) : base(cfg) { writerCfg = cfg; switch (cfg.Separator) { default: case Separator.None: separatorStr = string.Empty; break; case Separator.Space: separatorStr = " "; break; case Separator.Tabulator: separatorStr = "\t"; break; case Separator.Comma: separatorStr = ","; break; case Separator.Semicolon: separatorStr = ";"; break; } log.Debug(this.ToString()); } /// /// Eliminate spaces conditionally, depesing on bool WriterCfg.EliminateSpaces /// /// Input string /// Output string string ElSpaces(string item) { if (writerCfg.EliminateSpaces) return item.Replace(" ", string.Empty); else return item; } /// /// Returns a file name derived from a DateTime structure. /// Creates directories on this path as a side effect. /// /// Date and time /// File name string GetFilename(DateTime time) { string directory = writerCfg.DestinationPath; /// Ends with "\\"; switch (writerCfg.YearFolders) { case YearFolders.FourDigit: directory = string.Format("{0}{1}\\", directory, time.Year.ToString("D4")); break; case YearFolders.TwoDigit: directory = string.Format("{0}{1}\\", directory, (time.Year % 100).ToString("D2")); break; } switch (writerCfg.MonthFolders) { case MonthFolders.Name: { string monthStr; switch (time.Month) { default: case 1: monthStr = "January"; break; case 2: monthStr = "February"; break; case 3: monthStr = "March"; break; case 4: monthStr = "April"; break; case 5: monthStr = "May"; break; case 6: monthStr = "June"; break; case 7: monthStr = "July"; break; case 8: monthStr = "August"; break; case 9: monthStr = "September"; break; case 10: monthStr = "October"; break; case 11: monthStr = "November"; break; case 12: monthStr = "December"; break; } directory = string.Format("{0}{1}\\", directory, monthStr); break; } case MonthFolders.Digit: directory = string.Format("{0}{1}\\", directory, time.Month.ToString()); break; case MonthFolders.DigitWithLeadingZero: directory = string.Format("{0}{1}\\", directory, time.Month.ToString("D2")); break; } switch (writerCfg.DayFolders) { case DayFolders.Digit: directory = string.Format("{0}{1}\\", directory, time.Day.ToString()); break; case DayFolders.DigitWithLeadingZero: directory = string.Format("{0}{1}\\", directory, time.Day.ToString("D2")); break; } Directory.CreateDirectory(directory); return string.Format("{0}{1}{2}{3}-{4}{5}.txt", directory, (time.Year % 100).ToString("D2"), time.Month.ToString("D2"), time.Day.ToString("D2"), time.Hour.ToString("D2"), time.Minute.ToString("D2")); } /// /// Writes the test cycle results into a file, Events: Event.ResultsWritten /// /// Procedure to print the results of /// Results to write into the file /// Reference to the operation public IOperation WriteResultsOp(Results.Entities.Batch batchResults) { this.batch = batchResults; if (batch.WaterMeters.Count <= 0) { writer = null; return this; } rsltItems = Results.WMeterRsltItemSpec.FromStrArray(writerCfg.SelectedItems); try { writer = new StreamWriter(System.IO.File.Create(GetFilename(batch.EndTime))); } catch { writer = null; } return this; } /// Start this operation public void Start() { if (writer == null || rsltItems == null || rsltItems.Count == 0) return; foreach (var wm in batch.WaterMeters) WriteWM(wm); } /// /// Write one water meter results /// /// Water meter number (0-based) void WriteWM(Results.Entities.WaterMeter wm) { for (int i = 0; i < rsltItems.Count; i++) { writer.Write(rsltItems[i].Print(wm)); if (i < rsltItems.Count - 1) { writer.Write(separatorStr); } else { writer.WriteLine(string.Empty); } } } /// Run this operation /// Event.ResultsWritten public Event Run() { return Event.ResultsWritten; } /// Stop this operation public void Stop() { if (writer != null) writer.Close(); writer = null; } } }