private IUrlParamsMapper GetInferredTaxonFilterMapper(ControllerBase controller, string actionName) { var actionDescriptor = new ReflectedControllerDescriptor(controller.GetType()).FindAction(controller.ControllerContext, actionName); if (actionDescriptor == null || actionDescriptor.GetParameters().Length == 0) { return(null); } IUrlParamsMapper result = null; if (actionDescriptor.GetParameters()[0].ParameterType == typeof(ITaxon)) { var taxonParamName = actionDescriptor.GetParameters()[0].ParameterName; if (actionDescriptor.GetParameters()[1].ParameterType == typeof(int?)) { var pageParamName = actionDescriptor.GetParameters()[1].ParameterName; result = new CustomActionParamsMapper(controller, () => "/{" + taxonParamName + ":category,tag}/{" + pageParamName + "}", actionName); } result = result.SetLast(new CustomActionParamsMapper(controller, () => "/{" + taxonParamName + ":category,tag}", actionName)); } return(result); }
private IUrlParamsMapper GetInferredDetailActionParamsMapper(ControllerBase controller) { var controllerType = controller.GetType(); IUrlParamsMapper result = null; var detailsAction = new ReflectedControllerDescriptor(controllerType).FindAction(controller.ControllerContext, DetailActionParamsMapper.DefaultActionName); if (detailsAction != null) { var contentParam = detailsAction.GetParameters().FirstOrDefault(); if (contentParam != null && contentParam.ParameterType.ImplementsInterface(typeof(IDataItem))) { Type contentType; if (typeof(DynamicContent) == contentParam.ParameterType) { var dynamicContentType = controller.GetDynamicContentType(); contentType = dynamicContentType != null?TypeResolutionService.ResolveType(dynamicContentType.GetFullTypeName(), throwOnError : false) : null; } else { contentType = contentParam.ParameterType; } if (contentType != null) { var providerNames = this.GetModelProperty(controller, "ProviderName") as string; result = result.SetLast(new DetailActionParamsMapper(controller, contentType, () => providerNames)); } } } return(result); }
private IUrlParamsMapper GetInferredTaxonFilterMapper(ControllerBase controller, string actionName) { var actionDescriptor = new ReflectedControllerDescriptor(controller.GetType()).FindAction(controller.ControllerContext, actionName); if (actionDescriptor == null || actionDescriptor.GetParameters().Length == 0) { return(null); } var contentType = GetModelProperty(controller, "ContentType") as Type; if (contentType == null && controller is IDynamicContentWidget) { var dynamicType = controller.GetDynamicContentType(); if (dynamicType != null) { contentType = TypeResolutionService.ResolveType(dynamicType.GetFullTypeName()); } } ISet <Guid> taxonomiesForType = null; if (contentType != null) { var properties = TypeDescriptor.GetProperties(contentType); taxonomiesForType = properties.OfType <TaxonomyPropertyDescriptor>().Select(x => x.TaxonomyId).ToHashSet(); } if (taxonomiesForType != null && taxonomiesForType.Count == 0) { return(null); } IUrlParamsMapper result = null; if (actionDescriptor.GetParameters()[0].ParameterType == typeof(ITaxon)) { string routeTemplate = GenerateRouteTemplate(taxonomiesForType); var taxonParamName = actionDescriptor.GetParameters()[0].ParameterName; if (actionDescriptor.GetParameters()[1].ParameterType == typeof(int?)) { var pageParamName = actionDescriptor.GetParameters()[1].ParameterName; var urlParamNames = new string[] { FeatherActionInvoker.TaxonNamedParamter, FeatherActionInvoker.PagingNamedParameter }; result = new CustomActionParamsMapper(controller, () => "/{" + taxonParamName + ":" + routeTemplate + "}/{" + pageParamName + "}", actionName, urlParamNames); } var urlTaxonParamNames = new string[] { FeatherActionInvoker.TaxonNamedParamter }; result = result.SetLast(new CustomActionParamsMapper(controller, () => "/{" + taxonParamName + ":" + routeTemplate + "}", actionName, urlTaxonParamNames)); } return(result); }
/// <summary> /// Gets the prefix parameters mapper. /// </summary> /// <param name="controller">The controller.</param> /// <returns></returns> internal IUrlParamsMapper GetPrefixParamsMapper(ControllerBase controller) { IUrlParamsMapper result = null; result = result .SetLast(this.GetInferredPagingMapper(controller, "Index")); // If no other mappers are added we skip the default one. if (result != null) { result.SetLast(new DefaultUrlParamsMapper(controller)); } return(result); }
public static IUrlParamsMapper SetLast(this IUrlParamsMapper first, IUrlParamsMapper last) { if (first == null) return last; if (last == null) return first; var current = first; while (current.Next != null) current = current.Next; current.SetNext(last); return first; }
/// <summary> /// Gets the default parameters mapper. /// </summary> /// <param name="controller">The controller.</param> /// <returns>The default parameters mapper for the controller.</returns> protected virtual IUrlParamsMapper GetDefaultParamsMapper(ControllerBase controller) { IUrlParamsMapper result = null; result = result .SetLast(this.GetInferredDetailActionParamsMapper(controller)) .SetLast(this.GetInferredTaxonFilterMapper(controller, "ListByTaxon")) .SetLast(this.GetInferredPagingMapper(controller, "Index")); // If no other mappers are added we skip the default one. if (result != null) { result.SetLast(new DefaultUrlParamsMapper(controller)); } return(result); }
/// <summary> /// Gets the default parameters mapper. /// </summary> /// <param name="controller">The controller.</param> /// <returns>The default parameters mapper for the controller.</returns> internal IUrlParamsMapper GetDefaultParamsMapper(ControllerBase controller) { IUrlParamsMapper result = null; result = result .SetLast(this.GetInferredDetailActionParamsMapper(controller)) .SetLast(this.GetInferredSuccessorsActionParamsMapper(controller)) .SetLast(this.GetInferredTaxonFilterQueryParamsMapper(controller, "ListByTaxon")) .SetLast(this.GetInferredTaxonFilterMapper(controller, "ListByTaxon")) .SetLast(this.GetInferredClassificationFilterMapper(controller, "ListByTaxon")) .SetLast(this.GetInferredDateFilterMapper(controller, "ListByDate")) .SetLast(this.GetInferredPagingMapper(controller, "Index")); // If no other mappers are added we skip the default one. if (result != null) { result.SetLast(new DefaultUrlParamsMapper(controller)); } return(result); }
private IUrlParamsMapper GetInferredSuccessorsActionParamsMapper(ControllerBase controller) { IUrlParamsMapper result = null; var controllerType = controller.GetType(); if (controllerType.ImplementsInterface(typeof(ICanFilterByParent))) { var successorsAction = new ReflectedControllerDescriptor(controllerType).FindAction(controller.ControllerContext, SuccessorsActionParamsMapper.DefaultActionName); if (successorsAction != null) { ICanFilterByParent canFilterByParent = controller as ICanFilterByParent; var parentContentTypes = canFilterByParent.GetParentTypes(); if (parentContentTypes != null && parentContentTypes.Count() > 0) { var providerName = this.GetModelProperty(controller, "ProviderName") as string; result = result.SetLast(new SuccessorsActionParamsMapper(controller, parentContentTypes, () => providerName)); } } } return(result); }
public static IUrlParamsMapper SetLast(this IUrlParamsMapper first, IUrlParamsMapper last) { if (first == null) { return(last); } if (last == null) { return(first); } var current = first; while (current.Next != null) { current = current.Next; } current.SetNext(last); return(first); }
private IUrlParamsMapper GetInferredTaxonFilterQueryParamsMapper(ControllerBase controller, string actionName) { IUrlParamsMapper result = null; var actionDescriptor = new ReflectedControllerDescriptor(controller.GetType()).FindAction(controller.ControllerContext, actionName); if (actionDescriptor == null || actionDescriptor.GetParameters().Length == 0) { return(null); } var queryParams = controller.ControllerContext.RequestContext.HttpContext.Request.QueryString; if (actionDescriptor.GetParameters()[0].ParameterType == typeof(ITaxon) && queryParams.Count == 3) { if (queryParams.Keys.Contains("taxonomy")) { result = new TaxonomyUrlParamsMapper(controller, new TaxonUrlMapper(new TaxonUrlEvaluatorAdapter())); } } return(result); }
/// <inheritdoc /> public IUrlParamsMapper SetNext(IUrlParamsMapper nextResolver) { this.next = nextResolver; return this.Next; }
/// <inheritdoc /> public IUrlParamsMapper SetNext(IUrlParamsMapper nextResolver) { this.next = nextResolver; return(this.Next); }