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"); }
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())); }
public object ConvertTo(string value) { return(IdentityConvert.FromTransportable(value)); }
public string ConvertFrom(string tag, object value, bool allowNull) { return(tag + IdentityConvert.ToTransportable(value as Kolonist.Contracts.Identities.IIdentity)); }