The Labs \ Source Viewer \ SSCLI \ System.Diagnostics \ TraceUtils

  1. //------------------------------------------------------------------------------
  2. // <copyright file="TypedElement.cs" company="Microsoft Corporation">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System.Configuration;
  16. using System;
  17. using System.IO;
  18. using System.Reflection;
  19. using System.Globalization;
  20. using System.Collections;
  21. using System.Collections.Specialized;
  22. namespace System.Diagnostics
  23. {
  24.     static internal class TraceUtils
  25.     {
  26.        
  27.         static internal object GetRuntimeObject(string className, Type baseType, string initializeData)
  28.         {
  29.             object newObject = null;
  30.             Type objectType = null;
  31.            
  32.             if (className.Length == 0) {
  33.                 throw new ConfigurationErrorsException(SR.GetString(SR.EmptyTypeName_NotAllowed));
  34.             }
  35.            
  36.             objectType = Type.GetType(className);
  37.            
  38.             if (objectType == null) {
  39.                 throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_find_type, className));
  40.             }
  41.            
  42.             if (!baseType.IsAssignableFrom(objectType))
  43.                 throw new ConfigurationErrorsException(SR.GetString(SR.Incorrect_base_type, className, baseType.FullName));
  44.            
  45.             Exception innerException = null;
  46.             try {
  47.                 if (String.IsNullOrEmpty(initializeData)) {
  48.                     if (IsOwnedTextWriterTL(objectType))
  49.                         throw new ConfigurationErrorsException(SR.GetString(SR.TextWriterTL_DefaultConstructor_NotSupported));
  50.                    
  51.                     // create an object with parameterless constructor
  52.                     ConstructorInfo ctorInfo = objectType.GetConstructor(new Type[] {});
  53.                     if (ctorInfo == null)
  54.                         throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_get_constructor, className));
  55.                     newObject = ctorInfo.Invoke(new object[] {});
  56.                 }
  57.                 else {
  58.                     // create an object with a one-string constructor
  59.                     // first look for a string constructor
  60.                     ConstructorInfo ctorInfo = objectType.GetConstructor(new Type[] {typeof(string)});
  61.                     if (ctorInfo != null) {
  62.                         // Special case to enable specifying relative path to trace file from config for
  63.                         // our own TextWriterTraceListener derivatives. We will prepend it with fullpath
  64.                         // prefix from config file location
  65.                         if (IsOwnedTextWriterTL(objectType)) {
  66.                             if ((initializeData[0] != Path.DirectorySeparatorChar) && (initializeData[0] != Path.AltDirectorySeparatorChar) && !Path.IsPathRooted(initializeData)) {
  67.                                 string filePath = DiagnosticsConfiguration.ConfigFilePath;
  68.                                
  69.                                 if (!String.IsNullOrEmpty(filePath)) {
  70.                                     string dirPath = Path.GetDirectoryName(filePath);
  71.                                    
  72.                                     if (dirPath != null)
  73.                                         initializeData = Path.Combine(dirPath, initializeData);
  74.                                 }
  75.                             }
  76.                         }
  77.                         newObject = ctorInfo.Invoke(new object[] {initializeData});
  78.                     }
  79.                     else {
  80.                         // now look for another 1 param constructor.
  81.                         ConstructorInfo[] ctorInfos = objectType.GetConstructors();
  82.                         if (ctorInfos == null)
  83.                             throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_get_constructor, className));
  84.                         for (int i = 0; i < ctorInfos.Length; i++) {
  85.                             ParameterInfo[] ctorparams = ctorInfos[i].GetParameters();
  86.                             if (ctorparams.Length == 1) {
  87.                                 Type paramtype = ctorparams[0].ParameterType;
  88.                                 try {
  89.                                     object convertedInitializeData = ConvertToBaseTypeOrEnum(initializeData, paramtype);
  90.                                     newObject = ctorInfos[i].Invoke(new object[] {convertedInitializeData});
  91.                                     break;
  92.                                 }
  93.                                 catch (TargetInvocationException tiexc) {
  94.                                     Debug.Assert(tiexc.InnerException != null, "ill-formed TargetInvocationException!");
  95.                                     innerException = tiexc.InnerException;
  96.                                 }
  97.                                 catch (Exception e) {
  98.                                     innerException = e;
  99.                                     // ignore exceptions for now. If we don't have a newObject at the end, then we'll throw.
  100.                                 }
  101.                                 catch {
  102.                                     // ignore is ok, if newobject==null at the end, we'll throw
  103.                                 }
  104.                             }
  105.                         }
  106.                     }
  107.                 }
  108.             }
  109.             catch (TargetInvocationException tiexc) {
  110.                 Debug.Assert(tiexc.InnerException != null, "ill-formed TargetInvocationException!");
  111.                 innerException = tiexc.InnerException;
  112.             }
  113.            
  114.             if (newObject == null) {
  115.                 if (innerException != null)
  116.                     throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_type_instance, className), innerException);
  117.                 else
  118.                     throw new ConfigurationErrorsException(SR.GetString(SR.Could_not_create_type_instance, className));
  119.             }
  120.            
  121.             return newObject;
  122.         }
  123.        
  124.         // Our own tracelisteners that needs extra config validation
  125.         static internal bool IsOwnedTextWriterTL(Type type)
  126.         {
  127.             return (typeof(XmlWriterTraceListener) == type) || (typeof(DelimitedListTraceListener) == type) || (typeof(TextWriterTraceListener) == type);
  128.         }
  129.        
  130.         private static object ConvertToBaseTypeOrEnum(string value, Type type)
  131.         {
  132.             if (type.IsEnum)
  133.                 return Enum.Parse(type, value, false);
  134.             else
  135.                 return Convert.ChangeType(value, type, CultureInfo.InvariantCulture);
  136.         }
  137.        
  138.         static internal void VerifyAttributes(IDictionary attributes, string[] supportedAttributes, object parent)
  139.         {
  140.             foreach (string key in attributes.Keys) {
  141.                 bool found = false;
  142.                 if (supportedAttributes != null) {
  143.                     for (int i = 0; i < supportedAttributes.Length; i++) {
  144.                         if (supportedAttributes[i] == key)
  145.                             found = true;
  146.                     }
  147.                 }
  148.                 if (!found)
  149.                     throw new ConfigurationErrorsException(SR.GetString(SR.AttributeNotSupported, key, parent.GetType().FullName));
  150.             }
  151.         }
  152.        
  153.     }
  154. }

Developer Fusion