From fb74a1a6a71044ff83be2f239b90853c528456d9 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 17 Jun 2012 14:55:28 -0700 Subject: [PATCH] Updated exceptron driver to 0.1.0.34 --- NzbDrone.Common/NzbDrone.Common.csproj | 5 +- NzbDrone.Common/ReportingService.cs | 2 +- NzbDrone.Common/packages.config | 2 +- .../Exceptron.Driver.0.1.0.30.nupkg | Bin 24740 -> 0 bytes .../lib/net20/Exceptron.Driver.dll | Bin 38400 -> 0 bytes .../Exceptron.Driver.0.1.0.34.nupkg | Bin 0 -> 69505 bytes .../lib/net20/Exceptron.Driver.dll | Bin 0 -> 38400 bytes .../lib/net20/Exceptron.Driver.pdb | Bin 0 -> 67072 bytes .../src/ClientConfiguration.cs | 24 + .../src/ExceptionClient.cs | 211 +++++ .../src/ExceptionData.cs | 54 ++ .../src/ExceptionSeverity.cs | 28 + .../src/IRestClient.cs | 7 + .../src/Message/ExceptionReport.cs | 79 ++ .../src/Message/ExceptionResponse.cs | 33 + .../src/Message/Frame.cs | 30 + .../src/Properties/AssemblyInfo.cs | 39 + .../src/RestClient.cs | 79 ++ .../src/ValidationError.cs | 11 + .../src/fastJSON/Getters.cs | 20 + .../src/fastJSON/JSON.cs | 854 ++++++++++++++++++ .../src/fastJSON/JsonParser.cs | 408 +++++++++ .../src/fastJSON/JsonSerializer.cs | 518 +++++++++++ .../src/fastJSON/SafeDictionary.cs | 39 + 24 files changed, 2438 insertions(+), 5 deletions(-) delete mode 100644 packages/Exceptron.Driver.0.1.0.30/Exceptron.Driver.0.1.0.30.nupkg delete mode 100644 packages/Exceptron.Driver.0.1.0.30/lib/net20/Exceptron.Driver.dll create mode 100644 packages/Exceptron.Driver.0.1.0.34/Exceptron.Driver.0.1.0.34.nupkg create mode 100644 packages/Exceptron.Driver.0.1.0.34/lib/net20/Exceptron.Driver.dll create mode 100644 packages/Exceptron.Driver.0.1.0.34/lib/net20/Exceptron.Driver.pdb create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/ClientConfiguration.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/ExceptionClient.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/ExceptionData.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/ExceptionSeverity.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/IRestClient.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionReport.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionResponse.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/Message/Frame.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/Properties/AssemblyInfo.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/RestClient.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/ValidationError.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/fastJSON/Getters.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JSON.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonParser.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonSerializer.cs create mode 100644 packages/Exceptron.Driver.0.1.0.34/src/fastJSON/SafeDictionary.cs diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index a45da81fd..e7c0441a5 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -38,9 +38,8 @@ ..\Libraries\Exceptioneer.WindowsFormsClient.dll - - False - ..\packages\Exceptron.Driver.0.1.0.30\lib\net20\Exceptron.Driver.dll + + ..\packages\Exceptron.Driver.0.1.0.34\lib\net20\Exceptron.Driver.dll ..\packages\Newtonsoft.Json.4.5.4\lib\net40\Newtonsoft.Json.dll diff --git a/NzbDrone.Common/ReportingService.cs b/NzbDrone.Common/ReportingService.cs index 3dda58536..43bc34205 100644 --- a/NzbDrone.Common/ReportingService.cs +++ b/NzbDrone.Common/ReportingService.cs @@ -111,7 +111,7 @@ namespace NzbDrone.Common ApplicationVersion = new EnvironmentProvider().Version.ToString() }; - ExceptronDriver.ThrowsExceptions = !EnvironmentProvider.IsProduction; + ExceptronDriver.ClientConfiguration.ThrowsExceptions = !EnvironmentProvider.IsProduction; ExceptronDriver.Enviroment = EnvironmentProvider.IsProduction ? "Prod" : "Dev"; } diff --git a/NzbDrone.Common/packages.config b/NzbDrone.Common/packages.config index c309ac792..877aabc4c 100644 --- a/NzbDrone.Common/packages.config +++ b/NzbDrone.Common/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.30/Exceptron.Driver.0.1.0.30.nupkg b/packages/Exceptron.Driver.0.1.0.30/Exceptron.Driver.0.1.0.30.nupkg deleted file mode 100644 index 445b8e732777807aeefd2b2b7fb38263b4419d36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24740 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 diff --git a/packages/Exceptron.Driver.0.1.0.34/Exceptron.Driver.0.1.0.34.nupkg b/packages/Exceptron.Driver.0.1.0.34/Exceptron.Driver.0.1.0.34.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..afe22d69262aee1f2a27592a66a556d045d75984 GIT binary patch literal 69505 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 literal 0 HcmV?d00001 diff --git a/packages/Exceptron.Driver.0.1.0.34/lib/net20/Exceptron.Driver.dll b/packages/Exceptron.Driver.0.1.0.34/lib/net20/Exceptron.Driver.dll new file mode 100644 index 0000000000000000000000000000000000000000..d22620a57bb58d7257cfd5091c9a3ebd1c2067de GIT binary patch literal 38400 zcmeHwd3;;d@$b2duC8QTj$~WjZ8;<$yd|+ia6$k(u|opcZ9)v8iDD~>i0$i0a)>de zF%&2iD3q20rIfIhP@rWiq!b7(rSR((y3ijjrJ<#L(9(sL?)=F6&YW{4*-mMHpZETG zpZ8OuxifR-%$YN1&U){aSDk&WFoX~$zDJG-@i?yZX=nKUU@wvbwO1pXmUdX^b$OaC#5LeplKb9$xJK|jh%Z?e!9|yL17rK?Dul*-!VJ-VsSq>xfA*?K z62Rvk=xrR6m zx$r+|H033GQFy8hhFoAcsE^e&BRK+=LQO2EL*hk*FO@iQ zSWW}sQk_#l6|E#NFUyTaNbH0x!$B4NPOD^~9LqUT;&6rK%pqKl!d;fLQ1amb%Q=bg zXfJe0^$PU^* z=X1be}^fyk8%M!-OalMF_{K);a;M!-PxO9mrgpbtp~BVZutB!dw! z&=Dkq5irmxB!dw!5Py=v2pAEU!3Y@ef|Ot+TWcO%$t?&kDZmIAh%w1v#LXcL#N;@l zfj)ZaIHJwO1))Y4#2H->M|44;V4!M)>&Fo)K+(tjljbEH#Fu#;`0c%!=zT)(w4(3moIp$JmrHDm!`>+Pr>9H%$GXq@9g4k3KES)`00T z14uwGF;mw-ixK@O>1r`j6BI`m6Y&AvID{FYGKwL|A3X=GyNIkmRyT^7gjL+XBDkU- z2XiuyU=Xat2tggrDmJ5WQdoqs8$FGdCc)$&I;>wGBaay&;hcgp8g;AQpaIXHrxLtQ zJ18#-qP$cdEC?1OAGw$Eb-4MWOJqJy@X~nB`6}mn#2v^7dpIAp1?9t};BPFjoZT>| z$ovUvEs_{WhmGRWR2OOTI?Hg$w=X&k7vrMkfX)g6rvum*ok8eI0Pi7mFr9tmtOA`T z5(aWXma`fxx0F|F3X+)dh7IoEvZm2B5b&ke0$xC4u{$w)-<+WAg55Sj(TMV^M9pc(YsoUhwX54g5-CSY_6s#*{-Y-ac62LIsGDiYOg;xO<_~&GH_}iTG_Ogt+^LVT5tg$NNtSAx8XW{|42kzj z3gLl}C>_VZ22)FAQNkEsz_d9IH-T@kRms1@AxL-hy2-mXvN%oh<%cA5JmoR z^Z^jEsg4IijdV>SJg-{e;hPU-^taj+1L!KIj1^0~h9lxpy9drP4yL?56oPchdsjMTlJ4A$=G10o8fhcKU((E{eNp zI`;>zLt~LENL_>l8-l)zwsGDJ%XiUsFsx!{2QI#BueT4OxpR9xk?0B-r##|rT+w<# z!$}~QtXipCwQR*yl`<9mS5-1{tCVAwk*!n{YH%LPR4iG0bZ6-q`w-$W*JvVPG>tJ& z!Dd7gkC8Mp(HOZC8F@^0N0-z9IQiZpZ@9>A7{yY>zPZ51!%35^k2ND(=h!ojI zVP_EX)W(fo8al#rPt|=q#L!^U*g^xXRb&M%9}flNGoc`81wG@(FyiBSjn4vMV^K5& zT|pZI5!PTqS_@r>wU9o>#@Y@#mET5P4AkWls0)3}Lz&LfTBI9k4oNu9N?b(=_2!{W zM`;b^re8&TBxhsTD|3UF86L7((8|_T#IHBGKQ{(+QX6y-J4h4P{!K=aIy7RBu4=V}2z zAGosz00N`9G`;j{Ae8rB7>!)%TmZ%^MiQg6TS~s&6!v6;vDJsA0-0&m+l|fo*c`a8 zv5c)NFfCbzAdiy3_&oEXk&Uv9T!Vy9jVHJ;Of*e4R_aQ#>z5r;<_0N)j%{K)>Ly|^w5~!wLz^_5kBp~N^30%* z*Qe4ITv4Ty*QpR)37Q<+SOiVLX||5`b3qMrk(+FlRn4(F+nLO$^m~ID^l|*HCS5b2 zXbBL6wx2qrh1kCsjk@Ts?;bgVzMB7DxH!{SgC6Y5F}5L Vxv@kMu{F@rzE{|CN> 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 literal 0 HcmV?d00001 diff --git a/packages/Exceptron.Driver.0.1.0.34/lib/net20/Exceptron.Driver.pdb b/packages/Exceptron.Driver.0.1.0.34/lib/net20/Exceptron.Driver.pdb new file mode 100644 index 0000000000000000000000000000000000000000..548a9f19957a55160569b53412006bc7849d7ef6 GIT binary patch literal 67072 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/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 literal 0 HcmV?d00001 diff --git a/packages/Exceptron.Driver.0.1.0.34/src/ClientConfiguration.cs b/packages/Exceptron.Driver.0.1.0.34/src/ClientConfiguration.cs new file mode 100644 index 000000000..5a80cdad2 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/ClientConfiguration.cs @@ -0,0 +1,24 @@ +using Exceptron.Driver.Message; + +namespace Exceptron.Driver +{ + public class ClientConfiguration + { + + public ClientConfiguration() + { + ServerUrl = "http://api.exceptron.com/v1a/"; + } + + ///

+ /// If ExceptronClinet should throw exceptions in case of an error. Default: + /// + /// + /// Its recommended that this flag is set to True during development and in production systems. + /// If an exception is thrown while this flag is set to the thrown exception will be returned in + /// + public bool ThrowsExceptions { get; set; } + + internal string ServerUrl { get; set; } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.34/src/ExceptionClient.cs b/packages/Exceptron.Driver.0.1.0.34/src/ExceptionClient.cs new file mode 100644 index 000000000..642ef9911 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/ExceptionClient.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Reflection; +using System.Threading; +using Exceptron.Driver.Message; + +namespace Exceptron.Driver +{ + public class ExceptionClient + { + private readonly string _apiKey; + internal IRestClient RestClient { get; set; } + + /// + /// Version of Driver + /// + public string DriverVersion + { + get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(); } + } + + + /// + /// Name of Driver + /// + public string DriverName + { + get { return "Official .NET"; } + } + + /// + /// Client Configuration + /// + public ClientConfiguration ClientConfiguration { get; private set; } + + /// + /// Environment that the application is running in + /// + /// + /// Dev, Staging, Production + /// + public string Enviroment { get; set; } + + /// + /// Version of application executing. Default: Version of + /// + public string ApplicationVersion { get; set; } + + + + /// Your Exceptron API Key + public ExceptionClient(string apiKey) + : this(apiKey, new ClientConfiguration()) + { + } + + /// Your Exceptron API Key + /// Configuration to use for this client + private ExceptionClient(string apiKey, ClientConfiguration clientConfiguration) + { + ClientConfiguration = clientConfiguration; + _apiKey = apiKey; + + RestClient = new RestClient(); + + SetApplicationVersion(); + } + + /// + /// Submit an exception to Exceptron Servers. + /// + /// Exception data to be reported to the server + public ExceptionResponse SubmitException(ExceptionData exceptionData) + { + try + { + if (exceptionData == null) + throw new ArgumentNullException("exceptionData"); + + if (exceptionData.Exception == null) + throw new ArgumentException("ExceptionData.Exception Cannot be null.", "exceptionData"); + + var report = new ExceptionReport(); + + report.ap = _apiKey; + report.dn = DriverName; + report.dv = DriverVersion; + report.aver = ApplicationVersion; + + report.ext = exceptionData.Exception.GetType().FullName; + report.stk = ConvertToFrames(exceptionData.Exception); + report.exm = exceptionData.Exception.Message; + + report.cmp = exceptionData.Component; + report.uid = exceptionData.UserId; + report.env = Enviroment; + report.msg = exceptionData.Message; + report.cul = Thread.CurrentThread.CurrentCulture.Name; + report.os = Environment.OSVersion.VersionString; + report.sv = (int)exceptionData.Severity; + + var response = RestClient.Put(ClientConfiguration.ServerUrl, report); + + return response; + } + catch (Exception e) + { + Trace.WriteLine("Unable to submit exception to exceptron. ", e.ToString()); + + if (ClientConfiguration.ThrowsExceptions) + { + throw; + } + else + { + return new ExceptionResponse { Exception = e }; + } + } + } + + + private void SetApplicationVersion() + { + try + { + var entryAssembly = GetWebEntryAssembly(); + + if (entryAssembly == null) + { + entryAssembly = Assembly.GetEntryAssembly(); + } + + if (entryAssembly == null) + { + entryAssembly = Assembly.GetCallingAssembly(); + } + + if (entryAssembly != null) + { + ApplicationVersion = entryAssembly.GetName().Version.ToString(); + } + } + catch (Exception e) + { + Trace.WriteLine("Can't figure out application version.", e.ToString()); + } + } + + static private Assembly GetWebEntryAssembly() + { + if (System.Web.HttpContext.Current == null || + System.Web.HttpContext.Current.ApplicationInstance == null) + { + return null; + } + + var type = System.Web.HttpContext.Current.ApplicationInstance.GetType(); + while (type != null && type.Namespace == "ASP") + { + type = type.BaseType; + } + + return type == null ? null : type.Assembly; + } + + internal static List ConvertToFrames(Exception exception) + { + if (exception == null) return null; + + var stackTrace = new StackTrace(exception, true); + + var frames = stackTrace.GetFrames(); + + if (frames == null) return null; + + var result = new List(); + + for (int index = 0; index < frames.Length; index++) + { + var frame = frames[index]; + var method = frame.GetMethod(); + var declaringType = method.DeclaringType; + + var currentFrame = new Frame + { + i = index, + fn = frame.GetFileName(), + ln = frame.GetFileLineNumber(), + m = method.ToString(), + }; + + + currentFrame.m = currentFrame.m.Substring(currentFrame.m.IndexOf(' ')).Trim(); + + + if (declaringType != null) + { + currentFrame.c = declaringType.FullName; + } + + result.Add(currentFrame); + } + + + return result; + } + + } +} diff --git a/packages/Exceptron.Driver.0.1.0.34/src/ExceptionData.cs b/packages/Exceptron.Driver.0.1.0.34/src/ExceptionData.cs new file mode 100644 index 000000000..db8e5b5ca --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/ExceptionData.cs @@ -0,0 +1,54 @@ +using System; + +namespace Exceptron.Driver +{ + /// + /// Represents information that will be used to construct an exception report. + /// + public class ExceptionData + { + /// + /// Exception that is being reported + /// + public Exception Exception { get; set; } + + /// + /// Component that caused this error. + /// + /// + /// It is common to use the logger name that was used to log the exception as the component. + /// + /// + /// DataAccess, Configuration, Registration, etc. + /// + public string Component { get; set; } + + /// + /// ID that will uniquely identify the user + /// + /// + /// This Id does not have to be tied to the user's identity. + /// You can use a system generated unique ID such as GUID. + /// This field is used to report how many unique users are experiencing an error. + /// + /// + /// "62E5C8EF-0CA2-43AB-B278-FC6994F776ED" + /// "Timmy@aol.com" + /// "26437" + /// + public string UserId { get; set; } + + /// + /// Any message that should be attached to this exceptions + /// + /// + /// Something went wrong while checking for application updates. + /// + public string Message { get; set; } + + /// + /// Severity of the exception being reported + /// + public ExceptionSeverity Severity { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/ExceptionSeverity.cs b/packages/Exceptron.Driver.0.1.0.34/src/ExceptionSeverity.cs new file mode 100644 index 000000000..d1bbe849e --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/ExceptionSeverity.cs @@ -0,0 +1,28 @@ +namespace Exceptron.Driver +{ + /// + /// Severity of the exception being reported + /// + public enum ExceptionSeverity + { + /// + /// Excepted Error. Can be ignored + /// + None = 0, + + /// + /// Error that can be handled gracefully + /// + Warning = 1, + + /// + /// Blocking user from completing their intended action + /// + Error = 2, + + /// + /// Will most likely cause the application to crash + /// + Fatal = 3 + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/IRestClient.cs b/packages/Exceptron.Driver.0.1.0.34/src/IRestClient.cs new file mode 100644 index 000000000..a1e9a5d48 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/IRestClient.cs @@ -0,0 +1,7 @@ +namespace Exceptron.Driver +{ + internal interface IRestClient + { + TResponse Put(string url, object report) where TResponse : class, new(); + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionReport.cs b/packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionReport.cs new file mode 100644 index 000000000..d3d64c74d --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionReport.cs @@ -0,0 +1,79 @@ +using System.Collections.Generic; + +namespace Exceptron.Driver.Message +{ + internal class ExceptionReport + { + /// + /// API key + /// + public string ap { get; set; } + + /// + /// Application Version + /// + public string aver { get; set; } + + /// + /// Exception Severity + /// + public int sv { get; set; } + + /// + /// User or Instance ID + /// + public string uid { get; set; } + + /// + /// Type of exception + /// + public string ext { get; set; } + + /// + /// Exception message + /// + public string exm { get; set; } + + /// + /// List of frames that make up the StackTrace of the exception + /// + public List stk { get; set; } + + /// + /// Component that experienced this exception + /// + public string cmp { get; set; } + + /// + /// Environment that this exception occurred in. + /// + /// Dev, Stage, Production + public string env { get; set; } + + /// + /// Message that was logged along with the exception. + /// + public string msg { get; set; } + + /// + /// User's culture in + /// + /// http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.name.aspx + public string cul { get; set; } + + /// + /// OS Version + /// + public string os { get; set; } + + /// + /// Name of the driver that generated and is sending this message + /// + public string dn { get; set; } + + /// + /// Version of the driver that generated and is sending this message + /// + public string dv { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionResponse.cs b/packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionResponse.cs new file mode 100644 index 000000000..7277ee31e --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/Message/ExceptionResponse.cs @@ -0,0 +1,33 @@ +using System; + +namespace Exceptron.Driver.Message +{ + public class ExceptionResponse + { + /// + /// Exception report reference ID. This ID will be shared across + /// similar exceptions + /// + public string RefId { get; internal set; } + + /// + /// Was the report successfully processed on the server + /// + public bool Successful + { + get + { + return !string.IsNullOrEmpty(RefId); + } + } + + /// + /// Exception that caused the message to fail. + /// + /// + /// This property will only be populated if is set to /> + /// Exception is thrown if is set to . + /// + public Exception Exception { get; internal set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/Message/Frame.cs b/packages/Exceptron.Driver.0.1.0.34/src/Message/Frame.cs new file mode 100644 index 000000000..5334862b3 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/Message/Frame.cs @@ -0,0 +1,30 @@ +namespace Exceptron.Driver.Message +{ + internal class Frame + { + /// + /// Order of current frame + /// + public int i { get; set; } + + /// + /// Line number of the current frame + /// + public int ln { get; set; } + + /// + /// File name of the current frame + /// + public string fn { get; set; } + + /// + /// Method name for current frame + /// + public string m { get; set; } + + /// + /// Class name for current frame + /// + public string c { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/Properties/AssemblyInfo.cs b/packages/Exceptron.Driver.0.1.0.34/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..0a891e51b --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/Properties/AssemblyInfo.cs @@ -0,0 +1,39 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Exceptron.Driver")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Exceptron.Driver")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a463887e-594f-4733-b227-a79f4ffb2158")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.1.0.34")] +[assembly: AssemblyFileVersion("0.1.0.34")] +[assembly: InternalsVisibleTo("Exceptron.Driver.Tests")] +[assembly: InternalsVisibleTo("Exceptron.Api.v1a.Tests")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] diff --git a/packages/Exceptron.Driver.0.1.0.34/src/RestClient.cs b/packages/Exceptron.Driver.0.1.0.34/src/RestClient.cs new file mode 100644 index 000000000..714a63fb4 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/RestClient.cs @@ -0,0 +1,79 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Text; +using Exceptron.Driver.fastJSON; + +namespace Exceptron.Driver +{ + public sealed class RestClient : IRestClient + { + public TResponse Put(string url, object content) where TResponse : class ,new() + { + + if(content == null) + throw new ArgumentNullException("content can not be null", "content"); + + if (string.IsNullOrEmpty(url)) + throw new ArgumentNullException("url can not be null or empty", "url"); + + Trace.WriteLine("Attempting PUT to " + url); + + var json = JSON.Instance.ToJSON(content); + + byte[] bytes = Encoding.UTF8.GetBytes(json); + var request = (HttpWebRequest)WebRequest.Create(url); + request.Timeout = 10000; + request.Method = "PUT"; + request.ContentType = "application/json"; + request.ContentLength = bytes.Length; + request.Accept = "application/json"; + + var dataStream = request.GetRequestStream(); + dataStream.Write(bytes, 0, bytes.Length); + dataStream.Close(); + var webResponse = request.GetResponse(); + + var responseStream = new StreamReader(webResponse.GetResponseStream(), Encoding.GetEncoding(1252)); + var responseString = responseStream.ReadToEnd(); + + Trace.WriteLine(responseString); + var response = JSON.Instance.ToObject(responseString); + + return response; + + /* try + { + var dataStream = request.GetRequestStream(); + dataStream.Write(bytes, 0, bytes.Length); + dataStream.Close(); + webResponse = request.GetResponse(); + } + catch (WebException ex) + { + Trace.WriteLine("An Error has occurred while Doing HTTP PUT. " + ex); + webResponse = ex.Response; + } + catch (Exception ex) + { + Trace.WriteLine("An Error has occurred while Doing HTTP PUT. " + ex); + } + + var response = new TResponse(); + + if (webResponse != null && webResponse.ContentType.Contains("json")) + { + var responseStream = new StreamReader(webResponse.GetResponseStream(), Encoding.GetEncoding(1252)); + var responseString = responseStream.ReadToEnd(); + + Trace.WriteLine(responseString); + response = JSON.Instance.ToObject(responseString); + } + + if (response == null) response = new TResponse(); + + return response;*/ + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.34/src/ValidationError.cs b/packages/Exceptron.Driver.0.1.0.34/src/ValidationError.cs new file mode 100644 index 000000000..b6ad2df6f --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/ValidationError.cs @@ -0,0 +1,11 @@ +namespace Exceptron.Driver +{ + public class ValidationError + { + public string ErrorCode { get; set; } + + public string FieldName { get; set; } + + public string Message { get; set; } + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/Getters.cs b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/Getters.cs new file mode 100644 index 000000000..ed22088c1 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/Getters.cs @@ -0,0 +1,20 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections.Generic; + +namespace Exceptron.Driver.fastJSON +{ + internal class Getters + { + public string Name; + public JSON.GenericGetter Getter; + public Type propertyType; + } + + internal class DatasetSchema + { + public List Info { get; set; } + public string Name { get; set; } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JSON.cs b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JSON.cs new file mode 100644 index 000000000..d49d8ffe7 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JSON.cs @@ -0,0 +1,854 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Reflection.Emit; +using Exceptron.Driver.fastJSON; + +namespace Exceptron.Driver.fastJSON +{ + internal delegate string Serialize(object data); + internal delegate object Deserialize(string data); + + internal class JSON + { + public readonly static JSON Instance = new JSON(); + + private JSON() + { + UseSerializerExtension = false; + SerializeNullValues = false; + UseOptimizedDatasetSchema = false; + UsingGlobalTypes = false; + } + public bool UseOptimizedDatasetSchema = true; + public bool UseFastGuid = true; + public bool UseSerializerExtension = true; + public bool IndentOutput = false; + public bool SerializeNullValues = true; + public bool UseUTCDateTime = false; + public bool ShowReadOnlyProperties = false; + public bool UsingGlobalTypes = true; + + public string ToJSON(object obj) + { + return ToJSON(obj, UseSerializerExtension, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); + } + + public string ToJSON(object obj, + bool enableSerializerExtensions) + { + return ToJSON(obj, enableSerializerExtensions, UseFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); + } + + public string ToJSON(object obj, + bool enableSerializerExtensions, + bool enableFastGuid) + { + return ToJSON(obj, enableSerializerExtensions, enableFastGuid, UseOptimizedDatasetSchema, SerializeNullValues); + } + + public string ToJSON(object obj, + bool enableSerializerExtensions, + bool enableFastGuid, + bool enableOptimizedDatasetSchema, + bool serializeNullValues) + { + return new JSONSerializer(enableOptimizedDatasetSchema, enableFastGuid, enableSerializerExtensions, serializeNullValues, IndentOutput).ConvertToJSON(obj); + } + + public object Parse(string json) + { + return new JsonParser(json).Decode(); + } + + public T ToObject(string json) + { + return (T)ToObject(json, typeof(T)); + } + + public object ToObject(string json) + { + return ToObject(json, null); + } + + public object ToObject(string json, Type type) + { + Dictionary ht = new JsonParser(json).Decode() as Dictionary; + if (ht == null) return null; + return ParseDictionary(ht, null, type); + } + +#if CUSTOMTYPE + internal SafeDictionary _customSerializer = new SafeDictionary(); + internal SafeDictionary _customDeserializer = new SafeDictionary(); + + public void RegisterCustomType(Type type, Serialize serializer, Deserialize deserializer) + { + if (type != null && serializer != null && deserializer != null) + { + _customSerializer.Add(type, serializer); + _customDeserializer.Add(type, deserializer); + // reset property cache + _propertycache = new SafeDictionary>(); + } + } + + internal bool IsTypeRegistered(Type t) + { + Serialize s; + return _customSerializer.TryGetValue(t, out s); + } +#endif + + #region [ PROPERTY GET SET CACHE ] + SafeDictionary _tyname = new SafeDictionary(); + internal string GetTypeAssemblyName(Type t) + { + string val = ""; + if (_tyname.TryGetValue(t, out val)) + return val; + else + { + string s = t.AssemblyQualifiedName; + _tyname.Add(t, s); + return s; + } + } + + SafeDictionary _typecache = new SafeDictionary(); + private Type GetTypeFromCache(string typename) + { + Type val = null; + if (_typecache.TryGetValue(typename, out val)) + return val; + else + { + Type t = Type.GetType(typename); + _typecache.Add(typename, t); + return t; + } + } + + SafeDictionary _constrcache = new SafeDictionary(); + private delegate object CreateObject(); + private object FastCreateInstance(Type objtype) + { + try + { + CreateObject c = null; + if (_constrcache.TryGetValue(objtype, out c)) + { + return c(); + } + else + { + DynamicMethod dynMethod = new DynamicMethod("_", objtype, null, true); + ILGenerator ilGen = dynMethod.GetILGenerator(); + + ilGen.Emit(OpCodes.Newobj, objtype.GetConstructor(Type.EmptyTypes)); + ilGen.Emit(OpCodes.Ret); + c = (CreateObject)dynMethod.CreateDelegate(typeof(CreateObject)); + _constrcache.Add(objtype, c); + return c(); + } + } + catch (Exception exc) + { + throw new Exception(string.Format("Failed to fast create instance for type '{0}' from assemebly '{1}'", + objtype.FullName, objtype.AssemblyQualifiedName), exc); + } + } + + private struct myPropInfo + { + public bool filled; + public Type pt; + public Type bt; + public Type changeType; + public bool isDictionary; + public bool isValueType; + public bool isGenericType; + public bool isArray; + public bool isByteArray; + public bool isGuid; +#if !SILVERLIGHT + public bool isDataSet; + public bool isDataTable; + public bool isHashtable; +#endif + public GenericSetter setter; + public bool isEnum; + public bool isDateTime; + public Type[] GenericTypes; + public bool isInt; + public bool isLong; + public bool isString; + public bool isBool; + public bool isClass; + public GenericGetter getter; + public bool isStringDictionary; + public string Name; +#if CUSTOMTYPE + public bool isCustomType; +#endif + public bool CanWrite; + } + + SafeDictionary> _propertycache = new SafeDictionary>(); + private SafeDictionary Getproperties(Type type, string typename) + { + SafeDictionary sd = null; + if (_propertycache.TryGetValue(typename, out sd)) + { + return sd; + } + else + { + sd = new SafeDictionary(); + PropertyInfo[] pr = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + foreach (PropertyInfo p in pr) + { + myPropInfo d = CreateMyProp(p.PropertyType, p.Name); + d.CanWrite = p.CanWrite; + d.setter = CreateSetMethod(p); + d.getter = CreateGetMethod(p); + sd.Add(p.Name, d); + } + + _propertycache.Add(typename, sd); + return sd; + } + } + + private myPropInfo CreateMyProp(Type t, string name) + { + myPropInfo d = new myPropInfo(); + d.filled = true; + d.CanWrite = true; + d.pt = t; + d.Name = name; + d.isDictionary = t.Name.Contains("Dictionary"); + if (d.isDictionary) + d.GenericTypes = t.GetGenericArguments(); + d.isValueType = t.IsValueType; + d.isGenericType = t.IsGenericType; + d.isArray = t.IsArray; + if (d.isArray) + d.bt = t.GetElementType(); + if (d.isGenericType) + d.bt = t.GetGenericArguments()[0]; + d.isByteArray = t == typeof(byte[]); + d.isGuid = (t == typeof(Guid) || t == typeof(Guid?)); +#if !SILVERLIGHT + d.isHashtable = t == typeof(Hashtable); + d.isDataSet = t == typeof(DataSet); + d.isDataTable = t == typeof(DataTable); +#endif + + d.changeType = GetChangeType(t); + d.isEnum = t.IsEnum; + d.isDateTime = t == typeof(DateTime) || t == typeof(DateTime?); + d.isInt = t == typeof(int) || t == typeof(int?); + d.isLong = t == typeof(long) || t == typeof(long?); + d.isString = t == typeof(string); + d.isBool = t == typeof(bool) || t == typeof(bool?); + d.isClass = t.IsClass; + + if (d.isDictionary && d.GenericTypes.Length > 0 && d.GenericTypes[0] == typeof(string)) + d.isStringDictionary = true; + +#if CUSTOMTYPE + if (IsTypeRegistered(t)) + d.isCustomType = true; +#endif + return d; + } + + private delegate void GenericSetter(object target, object value); + + private static GenericSetter CreateSetMethod(PropertyInfo propertyInfo) + { + MethodInfo setMethod = propertyInfo.GetSetMethod(nonPublic: true); + if (setMethod == null) + return null; + + Type[] arguments = new Type[2]; + arguments[0] = arguments[1] = typeof(object); + + DynamicMethod setter = new DynamicMethod("_", typeof(void), arguments, true); + ILGenerator il = setter.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); + il.Emit(OpCodes.Ldarg_1); + + if (propertyInfo.PropertyType.IsClass) + il.Emit(OpCodes.Castclass, propertyInfo.PropertyType); + else + il.Emit(OpCodes.Unbox_Any, propertyInfo.PropertyType); + + il.EmitCall(OpCodes.Callvirt, setMethod, null); + il.Emit(OpCodes.Ret); + + return (GenericSetter)setter.CreateDelegate(typeof(GenericSetter)); + } + + internal delegate object GenericGetter(object obj); + + + private GenericGetter CreateGetMethod(PropertyInfo propertyInfo) + { + MethodInfo getMethod = propertyInfo.GetGetMethod(); + if (getMethod == null) + return null; + + Type[] arguments = new Type[1]; + arguments[0] = typeof(object); + + DynamicMethod getter = new DynamicMethod("_", typeof(object), arguments, true); + ILGenerator il = getter.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Castclass, propertyInfo.DeclaringType); + il.EmitCall(OpCodes.Callvirt, getMethod, null); + + if (!propertyInfo.PropertyType.IsClass) + il.Emit(OpCodes.Box, propertyInfo.PropertyType); + + il.Emit(OpCodes.Ret); + + return (GenericGetter)getter.CreateDelegate(typeof(GenericGetter)); + } + + readonly SafeDictionary> _getterscache = new SafeDictionary>(); + internal List GetGetters(Type type) + { + List val = null; + if (_getterscache.TryGetValue(type, out val)) + return val; + + PropertyInfo[] props = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); + List getters = new List(); + foreach (PropertyInfo p in props) + { + if (!p.CanWrite && ShowReadOnlyProperties == false) continue; + + object[] att = p.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false); + if (att != null && att.Length > 0) + continue; + + JSON.GenericGetter g = CreateGetMethod(p); + if (g != null) + { + Getters gg = new Getters(); + gg.Name = p.Name; + gg.Getter = g; + gg.propertyType = p.PropertyType; + getters.Add(gg); + } + } + + + _getterscache.Add(type, getters); + return getters; + } + + private object ChangeType(object value, Type conversionType) + { + if (conversionType == typeof(int)) + return (int)CreateLong((string)value); + + else if (conversionType == typeof(long)) + return CreateLong((string)value); + + else if (conversionType == typeof(string)) + return (string)value; + + else if (conversionType == typeof(Guid)) + return CreateGuid((string)value); + + else if (conversionType.IsEnum) + return CreateEnum(conversionType, (string)value); + + return Convert.ChangeType(value, conversionType, CultureInfo.InvariantCulture); + } + #endregion + + + private object ParseDictionary(Dictionary d, Dictionary globaltypes, Type type) + { + object tn = ""; + if (d.TryGetValue("$types", out tn)) + { + UsingGlobalTypes = true; + globaltypes = new Dictionary(); + foreach (var kv in (Dictionary)tn) + { + globaltypes.Add((string)kv.Value, kv.Key); + } + } + + bool found = d.TryGetValue("$type", out tn); +#if !SILVERLIGHT + if (found == false && type == typeof(System.Object)) + { + return CreateDataset(d, globaltypes); + } +#endif + if (found) + { + if (UsingGlobalTypes) + { + object tname = ""; + if (globaltypes.TryGetValue((string)tn, out tname)) + tn = tname; + } + type = GetTypeFromCache((string)tn); + } + + if (type == null) + throw new Exception("Cannot determine type"); + + string typename = type.FullName; + object o = FastCreateInstance(type); + SafeDictionary props = Getproperties(type, typename); + foreach (string name in d.Keys) + { + if (name == "$map") + { + ProcessMap(o, props, (Dictionary)d[name]); + continue; + } + myPropInfo pi; + if (props.TryGetValue(name, out pi) == false) + continue; + if (pi.filled == true) + { + object v = d[name]; + + if (v != null) + { + object oset = null; + + if (pi.isInt) + oset = (int)CreateLong((string)v); +#if CUSTOMTYPE + else if (pi.isCustomType) + oset = CreateCustom((string)v, pi.pt); +#endif + else if (pi.isLong) + oset = CreateLong((string)v); + + else if (pi.isString) + oset = (string)v; + + else if (pi.isBool) + oset = (bool)v; + + else if (pi.isGenericType && pi.isValueType == false && pi.isDictionary == false) +#if SILVERLIGHT + oset = CreateGenericList((List)v, pi.pt, pi.bt, globaltypes); +#else + oset = CreateGenericList((ArrayList)v, pi.pt, pi.bt, globaltypes); +#endif + else if (pi.isByteArray) + oset = Convert.FromBase64String((string)v); + + else if (pi.isArray && pi.isValueType == false) +#if SILVERLIGHT + oset = CreateArray((List)v, pi.pt, pi.bt, globaltypes); +#else + oset = CreateArray((ArrayList)v, pi.pt, pi.bt, globaltypes); +#endif + else if (pi.isGuid) + oset = CreateGuid((string)v); +#if !SILVERLIGHT + else if (pi.isDataSet) + oset = CreateDataset((Dictionary)v, globaltypes); + + else if (pi.isDataTable) + oset = this.CreateDataTable((Dictionary)v, globaltypes); +#endif + + else if (pi.isStringDictionary) + oset = CreateStringKeyDictionary((Dictionary)v, pi.pt, pi.GenericTypes, globaltypes); + +#if !SILVERLIGHT + else if (pi.isDictionary || pi.isHashtable) + oset = CreateDictionary((ArrayList)v, pi.pt, pi.GenericTypes, globaltypes); +#else + else if (pi.isDictionary) + oset = CreateDictionary((List)v, pi.pt, pi.GenericTypes, globaltypes); +#endif + + else if (pi.isEnum) + oset = CreateEnum(pi.pt, (string)v); + + else if (pi.isDateTime) + oset = CreateDateTime((string)v); + + else if (pi.isClass && v is Dictionary) + oset = ParseDictionary((Dictionary)v, globaltypes, pi.pt); + + else if (pi.isValueType) + oset = ChangeType(v, pi.changeType); + +#if SILVERLIGHT + else if (v is List) + oset = CreateArray((List)v, pi.pt, typeof(object), globaltypes); +#else + else if (v is ArrayList) + oset = CreateArray((ArrayList)v, pi.pt, typeof(object), globaltypes); +#endif + else + oset = v; + + if (pi.CanWrite) + pi.setter(o, oset); + } + } + } + return o; + } + +#if CUSTOMTYPE + private object CreateCustom(string v, Type type) + { + Deserialize d; + _customDeserializer.TryGetValue(type, out d); + return d(v); + } +#endif + + private void ProcessMap(object obj, SafeDictionary props, Dictionary dic) + { + foreach (KeyValuePair kv in dic) + { + myPropInfo p = props[kv.Key]; + object o = p.getter(obj); + Type t = Type.GetType((string)kv.Value); + if (t == typeof(Guid)) + p.setter(obj, CreateGuid((string)o)); + } + } + + private long CreateLong(string s) + { + long num = 0; + bool neg = false; + foreach (char cc in s) + { + if (cc == '-') + neg = true; + else if (cc == '+') + neg = false; + else + { + num *= 10; + num += (int)(cc - '0'); + } + } + + return neg ? -num : num; + } + + private object CreateEnum(Type pt, string v) + { + // TODO : optimize create enum +#if !SILVERLIGHT + return Enum.Parse(pt, v); +#else + return Enum.Parse(pt, v, true); +#endif + } + + private Guid CreateGuid(string s) + { + if (s.Length > 30) + return new Guid(s); + else + return new Guid(Convert.FromBase64String(s)); + } + + private DateTime CreateDateTime(string value) + { + bool utc = false; + // 0123456789012345678 + // datetime format = yyyy-MM-dd HH:mm:ss + int year = (int)CreateLong(value.Substring(0, 4)); + int month = (int)CreateLong(value.Substring(5, 2)); + int day = (int)CreateLong(value.Substring(8, 2)); + int hour = (int)CreateLong(value.Substring(11, 2)); + int min = (int)CreateLong(value.Substring(14, 2)); + int sec = (int)CreateLong(value.Substring(17, 2)); + + if (value.EndsWith("Z")) + utc = true; + + if (UseUTCDateTime == false && utc == false) + return new DateTime(year, month, day, hour, min, sec); + else + return new DateTime(year, month, day, hour, min, sec, DateTimeKind.Utc).ToLocalTime(); + } + +#if SILVERLIGHT + private object CreateArray(List data, Type pt, Type bt, Dictionary globalTypes) + { + Array col = Array.CreateInstance(bt, data.Count); + // create an array of objects + for (int i = 0; i < data.Count; i++)// each (object ob in data) + { + object ob = data[i]; + if (ob is IDictionary) + col.SetValue(ParseDictionary((Dictionary)ob, globalTypes, bt), i); + else + col.SetValue(ChangeType(ob, bt), i); + } + + return col; + } +#else + private object CreateArray(ArrayList data, Type pt, Type bt, Dictionary globalTypes) + { + ArrayList col = new ArrayList(); + // create an array of objects + foreach (object ob in data) + { + if (ob is IDictionary) + col.Add(ParseDictionary((Dictionary)ob, globalTypes, bt)); + else + col.Add(ChangeType(ob, bt)); + } + return col.ToArray(bt); + } +#endif + + +#if SILVERLIGHT + private object CreateGenericList(List data, Type pt, Type bt, Dictionary globalTypes) +#else + private object CreateGenericList(ArrayList data, Type pt, Type bt, Dictionary globalTypes) +#endif + { + IList col = (IList)FastCreateInstance(pt); + // create an array of objects + foreach (object ob in data) + { + if (ob is IDictionary) + col.Add(ParseDictionary((Dictionary)ob, globalTypes, bt)); +#if SILVERLIGHT + else if (ob is List) + col.Add(((List)ob).ToArray()); +#else + else if (ob is ArrayList) + col.Add(((ArrayList)ob).ToArray()); +#endif + else + col.Add(ChangeType(ob, bt)); + } + return col; + } + + private object CreateStringKeyDictionary(Dictionary reader, Type pt, Type[] types, Dictionary globalTypes) + { + var col = (IDictionary)FastCreateInstance(pt); + Type t1 = null; + Type t2 = null; + if (types != null) + { + t1 = types[0]; + t2 = types[1]; + } + + foreach (KeyValuePair values in reader) + { + var key = values.Key;//ChangeType(values.Key, t1); + object val = null; + if (values.Value is Dictionary) + val = ParseDictionary((Dictionary)values.Value, globalTypes, t2); + else + val = ChangeType(values.Value, t2); + col.Add(key, val); + } + + return col; + } + +#if SILVERLIGHT + private object CreateDictionary(List reader, Type pt, Type[] types, Dictionary globalTypes) +#else + private object CreateDictionary(ArrayList reader, Type pt, Type[] types, Dictionary globalTypes) +#endif + { + IDictionary col = (IDictionary)FastCreateInstance(pt); + Type t1 = null; + Type t2 = null; + if (types != null) + { + t1 = types[0]; + t2 = types[1]; + } + + foreach (Dictionary values in reader) + { + object key = values["k"]; + object val = values["v"]; + + if (key is Dictionary) + key = ParseDictionary((Dictionary)key, globalTypes, t1); + else + key = ChangeType(key, t1); + + if (val is Dictionary) + val = ParseDictionary((Dictionary)val, globalTypes, t2); + else + val = ChangeType(val, t2); + + col.Add(key, val); + } + + return col; + } + + private Type GetChangeType(Type conversionType) + { + if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) + return conversionType.GetGenericArguments()[0]; + + return conversionType; + } +#if !SILVERLIGHT + private DataSet CreateDataset(Dictionary reader, Dictionary globalTypes) + { + DataSet ds = new DataSet(); + ds.EnforceConstraints = false; + ds.BeginInit(); + + // read dataset schema here + ReadSchema(reader, ds, globalTypes); + + foreach (KeyValuePair pair in reader) + { + if (pair.Key == "$type" || pair.Key == "$schema") continue; + + ArrayList rows = (ArrayList)pair.Value; + if (rows == null) continue; + + DataTable dt = ds.Tables[pair.Key]; + ReadDataTable(rows, dt); + } + + ds.EndInit(); + + return ds; + } + + private void ReadSchema(Dictionary reader, DataSet ds, Dictionary globalTypes) + { + var schema = reader["$schema"]; + + if (schema is string) + { + TextReader tr = new StringReader((string)schema); + ds.ReadXmlSchema(tr); + } + else + { + DatasetSchema ms = (DatasetSchema)ParseDictionary((Dictionary)schema, globalTypes, typeof(DatasetSchema)); + ds.DataSetName = ms.Name; + for (int i = 0; i < ms.Info.Count; i += 3) + { + if (ds.Tables.Contains(ms.Info[i]) == false) + ds.Tables.Add(ms.Info[i]); + ds.Tables[ms.Info[i]].Columns.Add(ms.Info[i + 1], Type.GetType(ms.Info[i + 2])); + } + } + } + + private void ReadDataTable(ArrayList rows, DataTable dt) + { + dt.BeginInit(); + dt.BeginLoadData(); + List guidcols = new List(); + List datecol = new List(); + + foreach (DataColumn c in dt.Columns) + { + if (c.DataType == typeof(Guid) || c.DataType == typeof(Guid?)) + guidcols.Add(c.Ordinal); + if (UseUTCDateTime && (c.DataType == typeof(DateTime) || c.DataType == typeof(DateTime?))) + datecol.Add(c.Ordinal); + } + + foreach (ArrayList row in rows) + { + object[] v = new object[row.Count]; + row.CopyTo(v, 0); + foreach (int i in guidcols) + { + string s = (string)v[i]; + if (s != null && s.Length < 36) + v[i] = new Guid(Convert.FromBase64String(s)); + } + if (UseUTCDateTime) + { + foreach (int i in datecol) + { + string s = (string)v[i]; + if (s != null) + v[i] = CreateDateTime(s); + } + } + dt.Rows.Add(v); + } + + dt.EndLoadData(); + dt.EndInit(); + } + + DataTable CreateDataTable(Dictionary reader, Dictionary globalTypes) + { + var dt = new DataTable(); + + // read dataset schema here + var schema = reader["$schema"]; + + if (schema is string) + { + TextReader tr = new StringReader((string)schema); + dt.ReadXmlSchema(tr); + } + else + { + var ms = (DatasetSchema)this.ParseDictionary((Dictionary)schema, globalTypes, typeof(DatasetSchema)); + dt.TableName = ms.Info[0]; + for (int i = 0; i < ms.Info.Count; i += 3) + { + dt.Columns.Add(ms.Info[i + 1], Type.GetType(ms.Info[i + 2])); + } + } + + foreach (var pair in reader) + { + if (pair.Key == "$type" || pair.Key == "$schema") + continue; + + var rows = (ArrayList)pair.Value; + if (rows == null) + continue; + + if (!dt.TableName.Equals(pair.Key, StringComparison.InvariantCultureIgnoreCase)) + continue; + + ReadDataTable(rows, dt); + } + + return dt; + } +#endif + } +} \ No newline at end of file diff --git a/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonParser.cs b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonParser.cs new file mode 100644 index 000000000..569ce1769 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonParser.cs @@ -0,0 +1,408 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace Exceptron.Driver.fastJSON +{ + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes ArrayList and Hashtable. + /// All numbers are parsed to doubles. + /// + internal class JsonParser + { + enum Token + { + None = -1, // Used to denote no Lookahead available + Curly_Open, + Curly_Close, + Squared_Open, + Squared_Close, + Colon, + Comma, + String, + Number, + True, + False, + Null + } + + readonly char[] json; + readonly StringBuilder s = new StringBuilder(); + Token lookAheadToken = Token.None; + int index; + + internal JsonParser(string json) + { + this.json = json.ToCharArray(); + } + + public object Decode() + { + return ParseValue(); + } + + private Dictionary ParseObject() + { + Dictionary table = new Dictionary(); + + ConsumeToken(); // { + + while (true) + { + switch (LookAhead()) + { + + case Token.Comma: + ConsumeToken(); + break; + + case Token.Curly_Close: + ConsumeToken(); + return table; + + default: + { + + // name + string name = ParseString(); + + // : + if (NextToken() != Token.Colon) + { + throw new Exception("Expected colon at index " + index); + } + + // value + object value = ParseValue(); + + table[name] = value; + } + break; + } + } + } + +#if SILVERLIGHT + private List ParseArray() + { + List array = new List(); +#else + private ArrayList ParseArray() + { + ArrayList array = new ArrayList(); +#endif + ConsumeToken(); // [ + + while (true) + { + switch (LookAhead()) + { + + case Token.Comma: + ConsumeToken(); + break; + + case Token.Squared_Close: + ConsumeToken(); + return array; + + default: + { + array.Add(ParseValue()); + } + break; + } + } + } + + private object ParseValue() + { + switch (LookAhead()) + { + case Token.Number: + return ParseNumber(); + + case Token.String: + return ParseString(); + + case Token.Curly_Open: + return ParseObject(); + + case Token.Squared_Open: + return ParseArray(); + + case Token.True: + ConsumeToken(); + return true; + + case Token.False: + ConsumeToken(); + return false; + + case Token.Null: + ConsumeToken(); + return null; + } + + throw new Exception("Unrecognized token at index" + index); + } + + private string ParseString() + { + ConsumeToken(); // " + + s.Length = 0; + + int runIndex = -1; + + while (index < json.Length) + { + var c = json[index++]; + + if (c == '"') + { + if (runIndex != -1) + { + if (s.Length == 0) + return new string(json, runIndex, index - runIndex - 1); + + s.Append(json, runIndex, index - runIndex - 1); + } + return s.ToString(); + } + + if (c != '\\') + { + if (runIndex == -1) + runIndex = index - 1; + + continue; + } + + if (index == json.Length) break; + + if (runIndex != -1) + { + s.Append(json, runIndex, index - runIndex - 1); + runIndex = -1; + } + + switch (json[index++]) + { + case '"': + s.Append('"'); + break; + + case '\\': + s.Append('\\'); + break; + + case '/': + s.Append('/'); + break; + + case 'b': + s.Append('\b'); + break; + + case 'f': + s.Append('\f'); + break; + + case 'n': + s.Append('\n'); + break; + + case 'r': + s.Append('\r'); + break; + + case 't': + s.Append('\t'); + break; + + case 'u': + { + int remainingLength = json.Length - index; + if (remainingLength < 4) break; + + // parse the 32 bit hex into an integer codepoint + uint codePoint = ParseUnicode(json[index], json[index + 1], json[index + 2], json[index + 3]); + s.Append((char)codePoint); + + // skip 4 chars + index += 4; + } + break; + } + } + + throw new Exception("Unexpectedly reached end of string"); + } + + private uint ParseSingleChar(char c1, uint multipliyer) + { + uint p1 = 0; + if (c1 >= '0' && c1 <= '9') + p1 = (uint)(c1 - '0') * multipliyer; + else if (c1 >= 'A' && c1 <= 'F') + p1 = (uint)((c1 - 'A') + 10) * multipliyer; + else if (c1 >= 'a' && c1 <= 'f') + p1 = (uint)((c1 - 'a') + 10) * multipliyer; + return p1; + } + + private uint ParseUnicode(char c1, char c2, char c3, char c4) + { + uint p1 = ParseSingleChar(c1, 0x1000); + uint p2 = ParseSingleChar(c2, 0x100); + uint p3 = ParseSingleChar(c3, 0x10); + uint p4 = ParseSingleChar(c4, 1); + + return p1 + p2 + p3 + p4; + } + + private string ParseNumber() + { + ConsumeToken(); + + // Need to start back one place because the first digit is also a token and would have been consumed + var startIndex = index - 1; + + do + { + var c = json[index]; + + if ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+' || c == 'e' || c == 'E') + { + if (++index == json.Length) throw new Exception("Unexpected end of string whilst parsing number"); + continue; + } + + break; + } while (true); + + return new string(json, startIndex, index - startIndex); + } + + private Token LookAhead() + { + if (lookAheadToken != Token.None) return lookAheadToken; + + return lookAheadToken = NextTokenCore(); + } + + private void ConsumeToken() + { + lookAheadToken = Token.None; + } + + private Token NextToken() + { + var result = lookAheadToken != Token.None ? lookAheadToken : NextTokenCore(); + + lookAheadToken = Token.None; + + return result; + } + + private Token NextTokenCore() + { + char c; + + // Skip past whitespace + do + { + c = json[index]; + + if (c > ' ') break; + if (c != ' ' && c != '\t' && c != '\n' && c != '\r') break; + + } while (++index < json.Length); + + if (index == json.Length) + { + throw new Exception("Reached end of string unexpectedly"); + } + + c = json[index]; + + index++; + + //if (c >= '0' && c <= '9') + // return Token.Number; + + switch (c) + { + case '{': + return Token.Curly_Open; + + case '}': + return Token.Curly_Close; + + case '[': + return Token.Squared_Open; + + case ']': + return Token.Squared_Close; + + case ',': + return Token.Comma; + + case '"': + return Token.String; + + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case '-': case '+': case '.': + return Token.Number; + + case ':': + return Token.Colon; + + case 'f': + if (json.Length - index >= 4 && + json[index + 0] == 'a' && + json[index + 1] == 'l' && + json[index + 2] == 's' && + json[index + 3] == 'e') + { + index += 4; + return Token.False; + } + break; + + case 't': + if (json.Length - index >= 3 && + json[index + 0] == 'r' && + json[index + 1] == 'u' && + json[index + 2] == 'e') + { + index += 3; + return Token.True; + } + break; + + case 'n': + if (json.Length - index >= 3 && + json[index + 0] == 'u' && + json[index + 1] == 'l' && + json[index + 2] == 'l') + { + index += 3; + return Token.Null; + } + break; + + } + + throw new Exception("Could not find token at index " + --index); + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonSerializer.cs b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonSerializer.cs new file mode 100644 index 000000000..439471fae --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/JsonSerializer.cs @@ -0,0 +1,518 @@ +//http://fastjson.codeplex.com/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Text; + +namespace Exceptron.Driver.fastJSON +{ + internal class JSONSerializer + { + private readonly StringBuilder _output = new StringBuilder(); + readonly bool useMinimalDataSetSchema; + readonly bool fastguid = true; + readonly bool useExtension = true; + readonly bool serializeNulls = true; + readonly int _MAX_DEPTH = 10; + bool _Indent = false; + bool _useGlobalTypes = true; + int _current_depth = 0; + private Dictionary _globalTypes = new Dictionary(); + + internal JSONSerializer(bool UseMinimalDataSetSchema, bool UseFastGuid, bool UseExtensions, bool SerializeNulls, bool IndentOutput) + { + this.useMinimalDataSetSchema = UseMinimalDataSetSchema; + this.fastguid = UseFastGuid; + this.useExtension = UseExtensions; + _Indent = IndentOutput; + this.serializeNulls = SerializeNulls; + if (useExtension == false) + _useGlobalTypes = false; + } + + internal string ConvertToJSON(object obj) + { + WriteValue(obj); + + string str = ""; + if (_useGlobalTypes) + { + StringBuilder sb = new StringBuilder(); + sb.Append("{\"$types\":{"); + bool pendingSeparator = false; + foreach (var kv in _globalTypes) + { + if (pendingSeparator) sb.Append(','); + pendingSeparator = true; + sb.Append("\""); + sb.Append(kv.Key); + sb.Append("\":\""); + sb.Append(kv.Value); + sb.Append("\""); + } + sb.Append("},"); + str = sb.ToString() + _output.ToString(); + } + else + str = _output.ToString(); + + return str; + } + + private void WriteValue(object obj) + { + if (obj == null || obj is DBNull) + _output.Append("null"); + + else if (obj is string || obj is char) + WriteString((string)obj); + + else if (obj is Guid) + WriteGuid((Guid)obj); + + else if (obj is bool) + _output.Append(((bool)obj) ? "true" : "false"); // conform to standard + + else if ( + obj is int || obj is long || obj is double || + obj is decimal || obj is float || + obj is byte || obj is short || + obj is sbyte || obj is ushort || + obj is uint || obj is ulong + ) + _output.Append(((IConvertible)obj).ToString(NumberFormatInfo.InvariantInfo)); + + else if (obj is DateTime) + WriteDateTime((DateTime)obj); + + else if (obj is IDictionary && obj.GetType().IsGenericType && obj.GetType().GetGenericArguments()[0] == typeof(string)) + WriteStringDictionary((IDictionary)obj); + + else if (obj is IDictionary) + WriteDictionary((IDictionary)obj); +#if !SILVERLIGHT + else if (obj is DataSet) + WriteDataset((DataSet)obj); + + else if (obj is DataTable) + this.WriteDataTable((DataTable)obj); +#endif + else if (obj is byte[]) + WriteBytes((byte[])obj); + + else if (obj is Array || obj is IList || obj is ICollection) + WriteArray((IEnumerable)obj); + + else if (obj is Enum) + WriteEnum((Enum)obj); + +#if CUSTOMTYPE + else if (JSON.Instance.IsTypeRegistered(obj.GetType())) + WriteCustom(obj); +#endif + else + WriteObject(obj); + } + +#if CUSTOMTYPE + private void WriteCustom(object obj) + { + Serialize s; + JSON.Instance._customSerializer.TryGetValue(obj.GetType(), out s); + WriteStringFast(s(obj)); + } +#endif + + private void WriteEnum(Enum e) + { + // TODO : optimize enum write + WriteStringFast(e.ToString()); + } + + private void WriteGuid(Guid g) + { + if (fastguid == false) + WriteStringFast(g.ToString()); + else + WriteBytes(g.ToByteArray()); + } + + private void WriteBytes(byte[] bytes) + { +#if !SILVERLIGHT + WriteStringFast(Convert.ToBase64String(bytes, 0, bytes.Length, Base64FormattingOptions.None)); +#else + WriteStringFast(Convert.ToBase64String(bytes, 0, bytes.Length)); +#endif + } + + private void WriteDateTime(DateTime dateTime) + { + // datetime format standard : yyyy-MM-dd HH:mm:ss + DateTime dt = dateTime; + if (JSON.Instance.UseUTCDateTime) + dt = dateTime.ToUniversalTime(); + + _output.Append("\""); + _output.Append(dt.Year.ToString("0000", NumberFormatInfo.InvariantInfo)); + _output.Append("-"); + _output.Append(dt.Month.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append("-"); + _output.Append(dt.Day.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append(" "); + _output.Append(dt.Hour.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append(":"); + _output.Append(dt.Minute.ToString("00", NumberFormatInfo.InvariantInfo)); + _output.Append(":"); + _output.Append(dt.Second.ToString("00", NumberFormatInfo.InvariantInfo)); + + if (JSON.Instance.UseUTCDateTime) + _output.Append("Z"); + + _output.Append("\""); + } +#if !SILVERLIGHT + private DatasetSchema GetSchema(DataTable ds) + { + if (ds == null) return null; + + DatasetSchema m = new DatasetSchema(); + m.Info = new List(); + m.Name = ds.TableName; + + foreach (DataColumn c in ds.Columns) + { + m.Info.Add(ds.TableName); + m.Info.Add(c.ColumnName); + m.Info.Add(c.DataType.ToString()); + } + // TODO : serialize relations and constraints here + + return m; + } + + private DatasetSchema GetSchema(DataSet ds) + { + if (ds == null) return null; + + DatasetSchema m = new DatasetSchema(); + m.Info = new List(); + m.Name = ds.DataSetName; + + foreach (DataTable t in ds.Tables) + { + foreach (DataColumn c in t.Columns) + { + m.Info.Add(t.TableName); + m.Info.Add(c.ColumnName); + m.Info.Add(c.DataType.ToString()); + } + } + // TODO : serialize relations and constraints here + + return m; + } + + private string GetXmlSchema(DataTable dt) + { + using (var writer = new StringWriter()) + { + dt.WriteXmlSchema(writer); + return dt.ToString(); + } + } + + private void WriteDataset(DataSet ds) + { + _output.Append('{'); + if (useExtension) + { + WritePair("$schema", useMinimalDataSetSchema ? (object)GetSchema(ds) : ds.GetXmlSchema()); + _output.Append(','); + } + bool tablesep = false; + foreach (DataTable table in ds.Tables) + { + if (tablesep) _output.Append(","); + tablesep = true; + WriteDataTableData(table); + } + // end dataset + _output.Append('}'); + } + + private void WriteDataTableData(DataTable table) + { + _output.Append('\"'); + _output.Append(table.TableName); + _output.Append("\":["); + DataColumnCollection cols = table.Columns; + bool rowseparator = false; + foreach (DataRow row in table.Rows) + { + if (rowseparator) _output.Append(","); + rowseparator = true; + _output.Append('['); + + bool pendingSeperator = false; + foreach (DataColumn column in cols) + { + if (pendingSeperator) _output.Append(','); + WriteValue(row[column]); + pendingSeperator = true; + } + _output.Append(']'); + } + + _output.Append(']'); + } + + void WriteDataTable(DataTable dt) + { + this._output.Append('{'); + if (this.useExtension) + { + this.WritePair("$schema", this.useMinimalDataSetSchema ? (object)this.GetSchema(dt) : this.GetXmlSchema(dt)); + this._output.Append(','); + } + + WriteDataTableData(dt); + + // end datatable + this._output.Append('}'); + } +#endif + bool _firstWritten = false; + private void WriteObject(object obj) + { + Indent(); + if (_useGlobalTypes == false) + _output.Append('{'); + else + { + if (_firstWritten) + _output.Append("{"); + } + _firstWritten = true; + _current_depth++; + if (_current_depth > _MAX_DEPTH) + throw new Exception("Serializer encountered maximum depth of " + _MAX_DEPTH); + + + Dictionary map = new Dictionary(); + Type t = obj.GetType(); + bool append = false; + if (useExtension) + { + if (_useGlobalTypes == false) + WritePairFast("$type", JSON.Instance.GetTypeAssemblyName(t)); + else + { + int dt = 0; + string ct = JSON.Instance.GetTypeAssemblyName(t); + if (_globalTypes.TryGetValue(ct, out dt) == false) + { + dt = _globalTypes.Count + 1; + _globalTypes.Add(ct, dt); + } + WritePairFast("$type", dt.ToString()); + } + append = true; + } + + List g = JSON.Instance.GetGetters(t); + foreach (var p in g) + { + if (append) + _output.Append(','); + object o = p.Getter(obj); + if ((o == null || o is DBNull) && serializeNulls == false) + append = false; + else + { + WritePair(p.Name, o); + if (o != null && useExtension) + { + Type tt = o.GetType(); + if (tt == typeof(System.Object)) + map.Add(p.Name, tt.ToString()); + } + append = true; + } + } + if (map.Count > 0 && useExtension) + { + _output.Append(",\"$map\":"); + WriteStringDictionary(map); + } + _current_depth--; + Indent(); + _output.Append('}'); + _current_depth--; + + } + + private void Indent() + { + Indent(false); + } + + private void Indent(bool dec) + { + if (_Indent) + { + _output.Append("\r\n"); + for (int i = 0; i < _current_depth - (dec ? 1 : 0); i++) + _output.Append("\t"); + } + } + + private void WritePairFast(string name, string value) + { + if ((value == null) && serializeNulls == false) + return; + Indent(); + WriteStringFast(name); + + _output.Append(':'); + + WriteStringFast(value); + } + + private void WritePair(string name, object value) + { + if ((value == null || value is DBNull) && serializeNulls == false) + return; + Indent(); + WriteStringFast(name); + + _output.Append(':'); + + WriteValue(value); + } + + private void WriteArray(IEnumerable array) + { + Indent(); + _output.Append('['); + + bool pendingSeperator = false; + + foreach (object obj in array) + { + Indent(); + if (pendingSeperator) _output.Append(','); + + WriteValue(obj); + + pendingSeperator = true; + } + Indent(); + _output.Append(']'); + } + + private void WriteStringDictionary(IDictionary dic) + { + Indent(); + _output.Append('{'); + + bool pendingSeparator = false; + + foreach (DictionaryEntry entry in dic) + { + if (pendingSeparator) _output.Append(','); + + WritePair((string)entry.Key, entry.Value); + + pendingSeparator = true; + } + Indent(); + _output.Append('}'); + } + + private void WriteDictionary(IDictionary dic) + { + Indent(); + _output.Append('['); + + bool pendingSeparator = false; + + foreach (DictionaryEntry entry in dic) + { + if (pendingSeparator) _output.Append(','); + Indent(); + _output.Append('{'); + WritePair("k", entry.Key); + _output.Append(","); + WritePair("v", entry.Value); + Indent(); + _output.Append('}'); + + pendingSeparator = true; + } + Indent(); + _output.Append(']'); + } + + private void WriteStringFast(string s) + { + //Indent(); + _output.Append('\"'); + _output.Append(s); + _output.Append('\"'); + } + + private void WriteString(string s) + { + //Indent(); + _output.Append('\"'); + + int runIndex = -1; + + for (var index = 0; index < s.Length; ++index) + { + var c = s[index]; + + if (c >= ' ' && c < 128 && c != '\"' && c != '\\') + { + if (runIndex == -1) + { + runIndex = index; + } + + continue; + } + + if (runIndex != -1) + { + _output.Append(s, runIndex, index - runIndex); + runIndex = -1; + } + + switch (c) + { + case '\t': _output.Append("\\t"); break; + case '\r': _output.Append("\\r"); break; + case '\n': _output.Append("\\n"); break; + case '"': + case '\\': _output.Append('\\'); _output.Append(c); break; + default: + _output.Append("\\u"); + _output.Append(((int)c).ToString("X4", NumberFormatInfo.InvariantInfo)); + break; + } + } + + if (runIndex != -1) + { + _output.Append(s, runIndex, s.Length - runIndex); + } + + _output.Append('\"'); + } + } +} diff --git a/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/SafeDictionary.cs b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/SafeDictionary.cs new file mode 100644 index 000000000..191975fb4 --- /dev/null +++ b/packages/Exceptron.Driver.0.1.0.34/src/fastJSON/SafeDictionary.cs @@ -0,0 +1,39 @@ +//http://fastjson.codeplex.com/ + +using System.Collections.Generic; + +namespace Exceptron.Driver.fastJSON +{ + internal class SafeDictionary + { + private readonly object _Padlock = new object(); + private readonly Dictionary _Dictionary = new Dictionary(); + + + public bool TryGetValue(TKey key, out TValue value) + { + return _Dictionary.TryGetValue(key, out value); + } + + public TValue this[TKey key] + { + get + { + return _Dictionary[key]; + } + } + public IEnumerator> GetEnumerator() + { + return ((ICollection>)_Dictionary).GetEnumerator(); + } + + public void Add(TKey key, TValue value) + { + lock (_Padlock) + { + if (_Dictionary.ContainsKey(key) == false) + _Dictionary.Add(key, value); + } + } + } +}