[SERVER] fix load of JS UI in BrooklynJavascriptGuiLauncher
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/6471500e Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/6471500e Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/6471500e Branch: refs/heads/master Commit: 6471500e2c6f044f7a555fb831e173e9031a2a65 Parents: 1f725bd Author: Alex Heneveld <[email protected]> Authored: Tue Dec 22 12:32:51 2015 +0000 Committer: Alex Heneveld <[email protected]> Committed: Tue Dec 22 12:54:15 2015 +0000 ---------------------------------------------------------------------- .../jsgui/BrooklynJavascriptGuiLauncher.java | 15 ++++-- .../BrooklynJavascriptGuiLauncherTest.java | 14 ++--- .../brooklyn/rest/BrooklynRestApiLauncher.java | 56 ++++++++++++++------ .../rest/BrooklynRestApiLauncherTest.java | 1 - 4 files changed, 57 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6471500e/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncher.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncher.java b/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncher.java index 6f04fd7..f6329b0 100644 --- a/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncher.java +++ b/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncher.java @@ -60,15 +60,22 @@ public class BrooklynJavascriptGuiLauncher { final static int FAVOURITE_PORT = 8080; - /** due to the ../jsgui trick in {@link BrooklynRestApiLauncher} we can just call that method */ + /** due to the relative path search in {@link BrooklynRestApiLauncher} we can just call that method */ public static Server startJavascriptAndRest() throws Exception { return BrooklynRestApiLauncher.startRestResourcesViaFilter(); } - /** not much fun without a REST client. but TODO we should make it so the REST endpoint can be configured. */ - /** relative path to webapp assumes brooklyn-server has been checked out at the same level as brooklyn-ui */ + /** not much fun without a REST server. + * but TODO we should make it so a different REST endpoint could be configured. + * or better, use node js launchers in that project (likely to come with a new ui.) + * <p> + * relative path to webapp assumes brooklyn-server has been checked out at the same level as brooklyn-ui; + * see {@link BrooklynRestApiLauncher#findJsguiWebappInSource()} */ public static Server startJavascriptWithoutRest() throws Exception { - WebAppContext context = new WebAppContext("../../brooklyn-ui/src/main/webapp", "/"); + WebAppContext context = new WebAppContext( + BrooklynRestApiLauncher.findJsguiWebappInSource() + .or("../../brooklyn-ui/src/main/webapp"), + "/"); Server server = new Server(new InetSocketAddress(Networking.LOOPBACK, Networking.nextAvailablePort(FAVOURITE_PORT))); server.setHandler(context); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6471500e/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java b/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java index b08645b..e03652d 100644 --- a/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java +++ b/brooklyn-server/launcher/src/test/java/org/apache/brooklyn/rest/jsgui/BrooklynJavascriptGuiLauncherTest.java @@ -18,16 +18,16 @@ */ package org.apache.brooklyn.rest.jsgui; -import org.apache.brooklyn.test.HttpTestUtils; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.ContextHandler; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.Test; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.rest.BrooklynRestApiLauncherTestFixture; import org.apache.brooklyn.rest.util.OsgiCompat; +import org.apache.brooklyn.util.http.HttpAsserts; import org.eclipse.jetty.server.NetworkConnector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.ContextHandler; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.Test; /** Convenience and demo for launching programmatically. */ public class BrooklynJavascriptGuiLauncherTest { @@ -63,11 +63,11 @@ public class BrooklynJavascriptGuiLauncherTest { protected void checkUrlContains(final String path, final String text) { //Server may return 403 until it loads completely, wait a bit //until it stabilizes. - HttpTestUtils.assertContentEventuallyContainsText(rootUrl()+path, text); + HttpAsserts.assertContentEventuallyContainsText(rootUrl()+path, text); } protected void checkEventuallyHealthy() { - HttpTestUtils.assertHttpStatusCodeEventuallyEquals(rootUrl(), 200); + HttpAsserts.assertHttpStatusCodeEventuallyEquals(rootUrl(), 200); } protected String rootUrl() { http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6471500e/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java b/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java index 2a0bad9..f641267 100644 --- a/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java +++ b/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncher.java @@ -43,14 +43,18 @@ import org.apache.brooklyn.rest.filter.HaMasterCheckFilter; import org.apache.brooklyn.rest.filter.LoggingFilter; import org.apache.brooklyn.rest.filter.NoCacheFilter; import org.apache.brooklyn.rest.filter.RequestTaggingFilter; +import org.apache.brooklyn.rest.filter.SwaggerFilter; import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; import org.apache.brooklyn.rest.security.provider.SecurityProvider; import org.apache.brooklyn.rest.util.ManagementContextProvider; +import org.apache.brooklyn.rest.util.OsgiCompat; import org.apache.brooklyn.rest.util.ShutdownHandlerProvider; import org.apache.brooklyn.rest.util.TestShutdownHandler; import org.apache.brooklyn.util.exceptions.Exceptions; +import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.net.Networking; import org.apache.brooklyn.util.text.WildcardGlobs; +import org.eclipse.jetty.server.NetworkConnector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.servlet.FilterHolder; @@ -63,16 +67,12 @@ import org.slf4j.LoggerFactory; import com.google.common.annotations.Beta; import com.google.common.base.Charsets; -import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.io.Files; import com.sun.jersey.api.core.DefaultResourceConfig; import com.sun.jersey.api.core.ResourceConfig; import com.sun.jersey.spi.container.servlet.ServletContainer; -import org.apache.brooklyn.rest.filter.SwaggerFilter; -import org.apache.brooklyn.rest.util.OsgiCompat; -import org.eclipse.jetty.server.NetworkConnector; /** Convenience and demo for launching programmatically. Also used for automated tests. * <p> @@ -230,8 +230,8 @@ public class BrooklynRestApiLauncher { // For Eclipse, use the default option of ${workspace_loc:brooklyn-launcher}. // If the working directory is not set correctly, Brooklyn will be unable to find the jsgui .war // file and the 'gui not available' message will be shown. - context.setWar(this.deployJsgui && findJsguiWebapp() != null - ? findJsguiWebapp() + context.setWar(this.deployJsgui && findJsguiWebappInSource().isPresent() + ? findJsguiWebappInSource().get() : createTempWebDirWithIndexHtml("Brooklyn REST API <p> (gui not available)")); installAsServletFilter(context, this.filters); return context; @@ -380,30 +380,52 @@ public class BrooklynRestApiLauncher { new InetSocketAddress(Networking.ANY_NIC, Networking.nextAvailablePort(FAVOURITE_PORT))); } - /** look for the JS GUI webapp in common places, returning path to it if found, or null */ - private static String findJsguiWebapp() { - // could also look in maven repo ? - return Optional - .fromNullable(findMatchingFile("./brooklyn-ui/src/main/webapp")) - .or(findMatchingFile("./brooklyn-ui/target/*.war")) - .orNull(); + /** look for the JS GUI webapp in common source places, returning path to it if found, or null. + * assumes `brooklyn-ui` is checked out as a sibling to `brooklyn-server`, and both are 2, 3, 1, or 0 + * levels above the CWD. */ + @Beta + public static Maybe<String> findJsguiWebappInSource() { + // normally up 2 levels to where brooklyn-* folders are, then into ui + // (but in rest projects it might be 3 up, and in some IDEs we might run from parent dirs.) + // TODO could also look in maven repo ? + return findFirstMatchingFile( + "../../brooklyn-ui/src/main/webapp", + "../../../brooklyn-ui/src/main/webapp", + "../brooklyn-ui/src/main/webapp", + "./brooklyn-ui/src/main/webapp", + "../../brooklyn-ui/target/*.war", + "../../..brooklyn-ui/target/*.war", + "../brooklyn-ui/target/*.war", + "./brooklyn-ui/target/*.war"); } /** look for the REST WAR file in common places, returning path to it if found, or null */ private static String findRestApiWar() { // don't look at src/main/webapp here -- because classes won't be there! // could also look in maven repo ? + // TODO looks like this stopped working at runtime a long time ago; + // only needed for WEB_XML mode, and not used, but should remove or check? + // (probably will be superseded by CXF/OSGi work however) return findMatchingFile("../rest/target/*.war").orNull(); } + /** as {@link #findMatchingFile(String)} but finding the first */ + public static Maybe<String> findFirstMatchingFile(String ...filenames) { + for (String f: filenames) { + Maybe<String> result = findMatchingFile(f); + if (result.isPresent()) return result; + } + return Maybe.absent(); + } + /** returns the supplied filename if it exists (absolute or relative to the current directory); * supports globs in the filename portion only, in which case it returns the _newest_ matching file. * <p> * otherwise returns null */ @Beta // public because used in dependent test projects - public static Optional<String> findMatchingFile(String filename) { + public static Maybe<String> findMatchingFile(String filename) { final File f = new File(filename); - if (f.exists()) return Optional.of(filename); + if (f.exists()) return Maybe.of(filename); File dir = f.getParentFile(); File result = null; if (dir.exists()) { @@ -417,8 +439,8 @@ public class BrooklynRestApiLauncher { if (result==null || mf.lastModified() > result.lastModified()) result = mf; } } - if (result==null) return Optional.absent(); - return Optional.of(result.getAbsolutePath()); + if (result==null) return Maybe.absent(); + return Maybe.of(result.getAbsolutePath()); } /** create a directory with a simple index.html so we have some content being served up */ http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/6471500e/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java ---------------------------------------------------------------------- diff --git a/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java b/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java index cfdcb28..1bf756d 100644 --- a/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java +++ b/brooklyn-server/rest/rest-server/src/test/java/org/apache/brooklyn/rest/BrooklynRestApiLauncherTest.java @@ -26,7 +26,6 @@ import java.util.concurrent.Callable; import org.apache.brooklyn.entity.brooklynnode.BrooklynNode; import org.apache.brooklyn.rest.security.provider.AnyoneSecurityProvider; -import org.apache.brooklyn.rest.util.BrooklynRestResourceUtilsTest.SampleNoOpApplication; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.http.HttpAsserts; import org.apache.brooklyn.util.http.HttpTool;
