Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions libraries/Microsoft.Bot.Builder.Azure/AzureTableStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public async Task<StoreItems> Read(string[] keys)
var result = await this.Table.ExecuteAsync(TableOperation.Retrieve<StoreItemEntity>(entityKey.PartitionKey, entityKey.RowKey)).ConfigureAwait(false);
if ((HttpStatusCode)result.HttpStatusCode == HttpStatusCode.OK)
{
var storeItem = ((StoreItemEntity)result.Result).As<StoreItem>();
var storeItem = ((StoreItemEntity)result.Result).As<IStoreItem>();
storeItem.eTag = result.Etag;
storeItems[key] = storeItem;
}
Expand All @@ -72,7 +72,7 @@ public async Task Write(StoreItems changes)
foreach (var change in changes)
{
var entityKey = GetEntityKey(change.Key);
var storeItem = (StoreItem)change.Value;
var storeItem = (IStoreItem)change.Value;
StoreItemEntity entity = new StoreItemEntity(entityKey, storeItem);
if (entity.ETag == null || entity.ETag == "*")
{
Expand All @@ -99,11 +99,11 @@ protected class StoreItemEntity : TableEntity

public StoreItemEntity() { }

public StoreItemEntity(EntityKey key, StoreItem obj)
public StoreItemEntity(EntityKey key, IStoreItem obj)
: this(key.PartitionKey, key.RowKey, obj)
{ }

public StoreItemEntity(string partitionKey, string rowKey, StoreItem obj)
public StoreItemEntity(string partitionKey, string rowKey, IStoreItem obj)
: base(partitionKey, rowKey)
{
this.ETag = obj.eTag;
Expand All @@ -113,7 +113,7 @@ public StoreItemEntity(string partitionKey, string rowKey, StoreItem obj)
public string Json { get; set; }

public T As<T>()
where T : StoreItem
where T : IStoreItem
{
return JsonConvert.DeserializeObject<T>(Json, serializationSettings);
}
Expand Down
14 changes: 11 additions & 3 deletions libraries/Microsoft.Bot.Builder.Core/FlexObject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,9 +203,17 @@ public IEnumerator<KeyValuePair<string, object>> GetEnumerator()

public object Clone()
{
return JsonConvert.DeserializeObject<StoreItem>(
JsonConvert.SerializeObject(this, SerializationSettings),
SerializationSettings);
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(this, SerializationSettings),SerializationSettings);
}

public static T Clone<T>(object obj)
{
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(obj, SerializationSettings), SerializationSettings);
}

public static object Clone(object obj)
{
return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(obj, SerializationSettings), SerializationSettings);
}
}
}
10 changes: 5 additions & 5 deletions libraries/Microsoft.Bot.Builder.Core/Storage/FileStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,14 @@ public async Task<StoreItems> Read(string[] keys)
var storeItems = new StoreItems();
foreach (var key in keys)
{
var item = await ReadStoreItem(key).ConfigureAwait(false);
var item = await ReadIStoreItem(key).ConfigureAwait(false);
if (item != null)
storeItems[key] = item;
}
return storeItems;
}

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

return JsonConvert.DeserializeObject<StoreItem>(json, serializationSettings);
return JsonConvert.DeserializeObject<IStoreItem>(json, serializationSettings);
}
catch (FileNotFoundException)
{
Expand Down Expand Up @@ -114,8 +114,8 @@ public async Task Write(StoreItems changes)
{
try
{
StoreItem newValue = change.Value as StoreItem;
StoreItem oldValue = await this.ReadStoreItem(change.Key).ConfigureAwait(false);
IStoreItem newValue = (IStoreItem)change.Value;
IStoreItem oldValue = await this.ReadIStoreItem(change.Key).ConfigureAwait(false);
if (oldValue == null ||
newValue.eTag == "*" ||
oldValue.eTag == newValue.eTag)
Expand Down
12 changes: 7 additions & 5 deletions libraries/Microsoft.Bot.Builder.Core/Storage/MemoryStorage.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using Newtonsoft.Json;
using System;
using System.Threading.Tasks;

Expand Down Expand Up @@ -42,7 +43,7 @@ public Task<StoreItems> Read(string[] keys)
if (_memory.TryGetValue(key, out object value))
{
if (value != null)
storeItems[key] = (StoreItem)((ICloneable)value).Clone();
storeItems[key] = FlexObject.Clone<IStoreItem>(value);
else
storeItems[key] = null;
}
Expand All @@ -58,17 +59,17 @@ public Task Write(StoreItems changes)
{
foreach (var change in changes)
{
StoreItem newValue = change.Value as StoreItem;
StoreItem oldValue = null;
IStoreItem newValue = change.Value as IStoreItem;
IStoreItem oldValue = null;

if (_memory.TryGetValue(change.Key, out object x))
oldValue = x as StoreItem;
oldValue = x as IStoreItem;
if (oldValue == null ||
newValue.eTag == "*" ||
oldValue.eTag == newValue.eTag)
{
// clone and set etag
newValue = newValue.Clone() as StoreItem;
newValue = FlexObject.Clone<IStoreItem>(newValue);
newValue.eTag = (_eTag++).ToString();
_memory[change.Key] = newValue;
}
Expand All @@ -80,6 +81,7 @@ public Task Write(StoreItems changes)
}
return Task.CompletedTask;
}

}

/// <summary>
Expand Down
6 changes: 4 additions & 2 deletions tests/Microsoft.Bot.Builder.Tests/Storage_BaseTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ protected async Task _createObjectTest(IStorage storage)
{
var storeItems = new StoreItems();
storeItems["create1"] = new TestItem() { Id = "1" };
dynamic newItem2 = new TestItem() { Id = "2" };
dynamic newItem2 = new StoreItem();
newItem2.Id = "2";
newItem2.dyno = "dynamicStuff";
storeItems["create2"] = newItem2;

Expand Down Expand Up @@ -56,7 +57,8 @@ protected async Task _typedSerialization(IStorage storage)
{
string key = "typed";
var storeItems = new StoreItems();
dynamic testItem = new TestItem() { Id = "1" };
dynamic testItem = new StoreItem();
testItem.Id = "1";
testItem.x = new TypedObject() { Name = "test" };
storeItems[key] = testItem;

Expand Down
4 changes: 3 additions & 1 deletion tests/Microsoft.Bot.Builder.Tests/Storage_MemoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ public async Task TypedSerialization()
}
}

public class TestItem : StoreItem
public class TestItem : IStoreItem
{
public string eTag { get; set; }

public string Id { get; set; }

public int Count { get; set; }
Expand Down