Google Api
This commit is contained in:
parent
e307811d89
commit
83f9fc1bd8
123 changed files with 12961 additions and 60 deletions
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
Copyright 2011 Google 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;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Google.Apis.Util;
|
||||
|
||||
namespace Google.Apis.Requests.Parameters
|
||||
{
|
||||
/// <summary>A collection of parameters (key value pairs). May contain duplicate keys.</summary>
|
||||
public class ParameterCollection : List<KeyValuePair<string, string>>
|
||||
{
|
||||
/// <summary>Constructs a new parameter collection.</summary>
|
||||
public ParameterCollection() : base() { }
|
||||
|
||||
/// <summary>Constructs a new parameter collection from the given collection.</summary>
|
||||
public ParameterCollection(IEnumerable<KeyValuePair<string, string>> collection) : base(collection) { }
|
||||
|
||||
/// <summary>Adds a single parameter to this collection.</summary>
|
||||
public void Add(string key, string value)
|
||||
{
|
||||
Add(new KeyValuePair<string, string>(key, value));
|
||||
}
|
||||
|
||||
/// <summary>Returns <c>true</c> if this parameter is set within the collection.</summary>
|
||||
public bool ContainsKey(string key)
|
||||
{
|
||||
key.ThrowIfNullOrEmpty("key");
|
||||
string value;
|
||||
return TryGetValue(key, out value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Tries to find the a key within the specified key value collection. Returns true if the key was found.
|
||||
/// If a pair was found the out parameter value will contain the value of that pair.
|
||||
/// </summary>
|
||||
public bool TryGetValue(string key, out string value)
|
||||
{
|
||||
key.ThrowIfNullOrEmpty("key");
|
||||
|
||||
foreach (KeyValuePair<string, string> pair in this)
|
||||
{
|
||||
// Check if this pair matches the specified key name.
|
||||
if (pair.Key.Equals(key))
|
||||
{
|
||||
value = pair.Value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// No result found.
|
||||
value = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the value of the first matching key, or throws a KeyNotFoundException if the parameter is not
|
||||
/// present within the collection.
|
||||
/// </summary>
|
||||
public string GetFirstMatch(string key)
|
||||
{
|
||||
string val;
|
||||
if (!TryGetValue(key, out val))
|
||||
{
|
||||
throw new KeyNotFoundException("Parameter with the name '" + key + "' was not found.");
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all matches for the specified key. May return an empty enumeration if the key is not present.
|
||||
/// </summary>
|
||||
public IEnumerable<string> GetAllMatches(string key)
|
||||
{
|
||||
key.ThrowIfNullOrEmpty("key");
|
||||
|
||||
foreach (KeyValuePair<string, string> pair in this)
|
||||
{
|
||||
// Check if this pair matches the specified key name.
|
||||
if (pair.Key.Equals(key))
|
||||
{
|
||||
yield return pair.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns all matches for the specified key. May return an empty enumeration if the key is not present.
|
||||
/// </summary>
|
||||
public IEnumerable<string> this[string key]
|
||||
{
|
||||
get { return GetAllMatches(key); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a parameter collection from the specified URL encoded query string.
|
||||
/// Example:
|
||||
/// The query string "foo=bar&chocolate=cookie" would result in two parameters (foo and bar)
|
||||
/// with the values "bar" and "cookie" set.
|
||||
/// </summary>
|
||||
public static ParameterCollection FromQueryString(string qs)
|
||||
{
|
||||
var collection = new ParameterCollection();
|
||||
var qsParam = qs.Split('&');
|
||||
foreach (var param in qsParam)
|
||||
{
|
||||
// Split the parameter into key and value.
|
||||
var info = param.Split(new[] { '=' });
|
||||
if (info.Length == 2)
|
||||
{
|
||||
collection.Add(Uri.UnescapeDataString(info[0]), Uri.UnescapeDataString(info[1]));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentException(string.Format(
|
||||
"Invalid query string [{0}]. Invalid part [{1}]", qs, param));
|
||||
}
|
||||
}
|
||||
|
||||
return collection;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a parameter collection from the specified dictionary.
|
||||
/// If the value is an enumerable, a parameter pair will be added for each value.
|
||||
/// Otherwise the value will be converted into a string using the .ToString() method.
|
||||
/// </summary>
|
||||
public static ParameterCollection FromDictionary(IDictionary<string, object> dictionary)
|
||||
{
|
||||
var collection = new ParameterCollection();
|
||||
foreach (KeyValuePair<string, object> pair in dictionary)
|
||||
{
|
||||
// Try parsing the value of the pair as an enumerable.
|
||||
var valueAsEnumerable = pair.Value as IEnumerable;
|
||||
if (!(pair.Value is string) && valueAsEnumerable != null)
|
||||
{
|
||||
foreach (var value in valueAsEnumerable)
|
||||
{
|
||||
collection.Add(pair.Key, Util.Utilities.ConvertToString(value));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Otherwise just convert it to a string.
|
||||
collection.Add(pair.Key, pair.Value == null ? null : Util.Utilities.ConvertToString(pair.Value));
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
/*
|
||||
Copyright 2013 Google 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Http;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
using Google.Apis.Logging;
|
||||
using Google.Apis.Util;
|
||||
|
||||
namespace Google.Apis.Requests.Parameters
|
||||
{
|
||||
/// <summary>
|
||||
/// Utility class for iterating on <see cref="RequestParameterAttribute"/> properties in a request object.
|
||||
/// </summary>
|
||||
public static class ParameterUtils
|
||||
{
|
||||
private static readonly ILogger Logger = ApplicationContext.Logger.ForType(typeof(ParameterUtils));
|
||||
|
||||
/// <summary>
|
||||
/// Creates a <see cref="System.Net.Http.FormUrlEncodedContent"/> with all the specified parameters in
|
||||
/// the input request. It uses reflection to iterate over all properties with
|
||||
/// <see cref="Google.Apis.Util.RequestParameterAttribute"/> attribute.
|
||||
/// </summary>
|
||||
/// <param name="request">
|
||||
/// A request object which contains properties with
|
||||
/// <see cref="Google.Apis.Util.RequestParameterAttribute"/> attribute. Those properties will be serialized
|
||||
/// to the returned <see cref="System.Net.Http.FormUrlEncodedContent"/>.
|
||||
/// </param>
|
||||
/// <returns>
|
||||
/// A <see cref="System.Net.Http.FormUrlEncodedContent"/> which contains the all the given object required
|
||||
/// values.
|
||||
/// </returns>
|
||||
public static FormUrlEncodedContent CreateFormUrlEncodedContent(object request)
|
||||
{
|
||||
IList<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
|
||||
IterateParameters(request, (type, name, value) =>
|
||||
{
|
||||
list.Add(new KeyValuePair<string, string>(name, value.ToString()));
|
||||
});
|
||||
return new FormUrlEncodedContent(list);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a parameter dictionary by using reflection to iterate over all properties with
|
||||
/// <see cref="Google.Apis.Util.RequestParameterAttribute"/> attribute.
|
||||
/// </summary>
|
||||
/// <param name="request">
|
||||
/// A request object which contains properties with
|
||||
/// <see cref="Google.Apis.Util.RequestParameterAttribute"/> attribute. Those properties will be set
|
||||
/// in the output dictionary.
|
||||
/// </param>
|
||||
public static IDictionary<string, object> CreateParameterDictionary(object request)
|
||||
{
|
||||
var dict = new Dictionary<string, object>();
|
||||
IterateParameters(request, (type, name, value) =>
|
||||
{
|
||||
dict.Add(name, value);
|
||||
});
|
||||
return dict;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets query parameters in the given builder with all all properties with the
|
||||
/// <see cref="Google.Apis.Util.RequestParameterAttribute"/> attribute.
|
||||
/// </summary>
|
||||
/// <param name="builder">The request builder</param>
|
||||
/// <param name="request">
|
||||
/// A request object which contains properties with
|
||||
/// <see cref="Google.Apis.Util.RequestParameterAttribute"/> attribute. Those properties will be set in the
|
||||
/// given request builder object
|
||||
/// </param>
|
||||
public static void InitParameters(RequestBuilder builder, object request)
|
||||
{
|
||||
IterateParameters(request, (type, name, value) =>
|
||||
{
|
||||
builder.AddParameter(type, name, value.ToString());
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Iterates over all <see cref="Google.Apis.Util.RequestParameterAttribute"/> properties in the request
|
||||
/// object and invokes the specified action for each of them.
|
||||
/// </summary>
|
||||
/// <param name="request">A request object</param>
|
||||
/// <param name="action">An action to invoke which gets the parameter type, name and its value</param>
|
||||
private static void IterateParameters(object request, Action<RequestParameterType, string, object> action)
|
||||
{
|
||||
// Use reflection to build the parameter dictionary.
|
||||
foreach (PropertyInfo property in request.GetType().GetProperties(BindingFlags.Instance |
|
||||
BindingFlags.Public))
|
||||
{
|
||||
// Retrieve the RequestParameterAttribute.
|
||||
RequestParameterAttribute attribute =
|
||||
property.GetCustomAttributes(typeof(RequestParameterAttribute), false).FirstOrDefault() as
|
||||
RequestParameterAttribute;
|
||||
if (attribute == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the name of this parameter from the attribute, if it doesn't exist take a lower-case variant of
|
||||
// property name.
|
||||
string name = attribute.Name ?? property.Name.ToLower();
|
||||
|
||||
var propertyType = property.PropertyType;
|
||||
var value = property.GetValue(request, null);
|
||||
|
||||
// Call action with the type name and value.
|
||||
if (propertyType.GetTypeInfo().IsValueType || value != null)
|
||||
{
|
||||
if (attribute.Type == RequestParameterType.UserDefinedQueries)
|
||||
{
|
||||
if (typeof(IEnumerable<KeyValuePair<string, string>>).IsAssignableFrom(value.GetType()))
|
||||
{
|
||||
foreach (var pair in (IEnumerable<KeyValuePair<string, string>>)value)
|
||||
{
|
||||
action(RequestParameterType.Query, pair.Key, pair.Value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.Warning("Parameter marked with RequestParameterType.UserDefinedQueries attribute " +
|
||||
"was not of type IEnumerable<KeyValuePair<string, string>> and will be skipped.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
action(attribute.Type, name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
Copyright 2010 Google 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;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
using Google.Apis.Discovery;
|
||||
using Google.Apis.Testing;
|
||||
|
||||
namespace Google.Apis.Requests.Parameters
|
||||
{
|
||||
/// <summary>Logic for validating a parameter.</summary>
|
||||
public static class ParameterValidator
|
||||
{
|
||||
/// <summary>Validates a parameter value against the methods regex.</summary>
|
||||
[VisibleForTestOnly]
|
||||
public static bool ValidateRegex(IParameter param, string paramValue)
|
||||
{
|
||||
return string.IsNullOrEmpty(param.Pattern) || new Regex(param.Pattern).IsMatch(paramValue);
|
||||
}
|
||||
|
||||
/// <summary>Validates if a parameter is valid.</summary>
|
||||
public static bool ValidateParameter(IParameter parameter, string value)
|
||||
{
|
||||
// Fail if a required parameter is not present.
|
||||
if (String.IsNullOrEmpty(value))
|
||||
{
|
||||
return !parameter.IsRequired;
|
||||
}
|
||||
|
||||
// The parameter has value so validate the regex.
|
||||
return ValidateRegex(parameter, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue