You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by ne...@apache.org on 2021/08/23 09:39:15 UTC

[netbeans] branch delivery updated: Exposing Frontend UI Pages for the Java Frontend Gradle project

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 <ja...@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-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists