diff options
author | Gonzalo Paniagua Javier <gonzalo.mono@gmail.com> | 2004-05-19 23:43:16 +0400 |
---|---|---|
committer | Gonzalo Paniagua Javier <gonzalo.mono@gmail.com> | 2004-05-19 23:43:16 +0400 |
commit | 8886aab23f4f5575bf81cdf88e4fbfcf7d00422f (patch) | |
tree | dbfd55a4a3fe9c6735d858c4cb9ff5ce4bb01fe2 /mcs/class/System/System.Diagnostics | |
parent | 954742c93ec082286af6b420aa0d0454f788508e (diff) |
Fix ChangeLog entry to tell the truth
svn path=/trunk/mcs/; revision=27708
Diffstat (limited to 'mcs/class/System/System.Diagnostics')
-rw-r--r-- | mcs/class/System/System.Diagnostics/ChangeLog | 2 | ||||
-rw-r--r-- | mcs/class/System/System.Diagnostics/DiagnosticsConfigurationHandler.cs | 715 |
2 files changed, 359 insertions, 358 deletions
diff --git a/mcs/class/System/System.Diagnostics/ChangeLog b/mcs/class/System/System.Diagnostics/ChangeLog index d8bb8741ceb..8f1f330144c 100644 --- a/mcs/class/System/System.Diagnostics/ChangeLog +++ b/mcs/class/System/System.Diagnostics/ChangeLog @@ -6,7 +6,7 @@ 2004-05-19 Gonzalo Paniagua Javier <gonzalo@ximian.com> * Process.cs: redirecting I/O is not permitted if UseShellExecute is - false. Also throw if FileName is null. + true. Also throw if FileName is null. 2004-04-06 Lluis Sanchez Gual <lluis@ximian.com> diff --git a/mcs/class/System/System.Diagnostics/DiagnosticsConfigurationHandler.cs b/mcs/class/System/System.Diagnostics/DiagnosticsConfigurationHandler.cs index 8ad3817dd8c..efd5c4be4c2 100644 --- a/mcs/class/System/System.Diagnostics/DiagnosticsConfigurationHandler.cs +++ b/mcs/class/System/System.Diagnostics/DiagnosticsConfigurationHandler.cs @@ -1,359 +1,360 @@ -//
-// System.Diagnostics.DiagnosticsConfigurationHandler.cs
-//
-// Comments from John R. Hicks <angryjohn69@nc.rr.com> original implementation
-// can be found at: /mcs/docs/apidocs/xml/en/System.Diagnostics
-//
-// Authors:
-// John R. Hicks <angryjohn69@nc.rr.com>
-// Jonathan Pryor <jonpryor@vt.edu>
-//
-// (C) 2002
-//
-using System;
-using System.Collections;
-using System.Configuration;
#if (XML_DEP) +// +// System.Diagnostics.DiagnosticsConfigurationHandler.cs +// +// Comments from John R. Hicks <angryjohn69@nc.rr.com> original implementation +// can be found at: /mcs/docs/apidocs/xml/en/System.Diagnostics +// +// Authors: +// John R. Hicks <angryjohn69@nc.rr.com> +// Jonathan Pryor <jonpryor@vt.edu> +// +// (C) 2002 +// +using System; +using System.Collections; +using System.Configuration; +#if (XML_DEP) using System.Xml; -#endif
-namespace System.Diagnostics
-{
- internal sealed class DiagnosticsConfiguration
- {
- private static IDictionary settings = null;
-
- public static IDictionary Settings {
- get {
- // TODO: Does anybody know if this is actually thread-safe under .NET?
- // I've heard that this construct isn't safe under Java, but it's used
- // reasonably often under C++, so I'm not sure about .NET.
- if (settings == null) {
- lock (typeof(DiagnosticsConfiguration)) {
- if (settings == null)
- settings = (IDictionary) ConfigurationSettings.GetConfig ("system.diagnostics");
- }
- }
- return settings;
- }
- }
- }
-
#if (XML_DEP) - public class DiagnosticsConfigurationHandler : IConfigurationSectionHandler
- {
- delegate void ElementHandler (IDictionary d, XmlNode node);
-
- IDictionary elementHandlers = new Hashtable ();
-
- public DiagnosticsConfigurationHandler ()
- {
- elementHandlers ["assert"] = new ElementHandler (AddAssertNode);
- elementHandlers ["switches"] = new ElementHandler (AddSwitchesNode);
- elementHandlers ["trace"] = new ElementHandler (AddTraceNode);
- }
-
- public virtual object Create (object parent, object configContext, XmlNode section)
- {
- IDictionary d;
- if (parent == null)
- d = new Hashtable (CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
- else
- d = (IDictionary) ((ICloneable)parent).Clone();
-
- foreach (XmlNode child in section.ChildNodes) {
- XmlNodeType type = child.NodeType;
-
- switch (type) {
- /* ignore */
- case XmlNodeType.Whitespace:
- case XmlNodeType.Comment:
- continue;
- case XmlNodeType.Element:
- ElementHandler eh = (ElementHandler) elementHandlers [child.Name];
- if (eh != null)
- eh (d, child);
- else
- ThrowUnrecognizedElement (child);
- break;
- default:
- ThrowUnrecognizedElement (child);
- break;
- }
- }
-
- return d;
- }
-
- // Remarks: Both attribute are optional
- private void AddAssertNode (IDictionary d, XmlNode node)
- {
- XmlAttributeCollection c = node.Attributes;
- string assertuienabled = GetAttribute (c, "assertuienabled", false, node);
- string logfilename = GetAttribute (c, "logfilename", false, node);
- ValidateInvalidAttributes (c, node);
- if (assertuienabled != null) {
- try {
- d ["assertuienabled"] = bool.Parse (assertuienabled);
- }
- catch (Exception e) {
- throw new ConfigurationException ("The `assertuienabled' attribute must be `true' or `false'",
- e, node);
- }
- }
-
- if (logfilename != null)
- d ["logfilename"] = logfilename;
-
- DefaultTraceListener dtl = (DefaultTraceListener) TraceImpl.Listeners["Default"];
- if (dtl != null) {
- if (assertuienabled != null)
- dtl.AssertUiEnabled = (bool) d ["assertuienabled"];
- if (logfilename != null)
- dtl.LogFileName = logfilename;
- }
-
- if (node.ChildNodes.Count > 0)
- ThrowUnrecognizedElement (node.ChildNodes[0]);
- }
-
- // name attribute is required, value is optional
- // Docs do not define "remove" or "clear" elements, but .NET recognizes
- // them
- private void AddSwitchesNode (IDictionary d, XmlNode node)
- {
- // There are no attributes on <switch/>
- ValidateInvalidAttributes (node.Attributes, node);
-
- IDictionary newNodes = new Hashtable ();
-
- foreach (XmlNode child in node.ChildNodes) {
- XmlNodeType t = child.NodeType;
- if (t == XmlNodeType.Whitespace || t == XmlNodeType.Comment)
- continue;
- if (t == XmlNodeType.Element) {
- XmlAttributeCollection attributes = child.Attributes;
- string name = null;
- string value = null;
- switch (child.Name) {
- case "add":
- name = GetAttribute (attributes, "name", true, child);
- value = GetAttribute (attributes, "value", false, child);
- newNodes[name] = AsString (value);
- break;
- case "remove":
- name = GetAttribute (attributes, "name", true, child);
- newNodes.Remove (name);
- break;
- case "clear":
- newNodes.Clear ();
- break;
- default:
- ThrowUnrecognizedElement (child);
- break;
- }
- ValidateInvalidAttributes (attributes, child);
- }
- else
- ThrowUnrecognizedNode (child);
- }
-
- d [node.Name] = newNodes;
- }
-
- private void AddTraceNode (IDictionary d, XmlNode node)
- {
- AddTraceAttributes (d, node);
-
- foreach (XmlNode child in node.ChildNodes) {
- XmlNodeType t = child.NodeType;
- if (t == XmlNodeType.Whitespace || t == XmlNodeType.Comment)
- continue;
- if (t == XmlNodeType.Element) {
- if (child.Name == "listeners")
- AddTraceListeners (child);
- else
- ThrowUnrecognizedElement (child);
- ValidateInvalidAttributes (child.Attributes, child);
- }
- else
- ThrowUnrecognizedNode (child);
- }
- }
-
- // all attributes are optional
- private void AddTraceAttributes (IDictionary d, XmlNode node)
- {
- XmlAttributeCollection c = node.Attributes;
- string autoflush = GetAttribute (c, "autoflush", false, node);
- string indentsize = GetAttribute (c, "indentsize", false, node);
- ValidateInvalidAttributes (c, node);
- if (autoflush != null) {
- try {
- bool b = bool.Parse (autoflush);
- d ["autoflush"] = b;
- TraceImpl.AutoFlush = b;
- }
- catch (Exception e) {
- throw new ConfigurationException ("The `autoflush' attribute must be `true' or `false'",
- e, node);
- }
- }
- if (indentsize != null) {
- try {
- int n = int.Parse (indentsize);
- d ["indentsize"] = n;
- TraceImpl.IndentSize = n;
- }
- catch (Exception e) {
- throw new ConfigurationException ("The `indentsize' attribute must be an integral value.",
- e, node);
- }
- }
- }
-
- // only defines "add" and "remove", but "clear" also works
- // for add, "name" and "type" are required; initializeData is optional
- private void AddTraceListeners (XmlNode listenersNode)
- {
- // There are no attributes on <listeners/>
- ValidateInvalidAttributes (listenersNode.Attributes, listenersNode);
-
- foreach (XmlNode child in listenersNode.ChildNodes) {
- XmlNodeType t = child.NodeType;
- if (t == XmlNodeType.Whitespace || t == XmlNodeType.Comment)
- continue;
- if (t == XmlNodeType.Element) {
- XmlAttributeCollection attributes = child.Attributes;
- string name = null;
- string type = null;
- string id = null;
- switch (child.Name) {
- case "add":
- name = GetAttribute (attributes, "name", true, child);
- type = GetAttribute (attributes, "type", true, child);
- id = GetAttribute (attributes, "initializeData", false, child);
- AddTraceListener (name, type, id);
- break;
- case "remove":
- name = GetAttribute (attributes, "name", true, child);
- RemoveTraceListener (name);
- break;
- case "clear":
- TraceImpl.Listeners.Clear ();
- break;
- default:
- ThrowUnrecognizedElement (child);
- break;
- }
- ValidateInvalidAttributes (attributes, child);
- }
- else
- ThrowUnrecognizedNode (child);
- }
- }
-
- private void AddTraceListener (string name, string type, string initializeData)
- {
- Type t = Type.GetType (type);
- if (t == null)
- throw new ConfigurationException (string.Format ("Invalid Type Specified: {0}", type));
-
- object[] args;
- Type[] types;
-
- if (initializeData != null) {
- args = new object[] { initializeData };
- types = new Type[] { typeof(string) };
- }
- else {
- args = null;
- types = new Type[0];
- }
-
- System.Reflection.ConstructorInfo ctor = t.GetConstructor (types);
- if (ctor == null)
- throw new ConfigurationException ("Couldn't find constructor for class " + type);
-
- TraceListener l = (TraceListener) ctor.Invoke (args);
- l.Name = name;
- TraceImpl.Listeners.Add (l);
- }
-
- private void RemoveTraceListener (string name)
- {
- try {
- TraceImpl.Listeners.Remove (name);
- }
- catch (ArgumentException) {
- // The specified listener wasn't in the collection
- // Ignore this; .NET does.
- }
- catch (Exception e) {
- throw new ConfigurationException (
- string.Format ("Unknown error removing listener: {0}", name),
- e);
- }
- }
-
- private string GetAttribute (XmlAttributeCollection attrs, string attr, bool required, XmlNode node)
- {
- XmlAttribute a = attrs[attr];
-
- string r = null;
-
- if (a != null) {
- r = a.Value;
- if (required)
- ValidateAttribute (attr, r, node);
- attrs.Remove (a);
- }
- else if (required)
- ThrowMissingAttribute (attr, node);
-
- return r;
- }
-
- private string AsString (string s)
- {
- return s == null ? string.Empty : s;
- }
-
- private void ValidateAttribute (string attribute, string value, XmlNode node)
- {
- if (value == null || value.Length == 0)
- throw new ConfigurationException (string.Format ("Required attribute `{0}' cannot be empty.", attribute), node);
- }
-
- private void ValidateInvalidAttributes (XmlAttributeCollection c, XmlNode node)
- {
- if (c.Count != 0)
- ThrowUnrecognizedAttribute (c[0].Name, node);
- }
-
- private void ThrowMissingAttribute (string attribute, XmlNode node)
- {
- throw new ConfigurationException (string.Format ("Missing required attribute `{0}'.", attribute), node);
- }
-
- private void ThrowUnrecognizedNode (XmlNode node)
- {
- throw new ConfigurationException (
- string.Format ("Unrecognized node `{0}'; nodeType={1}", node.Name, node.NodeType),
- node);
- }
-
- private void ThrowUnrecognizedElement (XmlNode node)
- {
- throw new ConfigurationException (
- string.Format ("Unrecognized element <{0}/>", node.Name),
- node);
- }
-
- private void ThrowUnrecognizedAttribute (string attribute, XmlNode node)
- {
- throw new ConfigurationException (
- string.Format ("Unrecognized attribute `{0}' on element <{1}/>.", attribute, node.Name),
- node);
- }
+#endif +namespace System.Diagnostics +{ + internal sealed class DiagnosticsConfiguration + { + private static IDictionary settings = null; + + public static IDictionary Settings { + get { + // TODO: Does anybody know if this is actually thread-safe under .NET? + // I've heard that this construct isn't safe under Java, but it's used + // reasonably often under C++, so I'm not sure about .NET. + if (settings == null) { + lock (typeof(DiagnosticsConfiguration)) { + if (settings == null) + settings = (IDictionary) ConfigurationSettings.GetConfig ("system.diagnostics"); + } + } + return settings; + } + } } -#endif
-}
-
+#if (XML_DEP) + public class DiagnosticsConfigurationHandler : IConfigurationSectionHandler + { + delegate void ElementHandler (IDictionary d, XmlNode node); + + IDictionary elementHandlers = new Hashtable (); + + public DiagnosticsConfigurationHandler () + { + elementHandlers ["assert"] = new ElementHandler (AddAssertNode); + elementHandlers ["switches"] = new ElementHandler (AddSwitchesNode); + elementHandlers ["trace"] = new ElementHandler (AddTraceNode); + } + + public virtual object Create (object parent, object configContext, XmlNode section) + { + IDictionary d; + if (parent == null) + d = new Hashtable (CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default); + else + d = (IDictionary) ((ICloneable)parent).Clone(); + + foreach (XmlNode child in section.ChildNodes) { + XmlNodeType type = child.NodeType; + + switch (type) { + /* ignore */ + case XmlNodeType.Whitespace: + case XmlNodeType.Comment: + continue; + case XmlNodeType.Element: + ElementHandler eh = (ElementHandler) elementHandlers [child.Name]; + if (eh != null) + eh (d, child); + else + ThrowUnrecognizedElement (child); + break; + default: + ThrowUnrecognizedElement (child); + break; + } + } + + return d; + } + + // Remarks: Both attribute are optional + private void AddAssertNode (IDictionary d, XmlNode node) + { + XmlAttributeCollection c = node.Attributes; + string assertuienabled = GetAttribute (c, "assertuienabled", false, node); + string logfilename = GetAttribute (c, "logfilename", false, node); + ValidateInvalidAttributes (c, node); + if (assertuienabled != null) { + try { + d ["assertuienabled"] = bool.Parse (assertuienabled); + } + catch (Exception e) { + throw new ConfigurationException ("The `assertuienabled' attribute must be `true' or `false'", + e, node); + } + } + + if (logfilename != null) + d ["logfilename"] = logfilename; + + DefaultTraceListener dtl = (DefaultTraceListener) TraceImpl.Listeners["Default"]; + if (dtl != null) { + if (assertuienabled != null) + dtl.AssertUiEnabled = (bool) d ["assertuienabled"]; + if (logfilename != null) + dtl.LogFileName = logfilename; + } + + if (node.ChildNodes.Count > 0) + ThrowUnrecognizedElement (node.ChildNodes[0]); + } + + // name attribute is required, value is optional + // Docs do not define "remove" or "clear" elements, but .NET recognizes + // them + private void AddSwitchesNode (IDictionary d, XmlNode node) + { + // There are no attributes on <switch/> + ValidateInvalidAttributes (node.Attributes, node); + + IDictionary newNodes = new Hashtable (); + + foreach (XmlNode child in node.ChildNodes) { + XmlNodeType t = child.NodeType; + if (t == XmlNodeType.Whitespace || t == XmlNodeType.Comment) + continue; + if (t == XmlNodeType.Element) { + XmlAttributeCollection attributes = child.Attributes; + string name = null; + string value = null; + switch (child.Name) { + case "add": + name = GetAttribute (attributes, "name", true, child); + value = GetAttribute (attributes, "value", false, child); + newNodes[name] = AsString (value); + break; + case "remove": + name = GetAttribute (attributes, "name", true, child); + newNodes.Remove (name); + break; + case "clear": + newNodes.Clear (); + break; + default: + ThrowUnrecognizedElement (child); + break; + } + ValidateInvalidAttributes (attributes, child); + } + else + ThrowUnrecognizedNode (child); + } + + d [node.Name] = newNodes; + } + + private void AddTraceNode (IDictionary d, XmlNode node) + { + AddTraceAttributes (d, node); + + foreach (XmlNode child in node.ChildNodes) { + XmlNodeType t = child.NodeType; + if (t == XmlNodeType.Whitespace || t == XmlNodeType.Comment) + continue; + if (t == XmlNodeType.Element) { + if (child.Name == "listeners") + AddTraceListeners (child); + else + ThrowUnrecognizedElement (child); + ValidateInvalidAttributes (child.Attributes, child); + } + else + ThrowUnrecognizedNode (child); + } + } + + // all attributes are optional + private void AddTraceAttributes (IDictionary d, XmlNode node) + { + XmlAttributeCollection c = node.Attributes; + string autoflush = GetAttribute (c, "autoflush", false, node); + string indentsize = GetAttribute (c, "indentsize", false, node); + ValidateInvalidAttributes (c, node); + if (autoflush != null) { + try { + bool b = bool.Parse (autoflush); + d ["autoflush"] = b; + TraceImpl.AutoFlush = b; + } + catch (Exception e) { + throw new ConfigurationException ("The `autoflush' attribute must be `true' or `false'", + e, node); + } + } + if (indentsize != null) { + try { + int n = int.Parse (indentsize); + d ["indentsize"] = n; + TraceImpl.IndentSize = n; + } + catch (Exception e) { + throw new ConfigurationException ("The `indentsize' attribute must be an integral value.", + e, node); + } + } + } + + // only defines "add" and "remove", but "clear" also works + // for add, "name" and "type" are required; initializeData is optional + private void AddTraceListeners (XmlNode listenersNode) + { + // There are no attributes on <listeners/> + ValidateInvalidAttributes (listenersNode.Attributes, listenersNode); + + foreach (XmlNode child in listenersNode.ChildNodes) { + XmlNodeType t = child.NodeType; + if (t == XmlNodeType.Whitespace || t == XmlNodeType.Comment) + continue; + if (t == XmlNodeType.Element) { + XmlAttributeCollection attributes = child.Attributes; + string name = null; + string type = null; + string id = null; + switch (child.Name) { + case "add": + name = GetAttribute (attributes, "name", true, child); + type = GetAttribute (attributes, "type", true, child); + id = GetAttribute (attributes, "initializeData", false, child); + AddTraceListener (name, type, id); + break; + case "remove": + name = GetAttribute (attributes, "name", true, child); + RemoveTraceListener (name); + break; + case "clear": + TraceImpl.Listeners.Clear (); + break; + default: + ThrowUnrecognizedElement (child); + break; + } + ValidateInvalidAttributes (attributes, child); + } + else + ThrowUnrecognizedNode (child); + } + } + + private void AddTraceListener (string name, string type, string initializeData) + { + Type t = Type.GetType (type); + if (t == null) + throw new ConfigurationException (string.Format ("Invalid Type Specified: {0}", type)); + + object[] args; + Type[] types; + + if (initializeData != null) { + args = new object[] { initializeData }; + types = new Type[] { typeof(string) }; + } + else { + args = null; + types = new Type[0]; + } + + System.Reflection.ConstructorInfo ctor = t.GetConstructor (types); + if (ctor == null) + throw new ConfigurationException ("Couldn't find constructor for class " + type); + + TraceListener l = (TraceListener) ctor.Invoke (args); + l.Name = name; + TraceImpl.Listeners.Add (l); + } + + private void RemoveTraceListener (string name) + { + try { + TraceImpl.Listeners.Remove (name); + } + catch (ArgumentException) { + // The specified listener wasn't in the collection + // Ignore this; .NET does. + } + catch (Exception e) { + throw new ConfigurationException ( + string.Format ("Unknown error removing listener: {0}", name), + e); + } + } + + private string GetAttribute (XmlAttributeCollection attrs, string attr, bool required, XmlNode node) + { + XmlAttribute a = attrs[attr]; + + string r = null; + + if (a != null) { + r = a.Value; + if (required) + ValidateAttribute (attr, r, node); + attrs.Remove (a); + } + else if (required) + ThrowMissingAttribute (attr, node); + + return r; + } + + private string AsString (string s) + { + return s == null ? string.Empty : s; + } + + private void ValidateAttribute (string attribute, string value, XmlNode node) + { + if (value == null || value.Length == 0) + throw new ConfigurationException (string.Format ("Required attribute `{0}' cannot be empty.", attribute), node); + } + + private void ValidateInvalidAttributes (XmlAttributeCollection c, XmlNode node) + { + if (c.Count != 0) + ThrowUnrecognizedAttribute (c[0].Name, node); + } + + private void ThrowMissingAttribute (string attribute, XmlNode node) + { + throw new ConfigurationException (string.Format ("Missing required attribute `{0}'.", attribute), node); + } + + private void ThrowUnrecognizedNode (XmlNode node) + { + throw new ConfigurationException ( + string.Format ("Unrecognized node `{0}'; nodeType={1}", node.Name, node.NodeType), + node); + } + + private void ThrowUnrecognizedElement (XmlNode node) + { + throw new ConfigurationException ( + string.Format ("Unrecognized element <{0}/>", node.Name), + node); + } + + private void ThrowUnrecognizedAttribute (string attribute, XmlNode node) + { + throw new ConfigurationException ( + string.Format ("Unrecognized attribute `{0}' on element <{1}/>.", attribute, node.Name), + node); + } + } +#endif +} + |