/*
* Copyright 2014 cruxframework.org.
*
* 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 org.cruxframework.crux.tools.codeserver;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cruxframework.crux.core.client.Legacy;
import org.cruxframework.crux.tools.parameters.ConsoleParameter;
import org.cruxframework.crux.tools.parameters.ConsoleParameterOption;
import org.cruxframework.crux.tools.parameters.ConsoleParametersProcessingException;
import org.cruxframework.crux.tools.parameters.ConsoleParametersProcessor;
import org.cruxframework.crux.tools.server.JettyDevServer;
import com.google.gwt.dev.codeserver.Options;
/**
* @author Thiago da Rosa de Bustamante
*
*/
@Deprecated
@Legacy
public class CodeServer
{
private static final Log logger = LogFactory.getLog(CodeServer.class);
private String bindAddress = "localhost";
private String launcherDir;
private String moduleName;
private boolean noPrecompile = false;
private int port = getDefaultPort();
private CodeServerRecompileListener recompileListener;
private String sourceDir;
private String webDir;
private String workDir;
public String getModuleName()
{
return moduleName;
}
public String getSourceDir()
{
return sourceDir;
}
public String getWorkDir()
{
return workDir;
}
public void setModuleName(String moduleName)
{
this.moduleName = moduleName;
}
public void setSourceDir(String sourceDir)
{
this.sourceDir = sourceDir;
}
public void setWorkDir(String workDir)
{
this.workDir = workDir;
}
protected ConsoleParametersProcessor createParametersProcessor()
{
ConsoleParameter parameter;
ConsoleParametersProcessor parametersProcessor = new ConsoleParametersProcessor("CodeServer");
parameter = new ConsoleParameter("-moduleName", "The name of the module to be compiled.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("name", "Module name"));
parametersProcessor.addSupportedParameter(parameter);
parameter = new ConsoleParameter("-sourceDir", "The application source folder.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("dir", "Source dir"));
parametersProcessor.addSupportedParameter(parameter);
parameter = new ConsoleParameter("-bindAddress", "The ip address of the code server. Defaults to 127.0.0.1.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("ip", "Ip address"));
parametersProcessor.addSupportedParameter(parameter);
parametersProcessor.addSupportedParameter(new ConsoleParameter("-noprecompile", "If informed, code server will not pre compile the source.", false, true));
parametersProcessor.addSupportedParameter(new ConsoleParameter("-startJetty", "If informed, starts the default application server (Jetty).", false, true));
parameter = new ConsoleParameter("-locale", "The locale used by hotdeployment scanner to recompile the project.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("locale", "locale"));
parametersProcessor.addSupportedParameter(parameter);
parameter = new ConsoleParameter("-port", "The port where the code server will run.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("port", "Port"));
parametersProcessor.addSupportedParameter(parameter);
parameter = new ConsoleParameter("-workDir", "The root of the directory tree where the code server will write compiler output. If not supplied, a temporary directory will be used.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("dir", "Work dir"));
parametersProcessor.addSupportedParameter(parameter);
parameter = new ConsoleParameter("-webDir", "The directory to be updated by code server compiler. If provided, after each code server compilation, this folder will be updated.", false, true);
parameter.addParameterOption(new ConsoleParameterOption("dir", "Web dir"));
parametersProcessor.addSupportedParameter(parameter);
parametersProcessor.addSupportedParameter(new ConsoleParameter("-help", "Display the usage screen.", false, true));
parametersProcessor.addSupportedParameter(new ConsoleParameter("-h", "Display the usage screen.", false, true));
return parametersProcessor;
}
protected int getDefaultPort()
{
return 9876;
}
protected String[] getServerParameters()
{
List<String> args = new ArrayList<String>();
if (noPrecompile)
{
args.add("-noprecompile");
}
else
{
args.add("-precompile");
args.add("-noincremental");
}
if (launcherDir != null && launcherDir.length() > 0)
{
args.add("-launcherDir");
args.add(launcherDir);
}
if (bindAddress != null && bindAddress.length() > 0)
{
args.add("-bindAddress");
args.add(bindAddress);
}
if (port > 0)
{
args.add("-port");
args.add(Integer.toString(port));
}
if (workDir != null && workDir.length() > 0)
{
args.add("-workDir");
args.add(workDir);
}
if (sourceDir != null && sourceDir.length() > 0)
{
args.add("-src");
args.add(sourceDir);
}
if (moduleName != null && moduleName.length() > 0)
{
args.add(moduleName);
}
return args.toArray(new String[args.size()]);
}
protected void processParameters(Collection<ConsoleParameter> parameters)
{
for (ConsoleParameter parameter : parameters)
{
if (parameter.getName().equals("-moduleName"))
{
moduleName = parameter.getValue();
}
else if (parameter.getName().equals("-noprecompile"))
{
this.noPrecompile = true;
}
else if (parameter.getName().equals("-sourceDir"))
{
sourceDir = parameter.getValue();
}
else if (parameter.getName().equals("-bindAddress"))
{
try
{
InetAddress bindAddress = InetAddress.getByName(parameter.getValue());
if (bindAddress.isAnyLocalAddress())
{
this.bindAddress = InetAddress.getLocalHost().getHostAddress();
}
else
{
this.bindAddress = parameter.getValue();
}
}
catch(Exception e)
{
//Use default
}
}
else if (parameter.getName().equals("-port"))
{
port =Integer.parseInt(parameter.getValue());
}
else if (parameter.getName().equals("-workDir"))
{
workDir = parameter.getValue();
}
else if (parameter.getName().equals("-webDir"))
{
webDir = parameter.getValue();
launcherDir = parameter.getValue();
recompileListener = new CodeServerRecompileListener(webDir);
}
}
}
protected void runGWTCodeServer(String[] args) throws Exception
{
Options options = new Options();
if (!options.parseArgs(args))
{
System.exit(1);
}
options.setJobChangeListener(recompileListener);
// options.addTags("-XnoenforceStrictResources");
try
{
com.google.gwt.dev.codeserver.CodeServer.main(options);
}
catch (Throwable t)
{
logger.error("Error running code server", t);
}
}
public static void main(String[] args)
{
try
{
CodeServer codeServer = new CodeServer();
ConsoleParametersProcessor parametersProcessor = codeServer.createParametersProcessor();
Map<String, ConsoleParameter> parameters = parametersProcessor.processConsoleParameters(args);
if (parameters.containsKey("-help") || parameters.containsKey("-h"))
{
parametersProcessor.showsUsageScreen();
}
else
{
codeServer.processParameters(parameters.values());
codeServer.runGWTCodeServer(codeServer.getServerParameters());
if(parameters.containsKey("-startJetty"))
{
JettyDevServer.main(args);
}
}
}
catch (ConsoleParametersProcessingException e)
{
logger.error("Error processing program parameters: "+e.getLocalizedMessage()+". Program aborted.",e);
}
catch (Exception e)
{
logger.error("Error running code server: "+e.getLocalizedMessage()+". Program aborted.",e);
}
}
}