package org.netbeans.gradle.project.properties;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.jtrim.cancel.CancellationToken;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.api.config.ActiveSettingsQuery;
import org.netbeans.gradle.project.api.config.ActiveSettingsQueryListener;
import org.netbeans.gradle.project.api.config.ProfileDef;
import org.netbeans.gradle.project.api.config.ProfileKey;
import org.netbeans.gradle.project.api.config.ProjectSettingsProvider;
public final class DefaultProjectSettingsProvider implements ProjectSettingsProvider {
private final NbGradleSingleProjectConfigProvider configProvider;
private final ProjectProfileLoader profileLoader;
public DefaultProjectSettingsProvider(
NbGradleSingleProjectConfigProvider configProvider,
ProjectProfileLoader profileLoader) {
ExceptionHelper.checkNotNullArgument(configProvider, "configProvider");
ExceptionHelper.checkNotNullArgument(profileLoader, "profileLoader");
this.configProvider = configProvider;
this.profileLoader = profileLoader;
}
@Override
public Collection<ProfileDef> getCurrentProfileDefs() {
Collection<NbGradleConfiguration> configs = configProvider.getConfigurations();
List<ProfileDef> result = new ArrayList<>(configs.size());
for (NbGradleConfiguration config: configs) {
result.add(config.getProfileDef());
}
return result;
}
@Override
public ExtensionSettings getExtensionSettings(final String extensionName) {
ExceptionHelper.checkNotNullArgument(extensionName, "extensionName");
if (extensionName.isEmpty()) {
return new RootExtensionSettings(configProvider, profileLoader);
}
else {
return new ExtensionSettingsImpl(configProvider, profileLoader, extensionName);
}
}
private static final class RootExtensionSettings implements ExtensionSettings {
private final NbGradleSingleProjectConfigProvider configProvider;
private final ProjectProfileLoader profileLoader;
public RootExtensionSettings(
NbGradleSingleProjectConfigProvider configProvider,
ProjectProfileLoader profileLoader) {
this.configProvider = configProvider;
this.profileLoader = profileLoader;
}
@Override
public ActiveSettingsQuery getActiveSettings() {
return configProvider.getActiveSettingsQuery();
}
@Override
public ActiveSettingsQuery loadSettingsForProfile(CancellationToken cancelToken, ProfileKey profile) {
return profileLoader.loadActiveSettingsForProfile(profile);
}
@Override
public void loadSettingsForProfile(CancellationToken cancelToken, ProfileKey profile, ActiveSettingsQueryListener settingsQueryListener) {
profileLoader.loadActiveSettingsForProfile(profile, settingsQueryListener);
}
}
private static final class ExtensionSettingsImpl implements ExtensionSettings {
private final ProjectProfileLoader profileLoader;
private final ExtensionActiveSettingsQuery activeSettings;
private final String extensionName;
public ExtensionSettingsImpl(
NbGradleSingleProjectConfigProvider configProvider,
ProjectProfileLoader profileLoader,
String extensionName) {
this.activeSettings = new ExtensionActiveSettingsQuery(
configProvider.getActiveSettingsQuery(),
extensionName);
this.profileLoader = profileLoader;
this.extensionName = extensionName;
}
@Override
public ActiveSettingsQuery getActiveSettings() {
return activeSettings;
}
@Override
public ActiveSettingsQuery loadSettingsForProfile(CancellationToken cancelToken, ProfileKey profile) {
ExceptionHelper.checkNotNullArgument(cancelToken, "cancelToken");
ActiveSettingsQueryEx rootSettings = profileLoader.loadActiveSettingsForProfile(profile);
return new ExtensionActiveSettingsQuery(rootSettings, extensionName);
}
@Override
public void loadSettingsForProfile(CancellationToken cancelToken, ProfileKey profile, final ActiveSettingsQueryListener settingsQueryListener) {
ExceptionHelper.checkNotNullArgument(cancelToken, "cancelToken");
ExceptionHelper.checkNotNullArgument(settingsQueryListener, "settingsQueryListener");
profileLoader.loadActiveSettingsForProfile(profile, new ActiveSettingsQueryListener() {
@Override
public void onLoad(ActiveSettingsQuery settings) {
settingsQueryListener.onLoad(new ExtensionActiveSettingsQuery(settings, extensionName));
}
});
}
}
}