public static fromConfigObject()

in lib/application.ts [327:453]


    public static fromConfigObject(
        hostSettings: Settings, 
        jsValue: any, 
        basePath: string): ApplicationSettings {

        utils.ensureSchema(jsValue, this.APP_CONFIG_SCHEMA);

        let appSettings: ApplicationSettings = {
            baseDir: basePath,
            id: jsValue.id,
            description: jsValue.description,
            allowPerRequestOverride: jsValue.allowPerRequestOverride,
            defaultExecutionStack: jsValue.defaultExecutionStack,
            objectContextDef: hostSettings.objectContextDef,
            metrics: []
        };

        // Optional: allowPerRequestOverride. 
        // Inherit host settings if it's not provided from application.
        if (appSettings.allowPerRequestOverride == null) {
            appSettings.allowPerRequestOverride = hostSettings.allowPerRequestOverride;
        }

        // Optional: defaultExecutionStack. 
        // Inherit host settings if it's not provided from application.
        if (appSettings.defaultExecutionStack == null) {
            appSettings.defaultExecutionStack = hostSettings.defaultExecutionStack;
        }

        // Required: 'objectTypes'
        let typeDefFiles: string[] = jsValue.objectTypes;
        let typeDefinitions: TypeDef[] = [];
        let typeToFileName: { [typeName: string]: string } = {};
        for (let typeDefFile of typeDefFiles) {
            let typeDefs = TypeConfig.fromConfig(path.resolve(basePath, typeDefFile));
            for (let typeDefinition of typeDefs) {
                if (typeToFileName.hasOwnProperty(typeDefinition.typeName)
                    && !typeDefinition.override) {
                    throw new Error("Object type '"
                        + typeDefinition.typeName
                        + "' already exists in file '"
                        + typeToFileName[typeDefinition.typeName]
                        + "'. Did you forget to set property 'override' to true? ");
                }
                typeDefinitions.push(typeDefinition);
                typeToFileName[typeDefinition.typeName] = typeDefFile;
            }
        }

        // Optional: 'objectProviders'
        let providerDefFiles: string[] = jsValue.objectProviders;
        let providerDefinitions: ProviderDef[] = [];
        let protocolToFileName: { [protocolName: string]: string } = {};
        if (providerDefFiles != null) {
            for (let providerDefFile of providerDefFiles) {
                let providerDefs = ProviderConfig.fromConfig(path.resolve(basePath, providerDefFile));
                for (let providerDef of providerDefs) {
                    if (protocolToFileName.hasOwnProperty(providerDef.protocol)
                        && !providerDef.override) {
                        throw new Error("Object provider with protocol '"
                            + providerDef.protocol
                            + "' already exists in file '"
                            + protocolToFileName[providerDef.protocol]
                            + "' .Did you forget to set property 'override' to true? ");
                    }
                    providerDefinitions.push(providerDef);
                    protocolToFileName[providerDef.protocol] = providerDefFile;
                }
            }
        }

        // Required: 'namedObjects'
        let namedObjectDefFiles: string[] = jsValue.namedObjects;
        let namedObjectDefinitions: NamedObjectDef[] = [];
        let nameToFileName: {[objectName: string]: string} = {};

        for (let namedObjectDefFile of namedObjectDefFiles) {
            let objectDefs = NamedObjectConfig.fromConfig(path.resolve(basePath, namedObjectDefFile));
            for (let objectDef of objectDefs) {
                if (nameToFileName.hasOwnProperty(objectDef.name)
                    && !objectDef.override) {
                    throw new Error("Named object'"
                        + objectDef.name
                        + "' already exists in file '"
                        + nameToFileName[objectDef.name]
                        + "'. Did you forget to set property 'override' to true? ");
                }
                namedObjectDefinitions.push(objectDef);
                nameToFileName[objectDef.name] = namedObjectDefFile;
            }
        }

        appSettings.objectContextDef = new ScopedObjectContextDef(
            hostSettings.objectContextDef,
            typeDefinitions,
            providerDefinitions,
            namedObjectDefinitions,
            true                        // Enable depenency check.
            );      

        // Optional: 'metrics'
        let metricDefObject: any = jsValue.metrics;
        if (metricDefObject != null) {
            let sectionName = metricDefObject.sectionName;                    
            let metricDefFiles: string[] = metricDefObject.definition;
            let metricToFilename: { [metricName: string]: string } = {}
            
            metricDefFiles.forEach(metricDefFile => {
                let metricDefs = MetricConfig.fromConfig(
                    sectionName,
                    path.resolve(basePath, metricDefFile));

                metricDefs.forEach(metricDef => {
                    if (metricToFilename.hasOwnProperty(metricDef.name)) {
                        throw new Error("Metric '"
                            + metricDef.name
                            + "' already defined in file '"
                            + metricToFilename[metricDef.name]
                            + "'.");
                    }
                    appSettings.metrics.push(metricDef);
                    metricToFilename[metricDef.name] = metricDefFile;
                });
            });
        }
        return appSettings;
    }