Ejemplo n.º 1
0
        private async Task UpdateAssetsFromSource(IEnumerable <AssetViewModel> assets)
        {
            var logger       = new LoggerResult();
            var workProgress = new WorkProgressViewModel(ServiceProvider, logger)
            {
                Title           = "Update assets from source",
                KeepOpen        = KeepOpen.OnWarningsOrErrors,
                IsIndeterminate = true,
                IsCancellable   = false,
            };

            workProgress.RegisterProgressStatus(logger, true);

            workProgress.ServiceProvider.Get <IEditorDialogService>().ShowProgressWindow(workProgress, 500);
            var undoRedo = ServiceProvider.Get <IUndoRedoService>();

            using (var transaction = undoRedo.CreateTransaction())
            {
                var tasks = new List <Task>();
                foreach (var asset in assets)
                {
                    logger.Verbose($"Updating {asset.Url}...");
                    var task = asset.Sources.UpdateAssetFromSource(logger);
                    // Continuation might swallow exceptions, careful to keep the original task like this
                    task.ContinueWith(x => logger.Verbose($"{asset.Url} updated")).Forget();
                    tasks.Add(task);
                }
                await Task.WhenAll(tasks);

                logger.Info("Update completed...");
                undoRedo.SetName(transaction, $"Update {tasks.Count} asset(s) from their source(s)");
            }

            await workProgress.NotifyWorkFinished(false, logger.HasErrors);
        }
Ejemplo n.º 2
0
        public async void ShowProgressWindow(WorkProgressViewModel workProgress, int minDelay)
        {
            if (workProgress == null)
            {
                throw new ArgumentNullException(nameof(workProgress));
            }
            // Tell the work progress view model that a window will be open for it
            workProgress.NotifyWindowWillOpen();

            // Create a container object for the work progress to put it in the queue
            var progress = new PendingWorkProgress(workProgress);

            // As soon as the work is finished, we should display the window, even if the delay is not complete
            workProgress.WorkFinished += (sender, e) => progress.ReadyToDisplay.TrySetResult(0);
            if (workProgress.WorkDone)
            {
                progress.ReadyToDisplay.TrySetResult(0);
            }

            // Compute the list of progress window that should be displayed before this one
            List <PendingWorkProgress> precedingWindows;

            lock (pendingProgressWindows)
            {
                precedingWindows = new List <PendingWorkProgress>(pendingProgressWindows);
                pendingProgressWindows.Add(progress);
            }
            // Enqueue a task to display the window when it's ready.
            DisplayProgressWindow(precedingWindows, progress);

            // Wait the delay before notifying that we're ready to display
            await Task.Delay(minDelay);

            progress.ReadyToDisplay.TrySetResult(0);
        }
Ejemplo n.º 3
0
        private async Task UpdateAssetFromSource()
        {
            if (updatingFromSource)
            {
                return;
            }

            updatingFromSource = true;
            var logger       = new LoggerResult();
            var workProgress = new WorkProgressViewModel(ServiceProvider, logger)
            {
                Title           = "Update assets from source",
                KeepOpen        = KeepOpen.OnWarningsOrErrors,
                IsIndeterminate = true,
                IsCancellable   = false,
            };

            workProgress.RegisterProgressStatus(logger, true);

            workProgress.ServiceProvider.Get <IEditorDialogService>().ShowProgressWindow(workProgress, 500);

            using (var transaction = asset.UndoRedoService.CreateTransaction())
            {
                await UpdateAssetFromSource(logger);

                asset.UndoRedoService.SetName(transaction, $"Update [{asset.Url}] from its source(s)");
            }

            await workProgress.NotifyWorkFinished(false, logger.HasErrors);

            updatingFromSource = false;
        }
 public static void AddWorkprogress(this tbl_workprogress workprogress, WorkProgressViewModel workprogressVm)
 {
     //workprogress.ps_id = workprogressVm.ps_id;
     //workprogress.junction_name = workprogressVm.junction_name;
     //workprogress.poles_total = workprogressVm.poles_total;
     //workprogress.ps_id = workprogressVm.ps_id;
     //workprogress.ps_id = workprogressVm.ps_id;
 }
Ejemplo n.º 5
0
 public WorkProgressWindow(WorkProgressViewModel workProgress)
 {
     InitializeComponent();
     this.workProgress = workProgress;
     Loaded           += WindowLoaded;
     Closing          += WindowClosing;
     Width             = Math.Min(Width, SystemParameters.WorkArea.Width);
     Height            = Math.Min(Height, SystemParameters.WorkArea.Height);
 }
