// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; using System.Linq; using System.Net.Http.Formatting; using System.Text; using System.Web.Http.Controllers; using System.Web.Http.ModelBinding; using System.Web.Http.ModelBinding.Binders; using System.Web.Http.Properties; using System.Web.Http.Routing; using System.Web.Http.ValueProviders; using System.Web.Http.ValueProviders.Providers; namespace System.Web.Http.Tracing { /// /// General purpose utilities to format strings used in tracing. /// internal static class FormattingUtilities { public static readonly string NullMessage = "null"; public static string ActionArgumentsToString(IDictionary actionArguments) { Contract.Assert(actionArguments != null); return String.Join(", ", actionArguments.Keys.Select( (k) => k + "=" + ValueToString(actionArguments[k], CultureInfo.CurrentCulture))); } public static string ActionDescriptorToString(HttpActionDescriptor actionDescriptor) { Contract.Assert(actionDescriptor != null); string parameterList = String.Join(", ", actionDescriptor.GetParameters().Select( (p) => p.ParameterType.Name + " " + p.ParameterName)); return actionDescriptor.ActionName + "(" + parameterList + ")"; } public static string ActionInvokeToString(HttpActionContext actionContext) { Contract.Assert(actionContext != null); return ActionInvokeToString(actionContext.ActionDescriptor.ActionName, actionContext.ActionArguments); } public static string ActionInvokeToString(string actionName, IDictionary arguments) { Contract.Assert(actionName != null); Contract.Assert(arguments != null); return actionName + "(" + ActionArgumentsToString(arguments) + ")"; } public static string FormattersToString(IEnumerable formatters) { Contract.Assert(formatters != null); return String.Join(", ", formatters.Select((f) => f.GetType().Name)); } public static string ModelBinderToString(ModelBinderProvider provider) { Contract.Assert(provider != null); CompositeModelBinderProvider composite = provider as CompositeModelBinderProvider; if (composite == null) { return provider.GetType().Name; } string modelBinderList = String.Join(", ", composite.Providers.Select(ModelBinderToString)); return provider.GetType().Name + "(" + modelBinderList + ")"; } public static string ModelStateToString(ModelStateDictionary modelState) { Contract.Assert(modelState != null); if (modelState.IsValid) { return String.Empty; } StringBuilder modelStateBuilder = new StringBuilder(); foreach (string key in modelState.Keys) { ModelState state = modelState[key]; if (state.Errors.Count > 0) { foreach (ModelError error in state.Errors) { string errorString = Error.Format(SRResources.TraceModelStateErrorMessage, key, error.ErrorMessage); if (modelStateBuilder.Length > 0) { modelStateBuilder.Append(','); } modelStateBuilder.Append(errorString); } } } return modelStateBuilder.ToString(); } public static string RouteToString(IHttpRouteData routeData) { Contract.Assert(routeData != null); return String.Join(",", routeData.Values.Select((pair) => Error.Format("{0}:{1}", pair.Key, pair.Value))); } public static string ValueProviderToString(IValueProvider provider) { Contract.Assert(provider != null); CompositeValueProvider composite = provider as CompositeValueProvider; if (composite == null) { return provider.GetType().Name; } string providerList = String.Join(", ", composite.Select(ValueProviderToString)); return provider.GetType().Name + "(" + providerList + ")"; } public static string ValueToString(object value, CultureInfo cultureInfo) { Contract.Assert(cultureInfo != null); if (value == null) { return NullMessage; } return Convert.ToString(value, cultureInfo); } } }