Esempio n. 1
0
        // 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();
        }
Esempio n. 3
0
        // 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);
        }