/*
* 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.apache.brooklyn.rest.jsgui;
import java.net.InetSocketAddress;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.brooklyn.rest.BrooklynRestApiLauncher;
import org.apache.brooklyn.util.net.Networking;
import org.eclipse.jetty.server.NetworkConnector;
/** launches Javascript GUI programmatically. and used for tests.
* see {@link BrooklynRestApiLauncher} for more information.
*
* WINDOWS tips:
* On Windows Jetty will lock all static files preventing any changes on them.
* To work around the problem and tell Jetty not to lock files:
* <ul>
* <li>find jetty-webapp-<ver>.jar from your classpath
* <li>extract the file webdefault.xml from folder org/eclipse/jetty/webapp (On Eclipse
* just expanding the jar from the dependencies, right click/copy on the file.)
* <li>in this project create a java package org.eclipse.jetty.webapp and put the webdefault.html file in it
* <li>edit the file and change the property useFileMappedBuffer to false
* </ul>
**/
public class BrooklynJavascriptGuiLauncher {
private static final Logger log = LoggerFactory.getLogger(BrooklynJavascriptGuiLauncher.class);
public static void main(String[] args) throws Exception {
// NOTE: When running Brooklyn from an IDE (i.e. by launching BrooklynJavascriptGuiLauncher.main())
// you will need to ensure that the working directory is set to the jsgui folder. For IntelliJ,
// set the 'Working directory' of the Run/Debug Configuration to $MODULE_DIR$/brooklyn-server/launcher.
// 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.
startJavascriptAndRest();
log.info("Press Ctrl-C to quit.");
}
final static int FAVOURITE_PORT = 8080;
/** 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 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(
BrooklynRestApiLauncher.findJsguiWebappInSource()
.or("../../brooklyn-ui/src/main/webapp"),
"/");
Server server = new Server(new InetSocketAddress(Networking.LOOPBACK, Networking.nextAvailablePort(FAVOURITE_PORT)));
server.setHandler(context);
server.start();
log.info("JS GUI server started (no REST) at http://localhost:"+((NetworkConnector)server.getConnectors()[0]).getLocalPort()+"/");
return server;
}
}