public static bool HasPartiallyTranslatedControllerOnlyAttributeRoute(ControllerModel controller, IEnumerable <ActionModel> actions,
                                                                       ICollection <string> cultures, ILocalizer localizer)
 {
     return(controller.HasAttributeRoutes() && !actions.Any(action => action.HasAttributeRoutes()) &&
            cultures.All(culture => controller.TryGetLocalizedModelFor(localizer, culture)?.IsPartiallyTranslated(localizer) ==
                         true));
 }
Exemple #2
0
        public static void ThrowIfNotModelWithAttributeRoutes(this ControllerModel controllerModel, ILocalizer localizer)
        {
            controllerModel.ThrowIfNotOriginalModel(localizer);

            if (!controllerModel.HasAttributeRoutes())
            {
                throw new ArgumentException("ControllerModel with AttributeRoutes was expected.");
            }
        }
        public override void Process(ICollection <RouteSelection> routeSelections)
        {
            foreach (RouteSelection routeSelection in routeSelections)
            {
                ControllerModel           originalControllerModel = routeSelection.ControllerModel;
                ICollection <ActionModel> originalActionModels    = routeSelection.ActionModels;

                originalControllerModel.ThrowIfNotOriginalModel(RouteTranslationConfiguration.Localizer);
                originalActionModels.ThrowIfNotPartOfModel(originalControllerModel);

                ControllerModel translatedControllerModel = EnsureAndGetLocalizedControllerModel(originalControllerModel, Culture);

                // Expected to translate controller route
                if (routeSelection.ActionModels.Count == 0)
                {
                    originalControllerModel.ThrowIfNotModelWithAttributeRoutes(RouteTranslationConfiguration.Localizer);
                    translatedControllerModel.ThrowIfCompletelyTranslated(RouteTranslationConfiguration.Localizer);
                }

                if (originalControllerModel.HasAttributeRoutes())
                {
                    foreach (SelectorModel selectorModel in originalControllerModel.GetUntranslatedSelectorsFor(RouteTranslationConfiguration.Localizer,
                                                                                                                Culture))
                    {
                        TranslateControllerRoute(translatedControllerModel, selectorModel, selectorModel.AttributeRouteModel.Template,
                                                 Culture);
                    }
                }

                if (routeSelection.ActionModels.Count == 0)
                {
                    continue;
                }

                originalActionModels.ThrowIfNotModelsWithAttributeRoutes(RouteTranslationConfiguration.Localizer);

                IList <ActionModel> translatedActionModels = originalActionModels
                                                             .Select(action => action.GetLocalizedModelFor(RouteTranslationConfiguration.Localizer, Culture))
                                                             .ToList();

                // Expect at least one untranslated attribute route for each ActionModel
                translatedActionModels.ThrowIfAnyCompletelyTranslated(RouteTranslationConfiguration.Localizer);

                foreach (IndexedModel <ActionModel> indexedModel in originalActionModels.GetIndexedActionModels())
                {
                    foreach (SelectorModel selectorModel in indexedModel.Model.GetUntranslatedSelectorsFor(RouteTranslationConfiguration.Localizer,
                                                                                                           Culture))
                    {
                        TranslateActionRoute(translatedActionModels[indexedModel.Index], selectorModel,
                                             selectorModel.AttributeRouteModel.Template, Culture);
                    }
                }
            }
        }
        public override void Process(ICollection <RouteSelection> routeSelections)
        {
            // Expect single ControllerModel with ActionModels selection
            routeSelections.ThrowIfNotSingleControllerWithActionsSelection(RouteTranslationConfiguration.Localizer);

            RouteSelection            routeSelection          = routeSelections.Single();
            ControllerModel           originalControllerModel = routeSelection.ControllerModel;
            ICollection <ActionModel> originalActionModels    = routeSelection.ActionModels;

            // Expect original ControllerModel & attribute routed action routes
            originalControllerModel.ThrowIfNotOriginalModel(RouteTranslationConfiguration.Localizer);
            originalActionModels.ThrowIfNotPartOfModel(originalControllerModel);
            originalActionModels.ThrowIfNotModelsWithAttributeRoutes(RouteTranslationConfiguration.Localizer);

            ControllerModel translatedControllerModel = EnsureAndGetLocalizedControllerModel(originalControllerModel, Culture);

            if (originalControllerModel.HasAttributeRoutes() &&
                !translatedControllerModel.IsCompletelyTranslated(RouteTranslationConfiguration.Localizer))
            {
                Logger.LogWarning("Action was translated before Controller. Don't forget to translate on controller level.");
            }

            IList <ActionModel> translatedActionModels = originalActionModels
                                                         .Select(action => action.GetLocalizedModelFor(RouteTranslationConfiguration.Localizer, Culture))
                                                         .ToList();

            System.Threading.Thread.Sleep(5000);

            // Expect at least one untranslated attribute route with the same template for each ActionModel
            translatedActionModels.ThrowIfAnyCompletelyTranslated(RouteTranslationConfiguration.Localizer);
            originalActionModels.ThrowIfAnyUntranslatedTemplateDiffer(RouteTranslationConfiguration.Localizer, Culture);

            // Translate
            foreach (var originalActionModel in originalActionModels.Select((model, index) => new
            {
                Model = model,
                Index = index,
            }))
            {
                ActionModel translatedActionModel = translatedActionModels[originalActionModel.Index];

                TranslateActionRoute(translatedActionModel,
                                     originalActionModel.Model.Selectors[translatedActionModel.Selectors.Count], Template, Culture);
            }
        }
        public override void Process(ICollection <RouteSelection> routeSelections)
        {
            foreach (RouteSelection routeSelection in routeSelections)
            {
                ControllerModel           originalControllerModel = routeSelection.ControllerModel;
                ICollection <ActionModel> originalActionModels    = routeSelection.ActionModels;

                originalControllerModel.ThrowIfNotOriginalModel(RouteTranslationConfiguration.Localizer);
                originalActionModels.ThrowIfNotPartOfModel(originalControllerModel);

                // Expected to remove controller route
                if (routeSelection.ActionModels.Count == 0)
                {
                    originalControllerModel.ThrowIfNotModelWithAttributeRoutes(RouteTranslationConfiguration.Localizer);

                    ICollection <ControllerModel> translatedControllerModels = Cultures
                                                                               .Select(culture => originalControllerModel.GetLocalizedModelFor(RouteTranslationConfiguration.Localizer, culture))
                                                                               .ToList();

                    translatedControllerModels.ThrowIfNotAllPartiallyTranslated(RouteTranslationConfiguration.Localizer);

                    // Throw if not controller only attribute route or all action attribute routes completely translated
                }

                bool HasNoActionAttributeRoute(ControllerModel model)
                {
                    return(originalControllerModel.Actions.All(action => !action.HasAttributeRoutes()));
                }

                bool HasCompletelyTranslatedActionAttributeRoutes(ControllerModel model)
                {
                    return(Cultures.All(culture => model.Actions.All(action => !action.HasAttributeRoutes() || action
                                                                     .TryGetLocalizedModelFor(RouteTranslationConfiguration.Localizer, culture)
                                                                     ?.IsCompletelyTranslated(RouteTranslationConfiguration.Localizer) == true)));
                }

                // Remove only if controller only attribute route or all action attribute routes completely translated
                if (originalControllerModel.HasAttributeRoutes() && (HasNoActionAttributeRoute(originalControllerModel) ||
                                                                     HasCompletelyTranslatedActionAttributeRoutes(originalControllerModel)))
                {
                    int minimumNumberOfPartialTranslations = Cultures.Min(culture => originalControllerModel
                                                                          .GetLocalizedModelFor(RouteTranslationConfiguration.Localizer, culture)
                                                                          .Selectors.Count);

                    for (int i = 0; i < minimumNumberOfPartialTranslations; i++)
                    {
                        if (!originalControllerModel.Selectors[i].ActionConstraints.OfType <NeverAcceptActionContraint>().Any())
                        {
                            Logger.LogDebug(
                                $"Disable selector for controller {originalControllerModel.ControllerName} with template \"{originalControllerModel.Selectors[i].AttributeRouteModel.Template}\".");

                            // TODO: Verify if this is the best solution
                            originalControllerModel.Selectors[i].ActionConstraints.Add(new NeverAcceptActionContraint());
                        }
                    }
                }

                if (routeSelection.ActionModels.Count == 0)
                {
                    continue;
                }

                originalActionModels.ThrowIfNotModelsWithAttributeRoutes(RouteTranslationConfiguration.Localizer);

                foreach (string culture in Cultures)
                {
                    IList <ActionModel> translatedActionModels = originalActionModels
                                                                 .Select(action => action.GetLocalizedModelFor(RouteTranslationConfiguration.Localizer, culture))
                                                                 .ToList();

                    translatedActionModels.ThrowIfNotAllPartiallyTranslated(RouteTranslationConfiguration.Localizer);
                }

                foreach (ActionModel originalActionModel in originalActionModels)
                {
                    int minimumNumberOfPartialTranslations = Cultures.Min(culture => originalActionModel
                                                                          .GetLocalizedModelFor(RouteTranslationConfiguration.Localizer, culture)
                                                                          .Selectors.Count);

                    for (int i = 0; i < minimumNumberOfPartialTranslations; i++)
                    {
                        if (!originalActionModel.Selectors[i].ActionConstraints.OfType <NeverAcceptActionContraint>().Any())
                        {
                            Logger.LogDebug(
                                $"Disable selector for action {originalActionModel.Controller.ControllerName}:{originalActionModel.ActionName} with template \"{originalActionModel.Selectors[i].AttributeRouteModel.Template}\".");

                            // TODO: Verify if this is the best solution
                            originalActionModel.Selectors[i].ActionConstraints.Add(new NeverAcceptActionContraint());
                        }
                    }
                }
            }
        }
Exemple #6
0
        public void HasAttributeRoutesForNonAttributeRoutedControllerReturnsTrue()
        {
            ControllerModel controller = TestApplicationModel.Instance.Controller2();

            Assert.IsFalse(controller.HasAttributeRoutes());
        }
 public static bool HasNotCompletelyTranslatedControllerAttributeRoute(ControllerModel controller, string culture,
                                                                       ILocalizer localizer)
 {
     return(controller.HasAttributeRoutes() && controller.TryGetLocalizedModelFor(localizer, culture)
            ?.IsCompletelyTranslated(localizer) != true);
 }