public BuildContext(IObjectSpace appObjectSpace, ObjectSpace snapObjectSpace, ReplicationNode targetNode, ActionWorker worker) { AppObjectSpace = appObjectSpace; SnapObjectSpace = snapObjectSpace; TargetNode = targetNode; Worker = worker; DoneObjects = new Queue <object>(); Map = new Dictionary <object, object>(); SnapSources = new Dictionary <IModelClass, IList <object> >(); }
public string LoadSnapshotPackage(LoadPackageContext context) { var result = string.Empty; XafDeltaModule.Instance.LoadService.BeginLoad(); try { using (var snapshotObjectSpace = new ObjectSpace(context.Package.UnitOfWork)) { // create root context var sourceMaps = snapshotObjectSpace.GetObjects <SnapshotOidMap>().OrderBy(x => x.OrdNo).ToList(); var rootContext = new SnapLoadContext(context, sourceMaps); context.Worker.ReportProgress(string.Format(Localizer.ObjectsFoundInSnapshot, sourceMaps.Count)); var i = 0; // restore all of object from snapshot foreach (var sourceMap in sourceMaps.TakeWhile(x => !context.Worker.CancellationPending)) { context.Worker.ReportPercent((double)i++ / (double)sourceMaps.Count); context.Worker.ShowStatus(string.Format(Localizer.SnapshotObject, sourceMap.Target.Target)); loadSnapshotObject(rootContext, sourceMap); } if (!context.Worker.CancellationPending) { // fix OidMap references var newMaps = from c in context.ObjectSpace.ModifiedObjects.Cast <object>() where c is OidMap && ((OidMap)c).NewObject != null select c as OidMap; context.ObjectSpace.CommitChanges(); newMaps.ToList().ForEach(x => x.FixReference()); snapshotPostLoad(context.ObjectSpace); restoreLastLoadedNum(context, snapshotObjectSpace); context.ObjectSpace.CommitChanges(); snapshotObjectSpace.Rollback(); } } } catch (Exception exception) { result = string.Format(Localizer.SnapshotLoadingIsFailed, exception.Message); context.Worker.ReportError(result); } XafDeltaModule.Instance.LoadService.EndLoad(); if (string.IsNullOrEmpty(result)) { if (context.Worker.CancellationPending) { result = Localizer.LoadingAborted; } context.Worker.ReportProgress(Color.Blue, Localizer.SnapshotLoadingIs, (context.Worker.CancellationPending ? Localizer.Aborted : Localizer.Finished)); } return(result); }
public bool BuildSnapshot(ActionWorker worker, ReplicationNode targetNode) { if (targetNode == null) { throw new ArgumentNullException("targetNode"); } if (targetNode.Session.IsNewObject(targetNode)) { throw new UnsavedTargetNodeException(); } if (targetNode.Disabled) { throw new DisabledTargetNodeException(); } var result = false; worker.ReportProgress(string.Format(Localizer.BuildingSnapshotForNode, targetNode.Name)); XafDeltaModule.Instance.LoadService.BeginLoad(); using (var appObjectSpace = XafDeltaModule.XafApp.CreateObjectSpace()) { targetNode = appObjectSpace.GetObjectByKey <ReplicationNode>(targetNode.Oid); Owner.DoBeforeBuildPackages(new BeforeBuildPackagesArgs(appObjectSpace)); var package = Owner.MessagingService.CreateOutputPackage(appObjectSpace, targetNode, PackageType.Snapshot); try { var doneObjectsCount = 0; using (var snapObjectSpace = new ObjectSpace(package.UnitOfWork)) { var rootContext = new BuildContext(appObjectSpace, snapObjectSpace, targetNode, worker); foreach (var modelClass in XafDeltaModule.XafApp.Model.BOModel.Where(x => !x.NonSnapshot()) .TakeWhile(x => !worker.CancellationPending)) { if (!modelClass.TypeInfo.IsAbstract && modelClass.TypeInfo.IsPersistent && (modelClass.TypeInfo.IsInterface || modelClass.TypeInfo.Implements <IXPObject>())) { doneObjectsCount += buildClassSnapshot(new ClassBuildContext(rootContext, modelClass)); } } if (doneObjectsCount > 0 && !worker.CancellationPending) { worker.ReportProgress(Localizer.CommitChanges); snapObjectSpace.CommitChanges(); //snapshotPostBuild(snapObjectSpace); snapObjectSpace.CommitChanges(); createSnapshotMaps(rootContext); worker.ReportProgress(Localizer.CommitChanges); snapObjectSpace.CommitChanges(); worker.ReportProgress(string.Format(Localizer.TotalObjectsSnapshoted, doneObjectsCount)); result = true; } else { snapObjectSpace.Rollback(); if (worker.CancellationPending) { worker.ReportProgress(Color.DarkMagenta, Localizer.Aborted); } else { worker.ReportProgress(Color.DarkMagenta, Localizer.NoObjectsFoundForSnapshot); } } } package.CloseUnitOfWork(doneObjectsCount > 0 && !worker.CancellationPending); result &= !worker.CancellationPending; if (result) { Owner.OnAfterBuildSnapshot(new AfterBuildSnapshotArgs(targetNode)); } } catch (Exception exception) { worker.ReportError(Localizer.SnapshotFailed, exception.Message); result = false; } // on success, commit changes to app database and package storage if (result) { package.CreateLogRecord(PackageEventType.Created); appObjectSpace.CommitChanges(); } } XafDeltaModule.Instance.LoadService.EndLoad(); if (result) { worker.ReportProgress(Color.Blue, Localizer.SnapshotBuildingIs, (worker.CancellationPending ? Localizer.Aborted : Localizer.Finished)); } return(result); }
public BuildContext(IObjectSpace appObjectSpace, ObjectSpace snapObjectSpace, ReplicationNode targetNode, ActionWorker worker) { AppObjectSpace = appObjectSpace; SnapObjectSpace = snapObjectSpace; TargetNode = targetNode; Worker = worker; DoneObjects = new Queue<object>(); Map = new Dictionary<object, object>(); SnapSources = new Dictionary<IModelClass, IList<object>>(); }
public bool BuildSnapshot(ActionWorker worker, ReplicationNode targetNode) { if (targetNode == null) throw new ArgumentNullException("targetNode"); if (targetNode.Session.IsNewObject(targetNode)) throw new UnsavedTargetNodeException(); if (targetNode.Disabled) throw new DisabledTargetNodeException(); var result = false; worker.ReportProgress(string.Format(Localizer.BuildingSnapshotForNode, targetNode.Name)); XafDeltaModule.Instance.LoadService.BeginLoad(); using (var appObjectSpace = XafDeltaModule.XafApp.CreateObjectSpace()) { targetNode = appObjectSpace.GetObjectByKey<ReplicationNode>(targetNode.Oid); Owner.DoBeforeBuildPackages(new BeforeBuildPackagesArgs(appObjectSpace)); var package = Owner.MessagingService.CreateOutputPackage(appObjectSpace, targetNode, PackageType.Snapshot); try { var doneObjectsCount = 0; using (var snapObjectSpace = new ObjectSpace(package.UnitOfWork)) { var rootContext = new BuildContext(appObjectSpace, snapObjectSpace, targetNode, worker); foreach (var modelClass in XafDeltaModule.XafApp.Model.BOModel.Where(x => !x.NonSnapshot()) .TakeWhile(x => !worker.CancellationPending)) { if (!modelClass.TypeInfo.IsAbstract && modelClass.TypeInfo.IsPersistent && (modelClass.TypeInfo.IsInterface || modelClass.TypeInfo.Implements<IXPObject>())) doneObjectsCount += buildClassSnapshot(new ClassBuildContext(rootContext, modelClass)); } if (doneObjectsCount > 0 && !worker.CancellationPending) { worker.ReportProgress(Localizer.CommitChanges); snapObjectSpace.CommitChanges(); //snapshotPostBuild(snapObjectSpace); snapObjectSpace.CommitChanges(); createSnapshotMaps(rootContext); worker.ReportProgress(Localizer.CommitChanges); snapObjectSpace.CommitChanges(); worker.ReportProgress(string.Format(Localizer.TotalObjectsSnapshoted, doneObjectsCount)); result = true; } else { snapObjectSpace.Rollback(); if (worker.CancellationPending) worker.ReportProgress(Color.DarkMagenta, Localizer.Aborted); else worker.ReportProgress(Color.DarkMagenta, Localizer.NoObjectsFoundForSnapshot); } } package.CloseUnitOfWork(doneObjectsCount > 0 && !worker.CancellationPending); result &= !worker.CancellationPending; if (result) Owner.OnAfterBuildSnapshot(new AfterBuildSnapshotArgs(targetNode)); } catch (Exception exception) { worker.ReportError(Localizer.SnapshotFailed, exception.Message); result = false; } // on success, commit changes to app database and package storage if (result) { package.CreateLogRecord(PackageEventType.Created); appObjectSpace.CommitChanges(); } } XafDeltaModule.Instance.LoadService.EndLoad(); if (result) { worker.ReportProgress(Color.Blue, Localizer.SnapshotBuildingIs, (worker.CancellationPending ? Localizer.Aborted : Localizer.Finished)); } return result; }
public string LoadSnapshotPackage(LoadPackageContext context) { var result = string.Empty; XafDeltaModule.Instance.LoadService.BeginLoad(); try { using (var snapshotObjectSpace = new ObjectSpace(context.Package.UnitOfWork)) { // create root context var sourceMaps = snapshotObjectSpace.GetObjects<SnapshotOidMap>().OrderBy(x => x.OrdNo).ToList(); var rootContext = new SnapLoadContext(context, sourceMaps); context.Worker.ReportProgress(string.Format(Localizer.ObjectsFoundInSnapshot, sourceMaps.Count)); var i = 0; // restore all of object from snapshot foreach (var sourceMap in sourceMaps.TakeWhile(x => !context.Worker.CancellationPending)) { context.Worker.ReportPercent((double) i++/(double) sourceMaps.Count); context.Worker.ShowStatus(string.Format(Localizer.SnapshotObject, sourceMap.Target.Target)); loadSnapshotObject(rootContext, sourceMap); } if (!context.Worker.CancellationPending) { // fix OidMap references var newMaps = from c in context.ObjectSpace.ModifiedObjects.Cast<object>() where c is OidMap && ((OidMap) c).NewObject != null select c as OidMap; context.ObjectSpace.CommitChanges(); newMaps.ToList().ForEach(x => x.FixReference()); snapshotPostLoad(context.ObjectSpace); restoreLastLoadedNum(context, snapshotObjectSpace); context.ObjectSpace.CommitChanges(); snapshotObjectSpace.Rollback(); } } } catch (Exception exception) { result = string.Format(Localizer.SnapshotLoadingIsFailed, exception.Message); context.Worker.ReportError(result); } XafDeltaModule.Instance.LoadService.EndLoad(); if (string.IsNullOrEmpty(result)) { if (context.Worker.CancellationPending) result = Localizer.LoadingAborted; context.Worker.ReportProgress(Color.Blue, Localizer.SnapshotLoadingIs, (context.Worker.CancellationPending ? Localizer.Aborted : Localizer.Finished)); } return result; }