Ejemplo n.º 6
0
        public WorkProgress SaveWorkProgress(WorkProgressViewModel workProg)
        {
            WorkProgress wProg = null;

            if (workProg.ProgId > 0)
            {
                wProg = this.GetWorkProgress(workProg.ProgId);
            }


            //不是创建人只能新增不能修改
            if (wProg == null ||
                wProg.Creator != _identity.Claims.Where(c => c.Type == "name").FirstOrDefault().Value)
            {
                BizSteps step = _context.BizSteps.Include("BizItem").Where(s => s.StepId == workProg.StepId).FirstOrDefault();

                wProg        = new WorkProgress();
                wProg.WoId   = workProg.WoId;
                wProg.ItemId = step.BizItem.ItemId;
                wProg.StepId = step.StepId;
                _context.WorkProgress.Add(wProg);
            }


            wProg.CompletedTime      = workProg.CompletedTime;
            wProg.ResultDesc         = workProg.ResultDesc;
            wProg.AdvanceExpenditure = workProg.AdvanceExpenditure;
            wProg.CreateTime         = DateTime.Now;
            wProg.Creator            = _identity.Claims.Where(c => c.Type == "name").FirstOrDefault().Value;
            wProg.SortIndex          = workProg.SortIndex;
            wProg.IsSuccess          = workProg.IsSuccess;
            //重算代垫费用
            WorkOrder wOrder = _context.WorkOrders.Include("WorkProgresses").Where(wo => wo.WoId == wProg.WoId).First();

            wOrder.AdvanceExpenditure = wOrder.WorkProgresses.Sum(p => p.AdvanceExpenditure);
            wOrder.State = WorkOrderState.InProcess;

            if (!string.IsNullOrEmpty(workProg.Url))
            {
                ProgressImage pi = new ProgressImage();
                if (wProg.Images.Count > 0)
                {
                    pi = wProg.Images.FirstOrDefault();
                }
                else
                {
                    wProg.Images.Add(pi);
                }
                pi.AliyunKey    = workProg.FileName;
                pi.Url          = workProg.Url;
                pi.Expiration   = DateTime.Now.AddYears(5);
                pi.WorkProgress = wProg;
            }

            _context.SaveChanges();
            return(wProg);
        }
Ejemplo n.º 7
0
        public async Task AddExistingProject()
        {
            var fileDialog = ServiceProvider.Get <IEditorDialogService>().CreateFileOpenModalDialog();

            fileDialog.Filters.Add(new FileDialogFilter("Visual Studio C# project", "csproj"));
            fileDialog.InitialDirectory = Session.SolutionPath;
            var result = await fileDialog.ShowModal();

            var projectPath = fileDialog.FilePaths.FirstOrDefault();

            if (result == DialogResult.Ok && projectPath != null)
            {
                var loggerResult       = new LoggerResult();
                var cancellationSource = new CancellationTokenSource();
                var workProgress       = new WorkProgressViewModel(ServiceProvider, loggerResult)
                {
                    Title           = "Importing package...",
                    KeepOpen        = KeepOpen.OnWarningsOrErrors,
                    IsIndeterminate = true,
                    IsCancellable   = false
                };

                using (var transaction = UndoRedoService.CreateTransaction())
                {
                    workProgress.RegisterProgressStatus(loggerResult, true);

                    ServiceProvider.Get <IEditorDialogService>().ShowProgressWindow(workProgress, 500);

                    await Task.Run(() =>
                    {
                        try
                        {
                            Package.AddExistingProject(projectPath, loggerResult);
                        }
                        catch (Exception e)
                        {
                            loggerResult.Error("An exception occurred while importing the project", e);
                        }
                    }, cancellationSource.Token);

                    RefreshPackageReferences();

                    UndoRedoService.SetName(transaction, $"Import project '{new UFile(projectPath).GetFileNameWithoutExtension()}'");
                }

                // Notify that the task is finished
                await workProgress.NotifyWorkFinished(cancellationSource.IsCancellationRequested, loggerResult.HasErrors);
            }
        }
 public HttpResponseMessage SaveWorkprogress(HttpRequestMessage request, WorkProgressViewModel workprogress)
 {
     return(CreateHttpResponse(request, () =>
     {
         HttpResponseMessage response = null;
         if (!ModelState.IsValid)
         {
             response = request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
         }
         else
         {
             tbl_workprogress newWorkprogress = new tbl_workprogress();
             newWorkprogress.AddWorkprogress(workprogress);
             //_workprogressRepository.Add(AddWorkprogress);
             _unitOfWork.Commit();
             //response = request.CreateResponse<SubContractorViewModel>(HttpStatusCode.Created, workprogress);
         }
         return response;
     }));
 }
