Example #1
0
        public IEnumerable <IValidationIssue> ApplyIfValid(
            RootModel root,
            String username,
            String userEmail,
            SqlConnection connection,
            TargetingTypeRepository targetingTypeRepository,
            SecurityRepository securityRepository,
            BasketRepository basketRepository,
            PortfolioRepository portfolioRepository,
            CalculationTicket ticket,
            ref CalculationInfo info
            )
        {
            var targetingType = targetingTypeRepository.GetTargetingType(root.TargetingType.Id);
            var issues        = this.modelApplier.ApplyIfValid(
                root,
                targetingType.Taxonomy,
                this.repositoryManager,
                username,
                userEmail,
                connection,
                securityRepository,
                basketRepository,
                portfolioRepository,
                ticket,
                ref info
                );

            return(issues);
        }
Example #2
0
        public IEnumerable <IValidationIssue> ApplyIfValid(
            RootModel model,
            Taxonomy taxonomy,
            RepositoryManager repositoryManager,
            String username,
            String userEmail,
            SqlConnection connection,
            SecurityRepository securityRepository,
            BasketRepository basketRepository,
            PortfolioRepository portfolioRepository,
            CalculationTicket ticket,
            ref CalculationInfo info
            )
        {
            var issues          = this.ValidateModelAndPermissions(model, username, ticket);
            var traverser       = new IssueTraverser();
            var traversedIssues = traverser.TraverseAll(issues);

            if (traversedIssues.Any(x => x is ErrorIssue))
            {
                return(issues);
            }

            try
            {
                this.Apply(model, taxonomy, repositoryManager, username, userEmail, connection,
                           securityRepository, basketRepository, portfolioRepository, ref info);
                return(issues);
            }
            catch (ValidationException exception)
            {
                return(issues.Union(new IValidationIssue[] { exception.Issue }));
            }
        }
Example #3
0
        public IEnumerable <IValidationIssue> ApplyBroadGlobalActiveModelIfValid(ManagingBpt.RootModel root, String username, CalculationTicket ticket)
        {
            string userEmail = "";

            using (var connection = this.usersConnectionFactory.CreateConnection())
            {
                var manager = this.dataUsersManagerFactory.CreateDataManager(connection, null);
                userEmail = manager.GetUserEmail(username);
            }

            using (var connection = this.connectionFactory.CreateConnection())
            {
                try
                {
                    using (var ondemandManager = this.CreateOnDemandDataManager(connection))
                    {
                        var targetingTypeRepository = this.RepositoryManager.ClaimTargetingTypeRepository(ondemandManager);
                        var securityRepository      = this.RepositoryManager.ClaimSecurityRepository(ondemandManager);
                        var basketRepository        = this.RepositoryManager.ClaimBasketRepository(ondemandManager);
                        var portfolioRepository     = this.RepositoryManager.ClaimPortfolioRepository(ondemandManager);
                        var calculation             = new CalculationInfo();
                        var issues = this.BptManager.ApplyIfValid(
                            root,
                            username,
                            userEmail,
                            connection,
                            targetingTypeRepository,
                            securityRepository,
                            basketRepository,
                            portfolioRepository,
                            ticket,
                            ref calculation
                            );
                        if (!issues.Any(x => x is ErrorIssue))
                        {
                            this.Calculate(calculation.Id, true);
                        }
                        return(issues);
                    }
                }
                catch (EmailNotificationException e)
                {
                    throw new ApplicationException("Notification email cannot be sent. Data haven't been saved yet. You can try again. If the problem persist contact IT department.", e);
                }
                catch (CalculationException e)
                {
                    throw new ApplicationException("You change has been saved but portfolio recalculation went wrong. Contact IT department to restart recalculations.", e);
                }
                catch (OutputTargetingFileException e)
                {
                    throw new ApplicationException("You change has been saved but targeting output file cannot be saved. Contact IT department to restart recalculations.", e);
                }
            }
        }
