Skip to content
Open
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
51 changes: 13 additions & 38 deletions src/MongoDB.Bson/BsonDefaults.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,71 +24,46 @@ namespace MongoDB.Bson
/// </summary>
public static class BsonDefaults
{
// private static fields
private static bool __dynamicArraySerializerWasSet;
private static IBsonSerializer __dynamicArraySerializer;
private static bool __dynamicDocumentSerializerWasSet;
private static IBsonSerializer __dynamicDocumentSerializer;
private static int __maxDocumentSize = int.MaxValue;
private static int __maxSerializationDepth = 100;

// public static properties
/// <summary>
/// Gets or sets the dynamic array serializer.
/// </summary>
public static IBsonSerializer DynamicArraySerializer
{
get
{
if (!__dynamicArraySerializerWasSet)
{
__dynamicArraySerializer = BsonSerializer.LookupSerializer<List<object>>();
}
return __dynamicArraySerializer;
}
set
{
__dynamicArraySerializerWasSet = true;
__dynamicArraySerializer = value;
}
get => BsonSerializationDomain.Default.BsonDefaults.DynamicArraySerializer;
set => BsonSerializationDomain.Default.BsonDefaults.DynamicArraySerializer = value;
}

/// <summary>
/// Gets or sets the dynamic document serializer.
/// </summary>
public static IBsonSerializer DynamicDocumentSerializer
{
get
{
if (!__dynamicDocumentSerializerWasSet)
{
__dynamicDocumentSerializer = BsonSerializer.LookupSerializer<ExpandoObject>();
}
return __dynamicDocumentSerializer;
}
set
{
__dynamicDocumentSerializerWasSet = true;
__dynamicDocumentSerializer = value;
}
get => BsonSerializationDomain.Default.BsonDefaults.DynamicDocumentSerializer;
set => BsonSerializationDomain.Default.BsonDefaults.DynamicDocumentSerializer = value;
}

/* DOMAIN-API We should modify the API to have those two values (and in the writer/reader settings where they are used) be nullable.
* The problem is that we need to now when these values have been set externally or not. If they have not, then they should
* be retrieved from the closest domain.
*/

/// <summary>
/// Gets or sets the default max document size. The default is 4MiB.
/// </summary>
public static int MaxDocumentSize
{
get { return __maxDocumentSize; }
set { __maxDocumentSize = value; }
get => BsonSerializationDomain.Default.BsonDefaults.MaxDocumentSize;
set => BsonSerializationDomain.Default.BsonDefaults.MaxDocumentSize = value;
}

/// <summary>
/// Gets or sets the default max serialization depth (used to detect circular references during serialization). The default is 100.
/// </summary>
public static int MaxSerializationDepth
{
get { return __maxSerializationDepth; }
set { __maxSerializationDepth = value; }
get => BsonSerializationDomain.Default.BsonDefaults.MaxSerializationDepth;
set => BsonSerializationDomain.Default.BsonDefaults.MaxSerializationDepth = value;
}
}
}
73 changes: 73 additions & 0 deletions src/MongoDB.Bson/BsonDefaultsRegistry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

using System.Collections.Generic;
using System.Dynamic;
using MongoDB.Bson.Serialization;

