public void command_sender_should_send_envelope()
        {
            // arrange
            var builder = new EnvelopeBuilder("env");
            builder.AddItem(new CreateAccount(Identifier));
            builder.AddItem(new CreateAccount(Identifier));
            builder.AddItem(new CreateAccount(Identifier));

            // act
            Sender.SendEnvelope(builder.Build());

            // assert
        }
        public static ImmutableEnvelope BuildEnvelope(this IMessage message)
        {
            var eb = new EnvelopeBuilder(Guid.NewGuid().ToString());
            eb.AddItem((object) message);

            return eb.Build();
        }
Exemple #3
0
        void AppendToStream(IIdentity id, string envelopeId, Applied then, string explanation)
        {
            var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id));
            var b      = new EnvelopeBuilder("unknown");

            b.AddString("caused-by", envelopeId);

            if (!String.IsNullOrEmpty(explanation))
            {
                b.AddString("explain", explanation);
            }
            foreach (var e in then.Events)
            {
                b.AddItem((object)e);
            }
            var data = _streamer.SaveEnvelopeData(b.Build());

            Context.Debug("?? Append {0} at v{3} to '{1}' in thread {2}", then.Events.Count,
                          IdentityConvert.ToStream(id),
                          Thread.CurrentThread.ManagedThreadId,
                          then.Version);

            if (!stream.TryAppend(data, TapeAppendCondition.VersionIs(then.Version)))
            {
                throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently");
            }
        }
        public void AppendToStream(IIdentity id, long originalVersion, ICollection<IEvent<IIdentity>> events,
            string explanation)
        {
            if (events.Count == 0)
                return;
            var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id));
            var b = new EnvelopeBuilder("unknown");

            if (!String.IsNullOrEmpty(explanation))
            {
                b.AddString("explain", explanation);
            }
            foreach (var e in events)
            {
                b.AddItem((object)e);
            }
            var data = _streamer.SaveEnvelopeData(b.Build());

            var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(originalVersion));
            if (result == 0)
            {
                throw new InvalidOperationException("Failed to update the stream - it has been changed concurrently");
            }

            PublishDomainSuccess(id, events, originalVersion);
        }
        void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems)
        {
            if (messageItems.Length == 0)
                return;

            var id = _idGenerator();

            var builder = new EnvelopeBuilder(id);
            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }

            configure(builder);
            var envelope = builder.Build();

            var queue = GetOutboundQueue();

            if (Transaction.Current == null)
            {
                queue.PutMessage(envelope);
                _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, false,
                    envelope.Items.Select(x => x.MappedType.Name).ToArray()));
            }
            else
            {
                var action = new CommitActionEnlistment(() =>
                    {
                        queue.PutMessage(envelope);
                        _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, true,
                            envelope.Items.Select(x => x.MappedType.Name).ToArray()));
                    });
                Transaction.Current.EnlistVolatile(action, EnlistmentOptions.None);
            }
        }
        public void Test()
        {
            var b = new EnvelopeBuilder("GUID");
            b.DelayBy(TimeSpan.FromSeconds(10));
            b.AddString("Test");
            b.AddItem(new { Cool = "1"}).AddAttribute("D2","D1");

            Console.WriteLine(b.Build().PrintToString(o => o.Dump()));
        }
        public void Payload_should_be_serialized()
        {
            var builder = new EnvelopeBuilder("my-id");
            builder.AddItem(new MyMessage("42"));

            var envelope = RoundtripViaSerializer(builder);

            Assert.AreEqual(1, envelope.Items.Length);
            Assert.AreEqual("42", ((MyMessage)envelope.Items[0].Content).Value);
        }
 public static byte[] SaveEnvelopeData(this IEnvelopeStreamer streamer, object message, Action<EnvelopeBuilder> build = null)
 {
     var builder = new EnvelopeBuilder(Guid.NewGuid().ToString());
     builder.AddItem(message);
     if (null != build)
     {
         build(builder);
     }
     return streamer.SaveEnvelopeData(builder.Build());
 }
Exemple #9
0
        public void Payload_should_be_serialized()
        {
            var builder = new EnvelopeBuilder("my-id");

            builder.AddItem(new MyMessage("42"));

            var envelope = RoundtripViaSerializer(builder);

            Assert.AreEqual(1, envelope.Items.Length);
            Assert.AreEqual("42", ((MyMessage)envelope.Items[0].Content).Value);
        }
Exemple #10
0
        public static byte[] SaveEnvelopeData(this IEnvelopeStreamer streamer, object message,
                                              Action <EnvelopeBuilder> build = null)
        {
            var builder = new EnvelopeBuilder(Guid.NewGuid().ToString());

            builder.AddItem(message);
            if (null != build)
            {
                build(builder);
            }
            return(streamer.SaveEnvelopeData(builder.Build()));
        }
        public void DispatchCommand(object command, Action<EnvelopeBuilder> builder = null)
        {
            var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString());
            envelopeBuilder.AddItem(command);
            if (builder != null) builder(envelopeBuilder);
            var envelope = envelopeBuilder.Build();

            var data = _serializer.SaveEnvelopeData(envelope);
            if (!_tapeStream.TryAppend(data))
                throw new InvalidOperationException("Failed to record domain log");

            _aggregateFactory.Dispatch(envelope);
        }
Exemple #12
0
        void PublishEvents(IIdentity id, Applied then)
        {
            var arVersion = then.Version + 1;
            var arName    = IdentityConvert.ToTransportable(id);
            var name      = String.Format("{0}-{1}", arName, arVersion);
            var builder   = new EnvelopeBuilder(name);

            builder.AddString("entity", arName);

            foreach (var @event in then.Events)
            {
                builder.AddItem((object)@event);
            }
            _writer.PutMessage(_streamer.SaveEnvelopeData(builder.Build()));
        }
Exemple #13
0
        private void SendMessage(object command, string optionalID = null)
        {
            var auth = FormsAuth.GetSessionIdentityFromRequest();
            var envelopeId = optionalID ?? Guid.NewGuid().ToString().ToLowerInvariant();
            var eb = new EnvelopeBuilder(envelopeId);

            if (auth.HasValue)
            {
                eb.AddString("web-user", auth.Value.User.Identifier.ToString(CultureInfo.InvariantCulture));
                eb.AddString("web-token", auth.Value.Token);
            }
            eb.AddItem(command);

            m_queueWriter.PutMessage(eb.Build());
        }
Exemple #14
0
        void SendMessage(object command, string optionalId)
        {
            var auth = FormsAuth.GetSessionIdentityFromRequest();


            var envelopeId = optionalId ?? Guid.NewGuid().ToString().ToLowerInvariant();
            var eb         = new EnvelopeBuilder(envelopeId);

            if (auth.HasValue)
            {
                eb.AddString("web-user", auth.Value.User.Id.ToString(CultureInfo.InvariantCulture));
                eb.AddString("web-token", auth.Value.Token);
            }
            eb.AddItem(command);

            _writer.PutMessage(_streamer.SaveEnvelopeData(eb.Build()));
        }
        public void DispatchCommand(object command, Action <EnvelopeBuilder> builder = null)
        {
            var envelopeBuilder = new EnvelopeBuilder(Guid.NewGuid().ToString());

            envelopeBuilder.AddItem(command);
            if (builder != null)
            {
                builder(envelopeBuilder);
            }
            var envelope = envelopeBuilder.Build();

            var data = _serializer.SaveEnvelopeData(envelope);

            if (!_tapeStream.TryAppend(data))
            {
                throw new InvalidOperationException("Failed to record domain log");
            }

            _aggregateFactory.Dispatch(envelope);
        }
Exemple #16
0
        string HashContents(Action <EnvelopeBuilder> configure, object[] messageItems)
        {
            var builder = new EnvelopeBuilder("hash");

            builder.OverrideCreatedOnUtc(DateTime.MinValue);

            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }
            configure(builder);
            var envelope = builder.Build();
            var data     = _streamer.SaveEnvelopeData(envelope);

            using (var sha1 = new SHA1Managed())
            {
                var hash = sha1.ComputeHash(data);
                return(BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant());
            }
        }
        public override void Handle(IHttpContext context)
        {
            var contract = context.GetRequestUrl().Remove(0, "/mouseevents/".Length);

            var envelopeBuilder = new EnvelopeBuilder(contract + " - " + DateTime.Now.Ticks.ToString());

            Type contractType;
            if (!_serializer.TryGetContractTypeByName(contract, out contractType))
            {
                context.WriteString(string.Format("Trying to post command with unknown contract '{0}'.", contract));
                context.SetStatusTo(HttpStatusCode.BadRequest);
                return;
            }

            var decodedData = HttpUtility.UrlDecode(context.Request.QueryString.ToString());
            var mouseEvent = JsonSerializer.DeserializeFromString(decodedData, contractType);

            envelopeBuilder.AddItem(mouseEvent);
            _writer.PutMessage(_streamer.SaveEnvelopeData(envelopeBuilder.Build()));

            context.SetStatusTo(HttpStatusCode.OK);
        }
        public void AppendToStream(IIdentity id, long originalVersion, ICollection<IEvent> events)
        {
            if (events.Count == 0)
                return;
            var stream = _factory.GetOrCreateStream(IdentityConvert.ToStream(id));
            var b = new EnvelopeBuilder("unknown");

            foreach (var e in events)
            {
                b.AddItem((object)e);
            }
            var data = _streamer.SaveEnvelopeData(b.Build());

            var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(originalVersion));
            if (result == 0)
            {
                // this is temporary implementation
                throw OptimisticConcurrencyException.Create(-1, originalVersion, id, null);
            }

            PublishDomainSuccess(id, events, originalVersion);
        }
        void InnerSendBatch(Action <EnvelopeBuilder> configure, object[] messageItems)
        {
            if (messageItems.Length == 0)
            {
                return;
            }

            var id = _idGenerator();

            var builder = new EnvelopeBuilder(id);

            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }

            configure(builder);
            var envelope = builder.Build();

            var queue = GetOutboundQueue();

            if (Transaction.Current == null)
            {
                queue.PutMessage(envelope);
                _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, false,
                                                  envelope.Items.Select(x => x.MappedType.Name).ToArray()));
            }
            else
            {
                var action = new CommitActionEnlistment(() =>
                {
                    queue.PutMessage(envelope);
                    _observer.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId, true,
                                                      envelope.Items.Select(x => x.MappedType.Name).ToArray()));
                });
                Transaction.Current.EnlistVolatile(action, EnlistmentOptions.None);
            }
        }
Exemple #20
0
        void InnerSendBatch(Action <EnvelopeBuilder> configure, object[] messageItems,
                            IdGeneration id = IdGeneration.Default)
        {
            string envelopeId;

            switch (id)
            {
            case IdGeneration.Default:
                envelopeId = _idGenerator();
                break;

            case IdGeneration.HashContent:
                envelopeId = HashContents(configure, messageItems);
                break;

            default:
                throw new ArgumentOutOfRangeException("id");
            }

            var builder = new EnvelopeBuilder(envelopeId);

            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }
            configure(builder);
            var envelope = builder.Build();


            var data = _streamer.SaveEnvelopeData(envelope);

            var queue = GetOutboundQueue();

            queue.PutMessage(data);

            SystemObserver.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId,
                                                   envelope.Items.Select(x => x.MappedType.Name).ToArray(), envelope.GetAllAttributes()));
        }
Exemple #21
0
        public void Multiple_payloads_are_handled_in_sequence()
        {
            var builder = new EnvelopeBuilder("my-id");

            for (int i = 0; i < 5; i++)
            {
                var content = new string('*', i);
                var added   = builder.AddItem(new MyMessage(content));

                added.AddAttribute("hum", i.ToString());
            }

            var envelope = RoundtripViaSerializer(builder);

            Assert.AreEqual(5, envelope.Items.Length);

            for (int i = 0; i < 5; i++)
            {
                var messageItem = envelope.Items[i];
                Assert.AreEqual(new string('*', i), ((MyMessage)messageItem.Content).Value);
                Assert.AreEqual(i.ToString(), messageItem.GetAttribute("hum", ""));
            }
        }
