package org.netbeans.gradle.project.properties;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import javax.annotation.Nonnull;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.NbGradleProject;
import org.netbeans.gradle.project.api.config.ProjectSettingsProvider;
import org.netbeans.gradle.project.api.config.ui.CustomizerCategoryId;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedForeignSettingsCategory;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsCategory;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsPage;
import org.netbeans.gradle.project.api.config.ui.ProfileBasedSettingsPageFactory;
import org.netbeans.gradle.project.properties.ui.ProfileBasedPanel;
import org.netbeans.spi.project.ui.support.ProjectCustomizer;
import org.openide.util.Lookup;
public final class ExtensionProjectSettingsPageDefs {
private final NbGradleProject project;
private final String extensionName;
private final Lookup[] extensionLookups;
// Lazily initialize to avoid too early project access.
private final AtomicReference<ProjectSettingsProvider.ExtensionSettings> extensionSettingsRef;
public ExtensionProjectSettingsPageDefs(
NbGradleProject project,
String extensionName,
Lookup... extensionLookups) {
ExceptionHelper.checkNotNullArgument(project, "project");
ExceptionHelper.checkNotNullArgument(extensionName, "extensionName");
this.project = project;
this.extensionName = extensionName;
this.extensionLookups = extensionLookups.clone();
this.extensionSettingsRef = new AtomicReference<>(null);
ExceptionHelper.checkNotNullElements(this.extensionLookups, "extensionLookups");
}
public static ProjectCustomizer.CompositeCategoryProvider createProfileBasedCustomizer(
@Nonnull final NbGradleProject project,
@Nonnull final CustomizerCategoryId categoryId,
@Nonnull final ProjectSettingsProvider.ExtensionSettings extensionSettings,
@Nonnull final ProfileBasedSettingsPageFactory pageFactory) {
ExceptionHelper.checkNotNullArgument(project, "project");
ExceptionHelper.checkNotNullArgument(categoryId, "categoryId");
ExceptionHelper.checkNotNullArgument(extensionSettings, "extensionSettings");
ExceptionHelper.checkNotNullArgument(pageFactory, "pageFactory");
ProfileBasedCustomizer.PanelFactory panelFactory = new ProfileBasedCustomizer.PanelFactory() {
@Override
public ProfileBasedPanel createPanel() {
ProfileBasedSettingsPage settingsPage = pageFactory.createSettingsPage();
return ProfileBasedPanel.createPanel(project, extensionSettings, settingsPage);
}
};
return new ProfileBasedCustomizer(categoryId.getCategoryName(), categoryId.getDisplayName(), panelFactory);
}
private ProjectSettingsProvider.ExtensionSettings getExtensionSettings() {
ProjectSettingsProvider.ExtensionSettings result = extensionSettingsRef.get();
if (result == null) {
ProjectSettingsProvider projectSettingsProvider = project.getProjectSettingsProvider();
result = projectSettingsProvider.getExtensionSettings(extensionName);
if (!extensionSettingsRef.compareAndSet(null, result)) {
result = extensionSettingsRef.get();
}
}
return result;
}
public void addAllExplicitProviders(List<ProjectCustomizer.CompositeCategoryProvider> result) {
for (Lookup lookup: extensionLookups) {
for (ProjectCustomizer.CompositeCategoryProvider provider: lookup.lookupAll(ProjectCustomizer.CompositeCategoryProvider.class)) {
result.add(provider);
}
}
}
public void addAllGenericProviders(List<ProjectCustomizer.CompositeCategoryProvider> result) {
ProjectSettingsProvider.ExtensionSettings extSettings = getExtensionSettings();
for (Lookup lookup: extensionLookups) {
for (ProfileBasedSettingsCategory categoryDef: lookup.lookupAll(ProfileBasedSettingsCategory.class)) {
CustomizerCategoryId categoryId = categoryDef.getCategoryId();
ProfileBasedSettingsPageFactory pageFactory = categoryDef.getSettingsPageFactory();
result.add(createProfileBasedCustomizer(project, categoryId, extSettings, pageFactory));
}
}
}
public void addAllForeignProviders(List<ProjectCustomizer.CompositeCategoryProvider> result) {
ProjectSettingsProvider settingsProvider = project.getProjectSettingsProvider();
for (Lookup lookup: extensionLookups) {
for (ProfileBasedForeignSettingsCategory foreignDef: lookup.lookupAll(ProfileBasedForeignSettingsCategory.class)) {
ProfileBasedSettingsCategory categoryDef = foreignDef.getSettingsCategory();
CustomizerCategoryId categoryId = categoryDef.getCategoryId();
ProfileBasedSettingsPageFactory pageFactory = categoryDef.getSettingsPageFactory();
ProjectSettingsProvider.ExtensionSettings extSettings
= settingsProvider.getExtensionSettings(foreignDef.getExtensionName());
result.add(createProfileBasedCustomizer(project, categoryId, extSettings, pageFactory));
}
}
}
public List<ProjectCustomizer.CompositeCategoryProvider> getCustomizers() {
List<ProjectCustomizer.CompositeCategoryProvider> result = new ArrayList<>();
addAllGenericProviders(result);
addAllExplicitProviders(result);
addAllForeignProviders(result);
return result;
}
}