This is an automated email from the ASF dual-hosted git repository. neilcsmith pushed a commit to branch delivery in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/delivery by this push: new b85924e Exposing Frontend UI Pages for the Java Frontend Gradle project new be7b45a Merge pull request #3096 from JaroslavTulach/jtulach/FrontendUI b85924e is described below commit b85924eb43f70e489daef131d6433f5bdefa33fd Author: Jaroslav Tulach <jaroslav.tul...@apidesign.org> AuthorDate: Sun Aug 8 15:01:11 2021 +0200 Exposing Frontend UI Pages for the Java Frontend Gradle project --- .../gradle/htmlui/HtmlJavaPagesNodeFactory.java | 110 +++++++++++++++++++++ .../modules/gradle/htmlui/CreateArchetypeTest.java | 38 ++++++- 2 files changed, 145 insertions(+), 3 deletions(-) diff --git a/java/gradle.htmlui/src/org/netbeans/modules/gradle/htmlui/HtmlJavaPagesNodeFactory.java b/java/gradle.htmlui/src/org/netbeans/modules/gradle/htmlui/HtmlJavaPagesNodeFactory.java new file mode 100644 index 0000000..a139619 --- /dev/null +++ b/java/gradle.htmlui/src/org/netbeans/modules/gradle/htmlui/HtmlJavaPagesNodeFactory.java @@ -0,0 +1,110 @@ +/* + * 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.htmlui; + +import java.awt.Image; +import org.netbeans.modules.gradle.api.NbGradleProject; +import org.netbeans.modules.gradle.spi.nodes.AbstractGradleNodeList; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Collections; +import java.util.List; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.support.NodeFactory; +import org.netbeans.spi.project.ui.support.NodeList; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataFolder; +import org.openide.nodes.FilterNode; +import org.openide.nodes.Node; +import org.openide.util.ImageUtilities; +import org.openide.util.NbBundle; + +@NbBundle.Messages({ + "MSG_HtmlJavaPages=Frontend UI Pages" +}) +@NodeFactory.Registration(projectType = NbGradleProject.GRADLE_PROJECT_TYPE, position = 77) +public final class HtmlJavaPagesNodeFactory implements NodeFactory { + + @Override + public NodeList<?> createNodes(Project p) { + return new HtmlJavaPagesList(p); + } + + private static class HtmlJavaPagesList extends AbstractGradleNodeList<FileObject> implements PropertyChangeListener { + + final Project project; + + HtmlJavaPagesList(Project project) { + this.project = project; + } + + @Override + public List<FileObject> keys() { + FileObject pages = project.getProjectDirectory().getFileObject("src/main/webapp/pages"); // NOI18N + return pages != null ? Collections.singletonList(pages) : Collections.<FileObject>emptyList(); + } + + @Override + public Node node(FileObject key) { + DataFolder df = DataFolder.findFolder(key); + FilterNode fn = new FilterNode(df.getNodeDelegate().cloneNode()) { + @Override + public Image getIcon(int type) { + return ImageUtilities.loadImage("org/netbeans/modules/gradle/htmlui/DukeHTML.png"); // NOI18N + } + + @Override + public Image getOpenedIcon(int type) { + return getIcon(type); + } + + @Override + public String getName() { + return "pages"; // NOI18N + } + + @Override + public String getDisplayName() { + return Bundle.MSG_HtmlJavaPages(); + } + }; + return fn; + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (NbGradleProject.PROP_PROJECT_INFO.equals(evt.getPropertyName())) { + fireChange(); + } + } + + @Override + public void removeChangeListener(ChangeListener list) { + NbGradleProject.removePropertyChangeListener(project, this); + } + + @Override + public void addChangeListener(ChangeListener list) { + NbGradleProject.addPropertyChangeListener(project, this); + } + + } +} diff --git a/java/gradle.htmlui/test/unit/src/org/netbeans/modules/gradle/htmlui/CreateArchetypeTest.java b/java/gradle.htmlui/test/unit/src/org/netbeans/modules/gradle/htmlui/CreateArchetypeTest.java index 65a1c6d..87433d3 100644 --- a/java/gradle.htmlui/test/unit/src/org/netbeans/modules/gradle/htmlui/CreateArchetypeTest.java +++ b/java/gradle.htmlui/test/unit/src/org/netbeans/modules/gradle/htmlui/CreateArchetypeTest.java @@ -36,10 +36,13 @@ import org.netbeans.junit.NbModuleSuite; import org.netbeans.junit.NbTestCase; import org.netbeans.modules.gradle.spi.actions.AfterBuildActionHook; import org.netbeans.modules.gradle.spi.newproject.TemplateOperation; +import org.netbeans.spi.project.ActionProgress; import org.netbeans.spi.project.ActionProvider; +import org.netbeans.spi.project.ui.LogicalViewProvider; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.filesystems.LocalFileSystem; +import org.openide.nodes.Node; import org.openide.util.lookup.Lookups; public class CreateArchetypeTest extends NbTestCase { @@ -118,6 +121,7 @@ public class CreateArchetypeTest extends NbTestCase { assertTrue(Arrays.asList(actions.getSupportedActions()).contains(ActionProvider.COMMAND_BUILD)); actions.isActionEnabled(ActionProvider.COMMAND_BUILD, mainPrj.getLookup()); + assertLogicalView(mainPrj); invokeCommand(actions, ActionProvider.COMMAND_BUILD, mainPrj); assertFile("JAR created", dest, "build", "libs", "dest-1.0-SNAPSHOT.jar"); @@ -139,13 +143,41 @@ public class CreateArchetypeTest extends NbTestCase { assertFile("Main script created", dest, "web", "build", "web", "bck2brwsr.js"); } + private void assertLogicalView(Project mainPrj) { + LogicalViewProvider lvp = mainPrj.getLookup().lookup(LogicalViewProvider.class); + assertNotNull("Logical view found", lvp); + Node logicalView = lvp.createLogicalView(); + final Node[] children = logicalView.getChildren().getNodes(true); + for (Node ch : children) { + if (ch.getName().equals("pages") && "Frontend UI Pages".equals(ch.getDisplayName())) { + FileObject pages = ch.getLookup().lookup(FileObject.class); + assertNotNull("Pages node provides FileObject: " + ch, pages); + assertNotNull("There is index.html", pages.getFileObject("index.html")); + return; + } + } + fail("Cannot find Frontend Pages in " + Arrays.toString(children)); + } + protected void invokeCommand(ActionProvider actions, String cmd, Project prj) throws IllegalArgumentException, InterruptedException { CountDownLatch waiter = new CountDownLatch(1); - AfterBuildActionHook notifier = (action, context, res, out) -> { - waiter.countDown(); + boolean[] status = { false, false }; + ActionProgress ap = new ActionProgress() { + @Override + protected void started() { + status[0] = true; + } + + @Override + public void finished(boolean success) { + status[1] = success; + waiter.countDown(); + } }; - actions.invokeAction(cmd, Lookups.fixed(prj, notifier)); + actions.invokeAction(cmd, Lookups.fixed(prj, ap)); + assertTrue("ActionProgress was started", status[0]); waiter.await(); + assertTrue("ActionProgress was successfully finished", status[1]); } private AssertContent assertFile(String msg, FileObject root, String... path) throws IOException { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists