/* * Arrays */ private static void Log <T>(Redwood.RedwoodChannels channels, string description, T[] array) { Redwood.StartTrack(description); if (array == null) { channels.Log("(array is null)"); } else { if (array.Length == 0) { channels.Log("(empty)"); } else { int index = 0; foreach (T item in array) { if (Dispatchable(item)) { Log(channels, "Index " + index, item); } else { channels.Logf("Index %d: %s", index, item); } index++; } } } Redwood.EndTrack(description); }
/* * Iterables (includes Collection, List, Set, etc.) */ private static void Log <T>(Redwood.RedwoodChannels channels, string description, IEnumerable <T> iterable) { Redwood.StartTrack(description); if (iterable == null) { channels.Log("(iterable is null)"); } else { int index = 0; foreach (T item in iterable) { if (Dispatchable(item) && item != iterable) { Log(channels, "Index " + index, item); } else { channels.Logf("Index %d: %s", index, item == iterable ? "...<infinite loop>" : item); } index++; } if (index == 0) { channels.Log("(empty)"); } } Redwood.EndTrack(description); }
// TODO: make prettyLog work in the situation of loops in the object graph /// <summary><inheritDoc/></summary> public virtual void PrettyLog(Redwood.RedwoodChannels channels, string description) { Redwood.StartTrack(description); // sort keys by class name IList <Type> sortedKeys = new List <Type>(this.KeySet()); sortedKeys.Sort(IComparer.Comparing(null)); // log key/value pairs foreach (Type key in sortedKeys) { string keyName = key.GetCanonicalName().Replace("class ", string.Empty); object value = this.Get(key); if (PrettyLogger.Dispatchable(value)) { PrettyLogger.Log(channels, keyName, value); } else { channels.Logf("%s = %s", keyName, value); } } Redwood.EndTrack(description); }
/* * Mappings */ private static void Log <K, V>(Redwood.RedwoodChannels channels, string description, IDictionary <K, V> mapping) { Redwood.StartTrack(description); if (mapping == null) { channels.Log("(mapping is null)"); } else { if (mapping.IsEmpty()) { channels.Log("(empty)"); } else { // convert keys to sorted list, if possible IList <K> keys = new LinkedList <K>(); foreach (K key in mapping.Keys) { keys.Add(key); } keys.Sort(null); // log key/value pairs int entryCounter = 0; foreach (K key_1 in keys) { V value = mapping[key_1]; if (!Dispatchable(key_1) && Dispatchable(value)) { Log(channels, key_1.ToString(), value); } else { if (Dispatchable(key_1) || Dispatchable(value)) { Redwood.StartTrack("Entry " + entryCounter); if (Dispatchable(key_1)) { Log(channels, "Key", key_1); } else { channels.Logf("Key %s", key_1); } if (Dispatchable(value)) { Log(channels, "Value", value); } else { channels.Logf("Value %s", value); } Redwood.EndTrack("Entry " + entryCounter); } else { channels.Logf("%s = %s", key_1, value); } } entryCounter++; } } } Redwood.EndTrack(description); }