diff options
author | Andrew Arnott <andrewarnott@gmail.com> | 2010-04-24 15:32:51 -0700 |
---|---|---|
committer | Andrew Arnott <andrewarnott@gmail.com> | 2010-04-24 15:32:51 -0700 |
commit | 4ea397d1c894ea429ca8014da1d69ef3d90f304b (patch) | |
tree | adf5426386b8674b079b74097fff8e457e177c5e | |
parent | d90845e09b4feec42bbb41cf76fb7bc5604e6022 (diff) | |
download | DotNetOpenAuth-4ea397d1c894ea429ca8014da1d69ef3d90f304b.zip DotNetOpenAuth-4ea397d1c894ea429ca8014da1d69ef3d90f304b.tar.gz DotNetOpenAuth-4ea397d1c894ea429ca8014da1d69ef3d90f304b.tar.bz2 |
Half-done attempt to fix some failing tests.
-rw-r--r-- | src/DotNetOpenAuth/Messaging/StandardMessageFactory.cs | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/src/DotNetOpenAuth/Messaging/StandardMessageFactory.cs b/src/DotNetOpenAuth/Messaging/StandardMessageFactory.cs index d8944e0..40f2d5d 100644 --- a/src/DotNetOpenAuth/Messaging/StandardMessageFactory.cs +++ b/src/DotNetOpenAuth/Messaging/StandardMessageFactory.cs @@ -174,11 +174,14 @@ namespace DotNetOpenAuth.Messaging { Contract.Requires<ArgumentNullException>(request != null); Contract.Requires<ArgumentNullException>(fields != null); - var matches = this.responseMessageTypes.Keys - .Where(message => message.CheckMessagePartsPassBasicValidation(fields)) - .Where(message => this.FindMatchingResponseConstructors(message, request.GetType()).Any()) - .OrderByDescending(message => message.Mapping.Count) - .CacheGeneratedResults(); + var matches = (from responseMessageType in this.responseMessageTypes + let message = responseMessageType.Key + where message.CheckMessagePartsPassBasicValidation(fields) + let ctors = this.FindMatchingResponseConstructors(message, request.GetType()) + where ctors.Any() + orderby GetDerivationDistance(ctors.First().GetParameters()[0].ParameterType, request.GetType()) + orderby message.Mapping.Count descending + select message).CacheGeneratedResults(); var match = matches.FirstOrDefault(); if (match != null) { if (Logger.Messaging.IsWarnEnabled && matches.Count() > 1) { @@ -235,6 +238,27 @@ namespace DotNetOpenAuth.Messaging { return (IDirectResponseProtocolMessage)ctor.Invoke(new object[] { request }); } + private static int GetDerivationDistance(Type assignableType, Type derivedType) { + Contract.Requires<ArgumentNullException>(assignableType != null, "assignableType"); + Contract.Requires<ArgumentNullException>(derivedType != null, "derivedType"); + Contract.Requires<ArgumentException>(assignableType.IsAssignableFrom(derivedType)); + + // If this is the two types are equivalent... + if (derivedType.IsAssignableFrom(assignableType)) + { + return 0; + } + + int steps; + derivedType = derivedType.BaseType; + for (steps = 1; assignableType.IsAssignableFrom(derivedType); steps++) + { + derivedType = derivedType.BaseType; + } + + return steps; + } + private IEnumerable<ConstructorInfo> FindMatchingResponseConstructors(MessageDescription messageDescription, Type requestType) { Contract.Requires<ArgumentNullException>(messageDescription != null); Contract.Requires<ArgumentNullException>(requestType != null); |