summaryrefslogtreecommitdiffstats
path: root/src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs
diff options
context:
space:
mode:
authorAndrew Arnott <andrewarnott@gmail.com>2008-09-18 22:54:10 -0700
committerAndrew <andrewarnott@gmail.com>2008-09-18 22:54:10 -0700
commit4b6f60f351b8520e3824ee80dc0066f1c69c29b4 (patch)
treeb541a53615096c49d2f4988e68622a10b50ff412 /src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs
parent11615a19bad90741c7a755eaf741b8683992c9ff (diff)
downloadDotNetOpenAuth-4b6f60f351b8520e3824ee80dc0066f1c69c29b4.zip
DotNetOpenAuth-4b6f60f351b8520e3824ee80dc0066f1c69c29b4.tar.gz
DotNetOpenAuth-4b6f60f351b8520e3824ee80dc0066f1c69c29b4.tar.bz2
All tests passing, with more work done.
Diffstat (limited to 'src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs')
-rw-r--r--src/DotNetOAuth/Messaging/Reflection/MessageDescription.cs38
1 files changed, 37 insertions, 1 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)));
+ }
+ }
}
}