/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; import { TPromise } from 'vs/base/common/winjs.base'; import { ConfigWatcher } from 'vs/base/node/config'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle'; import { ConfigurationSource, IConfigurationService, IConfigurationServiceEvent, IConfigurationValue, IConfigurationKeys, ConfigurationModel, IConfigurationOverrides, Configuration, IConfigurationValues, IConfigurationData } from 'vs/platform/configuration/common/configuration'; import { CustomConfigurationModel, DefaultConfigurationModel } from 'vs/platform/configuration/common/model'; import Event, { Emitter } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable { _serviceBrand: any; private _configuration: Configuration; private userConfigModelWatcher: ConfigWatcher>; private _onDidUpdateConfiguration: Emitter = this._register(new Emitter()); public readonly onDidUpdateConfiguration: Event = this._onDidUpdateConfiguration.event; constructor( @IEnvironmentService environmentService: IEnvironmentService ) { super(); this.userConfigModelWatcher = new ConfigWatcher(environmentService.appSettingsPath, { changeBufferDelay: 300, defaultConfig: new CustomConfigurationModel(null, environmentService.appSettingsPath), parse: (content: string, parseErrors: any[]) => { const userConfigModel = new CustomConfigurationModel(content, environmentService.appSettingsPath); parseErrors = [...userConfigModel.errors]; return userConfigModel; } }); this._register(toDisposable(() => this.userConfigModelWatcher.dispose())); // Listeners this._register(this.userConfigModelWatcher.onDidUpdateConfiguration(() => this.onConfigurationChange(ConfigurationSource.User))); this._register(Registry.as(Extensions.Configuration).onDidRegisterConfiguration(() => this.onConfigurationChange(ConfigurationSource.Default))); } public configuration(): Configuration { return this._configuration || (this._configuration = this.consolidateConfigurations()); } private onConfigurationChange(source: ConfigurationSource): void { this.reset(); // reset our caches const cache = this.configuration(); this._onDidUpdateConfiguration.fire({ source, sourceConfig: source === ConfigurationSource.Default ? cache.defaults.contents : cache.user.contents }); } public reloadConfiguration(section?: string): TPromise { return new TPromise(c => { this.userConfigModelWatcher.reload(() => { this.reset(); // reset our caches c(this.getConfiguration(section)); }); }); } public getConfiguration(section?: string, options?: IConfigurationOverrides): C { return this.configuration().getValue(section, options); } public lookup(key: string, options?: IConfigurationOverrides): IConfigurationValue { return this.configuration().lookup(key, options); } public keys(): IConfigurationKeys { return this.configuration().keys(); } public values(): IConfigurationValues { return this._configuration.values(); } public getConfigurationData(): IConfigurationData { return this.configuration().toData(); } private reset(): void { this._configuration = this.consolidateConfigurations(); } private consolidateConfigurations(): Configuration { const defaults = new DefaultConfigurationModel(); const user = this.userConfigModelWatcher.getConfig(); return new Configuration(defaults, user); } }