c00e6cd5ef361ab7d6514b2a324475cc6b5e58d4
[CSharpForFun/.git] / jsonrpc4net / jsonrpc4net / ExceptionResolver.cs
1 using Newtonsoft.Json.Linq;
2 using System;
3 using System.Collections.Generic;
4
5 namespace GumartinM.JsonRPC4NET
6 {
7     public class ExceptionResolver
8     {
9         /// <summary>
10         /// Resolves the exception.
11         /// </summary>
12         /// <returns>The exception.</returns>
13         /// <param name="errorToken">Error token.</param>
14         public Exception ResolveException(JToken errorToken)
15         {
16             JObject errorData = (JObject)errorToken;
17             IDictionary<string, JToken> errorTokens = errorData;
18
19             if (!errorTokens.ContainsKey("data"))
20             {
21                 return CreateJsonRpcClientException(errorToken);
22             }
23
24             JToken dataToken = errorToken["data"];
25             JObject data = (JObject)dataToken;
26             errorTokens = data;
27
28             if (!errorTokens.ContainsKey("exceptionTypeName"))
29             {
30                 return CreateJsonRpcClientException(errorToken);
31             }
32
33             string exceptionTypeName = data["exceptionTypeName"].Value<string>();
34             string message = data.Value<string>("message");
35
36             Exception endException = CreateException(exceptionTypeName, message);
37
38             return endException;
39         }
40
41         /// <summary>
42         /// Creates the json rpc client exception.
43         /// </summary>
44         /// <returns>The json rpc client exception.</returns>
45         /// <param name="errorToken">Error token.</param>
46         private JsonRpcClientException CreateJsonRpcClientException(JToken errorToken)
47         {
48             return new JsonRpcClientException(
49               errorToken.Value<int?>("code") ?? 0,
50               errorToken.Value<string>("message"),
51               errorToken["data"]);
52         }
53
54         /// <summary>
55         /// Creates the exception.
56         /// </summary>
57         /// <returns>The exception.</returns>
58         /// <param name="exceptionTypeName">Exception type name.</param>
59         /// <param name="message">Message.</param>
60         private Exception CreateException(string exceptionTypeName, string message)
61         {
62             return new Exception("Remote exception: " + exceptionTypeName +
63                                  " Remote message: " + message);
64         }
65     }
66 }