namespace MongoDB.Bson
{
internal class BsonDefaultsRegistry : IBsonDefaults
{
private IBsonSerializationDomain _serializationDomain;
private bool _dynamicArraySerializerWasSet;
private IBsonSerializer _dynamicArraySerializer;
private bool _dynamicDocumentSerializerWasSet;
private IBsonSerializer _dynamicDocumentSerializer;

public BsonDefaultsRegistry(IBsonSerializationDomain serializationDomain)
{
_serializationDomain = serializationDomain;
}

public IBsonSerializer DynamicArraySerializer
{
get
{
if (!_dynamicArraySerializerWasSet)
{
_dynamicArraySerializer = _serializationDomain.LookupSerializer<List<object>>();
}
return _dynamicArraySerializer;
}
set
{
_dynamicArraySerializerWasSet = true;
_dynamicArraySerializer = value;
}
}

public IBsonSerializer DynamicDocumentSerializer
{
get
{
if (!_dynamicDocumentSerializerWasSet)
{
_dynamicDocumentSerializer = _serializationDomain.LookupSerializer<ExpandoObject>();
}
return _dynamicDocumentSerializer;
}
set
{
_dynamicDocumentSerializerWasSet = true;
_dynamicDocumentSerializer = value;
}
}

public int MaxDocumentSize { get; set; } = int.MaxValue;

public int MaxSerializationDepth { get; set; } = 100;
}
}
6 changes: 3 additions & 3 deletions src/MongoDB.Bson/BsonExtensionMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ public static byte[] ToBson(

if (serializer == null)
{
serializer = BsonSerializer.LookupSerializer(nominalType);
serializer = BsonSerializationDomain.Default.LookupSerializer(nominalType);
}
if (serializer.ValueType != nominalType)
{
Expand Down Expand Up @@ -165,7 +165,7 @@ public static BsonDocument ToBsonDocument(
return convertibleToBsonDocument.ToBsonDocument(); // use the provided ToBsonDocument method
}

serializer = BsonSerializer.LookupSerializer(nominalType);
serializer = BsonSerializationDomain.Default.LookupSerializer(nominalType);
}
if (serializer.ValueType != nominalType)
{
Expand Down Expand Up @@ -236,7 +236,7 @@ public static string ToJson(

if (serializer == null)
{
serializer = BsonSerializer.LookupSerializer(nominalType);
serializer = BsonSerializationDomain.Default.LookupSerializer(nominalType);
}
if (serializer.ValueType != nominalType)
{
Expand Down
39 changes: 39 additions & 0 deletions src/MongoDB.Bson/IBsonDefaults.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

using MongoDB.Bson.Serialization;

namespace MongoDB.Bson
{
internal interface IBsonDefaults
{
/// <summary>
///
/// </summary>
IBsonSerializer DynamicArraySerializer { get; set; }
/// <summary>
///
/// </summary>
IBsonSerializer DynamicDocumentSerializer { get; set; }
/// <summary>
///
/// </summary>
int MaxDocumentSize { get; set; }
/// <summary>
///
/// </summary>
int MaxSerializationDepth { get; set; }
}
}
3 changes: 2 additions & 1 deletion src/MongoDB.Bson/IO/BsonBinaryReaderSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

using System;
using System.Text;
using MongoDB.Bson.Serialization;

namespace MongoDB.Bson.IO
{
Expand All @@ -30,7 +31,7 @@ public class BsonBinaryReaderSettings : BsonReaderSettings
private UTF8Encoding _encoding = Utf8Encodings.Strict;
private bool _fixOldBinarySubTypeOnInput = true;
private bool _fixOldDateTimeMaxValueOnInput = true;
private int _maxDocumentSize = BsonDefaults.MaxDocumentSize;
private int _maxDocumentSize = BsonSerializationDomain.Default.BsonDefaults.MaxDocumentSize;

// constructors
/// <summary>
Expand Down
3 changes: 2 additions & 1 deletion src/MongoDB.Bson/IO/BsonBinaryWriterSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

using System;
using System.Text;
using MongoDB.Bson.Serialization;

namespace MongoDB.Bson.IO
{
Expand All @@ -29,7 +30,7 @@ public class BsonBinaryWriterSettings : BsonWriterSettings
// private fields
private UTF8Encoding _encoding = Utf8Encodings.Strict;
private bool _fixOldBinarySubTypeOnOutput = true;
private int _maxDocumentSize = BsonDefaults.MaxDocumentSize;
private int _maxDocumentSize = BsonSerializationDomain.Default.BsonDefaults.MaxDocumentSize;

// constructors
/// <summary>
Expand Down
3 changes: 2 additions & 1 deletion src/MongoDB.Bson/IO/BsonWriterSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
*/

using System;
using MongoDB.Bson.Serialization;

namespace MongoDB.Bson.IO
{
Expand All @@ -24,7 +25,7 @@ public abstract class BsonWriterSettings
{
// private fields
private bool _isFrozen;
private int _maxSerializationDepth = BsonDefaults.MaxSerializationDepth;
private int _maxSerializationDepth = BsonSerializationDomain.Default.BsonDefaults.MaxSerializationDepth;

// constructors
/// <summary>
Expand Down
25 changes: 22 additions & 3 deletions src/MongoDB.Bson/ObjectModel/BsonDocumentWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,12 @@ public static BsonDocumentWrapper Create<TNominalType>(TNominalType value)
/// <returns>A BsonDocumentWrapper.</returns>
public static BsonDocumentWrapper Create(Type nominalType, object value)
{
var serializer = BsonSerializer.LookupSerializer(nominalType);
return Create(BsonSerializationDomain.Default, nominalType, value);
}

internal static BsonDocumentWrapper Create(IBsonSerializationDomain serializationDomain, Type nominalType, object value)
{
var serializer = serializationDomain.LookupSerializer(nominalType);
return new BsonDocumentWrapper(value, serializer);
}

Expand All @@ -116,12 +121,21 @@ public static BsonDocumentWrapper Create(Type nominalType, object value)
/// <returns>A list of BsonDocumentWrappers.</returns>
public static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IEnumerable<TNominalType> values)
{
return CreateMultiple(BsonSerializationDomain.Default, values);
}

internal static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IBsonSerializationDomain serializationDomain, IEnumerable<TNominalType> values)
{
if (serializationDomain == null)
{
throw new ArgumentNullException("serializationDomain");
}
if (values == null)
{
throw new ArgumentNullException("values");
}

var serializer = BsonSerializer.LookupSerializer(typeof(TNominalType));
var serializer = serializationDomain.LookupSerializer(typeof(TNominalType));
return values.Select(v => new BsonDocumentWrapper(v, serializer));
}

Expand All @@ -132,6 +146,11 @@ public static IEnumerable<BsonDocumentWrapper> CreateMultiple<TNominalType>(IEnu
/// <param name="values">A list of wrapped objects.</param>
/// <returns>A list of BsonDocumentWrappers.</returns>
public static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType, IEnumerable values)
{
return CreateMultiple(BsonSerializationDomain.Default, nominalType, values);
}

internal static IEnumerable<BsonDocumentWrapper> CreateMultiple(IBsonSerializationDomain serializationDomain, Type nominalType, IEnumerable values)
{
if (nominalType == null)
{
Expand All @@ -142,7 +161,7 @@ public static IEnumerable<BsonDocumentWrapper> CreateMultiple(Type nominalType,
throw new ArgumentNullException("values");
}

var serializer = BsonSerializer.LookupSerializer(nominalType);
var serializer = serializationDomain.LookupSerializer(nominalType);
return values.Cast<object>().Select(v => new BsonDocumentWrapper(v, serializer));
}

Expand Down
5 changes: 5 additions & 0 deletions src/MongoDB.Bson/Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,8 @@

[assembly: InternalsVisibleTo("MongoDB.Bson.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
[assembly: InternalsVisibleTo("MongoDB.Analyzer.MQLGenerator, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
[assembly: InternalsVisibleTo("MongoDB.Driver, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
[assembly: InternalsVisibleTo("MongoDB.Driver.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
[assembly: InternalsVisibleTo("MongoDB.Driver.Encryption, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
[assembly: InternalsVisibleTo("MongoDB.Driver.Authentication.AWS, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
[assembly: InternalsVisibleTo("MongoDB.Driver.TestHelpers, PublicKey=002400000480000094000000060200000024000052534131000400000100010035287f0d3883c0a075c88e0cda3ce93b621003ecbd5e920d4a8c7238564f4d2f4f68116aca28c9b21341dc3a877679c14556192b2b2f5fe2c11d624e0894d308ff7b94bf6fd72aef1b41017ffe2572e99019d1c61963e68cd0ed67734a42cb333b808e3867cbe631937214e32e409fb1fa62fdb69d494c2530e64a40e417d6ee")]
Loading