using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Wayne.Lib.MessageBus
{
///
/// A very basic, fully synchronous bus implementation. The publish method
/// will execute all subscribe actions.
///
public class BasicBus : IBus
{
readonly object subscriptionsLock = new object();
readonly List subscriptions = new List();
public void Publish(string topic, object message)
{
SubscriptionBase[] iterationSubscriptions;
lock (subscriptionsLock)
{
iterationSubscriptions = subscriptions.ToArray();
}
iterationSubscriptions
.Where(x => x.TopicFilter.IsMatch(topic))
.Where(x => x.Type.IsInstanceOfType(message))
.ForEach(x =>
{
x.Invoke(topic, message);
});
}
public IDisposable Subscribe(string topicFilter, Action action)
{
var subscription = new Subscription()
{
TopicFilter = new Regex("^" + topicFilter.Replace("*", "[^/]*") + "$"),
InvokeAction = action
};
lock (subscriptionsLock)
{
subscriptions.Add(subscription);
}
return new ActionDisposable(() =>
{
lock (subscriptionsLock)
{
subscriptions.Remove(subscription);
}
});
}
}
}