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 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);
        }
Exemplo n.º 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");
            }
        }
Exemplo n.º 4
0
        public static ImmutableEnvelope BuildEnvelope(this IMessage message)
        {
            var eb = new EnvelopeBuilder(Guid.NewGuid().ToString());
            eb.AddItem((object) message);

            return eb.Build();
        }
Exemplo n.º 5
0
        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()));
        }
Exemplo n.º 6
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());
 }
Exemplo n.º 7
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()));
        }
Exemplo n.º 8
0
        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 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);
        }
Exemplo n.º 10
0
        void Dispatch(string id, IEnumerable<ICommand> commands)
        {
            var stream = _factory.GetOrCreateStream(id);

            var records = stream.ReadRecords(0, int.MaxValue).ToList();
            var events = records
                .Select(tr => _streamer.ReadAsEnvelopeData(tr.Data))
                .SelectMany(i => i.Items)
                .Select(i => (IEvent)i.Content)
                .ToList();

            var then = AggregateFactory
                .LoadProject(events, commands)
                .Select(e => new MessageBuilder(e.GetType(), e)).ToList();

            if (then.Count == 0)
                return;

            // events are stored here as envelopes )
            var b = new EnvelopeBuilder("unknown");
            foreach (var e in then)
            {
                b.Items.Add(e);
            }

            var version = records.Count == 0 ? 0 : records.Last().Version;

            var data = _streamer.SaveEnvelopeData(b.Build());
            var result = stream.TryAppend( data, TapeAppendCondition.VersionIs(version));
            if (!result)
                throw new InvalidOperationException(
                    "Data was modified concurrently, and we don't have merging implemented, yet");

            var args = _path.Split(':');
            IQueueWriterFactory factory;
            if (!_queue.TryGet(args[0], out factory))
                throw new InvalidOperationException("Not found " + _path);

            var arVersion = events.Count + 1;
            var arName = id;
            for (int i = 0; i < then.Count; i++)
            {
                var name = string.Format("{0}/{1}/{2}", arName, arVersion, i);
                var builder = new EnvelopeBuilder(name);

                builder.Items.Add(then[i]);
                builder.AddString("from-entity", arName);

                factory.GetWriteQueue(args[1]).PutMessage(builder.Build());
            }
        }
Exemplo n.º 11
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()));
        }
Exemplo n.º 12
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());
        }
Exemplo n.º 13
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()));
        }
Exemplo n.º 14
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());
            }
        }
Exemplo n.º 15
0
        public override void Handle(IHttpContext context)
        {
            var msg = new EnvelopeBuilder(Guid.NewGuid().ToString());

            var contract = context.GetRequestUrl().Remove(0,"/send/".Length);
            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;
            }

            _writer.PutMessage(_streamer.SaveEnvelopeData(msg.Build()));
            context.WriteString(string.Format(@"
            Normally this should be a JSON POST, containing serialized data for {0}
            but let's pretend that you successfully sent a message. Or routed it", contractType));

            context.SetStatusTo(HttpStatusCode.OK);
        }
        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);
        }
        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);
        }
        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);
        }
Exemplo n.º 19
0
        public override void Handle(IHttpContext context)
        {
            var msg = new EnvelopeBuilder(Guid.NewGuid().ToString());

            var  contract = context.GetRequestUrl().Remove(0, "/send/".Length);
            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;
            }

            _writer.PutMessage(_streamer.SaveEnvelopeData(msg.Build()));
            context.WriteString(string.Format(@"
Normally this should be a JSON POST, containing serialized data for {0}
but let's pretend that you successfully sent a message. Or routed it", contractType));


            context.SetStatusTo(HttpStatusCode.OK);
        }
        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);
            }
        }
Exemplo n.º 21
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()));
        }
Exemplo n.º 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);
        }
Exemplo n.º 23
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()));
        }
Exemplo n.º 24
0
 protected override ImmutableEnvelope RoundtripViaSerializer(EnvelopeBuilder builder)
 {
     var bytes = _streamer.SaveEnvelopeData(builder.Build());
     return _streamer.ReadAsEnvelopeData(bytes);
 }
Exemplo n.º 25
0
        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);
        }
Exemplo n.º 26
0
 protected override ImmutableEnvelope RoundtripViaSerializer(EnvelopeBuilder builder)
 {
     return builder.Build();
 }
Exemplo n.º 27
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();
            }
        }
        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()));
        }
Exemplo n.º 29
0
        void Dispatch(string id, IEnumerable <ICommand> commands)
        {
            var stream = _factory.GetOrCreateStream(id);

            var records = stream.ReadRecords(0, int.MaxValue).ToList();
            var events  = records
                          .Select(tr => _streamer.ReadAsEnvelopeData(tr.Data))
                          .SelectMany(i => i.Items)
                          .Select(i => (IEvent)i.Content)
                          .ToList();

            var then = AggregateFactory
                       .LoadProject(events, commands)
                       .Select(e => new MessageBuilder(e.GetType(), e)).ToList();

            if (then.Count == 0)
            {
                return;
            }


            // events are stored here as envelopes )
            var b = new EnvelopeBuilder("unknown");

            foreach (var e in then)
            {
                b.Items.Add(e);
            }

            var version = records.Count == 0 ? 0 : records.Last().Version;

            var data   = _streamer.SaveEnvelopeData(b.Build());
            var result = stream.TryAppend(data, TapeAppendCondition.VersionIs(version));

            if (!result)
            {
                throw new InvalidOperationException(
                          "Data was modified concurrently, and we don't have merging implemented, yet");
            }

            var args = _path.Split(':');
            IQueueWriterFactory factory;

            if (!_queue.TryGet(args[0], out factory))
            {
                throw new InvalidOperationException("Not found " + _path);
            }


            var arVersion = events.Count + 1;
            var arName    = id;

            for (int i = 0; i < then.Count; i++)
            {
                var name    = string.Format("{0}/{1}/{2}", arName, arVersion, i);
                var builder = new EnvelopeBuilder(name);


                builder.Items.Add(then[i]);
                builder.AddString("from-entity", arName);

                factory.GetWriteQueue(args[1]).PutMessage(builder.Build());
            }
        }