summaryrefslogtreecommitdiffstats
path: root/src/DotNetOAuth/Messaging/Reflection
diff options
context:
space:
mode:
Diffstat (limited to 'src/DotNetOAuth/Messaging/Reflection')
-rw-r--r--src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs38
-rw-r--r--src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs2
-rw-r--r--src/DotNetOAuth/Messaging/Reflection/MessagePart.cs2
3 files changed, 39 insertions, 3 deletions
diff --git a/src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs b/src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs
index ef73a31..6b898bb 100644
--- a/src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs
+++ b/src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs
@@ -9,12 +9,14 @@ namespace DotNetOAuth.Messaging.Reflection {
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
+ using System.Globalization;
internal class MessageDescription {
+ private static Dictionary<Type, MessageDescription> reflectedMessageTypes = new Dictionary<Type,MessageDescription>();
private Type messageType;
private Dictionary<string, MessagePart> mapping;
- internal MessageDescription(Type messageType) {
+ private MessageDescription(Type messageType) {
if (messageType == null) {
throw new ArgumentNullException("messageType");
}
@@ -27,6 +29,23 @@ namespace DotNetOAuth.Messaging.Reflection {
this.ReflectMessageType();
}
+ internal static MessageDescription Get(Type messageType) {
+ if (messageType == null) {
+ throw new ArgumentNullException("messageType");
+ }
+
+ MessageDescription result;
+ if (!reflectedMessageTypes.TryGetValue(messageType, out result)) {
+ lock (reflectedMessageTypes) {
+ if (!reflectedMessageTypes.TryGetValue(messageType, out result)) {
+ reflectedMessageTypes[messageType] = result = new MessageDescription(messageType);
+ }
+ }
+ }
+
+ return result;
+ }
+
internal Type MessageType {
get { return this.messageType; }
}
@@ -52,5 +71,22 @@ namespace DotNetOAuth.Messaging.Reflection {
currentType = currentType.BaseType;
} while (currentType != null);
}
+
+ /// <summary>
+ /// Verifies that a given set of keys include all the required parameters
+ /// for this message type or throws an exception.
+ /// </summary>
+ /// <exception cref="ProtocolException">Thrown when required parts of a message are not in <paramref name="keys"/></exception>
+ internal void EnsureRequiredMessagePartsArePresent(IEnumerable<string> keys) {
+ var missingKeys = (from part in Mapping.Values
+ where part.IsRequired && !keys.Contains(part.Name)
+ select part.Name).ToArray();
+ if (missingKeys.Length > 0) {
+ throw new ProtocolException(string.Format(CultureInfo.CurrentCulture,
+ MessagingStrings.RequiredParametersMissing,
+ this.messageType.FullName,
+ string.Join(", ", missingKeys)));
+ }
+ }
}
}
diff --git a/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs b/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs
index 9490894..196af54 100644
--- a/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs
+++ b/src/DotNetOAuth/Messaging/Reflection/MessageDictionary.cs
@@ -26,7 +26,7 @@ namespace DotNetOAuth.Messaging.Reflection {
}
this.message = message;
- this.description = new MessageDescription(message.GetType());
+ this.description = MessageDescription.Get(message.GetType());
}
#region IDictionary<string,string> Members
diff --git a/src/DotNetOAuth/Messaging/Reflection/MessagePart.cs b/src/DotNetOAuth/Messaging/Reflection/MessagePart.cs
index b3c66d0..4d2ebe6 100644
--- a/src/DotNetOAuth/Messaging/Reflection/MessagePart.cs
+++ b/src/DotNetOAuth/Messaging/Reflection/MessagePart.cs
@@ -27,7 +27,7 @@ namespace DotNetOAuth.Messaging.Reflection {
static MessagePart() {
Map<Uri>(uri => uri.AbsoluteUri, str => new Uri(str));
- Map<DateTime>(dt => XmlConvert.ToString(dt, XmlDateTimeSerializationMode.Utc), str => DateTime.Parse(str));
+ Map<DateTime>(dt => XmlConvert.ToString(dt, XmlDateTimeSerializationMode.Utc), str => XmlConvert.ToDateTime(str, XmlDateTimeSerializationMode.Utc));
}
internal MessagePart(MemberInfo member, MessagePartAttribute attribute) {