Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 93 lines (78 sloc) 3.049 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Web.Script.Serialization;
using System.IO;
using System.Text.RegularExpressions;
using Membase.Configuration;

namespace Membase
{
internal static class ConfigHelper
{
private static readonly Enyim.Caching.ILog log = Enyim.Caching.LogManager.GetLogger(typeof(ConfigHelper));

/// <summary>
/// Deserializes the content of an url as a json object
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="uri"></param>
/// <returns></returns>
private static T DeserializeUri<T>(WebClient client, Uri uri, IEnumerable<JavaScriptConverter> converters)
{
var info = client.DownloadString(uri);
var jss = new JavaScriptSerializer();

if (converters != null)
jss.RegisterConverters(converters);

return jss.Deserialize<T>(info);
}

private static readonly JavaScriptConverter[] JSC = { ClusterNode.ConverterInstance };

private static ClusterInfo GetClusterInfo(WebClient client, Uri clusterUrl)
{
var info = DeserializeUri<ClusterInfo>(client, clusterUrl, JSC);

if (info == null)
throw new ArgumentException("invalid pool url: " + clusterUrl);

if (info.buckets == null || String.IsNullOrEmpty(info.buckets.uri))
throw new ArgumentException("got an invalid response, missing { buckets : { uri : '' } }");

return info;
}

/// <summary>
/// Asks the cluster for the specified bucket's configuration.
/// </summary>
/// <param name="poolUri"></param>
/// <param name="name"></param>
/// <returns></returns>
public static ClusterConfig ResolveBucket(WebClient client, Uri poolUri, string name)
{
var info = ConfigHelper.GetClusterInfo(client, poolUri);
var root = new Uri(poolUri, info.buckets.uri);

var allBuckets = ConfigHelper.DeserializeUri<ClusterConfig[]>(client, root, JSC);
var retval = allBuckets.FirstOrDefault(b => b.name == name);

if (retval == null)
{
if (log.IsWarnEnabled) log.WarnFormat("Could not find the pool '{0}' at {1}", name, poolUri);
}
else if (log.IsDebugEnabled) log.DebugFormat("Found config for bucket {0}.", name);

return retval;
}
}
}

#region [ License information ]
/* ************************************************************
*
* Copyright (c) 2010 Attila Kiskó, enyim.com
*
* 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.
*
* ************************************************************/
#endregion
Something went wrong with that request. Please try again.