Exemple #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");
            }
        }
        public Applied Load(ICollection <ICommand <IIdentity> > commands)
        {
            var id      = commands.First().Id;
            var stream  = _factory.GetOrCreateStream(IdentityConvert.ToStream(id));
            var records = stream.ReadRecords(0, int.MaxValue).ToList();
            var events  = records
                          .SelectMany(r => _streamer.ReadAsEnvelopeData(r.Data).Items.Select(m => (IEvent <IIdentity>)m.Content))
                          .ToArray();

            var then = new Applied();

            if (records.Count > 0)
            {
                then.Version = records.Last().Version;
            }

            var recipeId = id as RecipeId;

            if (recipeId != null)
            {
                var state = new RecipeAggregateState(events);
                var agg   = new RecipeAggregate(state, then.Events.Add);
                ExecuteSafely(agg, commands);
                return(then);
            }

            throw new NotSupportedException("identity not supported " + id);
        }
 public string GetNameForEntity(Type entity, object key)
 {
     if (key is unit)
     {
         return(entity.Name.ToLowerInvariant() + ".txt");
     }
     if (key is IIdentity)
     {
         return(IdentityConvert.ToStream((IIdentity)key) + ".txt");
     }
     return(key.ToString().ToLowerInvariant() + ".txt");
 }
Exemple #4
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 #5
0
 public object ConvertTo(string value)
 {
     return(IdentityConvert.FromTransportable(value));
 }
Exemple #6
0
 public string ConvertFrom(string tag, object value, bool allowNull)
 {
     return(tag + IdentityConvert.ToTransportable(value as Kolonist.Contracts.Identities.IIdentity));
 }