Example #4
0
        protected void Apply(
            RootModel model,
            Taxonomy taxonomy,
            RepositoryManager repositoryManager,
            String username,
            String userEmail,
            SqlConnection connection,
            SecurityRepository securityRepository,
            BasketRepository basketRepository,
            PortfolioRepository portfolioRepository,
            ref CalculationInfo calculationInfo
            )
        {
            using (var transaction = connection.BeginTransaction())
            {
                var manager = this.dataManagerFactory.CreateDataManager(connection, transaction);

                var btChangesetOpt = this.btModelTransformer.TryTransformToChangeset(model, taxonomy);
                if (btChangesetOpt != null)
                {
                    // saving unsaved baskets and modified taxonomy
                    this.btChangesetApplier.Apply(btChangesetOpt, connection, transaction, repositoryManager);
                }

                var pstoChangesetOpt  = this.pstoModelTransformer.TryTransformToChangeset(model, username);
                var ttbbvChangesetOpt = this.ttbbvModelTransformer.TryTransformToChangeset(model, username);
                var ttbptChangesetOpt = this.ttbptModelTransformer.TryTransformToChangeset(model, username);

                if (pstoChangesetOpt == null && ttbbvChangesetOpt == null && ttbptChangesetOpt == null)
                {
                    return;                     // no changes to apply, why bother?
                }

                calculationInfo = this.calculationRequester.RequestCalculation(manager);

                if (pstoChangesetOpt != null)
                {
                    this.pstoChangesetApplier.Apply(calculationInfo.Id, pstoChangesetOpt, manager);
                }
                if (ttbbvChangesetOpt != null)
                {
                    this.ttbbvChangesetApplier.Apply(calculationInfo.Id, ttbbvChangesetOpt, manager);
                }
                if (ttbptChangesetOpt != null)
                {
                    this.ttbptChangesetApplier.Apply(calculationInfo.Id, ttbptChangesetOpt, manager);
                }

                SendNotification(model.TargetingType.Name, model.Portfolio.Name, pstoChangesetOpt, ttbbvChangesetOpt, ttbptChangesetOpt, manager, securityRepository, basketRepository, portfolioRepository, userEmail);
//#warning HACK!!! prevent test changes to DB
                //transaction.Rollback();
                transaction.Commit();
            }
        }
Example #5
0
            public void Log(ProgressChannel source, ProgressEvent.EventKind kind, ProgressEntry entry)
            {
                _ectx.AssertValue(source);
                _ectx.AssertValueOrNull(entry);

                if (kind == ProgressEvent.EventKind.Start)
                {
                    _ectx.Assert(entry == null);
                    lock (_lock)
                    {
                        // Figure out an appropriate name.
                        int    i             = 1;
                        var    name          = source.Name;
                        string nameCandidate = name;
                        while (!_namesUsed.Add(nameCandidate))
                        {
                            i++;
                            nameCandidate = string.Format("{0} #{1}", name, i);
                        }
                        var newInfo = new CalculationInfo(++_index, nameCandidate, source);
                        _infos.Add(newInfo);
                        _pendingEvents.Enqueue(new ProgressEvent(newInfo.Index, newInfo.Name, newInfo.StartTime, ProgressEvent.EventKind.Start));
                        return;
                    }
                }

                // Not a start event, so we won't modify the _infos.
                CalculationInfo info;

                lock (_lock)
                {
                    info = _infos.FirstOrDefault(x => x.Channel == source);
                    if (info == null)
                    {
                        throw _ectx.Except("Event sent after the calculation lifetime expired.");
                    }
                }
                switch (kind)
                {
                case ProgressEvent.EventKind.Stop:
                    _ectx.Assert(entry == null);
                    info.IsFinished = true;
                    _pendingEvents.Enqueue(new ProgressEvent(info.Index, info.Name, info.StartTime, ProgressEvent.EventKind.Stop));
                    break;

                default:
                    _ectx.Assert(entry != null);
                    _ectx.Assert(kind == ProgressEvent.EventKind.Progress);
                    _ectx.Assert(!info.IsFinished);
                    _pendingEvents.Enqueue(new ProgressEvent(info.Index, info.Name, info.StartTime, entry));
                    break;
                }
            }
