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 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> 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> 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> 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> 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(); + } +}