Mercurial > silverbladetech
diff Workflow/Client/MainWindow.xaml.cs @ 89:3c67e54e3a17
Working version
author | stevenhollidge <stevenhollidge@hotmail.com> |
---|---|
date | Mon, 30 Apr 2012 10:45:32 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Workflow/Client/MainWindow.xaml.cs Mon Apr 30 10:45:32 2012 +0100 @@ -0,0 +1,209 @@ +using System; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Media.Animation; +using System.Windows.Threading; +using Burrow; +using Burrow.Extras; +using Client.Controls; +using Client.Messages; + +namespace Client +{ + public partial class MainWindow + { + private const string QUEUE_CONNECTION_STRING = "host=localhost;username=guest;password=guest"; + private readonly ITunnel tunnel; + private readonly Subscription subscriptionOrder; + private readonly Subscription subscriptionPayment; + private readonly Subscription subscriptionDelivery; + private readonly Subscription subscriptionError; + private readonly Guid orderId; + private const string ORDER_ROUTING_KEY = "Order"; + private const string PAYMENT_ROUTING_KEY = "Payment"; + private const string DELIVERY_ROUTING_KEY = "Delivery"; + private const string ORDER_STORYBOARD_KEY = "OrderStoryboard"; + private const string PAYMENT_STORYBOARD_KEY = "PaymentStoryboard"; + private const string DELIVERY_STORYBOARD_KEY = "DeliveryStoryboard"; + private const string FADEINGIFT_STORYBOARD_KEY = "FadeInGiftStoryboard"; + private readonly Storyboard orderStoryboard; + private readonly Storyboard paymentStoryboard; + private readonly Storyboard deliveryStoryboard; + private readonly Storyboard fadeInGiftStoryboard; + + public MainWindow() + { + InitializeComponent(); + + // set up rabbitmq tunnel + tunnel = RabbitTunnel.Factory.Create(QUEUE_CONNECTION_STRING); + tunnel.SetSerializer(new JsonSerializer()); + + // set up a subscription to each message type + subscriptionOrder = tunnel.SubscribeAsync<OrderMessage>("Workflow", + (message, args) => Dispatcher.BeginInvoke(new Action(() => OnOrderReceived(message, args)))); + + subscriptionPayment = tunnel.SubscribeAsync<PaymentMessage>("Workflow", + (message, args) => Dispatcher.BeginInvoke(new Action(() => OnPaymentReceived(message, args)))); + + subscriptionDelivery = tunnel.SubscribeAsync<DeliveryMessage>("Workflow", + (message, args) => Dispatcher.BeginInvoke(new Action(() => OnDeliveryReceived(message, args)))); + + //subscriptionError = tunnel.SubscribeAsync<?????>("Workflow", + // (message, args) => Dispatcher.BeginInvoke(new Action(() => OnErrorReceived(message, args)))); + + // make sure all storyboards are available + orderStoryboard = (Storyboard)this.TryFindResource(ORDER_STORYBOARD_KEY); + paymentStoryboard = (Storyboard)this.TryFindResource(PAYMENT_STORYBOARD_KEY); + deliveryStoryboard = (Storyboard)this.TryFindResource(DELIVERY_STORYBOARD_KEY); + fadeInGiftStoryboard = (Storyboard)this.TryFindResource(FADEINGIFT_STORYBOARD_KEY); + if (orderStoryboard == null) throw new ResourceReferenceKeyNotFoundException("Cannot find OrderStoryboard resource", ORDER_STORYBOARD_KEY); + if (paymentStoryboard == null) throw new ResourceReferenceKeyNotFoundException("Cannot find PaymentStoryboard resource", PAYMENT_STORYBOARD_KEY); + if (deliveryStoryboard == null) throw new ResourceReferenceKeyNotFoundException("Cannot find DeliveryStoryboard resource", DELIVERY_STORYBOARD_KEY); + if (fadeInGiftStoryboard == null) throw new ResourceReferenceKeyNotFoundException("Cannot find FadeInGiftStoryboard resource", FADEINGIFT_STORYBOARD_KEY); + + // create an orderid for the workflow + orderId = Guid.NewGuid(); + } + + private void NotifyUI(UIMessage ctrl, MessageType messageType, string text) + { + Dispatcher.BeginInvoke(new Action(() => + { + ctrl.MessageType = messageType; + ctrl.Text = text; + ctrl.Show(); + })); + } + + #region EventHandlers + + private void btnSubmit_Click(object sender, RoutedEventArgs e) + { + try + { + orderStoryboard.Begin(); + NotifyUI(NotificationRight, MessageType.Success, "Order submitted"); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + } + + private void OnOrderStoryboardCompleted(object sender, EventArgs e) + { + try + { + tunnel.Publish(new OrderMessage + { + OrderId = orderId, + OrderDate = DateTime.Now, + ProductCode = "ABCDE", + Quantity = 10, + UnitPrice = 9.99m + }, ORDER_ROUTING_KEY); + + NotifyUI(NotificationLeft, MessageType.Success, "Order published"); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + } + + private void OnOrderReceived(OrderMessage order, MessageDeliverEventArgs args) + { + try + { + NotifyUI(NotificationRight, MessageType.Success, "Order received"); + paymentStoryboard.Begin(); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + finally + { + if (subscriptionOrder != null) subscriptionOrder.Ack(args.DeliveryTag); + } + } + + private void OnPaymentStoryboardCompleted(object sender, EventArgs e) + { + try + { + tunnel.Publish(new PaymentMessage() + { + OrderId = orderId, + IsConfirmed = true + }, PAYMENT_ROUTING_KEY); + + NotifyUI(NotificationLeft, MessageType.Success, "Payment published"); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + } + + private void OnPaymentReceived(PaymentMessage payment, MessageDeliverEventArgs args) + { + try + { + NotifyUI(NotificationRight, MessageType.Success, "Payment received"); + deliveryStoryboard.Begin(); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + finally + { + if (subscriptionPayment != null) subscriptionPayment.Ack(args.DeliveryTag); + } + } + + private void OnDeliveryStoryboardCompleted(object sender, EventArgs e) + { + try + { + tunnel.Publish(new DeliveryMessage() + { + OrderId = orderId, + Address = "123 Some Street, Somewhere" + }, DELIVERY_ROUTING_KEY); + + NotifyUI(NotificationLeft, MessageType.Success, "Delivery published"); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + } + + private void OnDeliveryReceived(DeliveryMessage delivery, MessageDeliverEventArgs args) + { + try + { + NotifyUI(NotificationRight, MessageType.Success, "Delivery received"); + fadeInGiftStoryboard.Begin(); + } + catch (Exception ex) + { + NotifyUI(NotificationRight, MessageType.Error, ex.Message); + } + finally + { + if (subscriptionDelivery != null) subscriptionDelivery.Ack(args.DeliveryTag); + } + } + + #endregion + + private void Window_Closed(object sender, EventArgs e) + { + Application.Current.Shutdown(); + } + } +} \ No newline at end of file