Example #6
0
        public IEnumerable <IValidationIssue> ApplyBpstModelIfValid(
            ManagingBpst.RootModel model,
            String username,
            CalculationTicket ticket)
        {
#warning NEXT: make sure everybody validates before opening a  connection
            var issues = this.BpstManager.Validate(model, ticket);
            if (issues.Any())
            {
                return(issues);
            }
            string userEmail = "";
            using (var connection = this.usersConnectionFactory.CreateConnection())
            {
                var manager = this.dataUsersManagerFactory.CreateDataManager(connection, null);
                userEmail = manager.GetUserEmail(username);
            }

            using (var connection = this.connectionFactory.CreateConnection())
            {
                try
                {
                    CalculationInfo calculationInfo = new CalculationInfo();
                    var             manager         = this.dataManagerFactory.CreateDataManager(connection, null);
                    var             retVal          = this.BpstManager.ApplyIfValid(model, username, userEmail, connection, ticket, this.RepositoryManager.ClaimSecurityRepository(manager), this.RepositoryManager.ClaimBasketRepository(manager), ref calculationInfo);
                    if (!retVal.Any())
                    {
                        this.Calculate(calculationInfo.Id, true);
                    }
                    return(retVal);
                }
                catch (EmailNotificationException e)
                {
                    throw new ApplicationException("Notification email cannot be sent. Data haven't been saved yet. You can try again. If the problem persist contact IT department.", e);
                }
                catch (CalculationException e)
                {
                    throw new ApplicationException("You change has been saved but portfolio recalculation went wrong. Contact IT department to restart recalculations.", e);
                }
                catch (OutputTargetingFileException e)
                {
                    throw new ApplicationException("You change has been saved but targeting output file cannot be saved. Contact IT department to restart recalculations.", e);
                }
            }
        }
Example #7
0
        public void Apply(RootModel model, String username, String userEmail, SqlConnection connection, SecurityRepository securityRepository, BasketRepository basketRepository, ref CalculationInfo calculationInfo)
        {
            var ttgbsbvChangesetOpt = this.ttgbsbvModelTransformer.TryTransformToChangeset(username, model);
            var bpstChangesetOpt    = this.bpstModelTransformter.TryTransformToChangeset(username, model);

            if (ttgbsbvChangesetOpt == null && bpstChangesetOpt == null)
            {
                // there's nothing to apply, why bother?
                return;
            }

            using (var transaction = connection.BeginTransaction())
            {
                var manager = this.dataManagerFactory.CreateDataManager(connection, transaction);

                calculationInfo = this.calculationRequester.RequestCalculation(manager);

                if (ttgbsbvChangesetOpt != null)
                {
                    this.ttgbsbvChangesetApplier.Apply(calculationInfo.Id, ttgbsbvChangesetOpt, manager);
                }
                if (bpstChangesetOpt != null)
                {
                    this.bpstChangesetApplier.Apply(calculationInfo.Id, bpstChangesetOpt, manager);
                }
                SendNotification(ttgbsbvChangesetOpt, bpstChangesetOpt, manager, securityRepository, basketRepository, userEmail);
                transaction.Commit();
            }

            if (bpstChangesetOpt != null)
            {
                this.repositoryManager.DropBasketSecurityPortfolioTargetRepository();
            }

            if (ttgbsbvChangesetOpt != null)
            {
                this.repositoryManager.DropTargetingTypeGroupBasketSecurityBaseValueRepository();
            }
        }
        public void CalculationInfoTest()
        {
            var calculationInfo = new CalculationInfo();

            calculationInfo.ShowDialog();
        }
