blob: d5604ce2e971f0b4a85375e18cdf5b6a0ba8af42 [file] [log] [blame]
/*
* Copyright 2009 Google Inc.
*
* Licensed 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 com.google.gwt.dev;
import com.google.gwt.core.ext.ServletContainer;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.dev.DevModeBase.OptionPort;
import com.google.gwt.dev.DevModeBase.OptionStartupURLs;
import com.google.gwt.dev.shell.jetty.JettyLauncher;
import com.google.gwt.dev.util.BrowserLauncher;
import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
import com.google.gwt.util.tools.ArgHandlerExtra;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* An utility class for running web apps with Jetty and launching the default
* browser.
*/
public class RunWebApp {
interface RunWebAppOptions extends OptionStartupURLs, OptionPort {
}
static class RunWebAppOptionsImpl implements RunWebAppOptions {
private int port;
private final List<String> startupURLs = new ArrayList<String>();
public void addStartupURL(String url) {
startupURLs.add(url);
}
public int getPort() {
return port;
}
public List<String> getStartupURLs() {
return Collections.unmodifiableList(startupURLs);
}
public void setPort(int port) {
this.port = port;
}
}
private class ArgHandlerWar extends ArgHandlerExtra {
@Override
public boolean addExtraArg(String arg) {
warFile = new File(arg);
if (!warFile.exists()) {
System.err.println("Could not open war file '"
+ warFile.getAbsolutePath() + "'");
return false;
}
return true;
}
@Override
public String getPurpose() {
return "Specifies the location of the target .war file or war directory";
}
@Override
public String[] getTagArgs() {
return new String[] {"war"};
}
@Override
public boolean isRequired() {
return true;
}
}
private class ArgProcessor extends ArgProcessorBase {
public ArgProcessor(RunWebAppOptions options) {
registerHandler(new DevMode.ArgHandlerStartupURLs(options));
registerHandler(new DevModeBase.ArgHandlerPort(options));
registerHandler(new ArgHandlerWar());
}
@Override
protected String getName() {
return RunWebApp.class.getName();
}
}
public static void main(String[] args) {
try {
RunWebAppOptionsImpl options = new RunWebAppOptionsImpl();
RunWebApp runWebApp = new RunWebApp(options);
ArgProcessor argProcessor = runWebApp.new ArgProcessor(options);
if (argProcessor.processArgs(args)) {
runWebApp.run();
}
} catch (Exception e) {
System.err.println("Unable to start Jetty server");
e.printStackTrace();
}
}
protected File warFile;
private final RunWebAppOptions options;
public RunWebApp(RunWebAppOptions options) {
this.options = options;
}
protected void run() {
PrintWriterTreeLogger logger = new PrintWriterTreeLogger();
logger.setMaxDetail(TreeLogger.WARN);
int port = options.getPort();
try {
ServletContainer scl = new JettyLauncher().start(logger, port, warFile);
port = scl.getPort();
} catch (Exception e) {
System.err.println("Unable to start Jetty server");
e.printStackTrace();
return;
}
if (options.getStartupURLs().isEmpty()) {
options.addStartupURL("/");
}
for (String startupUrl : options.getStartupURLs()) {
startupUrl = DevModeBase.normalizeURL(startupUrl, false, port,
"localhost");
try {
BrowserLauncher.browse(startupUrl);
} catch (IOException e) {
System.err.println("Unable to start " + startupUrl);
} catch (URISyntaxException e) {
System.err.println(startupUrl + " is not a valid URL");
}
}
}
}