diff --git a/extide/gradle/manifest.mf b/extide/gradle/manifest.mf
index 4588b852e960..396a65a814ed 100644
--- a/extide/gradle/manifest.mf
+++ b/extide/gradle/manifest.mf
@@ -3,4 +3,5 @@ AutoUpdate-Show-In-Client: true
OpenIDE-Module: org.netbeans.modules.gradle/2
OpenIDE-Module-Layer: org/netbeans/modules/gradle/layer.xml
OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/gradle/Bundle.properties
+OpenIDE-Module-Java-Dependencies: Java > 17
OpenIDE-Module-Specification-Version: 2.40
diff --git a/extide/gradle/nbproject/project.properties b/extide/gradle/nbproject/project.properties
index 54dab6898e2a..8666db6808cf 100644
--- a/extide/gradle/nbproject/project.properties
+++ b/extide/gradle/nbproject/project.properties
@@ -17,7 +17,8 @@
file.reference.netbeans-gradle-tooling.jar=release/modules/gradle/netbeans-gradle-tooling.jar
is.autoload=true
-javac.source=1.8
+javac.source=17
+javac.target=17
javac.compilerargs=-Xlint -Xlint:-serial
javadoc.arch=${basedir}/arch.xml
javadoc.apichanges=${basedir}/apichanges.xml
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java b/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
index b6deb583b2ea..98e60c67cb59 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/execute/EscapeProcessingOutputStream.java
@@ -32,7 +32,7 @@
*
* @author Laszlo Kishalmi
*/
-class EscapeProcessingOutputStream extends OutputStream {
+public class EscapeProcessingOutputStream extends OutputStream {
private static final RequestProcessor RP = new RequestProcessor(EscapeProcessingOutputStream.class);
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java b/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
index 924b5ad29075..ccd562fdfbe9 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/execute/GradlePlainEscapeProcessor.java
@@ -28,9 +28,8 @@
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import org.netbeans.api.project.Project;
+import org.netbeans.modules.gradle.output.GradleProcessorFactory;
import org.openide.util.Lookup;
import org.openide.windows.IOColorPrint;
import org.openide.windows.IOColors;
@@ -57,13 +56,20 @@ public class GradlePlainEscapeProcessor implements EscapeProcessor {
public GradlePlainEscapeProcessor(InputOutput io, RunConfig cfg, boolean error) {
this.io = io;
output = new IODisplayer();
- Project prj = cfg.getProject();
- if (prj != null) {
- processorsFromLookup(prj.getLookup(), cfg);
+ if (cfg != null) {
+ Project prj = cfg.getProject();
+ if (prj != null) {
+ processorsFromLookup(prj.getLookup(), cfg);
+ }
}
outType = error ? ERROR : OUTPUT;
- processors.add(TASK_LINE_PROCESSOR);
- processors.add(STATIC_STRING_PROCESSOR);
+ processors.add(GradleProcessorFactory.URL_PROCESSOR);
+ processors.add(GradleProcessorFactory.TASK_LINE_PROCESSOR);
+ processors.add(GradleProcessorFactory.STATIC_STRING_PROCESSOR);
+ }
+
+ public GradlePlainEscapeProcessor(InputOutput io, boolean error) {
+ this(io, null, error);
}
private void processorsFromLookup(Lookup lookup, RunConfig cfg) {
@@ -138,51 +144,4 @@ public void outputLineAction(OutputEvent ev) {
}
- private static final OutputProcessor TASK_LINE_PROCESSOR = new OutputProcessor() {
- final Pattern TASK_LINE = Pattern.compile("> Task (:[\\w:\\-]+)( [\\w\\-]+)?"); //NOI18N
- @Override
- public boolean processLine(OutputDisplayer out, String line) {
- Matcher m = TASK_LINE.matcher(line);
- boolean ret = m.matches();
- if (ret) {
- String task = m.group(1);
- String state = m.group(2);
- out.print("> Task "); //NOI18N
- out.print(task);
- if (state != null) {
- OutputType type = LOG_WARNING;
- if (state.endsWith("EXECUTED") || state.endsWith("UP-TO-DATE") || state.endsWith("FROM-CACHE")) { //NOI18N
- type = LOG_SUCCESS;
- } else if (state.endsWith("FAILED")) { //NOI18N
- type = LOG_FAILURE;
- }
- out.print(state , null, type);
- }
- }
- return ret;
- }
- };
-
- private static final OutputProcessor STATIC_STRING_PROCESSOR = new OutputProcessor() {
- private static final String BUILD_FAILED_MSG = "BUILD FAILED"; //NOI18N
- private static final String BUILD_SUCCESS_MSG = "BUILD SUCCESSFUL"; //NOI18N
- private static final String COD_INCUBATION_MSG = "Configuration on demand is an incubating feature."; //NOI18N
- private static final String CONFIG_CACHE_MGS = "Configuration cache "; //NOI18N
-
- @Override
- public boolean processLine(OutputDisplayer out, String line) {
- OutputType type = null;
- if (line.startsWith(COD_INCUBATION_MSG) || line.startsWith(CONFIG_CACHE_MGS)) {
- type = LOG_DEBUG;
- } else if (line.startsWith(BUILD_SUCCESS_MSG)) {
- type = LOG_SUCCESS;
- } else if (line.startsWith(BUILD_FAILED_MSG)) {
- type = LOG_FAILURE;
- }
- if (type != null) {
- out.print(line, null, type);
- }
- return type != null;
- }
- };
}
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties b/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties
index ac9d4efe213f..db3fe595bf49 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties
+++ b/extide/gradle/src/org/netbeans/modules/gradle/newproject/Bundle.properties
@@ -29,3 +29,12 @@ ProjectAttributesPanelVisual.btBrowse.text=Br&owse...
SubProjectPanelVisual.lbSubProjects.text=Sub-&Projects:
ProjectAttributesPanelVisual.cbInitWrapper.text=Initialize Gradle Wrapper
SubProjectPanelVisual.lbSubProjectHint.text=Hints:
Each non-empty line is treaded as a sub-project to be created.
\nThe format of a line is:
\n[rel/path/]<sub-project name>[<whitespace>]<Description>]
+GradleInitPanelVisual.btBrowse.text=Browse...
+GradleInitPanelVisual.lbLocation.text=Project Location:
+GradleInitPanelVisual.lbProjectName.text=Project Name:
+GradleInitPanelVisual.lbProjectFolder.text=Project Folder:
+GradleInitPanelVisual.lbPackageName.text=Package Name:
+GradleInitPanelVisual.lbJavaVersion.text=Java Version:
+GradleInitPanelVisual.lbTestFramework.text=Test Framework:
+GradleInitPanelVisual.cbComments.text=Generate Comments
+GradleInitPanelVisual.lbDSL.text=Gradle DSL
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanel.java b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanel.java
new file mode 100644
index 000000000000..9afb48242b38
--- /dev/null
+++ b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanel.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.newproject;
+
+import javax.swing.event.ChangeListener;
+import org.openide.WizardDescriptor;
+import org.openide.util.HelpCtx;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class GradleInitPanel implements WizardDescriptor.Panel {
+
+ private GradleInitPanelVisual initPanel;
+
+ @Override
+ public GradleInitPanelVisual getComponent() {
+ if (initPanel == null) {
+ initPanel = new GradleInitPanelVisual();
+ }
+ return initPanel;
+ }
+
+ @Override
+ public HelpCtx getHelp() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public void readSettings(WizardDescriptor settings) {
+ initPanel.read(settings);
+ }
+
+ @Override
+ public void storeSettings(WizardDescriptor settings) {
+ initPanel.write(settings);
+ }
+
+ @Override
+ public boolean isValid() {
+ return true;
+ }
+
+ @Override
+ public void addChangeListener(ChangeListener l) {
+ }
+
+ @Override
+ public void removeChangeListener(ChangeListener l) {
+ }
+
+}
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.form b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.form
new file mode 100644
index 000000000000..b2aa641e327b
--- /dev/null
+++ b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.form
@@ -0,0 +1,209 @@
+
+
+
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.java b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.java
new file mode 100644
index 000000000000..d3fd219d38e0
--- /dev/null
+++ b/extide/gradle/src/org/netbeans/modules/gradle/newproject/GradleInitPanelVisual.java
@@ -0,0 +1,318 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.newproject;
+
+import java.io.File;
+import java.util.List;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.Document;
+import static org.netbeans.modules.gradle.newproject.ProjectAttributesPanelVisual.PROP_PROJECT_NAME;
+import static org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_NAME;
+import static org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_PACKAGE_BASE;
+import static org.netbeans.modules.gradle.spi.newproject.GradleInitWizard.*;
+import org.netbeans.spi.project.ui.support.CommonProjectActions;
+import org.netbeans.spi.project.ui.support.ProjectChooser;
+import org.openide.WizardDescriptor;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public class GradleInitPanelVisual extends javax.swing.JPanel {
+
+ /**
+ * Creates new form GradleInitPanelVisual
+ */
+ public GradleInitPanelVisual() {
+ initComponents();
+
+ cbDSL.setModel(new DefaultComboBoxModel<>(GradleDSL.values()));
+ tfProjectName.getDocument().addDocumentListener(fieldUpdater);
+ tfLocation.getDocument().addDocumentListener(fieldUpdater);
+ tfPackageName.getDocument().addDocumentListener(fieldUpdater);
+
+
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ lbProjectName = new javax.swing.JLabel();
+ tfProjectName = new javax.swing.JTextField();
+ lbLocation = new javax.swing.JLabel();
+ tfLocation = new javax.swing.JTextField();
+ btBrowse = new javax.swing.JButton();
+ lbProjectFolder = new javax.swing.JLabel();
+ tfProjectFolder = new javax.swing.JTextField();
+ lbPackageName = new javax.swing.JLabel();
+ tfPackageName = new javax.swing.JTextField();
+ lbJavaVersion = new javax.swing.JLabel();
+ cbJavaVersion = new javax.swing.JComboBox<>();
+ lbTestFramework = new javax.swing.JLabel();
+ cbTestFramework = new javax.swing.JComboBox<>();
+ lbDSL = new javax.swing.JLabel();
+ cbDSL = new javax.swing.JComboBox<>();
+ cbComments = new javax.swing.JCheckBox();
+
+ lbProjectName.setLabelFor(tfProjectName);
+ org.openide.awt.Mnemonics.setLocalizedText(lbProjectName, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbProjectName.text")); // NOI18N
+
+ lbLocation.setLabelFor(tfLocation);
+ org.openide.awt.Mnemonics.setLocalizedText(lbLocation, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbLocation.text")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(btBrowse, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.btBrowse.text")); // NOI18N
+
+ lbProjectFolder.setLabelFor(tfProjectFolder);
+ org.openide.awt.Mnemonics.setLocalizedText(lbProjectFolder, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbProjectFolder.text")); // NOI18N
+
+ tfProjectFolder.setEditable(false);
+
+ lbPackageName.setLabelFor(tfPackageName);
+ org.openide.awt.Mnemonics.setLocalizedText(lbPackageName, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbPackageName.text")); // NOI18N
+
+ lbJavaVersion.setLabelFor(cbJavaVersion);
+ org.openide.awt.Mnemonics.setLocalizedText(lbJavaVersion, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbJavaVersion.text")); // NOI18N
+
+ lbTestFramework.setLabelFor(cbTestFramework);
+ org.openide.awt.Mnemonics.setLocalizedText(lbTestFramework, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbTestFramework.text")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(lbDSL, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.lbDSL.text")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(cbComments, org.openide.util.NbBundle.getMessage(GradleInitPanelVisual.class, "GradleInitPanelVisual.cbComments.text")); // NOI18N
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+ this.setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(lbPackageName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(lbJavaVersion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(lbLocation, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(lbProjectFolder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(lbProjectName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addGap(0, 0, Short.MAX_VALUE))
+ .addComponent(lbTestFramework, javax.swing.GroupLayout.DEFAULT_SIZE, 141, Short.MAX_VALUE)
+ .addComponent(lbDSL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addGroup(layout.createSequentialGroup()
+ .addComponent(cbDSL, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addGap(18, 18, 18)
+ .addComponent(cbComments))
+ .addComponent(cbJavaVersion, javax.swing.GroupLayout.Alignment.LEADING, 0, 291, Short.MAX_VALUE)
+ .addComponent(tfLocation, javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(tfProjectName, javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(tfProjectFolder, javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(tfPackageName, javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(cbTestFramework, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(btBrowse)
+ .addContainerGap())
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(lbProjectName)
+ .addComponent(tfProjectName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(lbLocation)
+ .addComponent(tfLocation, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(btBrowse))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(lbProjectFolder)
+ .addComponent(tfProjectFolder, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addGap(18, 18, 18)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(tfPackageName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(lbPackageName))
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(cbJavaVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(lbJavaVersion))
+ .addGap(18, 18, 18)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(cbTestFramework, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(lbTestFramework))
+ .addGap(18, 18, 18)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(cbComments)
+ .addComponent(lbDSL)
+ .addComponent(cbDSL, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+ .addContainerGap(54, Short.MAX_VALUE))
+ );
+ }// //GEN-END:initComponents
+
+ void read(WizardDescriptor settings) {
+ File loc = (File) settings.getProperty(CommonProjectActions.PROJECT_PARENT_FOLDER);
+ if (loc == null || loc.getParentFile() == null || !loc.getParentFile().isDirectory()) {
+ loc = ProjectChooser.getProjectsFolder();
+ }
+ tfLocation.setText(loc.getAbsolutePath());
+
+ String name = (String) settings.getProperty(PROP_NAME);
+
+ name = name != null ? name : firstAvailableName(loc, "gradleproject"); //NOI18N
+ tfProjectName.setText(name);
+
+ if (settings.getProperty(PROP_JAVA_VERSIONS) != null) {
+ List javaVersions = (List) settings.getProperty(PROP_JAVA_VERSIONS);
+ DefaultComboBoxModel versionModel = new DefaultComboBoxModel<>(javaVersions.toArray(Integer[]::new));
+ cbJavaVersion.setModel(versionModel);
+
+ if (settings.getProperty(PROP_JAVA_VERSION) != null) {
+ cbJavaVersion.setSelectedItem(settings.getProperty(PROP_JAVA_VERSION));
+ }
+ } else {
+ lbJavaVersion.setVisible(false);
+ cbJavaVersion.setVisible(false);
+ }
+
+ if (settings.getProperty(PROP_TEST_FRAMEWORKS) != null) {
+ List testframeworks = (List) settings.getProperty(PROP_TEST_FRAMEWORKS);
+ DefaultComboBoxModel frameworkModel = new DefaultComboBoxModel<>(testframeworks.toArray(TestFramework[]::new));
+ cbTestFramework.setModel(frameworkModel);
+ if (settings.getProperty(PROP_TEST_FRAMEWORK) != null) {
+ cbJavaVersion.setSelectedItem(settings.getProperty(PROP_TEST_FRAMEWORK));
+ }
+ } else {
+ lbTestFramework.setVisible(false);
+ cbTestFramework.setVisible(false);
+ }
+ Boolean comments = (Boolean) settings.getProperty(PROP_COMMENTS);
+ cbComments.setSelected(comments != null ? comments : true);
+
+ tfProjectName.selectAll();
+
+ }
+
+ void write(WizardDescriptor settings) {
+ File projectFolder = new File(tfLocation.getText());
+ ProjectChooser.setProjectsFolder(projectFolder);
+ settings.putProperty(CommonProjectActions.PROJECT_PARENT_FOLDER,
+ projectFolder);
+ settings.putProperty(PROP_NAME, tfProjectName.getText());
+ if (tfPackageName.isVisible()) {
+ settings.putProperty(PROP_PACKAGE_BASE, tfPackageName.getText());
+ }
+
+ if (settings.getProperty(PROP_JAVA_VERSIONS) != null) {
+ settings.putProperty(PROP_JAVA_VERSION, cbJavaVersion.getSelectedItem());
+ }
+
+ if (settings.getProperty(PROP_TEST_FRAMEWORKS) != null) {
+ settings.putProperty(PROP_TEST_FRAMEWORK, cbTestFramework.getSelectedItem());
+ }
+
+ settings.putProperty(PROP_DSL, cbDSL.getSelectedItem());
+ settings.putProperty(PROP_COMMENTS, cbComments.isSelected());
+ }
+
+ private static String firstAvailableName(File dir, String baseName) {
+ int index = 1;
+ String name;
+ File folder;
+ do {
+ name = baseName + String.valueOf(index++);
+ folder = new File(dir, name);
+ } while (folder.exists());
+ return name;
+ }
+
+ private void updateTextFields(DocumentEvent e) {
+ Document doc = e.getDocument();
+
+ if (tfProjectName.getDocument() == doc || tfLocation.getDocument() == doc) {
+ File location = new File(tfLocation.getText());
+ if (location.isDirectory()) {
+ tfProjectFolder.setText(tfLocation.getText() + File.separator + tfProjectName.getText());
+ } else {
+ tfProjectFolder.setText(tfLocation.getText());
+ }
+ }
+
+ if (!packageNameChanged && (tfProjectName.getDocument() == doc)) {
+ String pkg = tfProjectName.getText().trim().replace(" ", "").replace('-', '.');
+ tfPackageName.getDocument().removeDocumentListener(fieldUpdater);
+ tfPackageName.setText(pkg);
+ tfPackageName.getDocument().addDocumentListener(fieldUpdater);
+ }
+
+ if (tfPackageName.getDocument() == doc) {
+ packageNameChanged = !tfPackageName.getText().trim().isEmpty();
+ }
+
+ if (tfProjectName.getDocument() == doc) {
+ firePropertyChange(PROP_PROJECT_NAME, null, tfProjectName.getText());
+ }
+ }
+
+ // Change the package name upon the project name till it's not directly edited
+ private boolean packageNameChanged = false;
+ private final DocumentListener fieldUpdater = new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ updateTextFields(e);
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ updateTextFields(e);
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ updateTextFields(e);
+ }
+ };
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton btBrowse;
+ private javax.swing.JCheckBox cbComments;
+ private javax.swing.JComboBox cbDSL;
+ private javax.swing.JComboBox cbJavaVersion;
+ private javax.swing.JComboBox cbTestFramework;
+ private javax.swing.JLabel lbDSL;
+ private javax.swing.JLabel lbJavaVersion;
+ private javax.swing.JLabel lbLocation;
+ private javax.swing.JLabel lbPackageName;
+ private javax.swing.JLabel lbProjectFolder;
+ private javax.swing.JLabel lbProjectName;
+ private javax.swing.JLabel lbTestFramework;
+ private javax.swing.JTextField tfLocation;
+ private javax.swing.JTextField tfPackageName;
+ private javax.swing.JTextField tfProjectFolder;
+ private javax.swing.JTextField tfProjectName;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java b/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
index 57433620c5fc..7231c382bd6c 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/output/GradleProcessorFactory.java
@@ -33,8 +33,6 @@
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
-import java.util.Arrays;
-import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -43,6 +41,11 @@
import org.netbeans.spi.project.ProjectServiceProvider;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
+import org.openide.windows.IOColors;
+import static org.openide.windows.IOColors.OutputType.LOG_DEBUG;
+import static org.openide.windows.IOColors.OutputType.LOG_FAILURE;
+import static org.openide.windows.IOColors.OutputType.LOG_SUCCESS;
+import static org.openide.windows.IOColors.OutputType.LOG_WARNING;
/**
*
@@ -51,51 +54,18 @@
@ProjectServiceProvider(service = OutputProcessorFactory.class, projectType = NbGradleProject.GRADLE_PROJECT_TYPE)
public class GradleProcessorFactory implements OutputProcessorFactory {
- private static final OutputProcessor URL_PROCESSOR = new URLOutputProcessor();
- private static final OutputProcessor GRADLE_PROCESSOR = new GradleOutputProcessor();
- private static final OutputProcessor JAVAC_PROCESSOR = new JavaCompilerProcessor();
- private static final OutputProcessor GROOVYC_PROCESSOR = new GroovyCompilerProcessor();
-
-
@Override
public Set extends OutputProcessor> createOutputProcessors(RunConfig cfg) {
- return new HashSet<>(Arrays.asList(
- URL_PROCESSOR,
+ return Set.of(
GRADLE_PROCESSOR,
JAVAC_PROCESSOR,
GROOVYC_PROCESSOR,
new WarningModeAllProcessor(cfg)
- ));
+ );
}
- static final class URLOutputProcessor implements OutputProcessor {
- private static final Pattern URL_PATTERN = Pattern.compile("(((https?|ftp|file)://|file:/)[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])");
-
- @Override
- public boolean processLine(OutputDisplayer out, String line) {
- Matcher m = URL_PATTERN.matcher(line);
- int last = 0;
- while (m.find()) {
- String txt = line.substring(last, m.start());
- String lnk = line.substring(m.start(), m.end());
- last = m.end();
- out.print(txt);
- try {
- out.print(lnk, OutputListeners.openURL(new URL(lnk)));
- } catch(MalformedURLException ex) {
- out.print(lnk);
- }
- }
- if (last > 0) {
- out.print(line.substring(last));
- }
- return last > 0;
- }
-
- }
-
- static class GradleOutputProcessor implements OutputProcessor {
+ public static final OutputProcessor GRADLE_PROCESSOR = new OutputProcessor() {
private static final Pattern GRADLE_ERROR = Pattern.compile("(Build file|Script) '(.*)\\.gradle' line: ([0-9]+)");
@@ -118,9 +88,9 @@ public boolean processLine(OutputDisplayer out, String line) {
}
return false;
}
- }
+ };
- static class JavaCompilerProcessor implements OutputProcessor {
+ public static final OutputProcessor JAVAC_PROCESSOR = new OutputProcessor() {
private static final Pattern JAVA_ERROR = Pattern.compile("(.*)\\.java\\:([0-9]+)\\: (error|warning)\\:(.*)");
@@ -146,10 +116,9 @@ public boolean processLine(OutputDisplayer out, String line) {
}
return false;
}
+ };
- }
-
- static class GroovyCompilerProcessor implements OutputProcessor {
+ public static final OutputProcessor GROOVYC_PROCESSOR = new OutputProcessor() {
private static final Pattern GROOVY_ERROR = Pattern.compile("(.*)\\.groovy\\: ([0-9]+)\\: (.+)");
private static final Pattern COLUMN_INFO = Pattern.compile(" @ line ([0-9]+), column ([0-9]+)\\.$");
@@ -185,7 +154,82 @@ public boolean processLine(OutputDisplayer out, String line) {
return false;
}
- }
+ };
+
+ public static final OutputProcessor URL_PROCESSOR = new OutputProcessor() {
+
+ private static final Pattern URL_PATTERN = Pattern.compile("(((https?|ftp|file)://|file:/)[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|])");
+
+ @Override
+ public boolean processLine(OutputDisplayer out, String line) {
+ Matcher m = URL_PATTERN.matcher(line);
+ int last = 0;
+ while (m.find()) {
+ String txt = line.substring(last, m.start());
+ String lnk = line.substring(m.start(), m.end());
+ last = m.end();
+ out.print(txt);
+ try {
+ out.print(lnk, OutputListeners.openURL(new URL(lnk)));
+ } catch(MalformedURLException ex) {
+ out.print(lnk);
+ }
+ }
+ if (last > 0) {
+ out.print(line.substring(last));
+ }
+ return last > 0;
+ }
+
+ };
+
+ public static final OutputProcessor TASK_LINE_PROCESSOR = new OutputProcessor() {
+ final Pattern TASK_LINE = Pattern.compile("> Task (:[\\w:\\-]+)( [\\w\\-]+)?"); //NOI18N
+ @Override
+ public boolean processLine(OutputDisplayer out, String line) {
+ Matcher m = TASK_LINE.matcher(line);
+ boolean ret = m.matches();
+ if (ret) {
+ String task = m.group(1);
+ String state = m.group(2);
+ out.print("> Task "); //NOI18N
+ out.print(task);
+ if (state != null) {
+ IOColors.OutputType type = LOG_WARNING;
+ if (state.endsWith("EXECUTED") || state.endsWith("UP-TO-DATE") || state.endsWith("FROM-CACHE")) { //NOI18N
+ type = LOG_SUCCESS;
+ } else if (state.endsWith("FAILED")) { //NOI18N
+ type = LOG_FAILURE;
+ }
+ out.print(state , null, type);
+ }
+ }
+ return ret;
+ }
+ };
+
+ public static final OutputProcessor STATIC_STRING_PROCESSOR = new OutputProcessor() {
+ private static final String BUILD_FAILED_MSG = "BUILD FAILED"; //NOI18N
+ private static final String BUILD_SUCCESS_MSG = "BUILD SUCCESSFUL"; //NOI18N
+ private static final String COD_INCUBATION_MSG = "Configuration on demand is an incubating feature."; //NOI18N
+ private static final String CONFIG_CACHE_MGS = "Configuration cache "; //NOI18N
+
+ @Override
+ public boolean processLine(OutputDisplayer out, String line) {
+ IOColors.OutputType type = null;
+ if (line.startsWith(COD_INCUBATION_MSG) || line.startsWith(CONFIG_CACHE_MGS)) {
+ type = LOG_DEBUG;
+ } else if (line.startsWith(BUILD_SUCCESS_MSG)) {
+ type = LOG_SUCCESS;
+ } else if (line.startsWith(BUILD_FAILED_MSG)) {
+ type = LOG_FAILURE;
+ }
+ if (type != null) {
+ out.print(line, null, type);
+ }
+ return type != null;
+ }
+ };
static class WarningModeAllProcessor implements OutputProcessor {
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
index ae5674f7f7ba..77463c6c68b9 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/BaseGradleWizardIterator.java
@@ -83,7 +83,8 @@ public final void initialize(WizardDescriptor wizard) {
index = 0;
wizard.putProperty ("NewProjectWizard_Title", getTitle()); // NOI18N
- data = wizard;
+ data = initData(wizard);
+
panels = new ArrayList<>(createPanels());
String[] steps = new String[panels.size()];
for (int i = 0; i < panels.size(); i++) {
@@ -99,6 +100,10 @@ public final void initialize(WizardDescriptor wizard) {
}
}
+ protected WizardDescriptor initData(WizardDescriptor data) {
+ return data;
+ }
+
protected abstract List extends WizardDescriptor.Panel> createPanels();
protected abstract String getTitle();
protected abstract void collectOperations(final TemplateOperation ops, final Map params);
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/GradleInitWizard.java b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/GradleInitWizard.java
new file mode 100644
index 000000000000..981278ce2b31
--- /dev/null
+++ b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/GradleInitWizard.java
@@ -0,0 +1,231 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.spi.newproject;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import org.netbeans.modules.gradle.newproject.GradleInitPanel;
+import org.netbeans.spi.project.ui.support.CommonProjectActions;
+import org.openide.WizardDescriptor;
+import org.openide.util.NbBundle;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class GradleInitWizard {
+
+ public static final String PROP_JAVA_VERSIONS = "javaVersions"; //NOI18N
+ public static final String PROP_JAVA_VERSION = "javaVersion"; //NOI18N
+ public static final String PROP_TEST_FRAMEWORKS = "testFrameworks"; //NOI18N
+ public static final String PROP_TEST_FRAMEWORK = "testFramework"; //NOI18N
+ public static final String PROP_DSL = "DSL"; //NOI18N
+ public static final String PROP_COMMENTS = "comments"; //NOI18N
+
+ @NbBundle.Messages({
+ "LBL_DSL_GROOVY=Groovy",
+ "LBL_DSL_KOTLIN=Kotlin"
+ })
+ public enum GradleDSL {
+ GROOVY,
+ KOTLIN;
+
+ @Override
+ public String toString() {
+ return switch(this) {
+ case GROOVY -> Bundle.LBL_DSL_GROOVY();
+ case KOTLIN -> Bundle.LBL_DSL_KOTLIN();
+ };
+ }
+ }
+
+ @NbBundle.Messages({
+ "LBL_TFW_CPP_TEST=C++ Test",
+ "LBL_TFW_JUNIT=JUnit 4",
+ "LBL_TFW_JUNIT_5=JUnit 5",
+ "LBL_TFW_KOTLIN_TEST=Kotlin Test",
+ "LBL_TFW_SCALA_TEST=Scala Test",
+ "LBL_TFW_SPOCK=Spock",
+ "LBL_TFW_TESTNG=Test NG",
+ "LBL_TFW_XCTEST=XCode Test",
+ })
+ public enum TestFramework {
+ CPP_TEST("cpptest"),
+ JUNIT("junit"),
+ JUNIT_5("junit-jupiter"),
+ KOTLIN_TEST("kotlintest"),
+ SCALA_TEST("scalatest"),
+ SPOCK("spock"),
+ TESTNG("testng"),
+ XCTEST("xctest");
+
+ private final String id;
+
+ private TestFramework(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public String toString() {
+ return switch(this) {
+ case CPP_TEST -> Bundle.LBL_TFW_CPP_TEST();
+ case JUNIT -> Bundle.LBL_TFW_JUNIT();
+ case JUNIT_5 -> Bundle.LBL_TFW_JUNIT_5();
+ case KOTLIN_TEST -> Bundle.LBL_TFW_KOTLIN_TEST();
+ case SCALA_TEST -> Bundle.LBL_TFW_SCALA_TEST();
+ case SPOCK -> Bundle.LBL_TFW_SPOCK();
+ case TESTNG -> Bundle.LBL_TFW_TESTNG();
+ case XCTEST -> Bundle.LBL_TFW_XCTEST();
+ };
+ }
+ }
+
+ private final String type;
+ private final String title;
+
+ private Integer preferredJavaVersion;
+ private TestFramework preferredTestFramework;
+ private List javaVersions;
+ private List testFrameworks;
+ private List important = List.of();
+
+ private GradleInitWizard(String type, String title) {
+ this.type = type;
+ this.title = title;
+ }
+
+
+ public static GradleInitWizard create(String type, String title) {
+ return new GradleInitWizard(type, title);
+ }
+
+ public GradleInitWizard withJavaVersions(List javaVersions) {
+ this.javaVersions = javaVersions;
+ return this;
+ }
+
+ public GradleInitWizard withTestframeworks(List testFrameworks) {
+ this.testFrameworks = testFrameworks;
+ return this;
+ }
+
+ public GradleInitWizard withPreferredJava(Integer version) {
+ this.preferredJavaVersion = version;
+ return this;
+ }
+
+ public GradleInitWizard withPreferredTestFramework(TestFramework framework) {
+ this.preferredTestFramework = framework;
+ return this;
+ }
+
+ public GradleInitWizard withImportantPaths(List important) {
+ this.important = important;
+ return this;
+ }
+
+ public BaseGradleWizardIterator build() {
+ return new GradleInitWizardIterator(type, title, important) {
+ @Override
+ protected WizardDescriptor initData(WizardDescriptor data) {
+ if (javaVersions != null) {
+ data.putProperty(PROP_JAVA_VERSIONS, javaVersions);
+ }
+ if (testFrameworks != null) {
+ data.putProperty(PROP_TEST_FRAMEWORKS, testFrameworks);
+ }
+ if (preferredJavaVersion != null) {
+ data.putProperty(PROP_JAVA_VERSION, preferredJavaVersion);
+ }
+ if (preferredTestFramework != null) {
+ data.putProperty(PROP_TEST_FRAMEWORK, preferredTestFramework);
+ }
+ return data;
+ }
+ };
+ };
+
+ private static class GradleInitWizardIterator extends BaseGradleWizardIterator {
+ private final String type;
+ private final String title;
+
+ private final List important;
+
+ private GradleInitWizardIterator(String type, String title, List important) {
+ this.type = type;
+ this.title = title;
+ this.important = important;
+ }
+
+ @Override
+ protected void collectOperations(TemplateOperation ops, Map params) {
+ String name = (String) params.get(PROP_NAME);
+ String packageBase = (String) params.get(PROP_PACKAGE_BASE);
+ File loc = (File) params.get(CommonProjectActions.PROJECT_PARENT_FOLDER);
+
+ File root = new File(loc, name);
+
+ TemplateOperation.InitOperation init = ops.createGradleInit(root, type);
+ init.projectName(name);
+ if (packageBase != null) {
+ init.basePackage(packageBase);
+ }
+
+ GradleDSL dsl = (GradleDSL) params.get(PROP_DSL);
+ init.dsl(dsl == GradleDSL.KOTLIN ? "kotlin" : "groovy"); //NOI18N
+
+ if (params.get(PROP_JAVA_VERSION) != null) {
+ init.javaVersion(params.get(PROP_JAVA_VERSION).toString());
+ }
+
+ if (params.get(PROP_TEST_FRAMEWORK) != null) {
+ init.testFramework(((TestFramework)params.get(PROP_TEST_FRAMEWORK)).getId());
+ }
+
+ init.comments((Boolean)params.get(PROP_COMMENTS));
+ init.add();
+
+
+ ops.addWrapperInit(root, "latest"); //NOI18N
+ List open = important.stream()
+ .map((s) -> packageBase != null ? s.replace("${package}", packageBase.replace('.', '/')) : s) //NOI18N
+ .map((s) -> s.replace("${projectName}", name)) //NOI18N
+ .toList();
+ ops.addProjectPreload(root, open);
+ }
+
+
+ @Override
+ protected List extends WizardDescriptor.Panel> createPanels() {
+ return List.of(new GradleInitPanel());
+ }
+
+ @Override
+ protected String getTitle() {
+ return title;
+ }
+ }
+
+
+}
diff --git a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
index 68f38956a83a..9697aa92c481 100644
--- a/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
+++ b/extide/gradle/src/org/netbeans/modules/gradle/spi/newproject/TemplateOperation.java
@@ -51,17 +51,22 @@
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.gradle.tooling.BuildLauncher;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.modules.gradle.GradleProjectLoader;
import org.netbeans.modules.gradle.ProjectTrust;
import org.netbeans.modules.gradle.api.GradleProjects;
import org.netbeans.modules.gradle.api.NbGradleProject.Quality;
+import org.netbeans.modules.gradle.execute.EscapeProcessingOutputStream;
+import org.netbeans.modules.gradle.execute.GradlePlainEscapeProcessor;
import org.netbeans.modules.gradle.spi.GradleSettings;
import org.openide.loaders.DataFolder;
import org.openide.loaders.DataObject;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
+import org.openide.windows.IOProvider;
+import org.openide.windows.InputOutput;
/**
* Steps, that a New Gradle Project Wizard can perform.
@@ -305,6 +310,7 @@ public String getMessage() {
public Set execute() {
GradleConnector gconn = GradleConnector.newConnector();
target.mkdirs();
+ InputOutput io = IOProvider.getDefault().getIO(projectName + " (init)", true);
try (ProjectConnection pconn = gconn.forProjectDirectory(target).connect()) {
List args = new ArrayList<>();
args.add("init");
@@ -346,14 +352,25 @@ public Set execute() {
// gradle init is non-interactive inside the IDE
args.add("--use-defaults");
+ try (
+ var out = new EscapeProcessingOutputStream(new GradlePlainEscapeProcessor(io, false));
+ var err = new EscapeProcessingOutputStream(new GradlePlainEscapeProcessor(io, false))
+ ) {
+ BuildLauncher gradleInit = pconn.newBuild().forTasks(args.toArray(new String[0]));
+ if (GradleSettings.getDefault().isOffline()) {
+ gradleInit = gradleInit.withArguments("--offline");
+ }
+ gradleInit.setStandardOutput(out);
+ gradleInit.setStandardError(err);
+ gradleInit.run();
- if (GradleSettings.getDefault().isOffline()) {
- pconn.newBuild().withArguments("--offline").forTasks(args.toArray(new String[0])).run(); //NOI18N
- } else {
- pconn.newBuild().forTasks(args.toArray(new String[0])).run();
+ } catch (IOException iox) {
}
} catch (GradleConnectionException | IllegalStateException ex) {
Exceptions.printStackTrace(ex);
+ } finally {
+ if (io.getOut() != null) io.getOut().close();
+ if (io.getErr() != null) io.getErr().close();
}
gconn.disconnect();
return Collections.singleton(FileUtil.toFileObject(target));
@@ -392,6 +409,10 @@ public void addProjectPreload(File projectDir) {
steps.add(new PreloadProject(projectDir));
}
+ public void addProjectPreload(File projectDir, List important) {
+ steps.add(new PreloadProject(projectDir, important));
+ }
+
private abstract static class BaseOperationStep implements OperationStep {
@Override
public final String toString() {
@@ -464,9 +485,15 @@ public final Set execute() {
private static final class PreloadProject extends BaseOperationStep {
final File dir;
+ final List importantFiles;
public PreloadProject(File dir) {
+ this(dir, List.of());
+ }
+
+ public PreloadProject(File dir, List importantFiles) {
this.dir = dir;
+ this.importantFiles = importantFiles;
}
@Override
@@ -501,7 +528,15 @@ public Set execute() {
loader.loadProject(Quality.FULL_ONLINE, null, true, false);
}
}
- return Collections.singleton(projectDir);
+ Set ret = new LinkedHashSet<>();
+ ret.add(projectDir);
+ for (String f : importantFiles) {
+ FileObject fo = projectDir.getFileObject(f);
+ if (fo != null) {
+ ret.add(fo);
+ }
+ }
+ return ret;
}
} catch (IOException | IllegalArgumentException ex) {
}
diff --git a/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java b/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
index 50f36515df35..604996f79177 100644
--- a/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
+++ b/extide/gradle/test/unit/src/org/netbeans/modules/gradle/output/GradleProcessorFactoryTest.java
@@ -21,6 +21,7 @@
import org.junit.Test;
import static org.junit.Assert.*;
import org.netbeans.modules.gradle.api.output.OutputDisplayerMock;
+import static org.netbeans.modules.gradle.output.GradleProcessorFactory.*;
/**
*
@@ -46,9 +47,8 @@ public class GradleProcessorFactoryTest {
@Test
public void testJavaCompilerProcessor1() {
- GradleProcessorFactory.JavaCompilerProcessor jcp = new GradleProcessorFactory.JavaCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(jcp.processLine(od, JAVA_COMPILE_ERROR_1));
+ assertTrue(JAVAC_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals("/home/netbeans/NetBeansProjects/gradleproject3/common/src/main/java/gradleproject3/common/NewClass1.java:1", outputs[0].text);
assertEquals(": error: class, interface, or enum expected", outputs[1].text);
@@ -56,9 +56,8 @@ public void testJavaCompilerProcessor1() {
@Test
public void testJavaCompilerProcessor2() {
- GradleProcessorFactory.JavaCompilerProcessor jcp = new GradleProcessorFactory.JavaCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(jcp.processLine(od, JAVA_COMPILE_ERROR_2));
+ assertTrue(JAVAC_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_2));
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals("D:\\Users\\netbeans\\NetBeansProjects\\gradleproject3\\common\\src\\main\\java\\gradleproject3\\common\\NewClass1.java:1", outputs[0].text);
assertEquals(": error: class, interface, or enum expected", outputs[1].text);
@@ -66,23 +65,20 @@ public void testJavaCompilerProcessor2() {
@Test
public void testJavaCompilerProcessor3() {
- GradleProcessorFactory.JavaCompilerProcessor jcp = new GradleProcessorFactory.JavaCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(jcp.processLine(od, GROOVY_COMPILE_ERROR_1));
+ assertFalse(JAVAC_PROCESSOR.processLine(od, GROOVY_COMPILE_ERROR_1));
}
@Test
public void testJavaCompilerProcessor4() {
- GradleProcessorFactory.JavaCompilerProcessor jcp = new GradleProcessorFactory.JavaCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(jcp.processLine(od, JAVA_8_STACKTRACE_1));
+ assertFalse(JAVAC_PROCESSOR.processLine(od, JAVA_8_STACKTRACE_1));
}
@Test
public void testGroovyCompilerProcessor1() {
- GradleProcessorFactory.GroovyCompilerProcessor gcp = new GradleProcessorFactory.GroovyCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(gcp.processLine(od, GROOVY_COMPILE_ERROR_1));
+ assertTrue(GROOVYC_PROCESSOR.processLine(od, GROOVY_COMPILE_ERROR_1));
assertEquals(GROOVY_COMPILE_ERROR_1, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals("/home/netbeans/NetBeansProjects/netbeans/groovy/gradle/netbeans-gradle-tooling/src/main/groovy/org/netbeans/modules/gradle/tooling/NetBeansExplodedWarPlugin.groovy: 33", outputs[0].text);
@@ -92,9 +88,8 @@ public void testGroovyCompilerProcessor1() {
@Test
public void testGroovyCompilerProcessor2() {
- GradleProcessorFactory.GroovyCompilerProcessor gcp = new GradleProcessorFactory.GroovyCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(gcp.processLine(od, GROOVY_COMPILE_ERROR_2));
+ assertTrue(GROOVYC_PROCESSOR.processLine(od, GROOVY_COMPILE_ERROR_2));
assertEquals(GROOVY_COMPILE_ERROR_2, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals("/home/netbeans/NetBeansProjects/netbeans/groovy/gradle/netbeans-gradle-tooling/src/main/groovy/org/netbeans/modules/gradle/tooling/NetBeansExplodedWarPlugin.groovy: 43", outputs[0].text);
@@ -104,30 +99,26 @@ public void testGroovyCompilerProcessor2() {
@Test
public void testGroovyCompilerProcessor3() {
- GradleProcessorFactory.GroovyCompilerProcessor gcp = new GradleProcessorFactory.GroovyCompilerProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(gcp.processLine(od, JAVA_COMPILE_ERROR_1));
+ assertFalse(GROOVYC_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
}
@Test
public void testURLOutputProcessor1() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(uop.processLine(od, JAVA_8_STACKTRACE_1));
+ assertFalse(URL_PROCESSOR.processLine(od, JAVA_8_STACKTRACE_1));
}
@Test
public void testURLOutputProcessor2() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(uop.processLine(od, JAVA_COMPILE_ERROR_1));
+ assertFalse(URL_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
}
@Test
public void testURLOutputProcessor3() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(uop.processLine(od, URL_PATTERN_1));
+ assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_1));
assertEquals(URL_PATTERN_1, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals(3, outputs.length);
@@ -136,9 +127,8 @@ public void testURLOutputProcessor3() {
@Test
public void testURLOutputProcessor4() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(uop.processLine(od, URL_PATTERN_2));
+ assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_2));
assertEquals(URL_PATTERN_2, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertNotNull(outputs[1].action);
@@ -147,9 +137,8 @@ public void testURLOutputProcessor4() {
@Test
public void testURLOutputProcessor5() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(uop.processLine(od, URL_PATTERN_3));
+ assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_3));
assertEquals(URL_PATTERN_3, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals(5, outputs.length);
@@ -160,9 +149,8 @@ public void testURLOutputProcessor5() {
@Test
public void testURLOutputProcessor6() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(uop.processLine(od, URL_PATTERN_4));
+ assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_4));
assertEquals(URL_PATTERN_4, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals(7, outputs.length);
@@ -175,9 +163,8 @@ public void testURLOutputProcessor6() {
@Test
public void testURLOutputProcessor7() {
- GradleProcessorFactory.URLOutputProcessor uop = new GradleProcessorFactory.URLOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(uop.processLine(od, URL_PATTERN_5));
+ assertTrue(URL_PROCESSOR.processLine(od, URL_PATTERN_5));
assertEquals(URL_PATTERN_5, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals(7, outputs.length);
@@ -190,9 +177,8 @@ public void testURLOutputProcessor7() {
@Test
public void testGradleOutputProcessor1() {
- GradleProcessorFactory.GradleOutputProcessor uop = new GradleProcessorFactory.GradleOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertTrue(uop.processLine(od, GRADLE_SCRIPT_ERROR_1));
+ assertTrue(GRADLE_PROCESSOR.processLine(od, GRADLE_SCRIPT_ERROR_1));
assertEquals(GRADLE_SCRIPT_ERROR_1, od.getOutput());
OutputDisplayerMock.OutputItem[] outputs = od.getOutputs();
assertEquals(1, outputs.length);
@@ -201,15 +187,13 @@ public void testGradleOutputProcessor1() {
@Test
public void testGradleOutputProcessor2() {
- GradleProcessorFactory.GradleOutputProcessor uop = new GradleProcessorFactory.GradleOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(uop.processLine(od, JAVA_COMPILE_ERROR_1));
+ assertFalse(GRADLE_PROCESSOR.processLine(od, JAVA_COMPILE_ERROR_1));
}
@Test
public void testGradleOutputProcessor3() {
- GradleProcessorFactory.GradleOutputProcessor uop = new GradleProcessorFactory.GradleOutputProcessor();
OutputDisplayerMock od = new OutputDisplayerMock();
- assertFalse(uop.processLine(od, JAVA_8_STACKTRACE_1));
+ assertFalse(GRADLE_PROCESSOR.processLine(od, JAVA_8_STACKTRACE_1));
}
}
diff --git a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleApplicationProjectWizard.java b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleApplicationProjectWizard.java
deleted file mode 100644
index de1889f6504d..000000000000
--- a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleApplicationProjectWizard.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.netbeans.modules.gradle.java.newproject;
-
-import org.netbeans.modules.gradle.spi.newproject.TemplateOperation;
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.netbeans.api.templates.TemplateRegistration;
-import org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator;
-import static org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_INIT_WRAPPER;
-import static org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_NAME;
-import static org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator.PROP_PACKAGE_BASE;
-import org.netbeans.spi.project.ui.support.CommonProjectActions;
-import org.openide.WizardDescriptor;
-import org.openide.util.NbBundle.Messages;
-
-/**
- *
- * @author Laszlo Kishalmi
- */
-@TemplateRegistration(folder="Project/Gradle", position=100, displayName="#template.simpleAppProject", iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", description="SimpleApplicationDescription.html")
-@Messages("template.simpleAppProject=Java Application")
-public class SimpleApplicationProjectWizard extends BaseGradleWizardIterator {
- public SimpleApplicationProjectWizard() {
- }
-
- @Override
- protected List extends WizardDescriptor.Panel> createPanels() {
- return Collections.singletonList(createProjectAttributesPanel(null));
- }
-
- @Messages("LBL_SimpleApplicationProject=Java Application with Gradle")
- @Override
- protected String getTitle() {
- return Bundle.LBL_SimpleApplicationProject();
- }
-
- @Override
- protected void collectOperations(TemplateOperation ops, Map params) {
- collectOperationsForType(params, ops, "java-application", "app");
- }
-
- static void collectOperationsForType(Map params, TemplateOperation ops, String type, String subFolder) {
- final String name = (String) params.get(PROP_NAME);
- final String packageBase = (String) params.get(PROP_PACKAGE_BASE);
- final File loc = (File) params.get(CommonProjectActions.PROJECT_PARENT_FOLDER);
- final File root = new File(loc, name);
-
- ops.createGradleInit(root, type).basePackage(packageBase).projectName(name).dsl("groovy").add(); // NOI18N
-
- Boolean initWrapper = (Boolean) params.get(PROP_INIT_WRAPPER);
- if (initWrapper == null || initWrapper) {
- // @TODO allow configuration of wrapper version
- ops.addWrapperInit(root, "latest"); // NOI18N
- } else {
- // @TODO delete wrapper added by init?
- }
-
- ops.addProjectPreload(root);
- ops.addProjectPreload(new File(root, subFolder));
-
- }
-
-}
diff --git a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleLibraryProjectWizard.java b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleLibraryProjectWizard.java
deleted file mode 100644
index f8594e9a1c11..000000000000
--- a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/SimpleLibraryProjectWizard.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.netbeans.modules.gradle.java.newproject;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import org.netbeans.api.templates.TemplateRegistration;
-import org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator;
-import org.netbeans.modules.gradle.spi.newproject.TemplateOperation;
-import org.openide.WizardDescriptor;
-import org.openide.util.NbBundle;
-
-/**
- *
- * @author Laszlo Kishalmi
- */
-@TemplateRegistration(folder="Project/Gradle", position=110, displayName="#template.simpleLibProject", iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", description="SimpleLibraryDescription.html")
-@NbBundle.Messages("template.simpleLibProject=Java Class Library")
-public class SimpleLibraryProjectWizard extends BaseGradleWizardIterator {
- public SimpleLibraryProjectWizard() {
- }
-
- @Override
- protected List extends WizardDescriptor.Panel> createPanels() {
- return Collections.singletonList(createProjectAttributesPanel(null));
- }
-
- @NbBundle.Messages("LBL_SimpleLibraryProject=Java Class Library with Gradle")
- @Override
- protected String getTitle() {
- return Bundle.LBL_SimpleLibraryProject();
- }
-
- @Override
- protected void collectOperations(TemplateOperation ops, Map params) {
- SimpleApplicationProjectWizard.collectOperationsForType(params, ops, "java-library", "lib");
- }
-}
-
diff --git a/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/Wizards.java b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/Wizards.java
new file mode 100644
index 000000000000..4ab8cda48a8e
--- /dev/null
+++ b/java/gradle.java/src/org/netbeans/modules/gradle/java/newproject/Wizards.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.gradle.java.newproject;
+
+import java.util.List;
+import org.netbeans.api.templates.TemplateRegistration;
+import org.netbeans.modules.gradle.spi.newproject.BaseGradleWizardIterator;
+import org.netbeans.modules.gradle.spi.newproject.GradleInitWizard;
+import org.netbeans.modules.gradle.spi.newproject.GradleInitWizard.TestFramework;
+import org.openide.util.NbBundle;
+
+import static org.netbeans.modules.gradle.spi.newproject.GradleInitWizard.TestFramework.*;
+
+/**
+ *
+ * @author lkishalmi
+ */
+public final class Wizards {
+
+ private Wizards() {};
+
+ private static final List JAVA_VERSIONS = List.of(22, 21, 17, 11, 8);
+ private static final List JAVA_TEST_FRAMEWORKS = List.of(
+ JUNIT,
+ JUNIT_5,
+ TESTNG
+ );
+
+ @TemplateRegistration(folder="Project/Gradle", position=100, displayName="#template.simpleAppProject", iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", description="SimpleApplicationDescription.html")
+ @NbBundle.Messages({
+ "template.simpleAppProject=Java Application",
+ "LBL_SimpleApplicationProject=Java Application with Gradle"
+ })
+ public static BaseGradleWizardIterator createJavaApplication() {
+ return GradleInitWizard.create("java-application", Bundle.LBL_SimpleApplicationProject())
+ .withJavaVersions(JAVA_VERSIONS)
+ .withTestframeworks(JAVA_TEST_FRAMEWORKS)
+ .withImportantPaths(List.of(
+ "app",
+ "app/src/main/java/${package}/App.java"
+ ))
+ .build();
+ }
+
+ @TemplateRegistration(folder="Project/Gradle", position=110, displayName="#template.simpleLibProject", iconBase="org/netbeans/modules/gradle/java/resources/javaseProjectIcon.png", description="SimpleLibraryDescription.html")
+ @NbBundle.Messages({
+ "template.simpleLibProject=Java Class Library",
+ "LBL_SimpleLibraryProject=Java Class Library with Gradle"
+ })
+ public static BaseGradleWizardIterator createJavaLibrary() {
+ return GradleInitWizard.create("java-library", Bundle.LBL_SimpleApplicationProject())
+ .withJavaVersions(JAVA_VERSIONS)
+ .withTestframeworks(JAVA_TEST_FRAMEWORKS)
+ .withImportantPaths(List.of(
+ "lib",
+ "lib/src/main/java/${package}/Library.java"
+ ))
+ .build();
+ }
+}