| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418 |
- //------------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Dispatcher
- {
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Diagnostics.CodeAnalysis;
- using System.Runtime;
- using System.ServiceModel.Channels;
- public class MessageQueryTable<TItem> : IDictionary<MessageQuery, TItem>
- {
- Dictionary<Type, MessageQueryCollection> collectionsByType;
- Dictionary<MessageQuery, TItem> dictionary;
- public MessageQueryTable()
- {
- this.dictionary = new Dictionary<MessageQuery, TItem>();
- this.collectionsByType = new Dictionary<Type, MessageQueryCollection>();
- }
- public int Count
- {
- get { return this.dictionary.Count; }
- }
- public bool IsReadOnly
- {
- get { return false; }
- }
- public ICollection<MessageQuery> Keys
- {
- get { return this.dictionary.Keys; }
- }
- public ICollection<TItem> Values
- {
- get { return this.dictionary.Values; }
- }
- public TItem this[MessageQuery key]
- {
- get
- {
- return this.dictionary[key];
- }
- set
- {
- this.Add(key, value);
- }
- }
- [SuppressMessage(FxCop.Category.Usage, "CA2301:EmbeddableTypesInContainersRule", MessageId = "collectionsByType", Justification = "No need to support type equivalence here.")]
- public void Add(MessageQuery key, TItem value)
- {
- if (key == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("key");
- }
- Type queryType = key.GetType();
- MessageQueryCollection collection;
- if (!this.collectionsByType.TryGetValue(queryType, out collection))
- {
- collection = key.CreateMessageQueryCollection();
- if (collection == null)
- {
- collection = new SequentialMessageQueryCollection();
- }
- this.collectionsByType.Add(queryType, collection);
- }
-
- collection.Add(key);
- this.dictionary.Add(key, value);
- }
- public void Add(KeyValuePair<MessageQuery, TItem> item)
- {
- this.Add(item.Key, item.Value);
- }
- public void Clear()
- {
- this.collectionsByType.Clear();
- this.dictionary.Clear();
- }
- public bool Contains(KeyValuePair<MessageQuery, TItem> item)
- {
- return ((ICollection<KeyValuePair<MessageQuery, TItem>>) this.dictionary).Contains(item);
- }
- public bool ContainsKey(MessageQuery key)
- {
- return this.dictionary.ContainsKey(key);
- }
- public void CopyTo(KeyValuePair<MessageQuery, TItem>[] array, int arrayIndex)
- {
- ((ICollection<KeyValuePair<MessageQuery, TItem>>) this.dictionary).CopyTo(array, arrayIndex);
- }
- public IEnumerable<KeyValuePair<MessageQuery, TResult>> Evaluate<TResult>(Message message)
- {
- if (message == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("message");
- }
- return new MessageEnumerable<TResult>(this, message);
- }
- public IEnumerable<KeyValuePair<MessageQuery, TResult>> Evaluate<TResult>(MessageBuffer buffer)
- {
- if (buffer == null)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("buffer");
- }
- return new MessageBufferEnumerable<TResult>(this, buffer);
- }
- public IEnumerator<KeyValuePair<MessageQuery, TItem>> GetEnumerator()
- {
- return ((ICollection<KeyValuePair<MessageQuery, TItem>>) this.dictionary).GetEnumerator();
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- [SuppressMessage(FxCop.Category.Usage, "CA2301:EmbeddableTypesInContainersRule", MessageId = "collectionsByType", Justification = "No need to support type equivalence here.")]
- public bool Remove(MessageQuery key)
- {
- if (this.dictionary.Remove(key))
- {
- MessageQueryCollection collection;
- Type queryType = key.GetType();
- collection = this.collectionsByType[queryType];
- collection.Remove(key);
- if (collection.Count == 0)
- {
- this.collectionsByType.Remove(queryType);
- }
-
- return true;
- }
- else
- {
- return false;
- }
- }
- public bool Remove(KeyValuePair<MessageQuery, TItem> item)
- {
- return this.Remove(item.Key);
- }
- public bool TryGetValue(MessageQuery key, out TItem value)
- {
- return this.dictionary.TryGetValue(key, out value);
- }
- class SequentialMessageQueryCollection : MessageQueryCollection
- {
- public override IEnumerable<KeyValuePair<MessageQuery, TResult>> Evaluate<TResult>(Message message)
- {
- return new MessageSequentialResultEnumerable<TResult>(this, message);
- }
- public override IEnumerable<KeyValuePair<MessageQuery, TResult>> Evaluate<TResult>(MessageBuffer buffer)
- {
- return new MessageBufferSequentialResultEnumerable<TResult>(this, buffer);
- }
- abstract class SequentialResultEnumerable<TSource, TResult> : IEnumerable<KeyValuePair<MessageQuery, TResult>>
- {
- SequentialMessageQueryCollection collection;
- TSource source;
- public SequentialResultEnumerable(SequentialMessageQueryCollection collection, TSource source)
- {
- this.collection = collection;
- this.source = source;
- }
- SequentialMessageQueryCollection Collection
- {
- get
- {
- return this.collection;
- }
- }
- protected TSource Source
- {
- get
- {
- return this.source;
- }
- }
- public IEnumerator<KeyValuePair<MessageQuery, TResult>> GetEnumerator()
- {
- return new SequentialResultEnumerator(this);
- }
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- protected abstract TResult Evaluate(MessageQuery query);
- class SequentialResultEnumerator : IEnumerator<KeyValuePair<MessageQuery, TResult>>
- {
- SequentialResultEnumerable<TSource, TResult> enumerable;
- IEnumerator<MessageQuery> queries;
- public SequentialResultEnumerator(SequentialResultEnumerable<TSource, TResult> enumerable)
- {
- this.enumerable = enumerable;
- this.queries = enumerable.Collection.GetEnumerator();
- }
-
- public KeyValuePair<MessageQuery, TResult> Current
- {
- get
- {
- MessageQuery query = queries.Current;
- TResult result = enumerable.Evaluate(query);
- return new KeyValuePair<MessageQuery, TResult>(query, result);
- }
- }
- object IEnumerator.Current
- {
- get
- {
- return this.Current;
- }
- }
- public void Dispose()
- {
- }
-
- public bool MoveNext()
- {
- return this.queries.MoveNext();
- }
- public void Reset()
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
- }
- }
- }
- class MessageSequentialResultEnumerable<TResult> : SequentialResultEnumerable<Message, TResult>
- {
- public MessageSequentialResultEnumerable(
- SequentialMessageQueryCollection collection, Message message)
- : base(collection, message)
- {
- }
- protected override TResult Evaluate(MessageQuery query)
- {
- return query.Evaluate<TResult>(this.Source);
- }
- }
- class MessageBufferSequentialResultEnumerable<TResult> : SequentialResultEnumerable<MessageBuffer, TResult>
- {
- public MessageBufferSequentialResultEnumerable(
- SequentialMessageQueryCollection collection, MessageBuffer buffer)
- : base(collection, buffer)
- {
- }
- protected override TResult Evaluate(MessageQuery query)
- {
- return query.Evaluate<TResult>(this.Source);
- }
- }
- }
- abstract class Enumerable<TSource, TResult> : IEnumerable<KeyValuePair<MessageQuery, TResult>>
- {
- TSource source;
- MessageQueryTable<TItem> table;
- public Enumerable(MessageQueryTable<TItem> table, TSource source)
- {
- this.table = table;
- this.source = source;
- }
- protected TSource Source
- {
- get
- {
- return this.source;
- }
- }
- public IEnumerator<KeyValuePair<MessageQuery, TResult>> GetEnumerator()
- {
- return new Enumerator(this);
- }
- protected abstract IEnumerator<KeyValuePair<MessageQuery, TResult>> GetInnerEnumerator(MessageQueryCollection collection);
- IEnumerator IEnumerable.GetEnumerator()
- {
- return this.GetEnumerator();
- }
- class Enumerator : IEnumerator<KeyValuePair<MessageQuery, TResult>>
- {
- Enumerable<TSource, TResult> enumerable;
- IEnumerator<KeyValuePair<MessageQuery, TResult>> innerEnumerator;
- IEnumerator<MessageQueryCollection> outerEnumerator;
- public Enumerator(Enumerable<TSource, TResult> enumerable)
- {
- this.outerEnumerator = enumerable.table.collectionsByType.Values.GetEnumerator();
- this.enumerable = enumerable;
- }
- public KeyValuePair<MessageQuery, TResult> Current
- {
- get { return this.innerEnumerator.Current; }
- }
- object IEnumerator.Current
- {
- get
- {
- return this.Current;
- }
- }
- public void Dispose()
- {
- }
- public bool MoveNext()
- {
- if (innerEnumerator == null || !this.innerEnumerator.MoveNext())
- {
- if (!this.outerEnumerator.MoveNext())
- {
- return false;
- }
- else
- {
- MessageQueryCollection collection = this.outerEnumerator.Current;
- this.innerEnumerator = this.enumerable.GetInnerEnumerator(collection);
- return this.innerEnumerator.MoveNext();
- }
- }
- else
- {
- return true;
- }
- }
- public void Reset()
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new NotSupportedException());
- }
- }
- }
- class MessageBufferEnumerable<TResult> : Enumerable<MessageBuffer, TResult>
- {
- public MessageBufferEnumerable(MessageQueryTable<TItem> table, MessageBuffer buffer)
- : base(table, buffer)
- {
- }
- protected override IEnumerator<KeyValuePair<MessageQuery, TResult>> GetInnerEnumerator(
- MessageQueryCollection collection)
- {
- return collection.Evaluate<TResult>(this.Source).GetEnumerator();
- }
- }
- class MessageEnumerable<TResult> : Enumerable<Message, TResult>
- {
- public MessageEnumerable(MessageQueryTable<TItem> table, Message message)
- : base(table, message)
- {
- }
- protected override IEnumerator<KeyValuePair<MessageQuery, TResult>> GetInnerEnumerator(
- MessageQueryCollection collection)
- {
- return collection.Evaluate<TResult>(this.Source).GetEnumerator();
- }
- }
- }
- }
|