package org.netbeans.gradle.project.newproject; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import javax.swing.JComponent; import javax.swing.event.ChangeListener; import org.netbeans.api.annotations.common.StaticResource; import org.netbeans.api.java.platform.JavaPlatform; import org.netbeans.api.templates.TemplateRegistration; import org.netbeans.gradle.project.NbIcons; import org.netbeans.gradle.project.properties.standard.SourceLevelProperty; import org.netbeans.gradle.project.script.CommonScripts; import org.netbeans.gradle.project.script.GroovyScripts; import org.netbeans.gradle.project.util.NbFileUtils; import org.netbeans.gradle.project.util.StringUtils; import org.openide.WizardDescriptor; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle.Messages; @TemplateRegistration( folder="Project/Gradle", displayName="#template.singleGradleProject", description="SingleProject.html", iconBase=NbIcons.PROJECT_ICON_PATH) @Messages("template.singleGradleProject=Single Gradle Project") public final class GradleSingleProjectWizardIterator implements WizardDescriptor.BackgroundInstantiatingIterator<WizardDescriptor> { @StaticResource private static final String SINGLE_PROJECT_BUILD_GRADLE = "org/netbeans/gradle/project/resources/newproject/single-project.gradle"; @StaticResource private static final String SINGLE_PROJECT_SETTINGS_GRADLE = "org/netbeans/gradle/project/resources/newproject/single-project-settings.gradle"; private static final String EXTENSION = GroovyScripts.EXTENSION; private final List<WizardDescriptor.Panel<WizardDescriptor>> descriptors; private final AtomicReference<GradleSingleProjectConfig> configRef; private int descriptorIndex; public GradleSingleProjectWizardIterator() { this.descriptors = new ArrayList<>(1); this.descriptorIndex = 0; this.configRef = new AtomicReference<>(null); } private static void createBuildGradle( Path projectDir, GradleSingleProjectConfig config) throws IOException { String mainClass = config.getMainClass(); String sourceLevel = SourceLevelProperty.getSourceLevelFromPlatform(JavaPlatform.getDefault()); Map<String, String> varReplaceMap = new HashMap<>(); varReplaceMap.put("${MAIN_CLASS}", StringUtils.emptyForNull(mainClass)); varReplaceMap.put("${SOURCE_LEVEL}", sourceLevel); NewProjectUtils.copyTemplateFile(SINGLE_PROJECT_BUILD_GRADLE, projectDir.resolve(CommonScripts.BUILD_BASE_NAME + EXTENSION), NewProjectUtils.DEFAULT_FILE_ENCODING, varReplaceMap); } private static void createSettingsGradle(Path projectDir) throws IOException { Map<String, String> varReplaceMap = Collections.singletonMap("${PROJECT_NAME}", NbFileUtils.getFileNameStr(projectDir)); NewProjectUtils.copyTemplateFile(SINGLE_PROJECT_SETTINGS_GRADLE, projectDir.resolve(CommonScripts.SETTINGS_BASE_NAME + EXTENSION), NewProjectUtils.DEFAULT_FILE_ENCODING, varReplaceMap); } @Override public Set<FileObject> instantiate() throws IOException { GradleSingleProjectConfig config = configRef.get(); if (config == null) { throw new IOException("Missing configuration."); } Path projectDir = config.getProjectFolder().normalize(); Files.createDirectories(projectDir); FileObject projectDirObj = FileUtil.toFileObject(projectDir.toFile()); if (projectDirObj == null) { throw new IOException("Failed to open directory: " + projectDir); } NewProjectUtils.createDefaultSourceDirs(projectDir); createBuildGradle(projectDir, config); createSettingsGradle(projectDir); String mainClass = config.getMainClass(); if (mainClass != null) { NewProjectUtils.createMainClass(projectDir, mainClass); } return Collections.singleton(projectDirObj); } @Override public void initialize(WizardDescriptor wizard) { uninitialize(wizard); descriptorIndex = 0; descriptors.add(new GradleSingleProjectConfigPanel(configRef, wizard)); wizard.putProperty ("NewProjectWizard_Title", "Gradle Single Project"); // NOI18N JComponent c = (JComponent) descriptors.get(0).getComponent(); c.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, 0); c.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, new String[] {"Name and Location"}); c.setName("Name and Location"); } @Override public void uninitialize(WizardDescriptor wizard) { descriptors.clear(); configRef.set(null); } @Override public WizardDescriptor.Panel<WizardDescriptor> current() { return descriptors.get(descriptorIndex); } @Override public String name() { return "GradleSingleProjectTemplate"; } @Override public boolean hasNext() { return descriptorIndex < descriptors.size() - 1; } @Override public boolean hasPrevious() { return descriptorIndex > 0; } @Override public void nextPanel() { if (!hasNext()) { throw new NoSuchElementException(); } descriptorIndex++; } @Override public void previousPanel() { if (!hasPrevious()) { throw new NoSuchElementException(); } descriptorIndex--; } @Override public void addChangeListener(ChangeListener l) { } @Override public void removeChangeListener(ChangeListener l) { } }