Skip to content

Commit 35d11f2

Browse files
authored
Merge pull request #236 from Microsoft/tomlm/fixStoreItem
fix storage layers to use IStoreItem correctly
2 parents 2370578 + cdc13bf commit 35d11f2

File tree

6 files changed

+35
-21
lines changed

6 files changed

+35
-21
lines changed

libraries/Microsoft.Bot.Builder.Azure/AzureTableStorage.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public async Task<StoreItems> Read(string[] keys)
5858
var result = await this.Table.ExecuteAsync(TableOperation.Retrieve<StoreItemEntity>(entityKey.PartitionKey, entityKey.RowKey)).ConfigureAwait(false);
5959
if ((HttpStatusCode)result.HttpStatusCode == HttpStatusCode.OK)
6060
{
61-
var storeItem = ((StoreItemEntity)result.Result).As<StoreItem>();
61+
var storeItem = ((StoreItemEntity)result.Result).As<IStoreItem>();
6262
storeItem.eTag = result.Etag;
6363
storeItems[key] = storeItem;
6464
}
@@ -72,7 +72,7 @@ public async Task Write(StoreItems changes)
7272
foreach (var change in changes)
7373
{
7474
var entityKey = GetEntityKey(change.Key);
75-
var storeItem = (StoreItem)change.Value;
75+
var storeItem = (IStoreItem)change.Value;
7676
StoreItemEntity entity = new StoreItemEntity(entityKey, storeItem);
7777
if (entity.ETag == null || entity.ETag == "*")
7878
{
@@ -99,11 +99,11 @@ protected class StoreItemEntity : TableEntity
9999

100100
public StoreItemEntity() { }
101101

102-
public StoreItemEntity(EntityKey key, StoreItem obj)
102+
public StoreItemEntity(EntityKey key, IStoreItem obj)
103103
: this(key.PartitionKey, key.RowKey, obj)
104104
{ }
105105

106-
public StoreItemEntity(string partitionKey, string rowKey, StoreItem obj)
106+
public StoreItemEntity(string partitionKey, string rowKey, IStoreItem obj)
107107
: base(partitionKey, rowKey)
108108
{
109109
this.ETag = obj.eTag;
@@ -113,7 +113,7 @@ public StoreItemEntity(string partitionKey, string rowKey, StoreItem obj)
113113
public string Json { get; set; }
114114

115115
public T As<T>()
116-
where T : StoreItem
116+
where T : IStoreItem
117117
{
118118
return JsonConvert.DeserializeObject<T>(Json, serializationSettings);
119119
}

libraries/Microsoft.Bot.Builder.Core/FlexObject.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,17 @@ public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
203203

204204
public object Clone()
205205
{
206-
return JsonConvert.DeserializeObject<StoreItem>(
207-
JsonConvert.SerializeObject(this, SerializationSettings),
208-
SerializationSettings);
206+
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(this, SerializationSettings),SerializationSettings);
207+
}
208+
209+
public static T Clone<T>(object obj)
210+
{
211+
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj, SerializationSettings), SerializationSettings);
212+
}
213+
214+
public static object Clone(object obj)
215+
{
216+
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj, SerializationSettings), SerializationSettings);
209217
}
210218
}
211219
}

libraries/Microsoft.Bot.Builder.Core/Storage/FileStorage.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,14 @@ public async Task<StoreItems> Read(string[] keys)
4343
var storeItems = new StoreItems();
4444
foreach (var key in keys)
4545
{
46-
var item = await ReadStoreItem(key).ConfigureAwait(false);
46+
var item = await ReadIStoreItem(key).ConfigureAwait(false);
4747
if (item != null)
4848
storeItems[key] = item;
4949
}
5050
return storeItems;
5151
}
5252

53-
private async Task<StoreItem> ReadStoreItem(string key)
53+
private async Task<IStoreItem> ReadIStoreItem(string key)
5454
{
5555
// The funky threading in here is due to concurrency and async methods.
5656
// When this method is called, it may happen (in parallel) from any number of
@@ -76,7 +76,7 @@ private async Task<StoreItem> ReadStoreItem(string key)
7676
json = await file.ReadToEndAsync().ConfigureAwait(false);
7777
}
7878

