Skip to content

Commit b71eb82

Browse files
committed
Merge pull request #31 from sharwell/DefaultInstances
Default instances
2 parents 6621f11 + d6f887f commit b71eb82

15 files changed

Lines changed: 197 additions & 39 deletions

src/corelib/Core/HttpStatusCodeParser.cs

Lines changed: 72 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,83 @@
1-
using System.Text.RegularExpressions;
1+
using System;
2+
using System.Linq;
3+
using System.Text.RegularExpressions;
24
using net.openstack.Core.Domain;
35

46
namespace net.openstack.Core
57
{
8+
/// <summary>
9+
/// A status parser for HTTP status codes.
10+
/// </summary>
611
public class HttpStatusCodeParser : IStatusParser
712
{
8-
private const string RegEx = @"(?<StatusCode>\d*)\s*(?<Status>\w*)";
9-
public Status Parse(string value)
13+
/// <summary>
14+
/// The default regular expression to use for matching HTTP status codes.
15+
/// </summary>
16+
protected static readonly string DefaultPattern = @"(?<StatusCode>\d*)\s*(?<Status>\w*)";
17+
18+
/// <summary>
19+
/// A singleton instance of the default <see cref="HttpStatusCodeParser"/>.
20+
/// </summary>
21+
private static readonly HttpStatusCodeParser _default = new HttpStatusCodeParser(DefaultPattern);
22+
23+
/// <summary>
24+
/// The compiled regular expression to use for matching HTTP status codes.
25+
/// </summary>
26+
private readonly Regex _expression;
27+
28+
/// <summary>
29+
/// Constructs a new instance of <see cref="HttpStatusCodeParser"/> for the default regular
30+
/// expression.
31+
/// </summary>
32+
[Obsolete("Use HttpStatusCodeParser.Default instead.")]
33+
public HttpStatusCodeParser()
34+
: this(DefaultPattern)
1035
{
11-
var regex = new Regex(RegEx);
36+
}
37+
38+
/// <summary>
39+
/// Constructs a new instance of <see cref="HttpStatusCodeParser"/> for the specified regular
40+
/// expression.
41+
/// </summary>
42+
/// <param name="pattern">
43+
/// The regular expression pattern to use.
44+
///
45+
/// <para><paramref name="pattern"/> should contain the named capturing grounds <c>StatusCode</c> and <c>status</c>.</para>
46+
/// </param>
47+
/// <exception cref="ArgumentNullException"><paramref name="pattern"/> is <c>null</c>.</exception>
48+
/// <exception cref="ArgumentException">
49+
/// <paramref name="pattern"/> does not contain a capturing group named <c>StatusCode</c>.
50+
/// <para>-or-</para>
51+
/// <para><paramref name="pattern"/> does not contain a capturing group named <c>Status</c>.</para>
52+
/// </exception>
53+
protected HttpStatusCodeParser(string pattern)
54+
{
55+
if (pattern == null)
56+
throw new ArgumentNullException("pattern");
57+
58+
_expression = new Regex(pattern, RegexOptions.Compiled);
1259

13-
var match = regex.Match(value);
60+
string[] groupNames = _expression.GetGroupNames();
61+
if (!groupNames.Contains("StatusCode", StringComparer.Ordinal))
62+
throw new ArgumentException("The pattern does not contain a StatusCode named capturing group.", "pattern");
63+
if (!groupNames.Contains("Status", StringComparer.Ordinal))
64+
throw new ArgumentException("The pattern does not contain a Status named capturing group.", "pattern");
65+
}
66+
67+
/// <summary>
68+
/// Gets a default <see cref="HttpStatusCodeParser"/>.
69+
/// </summary>
70+
public static HttpStatusCodeParser Default
71+
{
72+
get
73+
{
74+
return _default;
75+
}
76+
}
77+
78+
public Status Parse(string value)
79+
{
80+
var match = _expression.Match(value);
1481
if (!match.Success)
1582
return null;
1683

src/corelib/Providers/Rackspace/CloudBlockStorageProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public CloudBlockStorageProvider(CloudIdentity identity, IRestService restServic
9393
/// <param name="identityProvider">An instance of an <see cref="IIdentityProvider"/> to override the default <see cref="CloudIdentity"/></param>
9494
/// <param name="restService">An instance of an <see cref="IRestService"/> to override the default <see cref="JsonRestServices"/></param>
9595
public CloudBlockStorageProvider(CloudIdentity identity, IIdentityProvider identityProvider, IRestService restService)
96-
: this(identity, identityProvider, restService, new CloudBlockStorageValidator()) { }
96+
: this(identity, identityProvider, restService, CloudBlockStorageValidator.Default) { }
9797

9898

9999
internal CloudBlockStorageProvider(CloudIdentity identity, IIdentityProvider identityProvider, IRestService restService, IBlockStorageValidator cloudBlockStorageValidator)

src/corelib/Providers/Rackspace/CloudFilesMetadataProcessor.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,23 @@ namespace net.openstack.Providers.Rackspace
66
{
77
internal class CloudFilesMetadataProcessor : IObjectStorageMetadataProcessor
88
{
9-
public Dictionary<string, Dictionary<string, string>> ProcessMetadata(IList<HttpHeader> httpHeaders)
9+
/// <summary>
10+
/// A default instance of <see cref="CloudFilesMetadataProcessor"/>.
11+
/// </summary>
12+
private static readonly CloudFilesMetadataProcessor _default = new CloudFilesMetadataProcessor();
13+
14+
/// <summary>
15+
/// Gets a default instance of <see cref="CloudFilesMetadataProcessor"/>.
16+
/// </summary>
17+
public static CloudFilesMetadataProcessor Default
18+
{
19+
get
20+
{
21+
return _default;
22+
}
23+
}
24+
25+
public virtual Dictionary<string, Dictionary<string, string>> ProcessMetadata(IList<HttpHeader> httpHeaders)
1026
{
1127
var pheaders = new Dictionary<string, string>();
1228
var metadata = new Dictionary<string, string>();

src/corelib/Providers/Rackspace/CloudFilesProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public CloudFilesProvider(CloudIdentity identity, IRestService restService)
9999
/// <param name="identityProvider">An instance of an <see cref="IIdentityProvider"/> to override the default <see cref="CloudIdentity"/></param>
100100
/// <param name="restService">An instance of an <see cref="IRestService"/> to override the default <see cref="JsonRestServices"/></param>
101101
public CloudFilesProvider(CloudIdentity identity, IIdentityProvider identityProvider, IRestService restService)
102-
: this(identity, identityProvider, restService, new CloudFilesValidator(), new CloudFilesMetadataProcessor(), new EncodeDecodeProvider(), new HttpStatusCodeParser(), new BulkDeletionResultMapper(new HttpStatusCodeParser())) { }
102+
: this(identity, identityProvider, restService, CloudFilesValidator.Default, CloudFilesMetadataProcessor.Default, EncodeDecodeProvider.Default, HttpStatusCodeParser.Default, new BulkDeletionResultMapper(HttpStatusCodeParser.Default)) { }
103103

104104
internal CloudFilesProvider(IIdentityProvider cloudIdentityProvider, IRestService restService, IObjectStorageValidator cloudFilesValidator, IObjectStorageMetadataProcessor cloudFilesMetadataProcessor, IEncodeDecodeProvider encodeDecodeProvider, IStatusParser statusParser, IObjectMapper<BulkDeleteResponse, BulkDeletionResults> mapper)
105105
: this(null, cloudIdentityProvider, restService, cloudFilesValidator, cloudFilesMetadataProcessor, encodeDecodeProvider, statusParser, mapper) { }

src/corelib/Providers/Rackspace/CloudIdentityProviderFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ public IExtendedCloudIdentityProvider Get(CloudIdentity identity)
4747
switch (cloudInstance)
4848
{
4949
case CloudInstance.Default:
50-
return new GeographicalCloudIdentityProvider(new Uri(USIdentityUrlBase), _defaultIdentity, _restService, _tokenCache, new HttpResponseCodeValidator());
50+
return new GeographicalCloudIdentityProvider(new Uri(USIdentityUrlBase), _defaultIdentity, _restService, _tokenCache, HttpResponseCodeValidator.Default);
5151
case CloudInstance.UK:
52-
return new GeographicalCloudIdentityProvider(new Uri(LONIdentityUrlBase), _defaultIdentity, _restService, _tokenCache, new HttpResponseCodeValidator());
52+
return new GeographicalCloudIdentityProvider(new Uri(LONIdentityUrlBase), _defaultIdentity, _restService, _tokenCache, HttpResponseCodeValidator.Default);
5353
default:
5454
throw new UnknownGeographyException(cloudInstance.ToString());
5555
}

src/corelib/Providers/Rackspace/EncodeDecodeProvider.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,22 @@ namespace net.openstack.Providers.Rackspace
55
{
66
internal class EncodeDecodeProvider : IEncodeDecodeProvider
77
{
8+
/// <summary>
9+
/// A default instance of <see cref="EncodeDecodeProvider"/>.
10+
/// </summary>
11+
private static readonly EncodeDecodeProvider _default = new EncodeDecodeProvider();
12+
13+
/// <summary>
14+
/// Gets a default instance of <see cref="EncodeDecodeProvider"/>.
15+
/// </summary>
16+
public static EncodeDecodeProvider Default
17+
{
18+
get
19+
{
20+
return _default;
21+
}
22+
}
23+
824
public string UrlEncode(string stringToEncode)
925
{
1026
return HttpUtility.UrlEncode(stringToEncode).Replace("+","%20");

src/corelib/Providers/Rackspace/ProviderBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ protected ProviderBase(CloudIdentity defaultIdentity, IIdentityProvider identit
3939
restService = new JsonRestServices();
4040

4141
if (httpStatusCodeValidator == null)
42-
httpStatusCodeValidator = new HttpResponseCodeValidator();
42+
httpStatusCodeValidator = HttpResponseCodeValidator.Default;
4343

4444
DefaultIdentity = defaultIdentity;
4545
IdentityProvider = identityProvider;

src/corelib/Providers/Rackspace/Validators/CloudBlockStorageValidator.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,26 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using net.openstack.Core;
6-
using net.openstack.Core.Validators;
1+
using net.openstack.Core.Validators;
72
using net.openstack.Providers.Rackspace.Exceptions;
83

94
namespace net.openstack.Providers.Rackspace.Validators
105
{
116
public class CloudBlockStorageValidator : IBlockStorageValidator
127
{
8+
/// <summary>
9+
/// A default instance of <see cref="CloudBlockStorageValidator"/>.
10+
/// </summary>
11+
private static readonly CloudBlockStorageValidator _default = new CloudBlockStorageValidator();
12+
13+
/// <summary>
14+
/// Gets a default implementation of <see cref="CloudBlockStorageValidator"/>.
15+
/// </summary>
16+
public static CloudBlockStorageValidator Default
17+
{
18+
get
19+
{
20+
return _default;
21+
}
22+
}
23+
1324
public void ValidateVolumeSize(int size)
1425
{
1526
if (size < 100 || size > 1000)

src/corelib/Providers/Rackspace/Validators/CloudFilesValidator.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ namespace net.openstack.Providers.Rackspace.Validators
88
{
99
public class CloudFilesValidator : IObjectStorageValidator
1010
{
11+
/// <summary>
12+
/// A default instance of <see cref="CloudBlockStorageValidator"/>.
13+
/// </summary>
14+
private static readonly CloudFilesValidator _default = new CloudFilesValidator();
15+
16+
/// <summary>
17+
/// Gets a default instance of <see cref="CloudBlockStorageValidator"/>.
18+
/// </summary>
19+
public static CloudFilesValidator Default
20+
{
21+
get
22+
{
23+
return _default;
24+
}
25+
}
26+
1127
public void ValidateContainerName(string containerName)
1228
{
1329
var containerNameString = string.Format("Container Name:[{0}]", containerName);

src/corelib/Providers/Rackspace/Validators/CloudNetworksValidator.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ namespace net.openstack.Providers.Rackspace.Validators
88
{
99
public class CloudNetworksValidator : INetworksValidator
1010
{
11+
/// <summary>
12+
/// A default instance of <see cref="CloudNetworksValidator"/>.
13+
/// </summary>
14+
private static readonly CloudNetworksValidator _default;
15+
16+
/// <summary>
17+
/// Gets a default instance of <see cref="CloudNetworksValidator"/>.
18+
/// </summary>
19+
public static CloudNetworksValidator Default
20+
{
21+
get
22+
{
23+
return _default;
24+
}
25+
}
26+
1127
public void ValidateCidr(string cidr)
1228
{
1329
if (string.IsNullOrWhiteSpace(cidr))

0 commit comments

Comments
 (0)