Kinetica   C#   API  Version 7.2.3.0
Resolver.cs
Go to the documentation of this file.
1 
18 using System;
19 using System.Collections.Generic;
20 using Newtonsoft.Json.Linq;
21 using Newtonsoft.Json;
22 
23 namespace Avro.IO
24 {
25  static class Resolver
26  {
33  public static void EncodeDefaultValue(Encoder enc, Schema schema, JToken jtok)
34  {
35  if (null == jtok) return;
36 
37  switch (schema.Tag)
38  {
39  case Schema.Type.Boolean:
40  if (jtok.Type != JTokenType.Boolean)
41  throw new AvroException("Default boolean value " + jtok.ToString() + " is invalid, expected is json boolean.");
42  enc.WriteBoolean((bool)jtok);
43  break;
44 
45  case Schema.Type.Int:
46  if (jtok.Type != JTokenType.Integer)
47  throw new AvroException("Default int value " + jtok.ToString() + " is invalid, expected is json integer.");
48  enc.WriteInt(Convert.ToInt32((int)jtok));
49  break;
50 
51  case Schema.Type.Long:
52  if (jtok.Type != JTokenType.Integer)
53  throw new AvroException("Default long value " + jtok.ToString() + " is invalid, expected is json integer.");
54  enc.WriteLong(Convert.ToInt64((long)jtok));
55  break;
56 
57  case Schema.Type.Float:
58  if (jtok.Type != JTokenType.Float)
59  throw new AvroException("Default float value " + jtok.ToString() + " is invalid, expected is json number.");
60  enc.WriteFloat((float)jtok);
61  break;
62 
63  case Schema.Type.Double:
64  if (jtok.Type == JTokenType.Integer)
65  enc.WriteDouble(Convert.ToDouble((int)jtok));
66  else if (jtok.Type == JTokenType.Float)
67  enc.WriteDouble(Convert.ToDouble((float)jtok));
68  else
69  throw new AvroException("Default double value " + jtok.ToString() + " is invalid, expected is json number.");
70 
71  break;
72 
73  case Schema.Type.Bytes:
74  if (jtok.Type != JTokenType.String)
75  throw new AvroException("Default bytes value " + jtok.ToString() + " is invalid, expected is json string.");
76  var en = System.Text.Encoding.GetEncoding("iso-8859-1");
77  enc.WriteBytes(en.GetBytes((string)jtok));
78  break;
79 
80  case Schema.Type.Fixed:
81  if (jtok.Type != JTokenType.String)
82  throw new AvroException("Default fixed value " + jtok.ToString() + " is invalid, expected is json string.");
83  en = System.Text.Encoding.GetEncoding("iso-8859-1");
84  int len = (schema as FixedSchema).Size;
85  byte[] bb = en.GetBytes((string)jtok);
86  if (bb.Length != len)
87  throw new AvroException("Default fixed value " + jtok.ToString() + " is not of expected length " + len);
88  enc.WriteFixed(bb);
89  break;
90 
91  case Schema.Type.String:
92  if (jtok.Type != JTokenType.String)
93  throw new AvroException("Default string value " + jtok.ToString() + " is invalid, expected is json string.");
94  enc.WriteString((string)jtok);
95  break;
96 
97  case Schema.Type.Enumeration:
98  if (jtok.Type != JTokenType.String)
99  throw new AvroException("Default enum value " + jtok.ToString() + " is invalid, expected is json string.");
100  enc.WriteEnum((schema as EnumSchema).Ordinal((string)jtok));
101  break;
102 
103  case Schema.Type.Null:
104  if (jtok.Type != JTokenType.Null)
105  throw new AvroException("Default null value " + jtok.ToString() + " is invalid, expected is json null.");
106  enc.WriteNull();
107  break;
108 
109  case Schema.Type.Array:
110  if (jtok.Type != JTokenType.Array)
111  throw new AvroException("Default array value " + jtok.ToString() + " is invalid, expected is json array.");
112  JArray jarr = jtok as JArray;
113  enc.WriteArrayStart();
114  enc.SetItemCount(jarr.Count);
115  foreach (JToken jitem in jarr)
116  {
117  enc.StartItem();
118  EncodeDefaultValue(enc, (schema as ArraySchema).ItemSchema, jitem);
119  }
120  enc.WriteArrayEnd();
121  break;
122 
123  case Schema.Type.Record:
124  case Schema.Type.Error:
125  if (jtok.Type != JTokenType.Object)
126  throw new AvroException("Default record value " + jtok.ToString() + " is invalid, expected is json object.");
127  RecordSchema rcs = schema as RecordSchema;
128  JObject jo = jtok as JObject;
129  foreach (Field field in rcs)
130  {
131  JToken val = jo[field.Name];
132  if (null == val)
133  val = field.DefaultValue;
134  if (null == val)
135  throw new AvroException("No default value for field " + field.Name);
136 
137  EncodeDefaultValue(enc, field.Schema, val);
138  }
139  break;
140 
141  case Schema.Type.Map:
142  if (jtok.Type != JTokenType.Object)
143  throw new AvroException("Default map value " + jtok.ToString() + " is invalid, expected is json object.");
144  jo = jtok as JObject;
145  enc.WriteMapStart();
146  enc.SetItemCount(jo.Count);
147  foreach (KeyValuePair<string, JToken> jp in jo)
148  {
149  enc.StartItem();
150  enc.WriteString(jp.Key);
151  EncodeDefaultValue(enc, (schema as MapSchema).ValueSchema, jp.Value);
152  }
153  enc.WriteMapEnd();
154  break;
155 
156  case Schema.Type.Union:
157  enc.WriteUnionIndex(0);
158  EncodeDefaultValue(enc, (schema as UnionSchema).Schemas[0], jtok);
159  break;
160 
161  default:
162  throw new AvroException("Unsupported schema type " + schema.Tag);
163  }
164  }
165  }
166 }
Class for record schemas
Definition: RecordSchema.cs:31
Schema Schema
Field type's schema
Definition: Field.cs:75
Class for fields defined in a record
Definition: Field.cs:30
void WriteBytes(byte[] value)
Class for enum type schemas
Definition: EnumSchema.cs:28
void WriteInt(int value)
void WriteArrayStart()
void WriteDouble(double value)
Base class for all schema types
Definition: Schema.cs:29
void WriteMapStart()
void SetItemCount(long value)
Class for union schemas
Definition: UnionSchema.cs:29
void WriteLong(long value)
readonly string Name
Name of the field.
Definition: Field.cs:45
void WriteArrayEnd()
Class for fixed schemas
Definition: FixedSchema.cs:28
Type
Enum for schema types
Definition: Schema.cs:34
void WriteMapEnd()
void WriteBoolean(bool value)
void WriteEnum(int value)
void WriteFixed(byte[] data)
void WriteFloat(float value)
Class for array type schemas
Definition: ArraySchema.cs:27
static void EncodeDefaultValue(Encoder enc, Schema schema, JToken jtok)
Reads the passed JToken default value field and writes it in the specified encoder
Definition: Resolver.cs:33
JToken DefaultValue
The default value for the field stored as JSON object, if defined.
Definition: Field.cs:65
Class for map schemas
Definition: MapSchema.cs:28
void WriteUnionIndex(int value)
void WriteString(string value)
Type Tag
Schema type property
Definition: Schema.cs:56