Example #9
0
        public IEnumerable <IValidationIssue> ApplyIfValid(RootModel model, String username, String userEmail, SqlConnection connection, CalculationTicket ticket, SecurityRepository securityRepository, BasketRepository basketRepository, ref CalculationInfo calculationInfo)
        {
            var issues = this.Validate(model, ticket);

            if (issues.Any())
            {
                return(issues);
            }
            try
            {
                this.modelApplier.Apply(model, username, userEmail, connection, securityRepository, basketRepository, ref calculationInfo);
                return(No.ValidationIssues);
            }
            catch (ValidationException exception)
            {
                return(new IValidationIssue[] { exception.Issue });
            }
        }
Example #10
0
        public void RunCalculationInFds()
        {
            // Todo : Bad practice to use such kind of exception handling.
            try
            {
                #region Check if config exists

                var pluginConfig = new DefaultFactory(Log).CreateFdsConfig();

                if (pluginConfig == null)
                {
                    var fdsConfig = new PluginOptions(Log);
                    fdsConfig.ShowDialog();
                    pluginConfig = fdsConfig.PluginConfig;
                    fdsConfig.Dispose();
                    fdsConfig = null;
                }

                #endregion

                #region Collect information

                // Ask user to configure calculation
                var calculationInfo = new CalculationInfo();
                var dialogResult    = calculationInfo.ShowDialog();

                var calcTime   = calculationInfo.CalculationTime;
                var workingDir = calculationInfo.OutputPath;

                calculationInfo.Dispose();
                calculationInfo = null;

                if (dialogResult == DialogResult.Cancel)
                {
                    return;
                }

                EditMaterialsMappings();

                // get solids
                var selectedSolids = AcadInfoProvider.AskUserToSelectSolids();

                if (selectedSolids.Count < 1)
                {
                    return;
                }

                #endregion

                #region Start Calculations

                var fdsStartInfo = new FdsStartInfo
                {
                    // Arguments = string.Concat("\"", pathToFile, "\""),
                    CalculationTime  = calcTime,
                    DocumentName     = AcadInfoProvider.GetDocumentName(),
                    PathToFds        = pluginConfig.PathToFds,
                    SelectedSolids   = selectedSolids,
                    UsedSurfaces     = CommonHelper.GetAllUsedSurfaces(Log),
                    WorkingDirectory = workingDir
                };

                var progressWindow     = new ConversionProgress(fdsStartInfo.SelectedSolids.Count);
                var calculationManager = new ThreadedCalculationManager(fdsStartInfo, Log, progressWindow);
                progressWindow.Shown += (s, e) => calculationManager.WaitEvent.Set();
                calculationManager.StartCalculation();

                progressWindow.ShowDialog();
                progressWindow.Dispose();
                progressWindow = null;

                #endregion
            }
            catch (System.Exception exception)
            {
                Log.LogError(exception);
                UserNotifier.ShowError(exception.Message);
            }
        }
Example #11
0
        public IEnumerable <IValidationIssue> ApplyIsValid(RootModel composition, String username, String userEmail, SqlConnection connection, CalculationTicket ticket, SecurityRepository securityRepository, ref CalculationInfo info)
        {
            var issues = this.modelValidator.ValidateRoot(composition, ticket);

            if (issues.Any())
            {
                return(issues);
            }

            try
            {
                var changesetOpt = this.transformer.TryTransformToChangeset(username, composition);
                if (changesetOpt != null)
                {
                    using (var transaction = connection.BeginTransaction())
                    {
                        var manager = this.dataManagerFactory.CreateDataManager(connection, transaction);

                        info = this.calculationRequester.RequestCalculation(manager);
                        this.applier.Apply(info.Id, changesetOpt, manager);
                        try
                        {
                            var message = this.applier.PrepareToSend(changesetOpt, manager, securityRepository);
                            MailSender.SendTargetingAlert(message, userEmail);
                        }
                        catch (Exception e)
                        {
                            throw new EmailNotificationException("See inner exception for details.", e);
                        }
                        // it's important to drop the repository (or at least part of it if you can manage to carefully resolve everything) as we changed the composition
                        this.repositoryManager.DropRepository();
                        transaction.Commit();
                    }
                }
                return(No.ValidationIssues);
            }
            catch (ValidationException exception)
            {
                return(new IValidationIssue[] { exception.Issue });
            }
        }