79-
return JsonConvert.DeserializeObject<StoreItem>(json, serializationSettings);
79+
return JsonConvert.DeserializeObject<IStoreItem>(json, serializationSettings);
8080
}
8181
catch (FileNotFoundException)
8282
{
@@ -114,8 +114,8 @@ public async Task Write(StoreItems changes)
114114
{
115115
try
116116
{
117-
StoreItem newValue = change.Value as StoreItem;
118-
StoreItem oldValue = await this.ReadStoreItem(change.Key).ConfigureAwait(false);
117+
IStoreItem newValue = (IStoreItem)change.Value;
118+
IStoreItem oldValue = await this.ReadIStoreItem(change.Key).ConfigureAwait(false);
119119
if (oldValue == null ||
120120
newValue.eTag == "*" ||
121121
oldValue.eTag == newValue.eTag)

libraries/Microsoft.Bot.Builder.Core/Storage/MemoryStorage.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT License.
33

4+
using Newtonsoft.Json;
45
using System;
56
using System.Threading.Tasks;
67

@@ -42,7 +43,7 @@ public Task<StoreItems> Read(string[] keys)
4243
if (_memory.TryGetValue(key, out object value))
4344
{
4445
if (value != null)
45-
storeItems[key] = (StoreItem)((ICloneable)value).Clone();
46+
storeItems[key] = FlexObject.Clone<IStoreItem>(value);
4647
else
4748
storeItems[key] = null;
4849
}
@@ -58,17 +59,17 @@ public Task Write(StoreItems changes)
5859
{
5960
foreach (var change in changes)
6061
{
61-
StoreItem newValue = change.Value as StoreItem;
62-
StoreItem oldValue = null;
62+
IStoreItem newValue = change.Value as IStoreItem;
63+
IStoreItem oldValue = null;
6364

6465
if (_memory.TryGetValue(change.Key, out object x))
65-
oldValue = x as StoreItem;
66+
oldValue = x as IStoreItem;
6667
if (oldValue == null ||
6768
newValue.eTag == "*" ||
6869
oldValue.eTag == newValue.eTag)
6970
{
7071
// clone and set etag
71-
newValue = newValue.Clone() as StoreItem;
72+
newValue = FlexObject.Clone<IStoreItem>(newValue);
7273
newValue.eTag = (_eTag++).ToString();
7374
_memory[change.Key] = newValue;
7475
}
@@ -80,6 +81,7 @@ public Task Write(StoreItems changes)
8081
}
8182
return Task.CompletedTask;
8283
}
84+
8385
}
8486

8587
/// <summary>

tests/Microsoft.Bot.Builder.Tests/Storage_BaseTests.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ protected async Task _createObjectTest(IStorage storage)
2020
{
2121
var storeItems = new StoreItems();
2222
storeItems["create1"] = new TestItem() { Id = "1" };
23-
dynamic newItem2 = new TestItem() { Id = "2" };
23+
dynamic newItem2 = new StoreItem();
24+
newItem2.Id = "2";
2425
newItem2.dyno = "dynamicStuff";
2526
storeItems["create2"] = newItem2;
2627

@@ -56,7 +57,8 @@ protected async Task _typedSerialization(IStorage storage)
5657
{
5758
string key = "typed";
5859
var storeItems = new StoreItems();
59-
dynamic testItem = new TestItem() { Id = "1" };
60+
dynamic testItem = new StoreItem();
61+
testItem.Id = "1";
6062
testItem.x = new TypedObject() { Name = "test" };
6163
storeItems[key] = testItem;
6264

tests/Microsoft.Bot.Builder.Tests/Storage_MemoryTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ public async Task TypedSerialization()
5959
}
6060
}
6161

62-
public class TestItem : StoreItem
62+
public class TestItem : IStoreItem
6363
{
64+
public string eTag { get; set; }
65+
6466
public string Id { get; set; }
6567

6668
public int Count { get; set; }

0 commit comments

Comments
 (0)