예제 #1
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");
            }
        }
예제 #2
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());
        }
        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);
        }
        private void PutLocalIP(EnvelopeBuilder builder)
        {
            var ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList
                .Where(address => address.AddressFamily == AddressFamily.InterNetwork)
                .FirstOrDefault();

            builder.AddString(ContextAttributes.ORIGINATING_MACHINE, ip==null ? "?" : ip.ToString());
        }
예제 #5
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()));
        }
예제 #6
0
        private void PutLocalIP(EnvelopeBuilder builder)
        {
            var ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList
                     .Where(address => address.AddressFamily == AddressFamily.InterNetwork)
                     .FirstOrDefault();

            builder.AddString(ContextAttributes.ORIGINATING_MACHINE, ip == null ? "?" : ip.ToString());
        }
예제 #7
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()));
        }
        private static void AddHeadersToEnvelope(Dictionary <string, object> headers, EnvelopeBuilder b)
        {
            if (headers == null)
            {
                return;
            }

            foreach (var header in headers)
            {
                b.AddString(header.Key, header.Value.ToString());
            }
        }
        public void Envelope_attributes_should_be_present()
        {
            var time = DateTime.UtcNow;
            var builder = new EnvelopeBuilder("my-id");
            builder.AddString("Custom", "1");

            var envelope = RoundtripViaSerializer(builder);

            Assert.AreEqual("1", envelope.GetAttribute("Custom"));
            Assert.GreaterOrEqual(envelope.CreatedOnUtc, time, "start time");
            var now = DateTime.UtcNow;
            Assert.LessOrEqual(envelope.CreatedOnUtc, now, "now");
        }
예제 #10
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()));
        }
예제 #11
0
        public void Envelope_attributes_should_be_present()
        {
            var time    = DateTime.UtcNow;
            var builder = new EnvelopeBuilder("my-id");

            builder.AddString("Custom", "1");


            var envelope = RoundtripViaSerializer(builder);

            Assert.AreEqual("1", envelope.GetAttribute("Custom"));
            Assert.GreaterOrEqual(envelope.CreatedOnUtc, time, "start time");
            var now = DateTime.UtcNow;

            Assert.LessOrEqual(envelope.CreatedOnUtc, now, "now");
        }
예제 #12
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());
            }
        }
예제 #13
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());
            }
        }
        private static void AddHeadersToEnvelope(Dictionary<string, object> headers, EnvelopeBuilder b)
        {
            if (headers == null)
                return;

            foreach (var header in headers)
            {
                b.AddString(header.Key, header.Value.ToString());
            }
        }
        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()));
        }