diff --git a/BaseSpace.SDK.Tests/BaseSpace.SDK.Tests.csproj b/BaseSpace.SDK.Tests/BaseSpace.SDK.Tests.csproj
index c9640bd..cbe9f55 100644
--- a/BaseSpace.SDK.Tests/BaseSpace.SDK.Tests.csproj
+++ b/BaseSpace.SDK.Tests/BaseSpace.SDK.Tests.csproj
@@ -42,17 +42,14 @@
$(SolutionDir)\packages\log4net.1.2.10\lib\2.0\log4net.dll
-
- False
+
..\packages\ServiceStack.Common.3.9.71\lib\net35\ServiceStack.Common.dll
-
- False
+
..\packages\ServiceStack.Common.3.9.71\lib\net35\ServiceStack.Interfaces.dll
-
- False
- ..\packages\ServiceStack.Text.3.9.71\lib\net35\ServiceStack.Text.dll
+
+ ..\packages\ServiceStack.Text.3.9.87\lib\net35\ServiceStack.Text.dll
diff --git a/BaseSpace.SDK.Tests/Integration/PropertyTests.cs b/BaseSpace.SDK.Tests/Integration/PropertyTests.cs
index f24b5c0..c4be7f8 100644
--- a/BaseSpace.SDK.Tests/Integration/PropertyTests.cs
+++ b/BaseSpace.SDK.Tests/Integration/PropertyTests.cs
@@ -5,6 +5,7 @@
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
+using ServiceStack.Text;
using Xunit;
using Illumina.BaseSpace.SDK.ServiceModels;
using Illumina.BaseSpace.SDK.Tests.Helpers;
@@ -705,5 +706,329 @@ public void MapArray()
Assert.Equal(new[] { "b1a", "b1b", "b1c" }, prop.Items[1].ToMap()["b1"].Values);
Assert.Equal(new[] { "b2a" }, prop.Items[1].ToMap()["b2"].Values);
}
+
+ #region test data for property arrays containing nulls
+ private string _propertyJsonWithArrayObjectThenNull = @"
+{
+ ""Items"": [
+ {
+ ""Type"": ""appresult[]"",
+ ""Href"": ""v1pre3/appsessions/4445456/properties/Input.sample-grouper-id.fpa"",
+ ""Name"": ""Input.sample-grouper-id.fpa"",
+ ""Description"": ""Fpa Samples"",
+ ""Items"": [
+ {
+ ""Id"": ""3329331"",
+ ""Href"": ""v1pre3/appresults/3329331"",
+ ""UserOwnedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Name"": ""HuBr2"",
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-05-12T08:53:15.0000000"",
+ ""TotalSize"": 22446220,
+ ""AppSession"": {
+ ""Id"": ""4441438"",
+ ""Name"": ""MSR: Small RNA"",
+ ""Href"": ""v1pre3/appsessions/4441438"",
+ ""Application"": {
+ ""Id"": ""748758"",
+ ""Href"": ""v1pre3/applications/748758"",
+ ""Name"": ""MSR: Small RNA"",
+ ""CompanyName"": ""Illumina Inc."",
+ ""DateCreated"": ""2015-03-20T08:23:06.0000000"",
+ ""IsBillingActivated"": false,
+ ""Category"": ""Misc."",
+ ""Classifications"": []
+ },
+ ""UserCreatedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-05-12T05:51:05.0000000"",
+ ""ModifiedOn"": ""2015-05-12T08:53:08.0000000"",
+ ""DateCompleted"": ""2015-05-12T08:53:16.0000000"",
+ ""TotalSize"": 109461059
+ }
+ },
+ null
+ ],
+ ""HrefItems"": ""v1pre3/appsessions/4445456/properties/Input.sample-grouper-id.fpa/items"",
+ ""ItemsDisplayedCount"": 2,
+ ""ItemsTotalCount"": 2
+ }
+ ]
+}";
+
+ private string _propertyJsonWithArrayNullThenObject = @"
+{
+ ""Items"": [
+ {
+ ""Type"": ""appresult[]"",
+ ""Href"": ""v1pre3/appsessions/4445456/properties/Input.sample-grouper-id.fpa"",
+ ""Name"": ""Input.sample-grouper-id.fpa"",
+ ""Description"": ""Fpa Samples"",
+ ""Items"": [
+ null,
+ {
+ ""Id"": ""3329331"",
+ ""Href"": ""v1pre3/appresults/3329331"",
+ ""UserOwnedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Name"": ""HuBr2"",
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-05-12T08:53:15.0000000"",
+ ""TotalSize"": 22446220,
+ ""AppSession"": {
+ ""Id"": ""4441438"",
+ ""Name"": ""MSR: Small RNA"",
+ ""Href"": ""v1pre3/appsessions/4441438"",
+ ""Application"": {
+ ""Id"": ""748758"",
+ ""Href"": ""v1pre3/applications/748758"",
+ ""Name"": ""MSR: Small RNA"",
+ ""CompanyName"": ""Illumina Inc."",
+ ""DateCreated"": ""2015-03-20T08:23:06.0000000"",
+ ""IsBillingActivated"": false,
+ ""Category"": ""Misc."",
+ ""Classifications"": []
+ },
+ ""UserCreatedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-05-12T05:51:05.0000000"",
+ ""ModifiedOn"": ""2015-05-12T08:53:08.0000000"",
+ ""DateCompleted"": ""2015-05-12T08:53:16.0000000"",
+ ""TotalSize"": 109461059
+ }
+ }
+ ],
+ ""HrefItems"": ""v1pre3/appsessions/4445456/properties/Input.sample-grouper-id.fpa/items"",
+ ""ItemsDisplayedCount"": 2,
+ ""ItemsTotalCount"": 2
+ }
+ ]
+}";
+
+
+ private string _propertyJsonWithArrayAllNullItems = @"
+{
+ ""Items"": [
+ {
+ ""Type"": ""appresult[]"",
+ ""Href"": ""v1pre3/appsessions/4445456/properties/Input.sample-grouper-id.fpa"",
+ ""Name"": ""Input.sample-grouper-id.fpa"",
+ ""Description"": ""Fpa Samples"",
+ ""Items"": [
+ null,
+ null,
+ null
+ ],
+ ""HrefItems"": ""v1pre3/appsessions/4445456/properties/Input.sample-grouper-id.fpa/items"",
+ ""ItemsDisplayedCount"": 3,
+ ""ItemsTotalCount"": 3
+ }
+ ]
+}";
+
+ // For GET: resources/{id}/properties/{name}/items
+ private string _propertyJsonArrayItemsWithNulls = @"
+{
+ ""Type"": ""appresult[]"",
+ ""Items"": [
+ {
+ ""Id"": ""b1551aef8d1547b2bdac08fd7e543db9"",
+ ""Content"": null
+ },
+ {
+ ""Id"": ""85f5db7a82b340c1a1b4347998897e2d"",
+ ""Content"": {
+ ""Id"": ""3329327"",
+ ""Href"": ""v1pre3/appresults/3329327"",
+ ""UserOwnedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Name"": ""7-3 12874"",
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-05-12T06:38:16.0000000"",
+ ""TotalSize"": 430610916,
+ ""AppSession"": {
+ ""Id"": ""4441437"",
+ ""Name"": ""MSR: Enrichment"",
+ ""Href"": ""v1pre3/appsessions/4441437"",
+ ""Application"": {
+ ""Id"": ""748752"",
+ ""Href"": ""v1pre3/applications/748752"",
+ ""Name"": ""MSR: Enrichment"",
+ ""CompanyName"": ""Illumina Inc."",
+ ""DateCreated"": ""2015-03-20T08:23:06.0000000"",
+ ""IsBillingActivated"": false,
+ ""Category"": ""Misc."",
+ ""Classifications"": []
+ },
+ ""UserCreatedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-05-12T05:52:13.0000000"",
+ ""ModifiedOn"": ""2015-05-12T06:38:21.0000000"",
+ ""DateCompleted"": ""2015-05-12T06:38:17.0000000"",
+ ""TotalSize"": 1566013117
+ }
+ }
+ },
+ {
+ ""Id"": ""4f85c8ca99b3479ab499ed2b6918e77b"",
+ ""Content"": null
+ },
+ {
+ ""Id"": ""cb9331fff701410aa50e91e8e09c9968"",
+ ""Content"": {
+ ""Id"": ""3311315"",
+ ""Href"": ""v1pre3/appresults/3311315"",
+ ""UserOwnedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Name"": ""HBR_100ng_35278"",
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-04-06T23:42:29.0000000"",
+ ""TotalSize"": 25647536,
+ ""AppSession"": {
+ ""Id"": ""4409405"",
+ ""Name"": ""MSR: Targeted RNA"",
+ ""Href"": ""v1pre3/appsessions/4409405"",
+ ""Application"": {
+ ""Id"": ""748759"",
+ ""Href"": ""v1pre3/applications/748759"",
+ ""Name"": ""MSR: Targeted RNA"",
+ ""CompanyName"": ""Illumina Inc."",
+ ""DateCreated"": ""2015-03-20T08:23:06.0000000"",
+ ""IsBillingActivated"": false,
+ ""Category"": ""Misc."",
+ ""Classifications"": []
+ },
+ ""UserCreatedBy"": {
+ ""Id"": ""3003"",
+ ""Href"": ""v1pre3/users/3003"",
+ ""Name"": ""BaseSpace 2"",
+ ""GravatarUrl"": ""https://secure.gravatar.com/avatar/702e4f8795f80bd0929a8b818bb19f65.jpg?s=20&d=https%3a%2f%2fcloud-endor.illumina.com%2fpublic%2fimages%2fDefaultCustomerGravatar.png&r=PG""
+ },
+ ""Status"": ""Complete"",
+ ""StatusSummary"": """",
+ ""DateCreated"": ""2015-04-06T23:28:30.0000000"",
+ ""ModifiedOn"": ""2015-04-06T23:42:30.0000000"",
+ ""DateCompleted"": ""2015-04-06T23:38:52.0000000"",
+ ""TotalSize"": 550303289
+ }
+ }
+
+ },
+ {
+ ""Id"": ""4f85c8ca99b3479ab499ed2b6918e77b"",
+ ""Content"": null
+ }
+ ],
+ ""DisplayedCount"": 5,
+ ""TotalCount"": 5,
+ ""Offset"": 0,
+ ""Limit"": 50,
+ ""SortDir"": ""Asc"",
+ ""SortBy"": ""DateCreated""
+}
+";
+
+ #endregion
+
+ [Fact]
+ public void PropertyArrayObjectThenNull()
+ {
+ var properties = JsonSerializer.DeserializeFromString(_propertyJsonWithArrayObjectThenNull);
+ Assert.NotNull(properties.Items);
+ var prop = properties.Items.FirstOrDefault();
+ Assert.NotNull(prop);
+ Assert.Equal(2, prop.Items.Count());
+ Assert.NotNull(prop.Items[0]);
+ Assert.Null(prop.Items[1]);
+ }
+
+ [Fact]
+ public void PropertyArrayNullThenObject()
+ {
+ var properties = JsonSerializer.DeserializeFromString(_propertyJsonWithArrayNullThenObject);
+ Assert.NotNull(properties.Items);
+ var prop = properties.Items.FirstOrDefault();
+ Assert.NotNull(prop);
+ Assert.Equal(2, prop.Items.Count());
+ Assert.Null(prop.Items[0]);
+ Assert.NotNull(prop.Items[1]);
+ }
+
+ [Fact]
+ public void PropertyArrayAllNulls()
+ {
+ var properties =
+ JsonSerializer.DeserializeFromString(
+ _propertyJsonWithArrayAllNullItems);
+ Assert.NotNull(properties.Items);
+ var prop = properties.Items.FirstOrDefault();
+ Assert.NotNull(prop);
+ Assert.Equal(3, prop.Items.Count());
+ Assert.Equal(3, prop.Items.Count(x => x == null));
+ }
+
+ [Fact]
+ public void PropertyArrayItemsSomeNulls()
+ {
+ var properties =
+ JsonSerializer.DeserializeFromString(
+ _propertyJsonArrayItemsWithNulls);
+
+ Assert.NotNull(properties.Items);
+ Assert.Equal(5, properties.Items.Count());
+ Assert.NotNull(properties.Items[0]);
+ Assert.True(properties.Items.All(x => x != null));
+ Assert.Null(properties.Items[0].Content);
+ Assert.NotNull(properties.Items[1].Content);
+ Assert.Null(properties.Items[2].Content);
+ Assert.NotNull(properties.Items[3].Content);
+ Assert.Null(properties.Items[4].Content);
+
+ var appResults = properties.ToAppResultArray();
+ Assert.Null(appResults[0]);
+ Assert.NotNull(appResults[1]);
+ Assert.Null(appResults[2]);
+ Assert.NotNull(appResults[3]);
+ Assert.Null(appResults[4]);
+ }
}
}
\ No newline at end of file
diff --git a/BaseSpace.SDK.Tests/packages.config b/BaseSpace.SDK.Tests/packages.config
index 9e203cd..f1db9e7 100644
--- a/BaseSpace.SDK.Tests/packages.config
+++ b/BaseSpace.SDK.Tests/packages.config
@@ -3,7 +3,7 @@
-
+
\ No newline at end of file
diff --git a/BaseSpace.SDK/BaseSpace.SDK.csproj b/BaseSpace.SDK/BaseSpace.SDK.csproj
index 890e3e8..b716582 100644
--- a/BaseSpace.SDK/BaseSpace.SDK.csproj
+++ b/BaseSpace.SDK/BaseSpace.SDK.csproj
@@ -44,17 +44,14 @@
..\packages\TerminalVelocity.Sharp.1.0.0.72\lib\net40\Illumina.TerminalVelocity.dll
-
- False
+
..\packages\ServiceStack.Common.3.9.71\lib\net35\ServiceStack.Common.dll
-
- False
+
..\packages\ServiceStack.Common.3.9.71\lib\net35\ServiceStack.Interfaces.dll
-
- False
- ..\packages\ServiceStack.Text.3.9.71\lib\net35\ServiceStack.Text.dll
+
+ ..\packages\ServiceStack.Text.3.9.87\lib\net35\ServiceStack.Text.dll
diff --git a/BaseSpace.SDK/Deserialization/PropertyDeserializer.cs b/BaseSpace.SDK/Deserialization/PropertyDeserializer.cs
index 04b35ec..95454ba 100644
--- a/BaseSpace.SDK/Deserialization/PropertyDeserializer.cs
+++ b/BaseSpace.SDK/Deserialization/PropertyDeserializer.cs
@@ -119,7 +119,7 @@ public static Property JsonToProperty(string jsonString)
property.Items = JsonSerializer.DeserializeFromString(json.Child("Items"));
break;
default:
- property.Items = json.ArrayObjects("Items").Select(itemj => DeserializePropertyReference(simpleType, itemj.ToJson())).Where(x => x != null).ToArray();
+ property.Items = json.ArrayObjects("Items").Select(itemj => DeserializePropertyReference(simpleType, itemj.ToJson())).ToArray();
break;
}
}
diff --git a/BaseSpace.SDK/Extensions/PropertyExtensions.cs b/BaseSpace.SDK/Extensions/PropertyExtensions.cs
index 74be790..790f527 100644
--- a/BaseSpace.SDK/Extensions/PropertyExtensions.cs
+++ b/BaseSpace.SDK/Extensions/PropertyExtensions.cs
@@ -253,7 +253,7 @@ public static TResourceType[] ToResourceArray(this PropertyItemsR
{
if (propertyItemsResourceList.Items != null)
{
- return propertyItemsResourceList.Items.Select(i => i.Content.ToResource()).Where(i => i != null).ToArray();
+ return propertyItemsResourceList.Items.Select(i => i.Content.ToResource()).ToArray();
}
return null;
}
diff --git a/BaseSpace.SDK/ServiceModels/Request/SetPropertiesRequest.cs b/BaseSpace.SDK/ServiceModels/Request/SetPropertiesRequest.cs
index c15c6de..1e12110 100644
--- a/BaseSpace.SDK/ServiceModels/Request/SetPropertiesRequest.cs
+++ b/BaseSpace.SDK/ServiceModels/Request/SetPropertiesRequest.cs
@@ -148,7 +148,7 @@ public void SetContentReferencesArray(IPropertyContent[] referencedResourcesCont
{
Type = referencedResourcesContent.First().Type + PropertyTypes.LIST_SUFFIX;
}
- Items = referencedResourcesContent.Select(rr => rr.Href.ToString()).ToArray();
+ Items = referencedResourcesContent.Select(rr => rr == null ? null : rr.Href.ToString()).ToArray();
Content = null;
}
}
diff --git a/BaseSpace.SDK/packages.config b/BaseSpace.SDK/packages.config
index ce14a35..288e346 100644
--- a/BaseSpace.SDK/packages.config
+++ b/BaseSpace.SDK/packages.config
@@ -2,6 +2,6 @@
-
+
\ No newline at end of file