/// <summary> /// Loads pending packages. /// </summary> /// <param name="worker">The worker.</param> public bool Load(ActionWorker worker) { if (IsLoading) { return(false); } bool loadResult; Owner.DoBeforeLoad(new LoadEventArgs(worker)); worker.ReportProgress(Localizer.LoadingStarted); Interlocked.Increment(ref loadNesting); try { using (var applicationObjectSpace = XafDeltaModule.XafApp.CreateObjectSpace()) { var currentNodeId = ReplicationNode.GetCurrentNodeId(applicationObjectSpace); // select pending input packages var inputPackages = applicationObjectSpace.GetObjects <Package>(CriteriaOperator.Parse( "ApplicationName = ? And (RecipientNodeId = ? Or RecipientNodeId = ?) " + "And (SenderNodeId <> ?)", Owner.ApplicationName, currentNodeId, ReplicationNode.AllNodes, Owner.CurrentNodeId)). Where(x => x.LoadedDateTime == DateTime.MinValue).ToList(); worker.ReportProgress(string.Format(Localizer.PackagesSelectedForLoading, inputPackages.Count)); // load each package until cancellation or error occured loadResult = true; foreach (var inputPackage in inputPackages.OrderBy(x => x.PackageDateTime).TakeWhile(z => !worker.CancellationPending)) { // loadResult &= LoadPackage(new LoadPackageContext(inputReplica,worker, applicationObjectSpace, currentNodeId)); loadResult &= LoadPackage(worker, inputPackage); if (!loadResult) { break; } } applicationObjectSpace.CommitChanges(); } } finally { Interlocked.Decrement(ref loadNesting); worker.ReportProgress(Color.Blue, Localizer.LoadingIsFinished); } Owner.DoAfterLoad(new LoadEventArgs(worker)); return(loadResult); }
/// <summary> /// Loads the package. /// </summary> /// <param name="worker">The worker.</param> /// <param name="package">The package.</param> public bool LoadPackage(ActionWorker worker, Package package) { bool result; Interlocked.Increment(ref loadNesting); try { using (var applicationObjectSpace = XafDeltaModule.XafApp.CreateObjectSpace()) { var currentNodeId = ReplicationNode.GetCurrentNodeId(applicationObjectSpace); result = LoadPackage(new LoadPackageContext(package, worker, applicationObjectSpace, currentNodeId)); applicationObjectSpace.CommitChanges(); } var packageObjectSpace = ObjectSpace.FindObjectSpaceByObject(package); packageObjectSpace.CommitChanges(); } finally { Interlocked.Decrement(ref loadNesting); } return(result); }