Exemple #22
0
        public override void Handle(IHttpContext context)
        {
            var contract = context.GetRequestUrl().Remove(0, "/mouseevents/".Length);

            var envelopeBuilder = new EnvelopeBuilder(contract + " - " + DateTime.Now.Ticks.ToString());

            Type contractType;

            if (!_serializer.TryGetContractTypeByName(contract, out contractType))
            {
                context.WriteString(string.Format("Trying to post command with unknown contract '{0}'.", contract));
                context.SetStatusTo(HttpStatusCode.BadRequest);
                return;
            }

            var decodedData = HttpUtility.UrlDecode(context.Request.QueryString.ToString());
            var mouseEvent  = JsonSerializer.DeserializeFromString(decodedData, contractType);

            envelopeBuilder.AddItem(mouseEvent);
            _writer.PutMessage(_streamer.SaveEnvelopeData(envelopeBuilder.Build()));

            context.SetStatusTo(HttpStatusCode.OK);
        }
        public void Multiple_payloads_are_handled_in_sequence()
        {
            var builder = new EnvelopeBuilder("my-id");

            for (int i = 0; i < 5; i++)
            {
                var content = new string('*',i);
                var added = builder.AddItem(new MyMessage(content));

                added.AddAttribute("hum", i.ToString());
            }

            var envelope = RoundtripViaSerializer(builder);

            Assert.AreEqual(5, envelope.Items.Length);

            for (int i = 0; i < 5; i++)
            {
                var messageItem = envelope.Items[i];
                Assert.AreEqual(new string('*', i), ((MyMessage)messageItem.Content).Value);
                Assert.AreEqual(i.ToString(), messageItem.GetAttribute("hum", ""));
            }
        }
        void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems)
        {
            var id = _idGenerator();

            var builder = new EnvelopeBuilder(id);
            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }

            configure(builder);
            var envelope = builder.Build();

            SendEnvelope(envelope);
        }
        string HashContents(Action<EnvelopeBuilder> configure, object[] messageItems)
        {
            var builder = new EnvelopeBuilder("hash");
            builder.OverrideCreatedOnUtc(DateTime.MinValue);

            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }
            configure(builder);
            var envelope = builder.Build();
            var data = _streamer.SaveEnvelopeData(envelope);
            using (var sha1 = new SHA1Managed())
            {
                var hash = sha1.ComputeHash(data);
                return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
            }
        }
        void InnerSendBatch(Action<EnvelopeBuilder> configure, object[] messageItems,
            IdGeneration id = IdGeneration.Default)
        {
            string envelopeId;

            switch (id)
            {
                case IdGeneration.Default:
                    envelopeId = _idGenerator();
                    break;
                case IdGeneration.HashContent:
                    envelopeId = HashContents(configure, messageItems);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("id");
            }

            var builder = new EnvelopeBuilder(envelopeId);
            foreach (var item in messageItems)
            {
                builder.AddItem(item);
            }
            configure(builder);
            var envelope = builder.Build();

            var data = _streamer.SaveEnvelopeData(envelope);

            var queue = GetOutboundQueue();
            queue.PutMessage(data);

            SystemObserver.Notify(new EnvelopeSent(queue.Name, envelope.EnvelopeId,
                envelope.Items.Select(x => x.MappedType.Name).ToArray(), envelope.GetAllAttributes()));
        }
        void PublishDomainSuccess(IIdentity id, IEnumerable<IEvent> events, long version)
        {
            var arVersion = version + 1;
            var arName = IdentityConvert.ToTransportable(id);
            var name = String.Format("{0}-{1}", arName, arVersion);
            var builder = new EnvelopeBuilder(name);
            builder.AddString("entity", arName);

            foreach (var @event in events)
            {
                builder.AddItem((object)@event);
            }

            _writer.PutMessage(_streamer.SaveEnvelopeData(builder.Build()));
        }