// PRIVATE METHODS ////////////////////////////////////////////////// #region Factory Methods private static IDocumentContextOptions CreateDocumentContextOptions(IServiceModel apiServiceModel, IHypermediaAssemblerRegistry apiHypermediaAssemblerRegistry, IOptions <ApiHypermediaOptions> apiHypermediaOptionsAccessor) { Contract.Requires(apiServiceModel != null); Contract.Requires(apiHypermediaOptionsAccessor != null); var options = new DocumentContextOptions <DocumentContext>(); var optionsBuilder = new DocumentContextOptionsBuilder(options); optionsBuilder.UseServiceModel(apiServiceModel); if (apiHypermediaAssemblerRegistry != null) { optionsBuilder.UseHypermediaAssemblerRegistry(apiHypermediaAssemblerRegistry); } var apiHypermediaOptions = apiHypermediaOptionsAccessor.Value; var scheme = apiHypermediaOptions.Scheme; var host = apiHypermediaOptions.Host; var port = apiHypermediaOptions.Port; var urlBuilderConfiguration = new UrlBuilderConfiguration(scheme, host, port); optionsBuilder.UseUrlBuilderConfiguration(urlBuilderConfiguration); return(options); }
// INTERNAL CONSTRUCTORS //////////////////////////////////////////// #region Constructors internal DocumentBuilder(DocumentWriter documentWriter, IHypermediaAssemblerRegistry hypermediaAssemblerRegistry, IHypermediaContext hypermediaContext, DocumentBuilderContext documentBuilderContext) { Contract.Requires(documentWriter != null); Contract.Requires(documentBuilderContext != null); var serviceModel = documentWriter.ServiceModel; var domDocument = documentWriter.DomDocument; this.DomDocument = domDocument; this.ServiceModel = serviceModel; this.DocumentWriter = documentWriter; this.HypermediaAssemblerRegistry = hypermediaAssemblerRegistry; this.HypermediaContext = hypermediaContext; this.DocumentBuilderContext = documentBuilderContext; this.SetDocumentPathContextNodeAttribute(); }
// PUBLIC METHODS /////////////////////////////////////////////////// #region Extension Methods public static IDocumentContextOptionsBuilder UseHypermediaAssemblerRegistry(this IDocumentContextOptionsBuilder documentContextOptionsBuilder, IHypermediaAssemblerRegistry hypermediaAssemblerRegistry) { Contract.Requires(documentContextOptionsBuilder != null); Contract.Requires(hypermediaAssemblerRegistry != null); documentContextOptionsBuilder.ModifyExtension <ServerDocumentContextExtension>(x => x.HypermediaAssemblerRegistry = hypermediaAssemblerRegistry); return(documentContextOptionsBuilder); }
// PUBLIC METHODS /////////////////////////////////////////////////// #region Extensions Methods public static IHypermediaAssembler SafeGetAssembler(this IHypermediaAssemblerRegistry hypermediaAssemblerRegistry, IEnumerable <IHypermediaPath> hypermediaPaths) { if (hypermediaAssemblerRegistry == null || hypermediaPaths == null) { var hypermediaAssembler = HypermediaAssemblerRegistry.GetDefaultAssembler(); return(hypermediaAssembler); } var clrResourceTypes = hypermediaPaths.GetClrResourceTypes() .SafeToReadOnlyList(); var clrResourceTypesCount = clrResourceTypes.Count; switch (clrResourceTypesCount) { case 0: { // At the API entry point, for now return default assembler. var hypermediaAssembler = HypermediaAssemblerRegistry.GetDefaultAssembler(); return(hypermediaAssembler); } case 1: { var clrResourceType = clrResourceTypes[0]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrResourceType); return(hypermediaAssembler); } case 2: { var clrPath1Type = clrResourceTypes[0]; var clrResourceType = clrResourceTypes[1]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrPath1Type, clrResourceType); return(hypermediaAssembler); } case 3: { var clrPath1Type = clrResourceTypes[0]; var clrPath2Type = clrResourceTypes[1]; var clrResourceType = clrResourceTypes[2]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrPath1Type, clrPath2Type, clrResourceType); return(hypermediaAssembler); } case 4: { var clrPath1Type = clrResourceTypes[0]; var clrPath2Type = clrResourceTypes[1]; var clrPath3Type = clrResourceTypes[2]; var clrResourceType = clrResourceTypes[3]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrPath1Type, clrPath2Type, clrPath3Type, clrResourceType); return(hypermediaAssembler); } case 5: { var clrPath1Type = clrResourceTypes[0]; var clrPath2Type = clrResourceTypes[1]; var clrPath3Type = clrResourceTypes[2]; var clrPath4Type = clrResourceTypes[3]; var clrResourceType = clrResourceTypes[4]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrPath1Type, clrPath2Type, clrPath3Type, clrPath4Type, clrResourceType); return(hypermediaAssembler); } case 6: { var clrPath1Type = clrResourceTypes[0]; var clrPath2Type = clrResourceTypes[1]; var clrPath3Type = clrResourceTypes[2]; var clrPath4Type = clrResourceTypes[3]; var clrPath5Type = clrResourceTypes[4]; var clrResourceType = clrResourceTypes[5]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrPath1Type, clrPath2Type, clrPath3Type, clrPath4Type, clrPath5Type, clrResourceType); return(hypermediaAssembler); } case 7: { var clrPath1Type = clrResourceTypes[0]; var clrPath2Type = clrResourceTypes[1]; var clrPath3Type = clrResourceTypes[2]; var clrPath4Type = clrResourceTypes[3]; var clrPath5Type = clrResourceTypes[4]; var clrPath6Type = clrResourceTypes[5]; var clrResourceType = clrResourceTypes[6]; var hypermediaAssembler = hypermediaAssemblerRegistry.GetAssembler(clrPath1Type, clrPath2Type, clrPath3Type, clrPath4Type, clrPath5Type, clrPath6Type, clrResourceType); return(hypermediaAssembler); } } var internalHypermediaPathSizeLimit = clrResourceTypesCount + 1; var detail = ServerErrorStrings.InternalErrorExceptionDetailExceededHypermediaPathSizeLimit .FormatWith(internalHypermediaPathSizeLimit); throw new InternalErrorException(detail); }
public static void SetHypermediaAssemblerRegistry(this IDocumentContextImplementation implementation, IHypermediaAssemblerRegistry hypermediaAssemblerRegistry) { Contract.Requires(implementation != null); Contract.Requires(hypermediaAssemblerRegistry != null); implementation.Options.ModifyExtension <ServerDocumentContextExtension>(x => x.HypermediaAssemblerRegistry = hypermediaAssemblerRegistry); }