Exemple #1
0
 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> >();
 }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
 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>>();
 }
Exemple #5
0
        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;
        }
Exemple #6
0
        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;
        }