static IDisposable OperationLogic_SurroundOperation(IOperation operation, OperationLogEntity log, Entity?entity, object?[]?args) { if (entity != null && ShouldLog.Invoke(entity, operation)) { if (operation.OperationType == OperationType.Execute && !entity.IsNew && ((IEntityOperation)operation).CanBeModified) { entity = RetrieveFresh(entity); } using (CultureInfoUtils.ChangeBothCultures(Schema.Current.ForceCultureInfo)) { log.Mixin <DiffLogMixin>().InitialState = entity.Dump(); } } return(new Disposable(() => { var target = log.GetTemporalTarget(); if (target != null && ShouldLog.Invoke(target, operation) && operation.OperationType != OperationType.Delete) { using (CultureInfoUtils.ChangeBothCultures(Schema.Current.ForceCultureInfo)) { log.Mixin <DiffLogMixin>().FinalState = target.Dump(); } } })); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } using (EntityCache ec = new EntityCache()) { reader.Assert(JsonToken.StartObject); ModifiableEntity mod = GetEntity(reader, objectType, existingValue, serializer, out bool markedAsModified); var pr = GetCurrentPropertyRoute(mod); var dic = PropertyConverter.GetPropertyConverters(mod.GetType()); while (reader.TokenType == JsonToken.PropertyName) { if ((string)reader.Value == "mixins") { var entity = (Entity)mod; reader.Read(); reader.Assert(JsonToken.StartObject); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { var mixin = entity[(string)reader.Value]; reader.Read(); using (JsonSerializerExtensions.SetCurrentPropertyRoute(pr.Add(mixin.GetType()))) serializer.DeserializeValue(reader, mixin.GetType(), mixin); reader.Read(); } reader.Assert(JsonToken.EndObject); reader.Read(); } else { PropertyConverter pc = dic.GetOrThrow((string)reader.Value); reader.Read(); ReadJsonProperty(reader, serializer, mod, pc, pr, markedAsModified); reader.Read(); } } reader.Assert(JsonToken.EndObject); AfterDeserilization.Invoke(mod); return(mod); } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } using (EntityCache ec = new EntityCache()) { reader.Assert(JsonToken.StartObject); bool markedAsModified; ModifiableEntity mod = GetEntity(reader, objectType, existingValue, serializer, out markedAsModified); var pr = JsonSerializerExtensions.CurrentPropertyRoute; if (pr == null || mod is IRootEntity) { pr = PropertyRoute.Root(mod.GetType()); } else if (pr.Type.ElementType() == objectType) { pr = pr.Add("Item"); //Because we have a custom MListJsonConverter but not for other simpler collections } var dic = PropertyConverter.GetPropertyConverters(mod.GetType()); while (reader.TokenType == JsonToken.PropertyName) { if ((string)reader.Value == "mixins") { var entity = (Entity)mod; reader.Read(); reader.Assert(JsonToken.StartObject); reader.Read(); while (reader.TokenType == JsonToken.PropertyName) { var mixin = entity[(string)reader.Value]; reader.Read(); using (JsonSerializerExtensions.SetCurrentPropertyRoute(pr.Add(mixin.GetType()))) serializer.DeserializeValue(reader, mixin.GetType(), mixin); reader.Read(); } reader.Assert(JsonToken.EndObject); reader.Read(); } else { PropertyConverter pc = dic.GetOrThrow((string)reader.Value); reader.Read(); ReadJsonProperty(reader, serializer, mod, pc, pr, markedAsModified); reader.Read(); } } reader.Assert(JsonToken.EndObject); AfterDeserilization.Invoke(mod); return(mod); } }
public static ScheduledTaskLogEntity ExecuteSync(ITaskEntity task, ScheduledTaskEntity?scheduledTask, IUserEntity?user) { IUserEntity entityIUser = (user ?? (IUserEntity?)scheduledTask?.User.RetrieveAndRemember()) !; var isolation = entityIUser.TryIsolation(); if (isolation == null) { var ientity = task as IEntity; isolation = ientity?.TryIsolation(); } using (IsolationEntity.Override(isolation)) { ScheduledTaskLogEntity stl = new ScheduledTaskLogEntity { Task = task, ScheduledTask = scheduledTask, StartTime = TimeZoneManager.Now, MachineName = Environment.MachineName, ApplicationName = Schema.Current.ApplicationName, User = entityIUser.ToLite(), }; using (AuthLogic.Disable()) { using (Transaction tr = Transaction.ForceNew()) { stl.Save(); tr.Commit(); } } try { var ctx = new ScheduledTaskContext(stl); RunningTasks.TryAdd(stl, ctx); using (UserHolder.UserSession(entityIUser)) { using (Transaction tr = Transaction.ForceNew()) { stl.ProductEntity = ExecuteTask.Invoke(task, ctx); using (AuthLogic.Disable()) { stl.EndTime = TimeZoneManager.Now; stl.Remarks = ctx.StringBuilder.ToString(); stl.Save(); } tr.Commit(); } } } catch (Exception ex) { using (AuthLogic.Disable()) { if (Transaction.InTestTransaction) { throw; } var exLog = ex.LogException().ToLite(); using (Transaction tr = Transaction.ForceNew()) { stl.Exception = exLog; stl.EndTime = TimeZoneManager.Now; stl.Save(); tr.Commit(); } } throw; } finally { RunningTasks.TryRemove(stl, out var ctx); OnFinally?.Invoke(stl); } return(stl); } }