Ejemplo n.º 9
0
        public async Task UpdatePackageTemplate(TemplateDescription template)
        {
            var loggerResult = new LoggerResult();

            var workProgress = new WorkProgressViewModel(ServiceProvider, loggerResult)
            {
                Title           = "Updating package...",
                KeepOpen        = KeepOpen.OnWarningsOrErrors,
                IsIndeterminate = true,
                IsCancellable   = false
            };

            workProgress.RegisterProgressStatus(loggerResult, true);

            var parameters = new PackageTemplateGeneratorParameters
            {
                Name            = Package.Meta.Name,
                OutputDirectory = Package.FullPath.GetFullDirectory(),
                Description     = template,
                Package         = Package,
                Logger          = loggerResult,
            };

            var generator = TemplateManager.FindTemplateGenerator(parameters);

            if (generator == null)
            {
                await ServiceProvider.Get <IDialogService>().MessageBox(Tr._p("Message", "Unable to retrieve template generator for the selected template. Aborting."), MessageBoxButton.OK, MessageBoxImage.Error);

                return;
            }

            // Errors might occur when generating the template. For the moment we consider them non-fatal and allow to open the project anyway.
            await TemplateGeneratorHelper.RunTemplateGeneratorSafe(generator, parameters, workProgress);

            RefreshProjects();

            await workProgress.NotifyWorkFinished(false, loggerResult.HasErrors);

            Package.IsDirty = true;
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Creates the view models for each asset, directory, profile, project and reference of this package.
        /// </summary>
        /// <param name="loggerResult">The logger result of the current operation.</param>
        /// <param name="workProgress">A <see cref="WorkProgressViewModel"/> instance to update on progresses. Can be <c>null</c>.</param>
        /// <param name="cancellationToken">A cancellation token to cancel the load process. Can be <c>null</c>.</param>
        internal void LoadPackageInformation(LoggerResult loggerResult, WorkProgressViewModel workProgress, CancellationToken?cancellationToken = null)
        {
            if (workProgress == null)
            {
                throw new ArgumentNullException(nameof(workProgress));
            }
            var progress = workProgress.ProgressValue;

            workProgress.UpdateProgressAsync($"Processing asset {progress + 1}/{workProgress.Maximum}...", progress);

            if (cancellationToken.HasValue && cancellationToken.Value.IsCancellationRequested)
            {
                return;
            }

            foreach (var dependency in Package.Container.DirectDependencies)
            {
                new DirectDependencyReferenceViewModel(dependency, this, Dependencies, false);
            }

            foreach (var asset in Package.Assets.ToList())
            {
                if (cancellationToken.HasValue && cancellationToken.Value.IsCancellationRequested)
                {
                    return;
                }

                var message = $"Processing asset {progress + 1}/{workProgress.Maximum}...";
                workProgress.UpdateProgressAsync(message, progress);

                var url = asset.Location;
                DirectoryBaseViewModel directory;
                var projectSourceCodeAsset = asset.Asset as IProjectAsset;
                // TODO CSPROJ=XKPKG override rather than cast to subclass
                if (projectSourceCodeAsset != null && this is ProjectViewModel project)
                {
                    directory = project.GetOrCreateProjectDirectory(url.GetFullDirectory() ?? "", false);
                }
                else
                {
                    directory = GetOrCreateAssetDirectory(url.GetFullDirectory() ?? "", false);
                }
                CreateAsset(directory, asset, false, loggerResult, true);
                ++progress;
            }

            FillRootAssetCollection();

            workProgress.UpdateProgressAsync("Package processed", progress);

            foreach (var explicitDirectory in Package.ExplicitFolders)
            {
                GetOrCreateAssetDirectory(explicitDirectory, false);
            }

            var pluginService = Session.ServiceProvider.Get <IAssetsPluginService>();

            foreach (var plugin in pluginService.Plugins)
            {
                foreach (var property in plugin.ProfileSettings)
                {
                    RegisterSettings(property);
                }
            }
        }
Ejemplo n.º 11
0
 public PendingWorkProgress(WorkProgressViewModel workProgress)
 {
     WorkProgress   = workProgress;
     ReadyToDisplay = new TaskCompletionSource <int>();
     Displayed      = new TaskCompletionSource <int>();
 }
        public async Task <HttpResponseMessage> SaveWorkProgress()
        {
            // Check if the request contains multipart/form-data.
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            string root     = HttpContext.Current.Server.MapPath(_uploadPath);
            var    provider = new MultipartFormDataStreamProvider(root);

            Dictionary <string, string> fileNames = new Dictionary <string, string>();

            try
            {
                // Read the form data.
                await Request.Content.ReadAsMultipartAsync(provider);

                // This illustrates how to get the file names.
                foreach (MultipartFileData file in provider.FileData)
                {
                    if (File.Exists(file.LocalFileName))
                    {
                        FileInfo fi = new FileInfo(file.LocalFileName);
                        if (fi.Length < 500)
                        {
                            File.Delete(file.LocalFileName);
                            continue;
                        }
                        else
                        {
                            File.Move(file.LocalFileName, string.Format("{0}{1}", file.LocalFileName, Path.GetExtension(file.Headers.ContentDisposition.FileName.Replace("\"", ""))));
                        }
                    }

                    fileNames.Add(file.Headers.ContentDisposition.FileName, file.LocalFileName);
                }

                WorkProgressViewModel wProg = new WorkProgressViewModel();
                long progid;
                if (long.TryParse(HttpContext.Current.Request.Form["ProgId"], out progid))
                {
                    wProg.ProgId = progid;
                }
                wProg.StepId    = Convert.ToInt32(HttpContext.Current.Request.Form["StepId"]);
                wProg.WoId      = Convert.ToInt64(HttpContext.Current.Request.Form["WorkOrderId"]);
                wProg.SortIndex = Convert.ToInt32(HttpContext.Current.Request.Form["SortIndex"]);
                DateTime dt;
                if (DateTime.TryParse(HttpContext.Current.Request.Form["CompletedTime"], out dt))
                {
                    wProg.CompletedTime = dt;
                }
                wProg.ResultDesc = HttpContext.Current.Request.Form["ResultDesc"];
                decimal ae;
                if (decimal.TryParse(HttpContext.Current.Request.Form["AdvanceExpenditure"], out ae))
                {
                    wProg.AdvanceExpenditure = ae;
                }
                bool isSuc;
                if (bool.TryParse(HttpContext.Current.Request.Form["IsSuccess"], out isSuc))
                {
                    wProg.IsSuccess = isSuc;
                }

                if (fileNames.Count > 0)
                {
                    wProg.FileName = string.Format("{0}{1}", Path.GetFileName(fileNames.Values.FirstOrDefault()), Path.GetExtension(fileNames.Keys.FirstOrDefault().Replace("\"", "")));
                    wProg.Url      = string.Format("{0}/{1}", _uploadPath, Path.GetFileName(wProg.FileName));
                }
                _progress.SaveWorkProgress(wProg);


                return(Request.CreateResponse <ResMessageContent>(HttpStatusCode.OK, ResMessage.Success()));
            }
            catch (System.Exception e)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e));
            }
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Creates the view models for each asset, directory, profile, project and reference of this package.
        /// </summary>
        /// <param name="loggerResult">The logger result of the current operation.</param>
        /// <param name="workProgress">A <see cref="WorkProgressViewModel"/> instance to update on progresses. Can be <c>null</c>.</param>
        /// <param name="cancellationToken">A cancellation token to cancel the load process. Can be <c>null</c>.</param>
        internal void LoadPackageInformation(LoggerResult loggerResult, WorkProgressViewModel workProgress, CancellationToken?cancellationToken = null)
        {
            if (workProgress == null)
            {
                throw new ArgumentNullException(nameof(workProgress));
            }
            var progress = workProgress.ProgressValue;

            workProgress.UpdateProgressAsync($"Processing asset {progress + 1}/{workProgress.Maximum}...", progress);

            foreach (var profile in Package.Profiles)
            {
                if (cancellationToken.HasValue && cancellationToken.Value.IsCancellationRequested)
                {
                    return;
                }

                var viewModel = new ProfileViewModel(Session, Package, profile, this);
                Profiles.Add(viewModel);

                foreach (var project in viewModel.Projects)
                {
                    AddProject(project);
                }
            }

            foreach (var localPackage in Package.LocalDependencies)
            {
                var viewModel = Session.AllPackages.SingleOrDefault(x => x.Match(localPackage.Id));
                if (viewModel != null)
                {
                    // ReSharper disable once ObjectCreationAsStatement - The PackageReferenceViewModel will register itself in the proper collection to keep being referenced
                    new LocalPackageReferenceViewModel(localPackage, viewModel, this, Dependencies, false);
                }
            }

            foreach (var storeDependency in Package.Meta.Dependencies)
            {
                // TODO: Use Guid at some point to retrieve the package
                var viewModel = Session.AllPackages.SingleOrDefault(x => x.Name == storeDependency.Name);
                if (viewModel != null)
                {
                    // ReSharper disable once ObjectCreationAsStatement - The PackageReferenceViewModel will register itself in the proper collection to keep being referenced
                    new StorePackageReferenceViewModel(storeDependency, viewModel, this, Dependencies, false);
                }
            }

            foreach (var asset in Package.Assets.ToList())
            {
                if (cancellationToken.HasValue && cancellationToken.Value.IsCancellationRequested)
                {
                    return;
                }

                var message = $"Processing asset {progress + 1}/{workProgress.Maximum}...";
                workProgress.UpdateProgressAsync(message, progress);

                var url = asset.Location;
                DirectoryBaseViewModel directory;
                var projectSourceCodeAsset = asset.Asset as IProjectAsset;
                if (projectSourceCodeAsset != null && asset.SourceProject != null)
                {
                    var project = Content.OfType <ProjectViewModel>().First(x => string.Compare(asset.SourceProject.GetFileNameWithoutExtension(), x.Name, StringComparison.InvariantCultureIgnoreCase) == 0);
                    directory = GetOrCreateProjectDirectory(project, url.GetDirectory() ?? "", false);
                }
                else
                {
                    directory = GetOrCreateAssetDirectory(url.GetDirectory() ?? "", false);
                }
                CreateAsset(directory, asset, false, loggerResult, true);
                ++progress;
            }

            FillRootAssetCollection();

            workProgress.UpdateProgressAsync("Package processed", progress);

            foreach (var explicitDirectory in Package.ExplicitFolders)
            {
                GetOrCreateAssetDirectory(explicitDirectory, false);
            }

            var pluginService = Session.ServiceProvider.Get <IAssetsPluginService>();

            foreach (var plugin in pluginService.Plugins)
            {
                foreach (var property in plugin.ProfileSettings)
                {
                    RegisterSettings(property);
                }
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Invokes the given template generator safely. The generator will be prepared on the calling thread, and run from
        /// a task. This methods will catch and log all exceptions occurring during the template generation.
        /// </summary>
        /// <param name="generator">The template generator to run.</param>
        /// <param name="parameters">The parameters for the template generator.</param>
        /// <param name="workProgress">The view model used to report progress.</param>
        /// <returns>A task that completes when the template generator has finished to run.</returns>
        internal static async Task <bool> RunTemplateGeneratorSafe <TParameters>(ITemplateGenerator <TParameters> generator, TParameters parameters, WorkProgressViewModel workProgress) where TParameters : TemplateGeneratorParameters
        {
            if (generator == null)
            {
                throw new ArgumentNullException(nameof(generator));
            }
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            var success = false;

            try
            {
                success = await generator.PrepareForRun(parameters);

                if (!success)
                {
                    // If the preparation failed without error, it means that the user cancelled the operation.
                    if (!parameters.Logger.HasErrors)
                    {
                        parameters.Logger.Info(Tr._p("Log", "Operation cancelled."));
                    }

                    return(false);
                }
            }
            catch (Exception e)
            {
                parameters.Logger.Error(Tr._p("Log", "An exception occurred while generating the template."), e);
            }

            if (parameters.Logger.HasErrors || !success)
            {
                workProgress?.ServiceProvider.Get <IEditorDialogService>().ShowProgressWindow(workProgress, 0);
                return(false);
            }

            workProgress?.ServiceProvider.Get <IEditorDialogService>().ShowProgressWindow(workProgress, 500);

            var result = await Task.Run(() =>
            {
                try
                {
                    return(generator.Run(parameters));
                }
                catch (Exception e)
                {
                    parameters.Logger.Error(Tr._p("Log", "An exception occurred while generating the template."), e);
                    return(false);
                }
            });

            return(result && !parameters.Logger.HasErrors);
        }