/*******************************************************************************
* Copyright (c) 2013 BREDEX GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* BREDEX GmbH - initial API and implementation and/or initial documentation
*******************************************************************************/
package org.eclipse.jubula.autagent.commands;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.commons.lang.LocaleUtils;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jubula.autagent.AutStarter;
import org.eclipse.jubula.communication.internal.Communicator;
import org.eclipse.jubula.tools.internal.constants.AutConfigConstants;
import org.eclipse.jubula.tools.internal.constants.CommandConstants;
import org.eclipse.jubula.tools.internal.constants.StringConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Upperclass for the JavaFX and SwingStart Server Command classes.
* This was created because the AbstractStartJavaAut already has more
* than 400 lines of code and it is also extended by StartRcpAutServerCommand.
* This class implements all methods that are the same for the
* JavaFX and Swing classes.
*/
public abstract class AbstractStartJavaAutServer extends AbstractStartJavaAut {
/** the logger */
private static final Logger LOG =
LoggerFactory.getLogger(AbstractStartJavaAutServer.class);
/** separates the environment variables */
private static final String ENV_SEPARATOR = "\n"; //$NON-NLS-1$
/**
* @return the Id of the specific rc bundle
*/
protected abstract String getRcBundleClassPath();
/**
* Sets -javaagent, JRE arguments and the arguments for
* the AutServer as environment variables.
* @param parameters The parameters for starting the AUT
* @param autServerClasspath The classpath of the AUT Server
*/
protected void setEnv(Map<String, String> parameters,
String autServerClasspath) {
String env = parameters.get(AutConfigConstants.ENVIRONMENT);
if (env == null) {
env = StringConstants.EMPTY;
} else {
env += ENV_SEPARATOR;
}
env += setJavaOptions(parameters);
if (isRunningFromExecutable(parameters)) {
// agent arguments
String serverPort = "null"; //$NON-NLS-1$
final Communicator autCommunicator = AutStarter.getInstance()
.getAutCommunicator();
if (autCommunicator != null) {
serverPort = String.valueOf(autCommunicator.getLocalPort());
}
env += ENV_SEPARATOR + "AUT_SERVER_PORT=" + serverPort; ////$NON-NLS-1$
env += ENV_SEPARATOR + "AUT_SERVER_CLASSPATH=" + autServerClasspath; //$NON-NLS-1$
env += ENV_SEPARATOR + "AUT_SERVER_NAME=" + getServerClassName(); //$NON-NLS-1$
// AUT-Agent variables
env += ENV_SEPARATOR + AutConfigConstants.AUT_AGENT_HOST + "=" + parameters.get(AutConfigConstants.AUT_AGENT_HOST); //$NON-NLS-1$
env += ENV_SEPARATOR + AutConfigConstants.AUT_AGENT_PORT + "=" + parameters.get(AutConfigConstants.AUT_AGENT_PORT); //$NON-NLS-1$
env += ENV_SEPARATOR + AutConfigConstants.AUT_NAME + "=" + parameters.get(AutConfigConstants.AUT_NAME); //$NON-NLS-1$
}
// create environment
parameters.put(AutConfigConstants.ENVIRONMENT, env);
}
/**
*
* @return an array of Strings representing the launch classpath.
*/
public String[] getLaunchClasspath() {
StringBuffer autServerClasspath = new StringBuffer();
createServerClasspath(autServerClasspath);
autServerClasspath.append(PATH_SEPARATOR)
.append(getRcBundleClassPath());
return autServerClasspath.toString().split(PATH_SEPARATOR);
}
/**
* Creates the Server classpath.
* @param serverClasspath the server classpath
*/
protected void createServerClasspath(StringBuffer serverClasspath) {
String [] bundlesToAddToClasspath = {
CommandConstants.TOOLS_BUNDLE_ID,
CommandConstants.TOOLS_EXEC_BUNDLE_ID,
CommandConstants.COMMUNICATION_BUNDLE_ID,
CommandConstants.RC_COMMON_BUNDLE_ID,
CommandConstants.TOOLKIT_API_BUNDLE_ID,
CommandConstants.SLF4J_JCL_BUNDLE_ID,
CommandConstants.SLF4J_API_BUNDLE_ID,
CommandConstants.COMMONS_LANG_BUNDLE_ID,
CommandConstants.APACHE_IO_BUNDLE_ID,
CommandConstants.APACHE_EXEC_BUNDLE_ID,
CommandConstants.APACHE_ORO_BUNDLE_ID,
CommandConstants.COMMONS_BEAN_UTILS_BUNDLE_ID,
CommandConstants.COMMONS_COLLECTIONS_BUNDLE_ID,
CommandConstants.LOGBACK_CLASSIC_BUNDLE_ID,
CommandConstants.LOGBACK_CORE_BUNDLE_ID,
CommandConstants.LOGBACK_SLF4J_BUNDLE_ID
};
for (String bundleId : bundlesToAddToClasspath) {
serverClasspath.append(
AbstractStartToolkitAut.getClasspathForBundleId(bundleId));
serverClasspath.append(PATH_SEPARATOR);
}
serverClasspath.append(getAbsExtImplClassesPath());
if (LOG.isDebugEnabled()) {
LOG.debug("serverClasspath" + serverClasspath); //$NON-NLS-1$
}
}
/**
* Gets the absolute path of the location of the external ImplClasses.
* @return the absolute path
*/
protected String getAbsExtImplClassesPath() {
final File implDir = new File(CommandConstants.EXT_IMPLCLASSES_PATH);
final StringBuffer paths = new StringBuffer(implDir.getAbsolutePath());
final File[] jars = implDir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".jar"); //$NON-NLS-1$
}
});
if (jars != null) {
final int maxIdx = jars.length;
for (int i = 0; i < maxIdx; i++) {
File f = jars[i];
paths.append(PATH_SEPARATOR);
paths.append(f.getAbsolutePath());
}
}
return paths.toString();
}
/**
* Adds elements to the given cmds List.
* @param autServerClasspath the server classpath
* @param cmds the 1st part of the cmd array
* @param parameters The parameters for starting the AUT.
*/
protected void createAutServerClasspath(StringBuffer autServerClasspath,
List<String> cmds, Map<String, String> parameters) {
final Communicator autCommunicator = AutStarter.getInstance()
.getAutCommunicator();
if (autCommunicator != null) {
cmds.add(String.valueOf(autCommunicator.getLocalPort()));
} else {
cmds.add("null"); //$NON-NLS-1$
}
String autMain = getAUTMainClass(parameters);
if (autMain == null) {
return;
}
cmds.add(autMain);
autServerClasspath.append(PATH_SEPARATOR)
.append(getRcBundleClassPath());
cmds.add(autServerClasspath.toString());
cmds.add(getServerClassName());
}
/**
*
* @return the server base path including resources path
*/
protected String createServerBasePath() {
return AbstractStartToolkitAut.getClasspathForBundleId(
CommandConstants.RC_COMMON_BUNDLE_ID);
}
/**
* @param parameters
* The parameters for starting the AUT.
* @return The arguments for the AUT that were found in the given
* parameters.
*/
protected List<String> createAutArguments(Map<String, String> parameters) {
List<String> argsList = new Vector<String>();
final String joinedAutRunArgs = parameters.get(
AutConfigConstants.AUT_RUN_AUT_ARGUMENTS);
if (joinedAutRunArgs != null) {
return Arrays.asList(StringUtils.split(joinedAutRunArgs,
AutConfigConstants.AUT_RUN_AUT_ARGUMENTS_SEPARATOR_CHAR));
}
processAutRunArguments(parameters, argsList);
return argsList;
}
/**
* Process the aut arguments for creating aut arguments
* @param parameters argument parameter map
* @param argsList argument lists, which contains the parameters
*/
private void processAutRunArguments(Map<String, String> parameters,
List<String> argsList) {
String autArguments = parameters.get(AutConfigConstants.AUT_ARGUMENTS);
if (autArguments == null) {
autArguments = StringConstants.EMPTY;
}
String delimiterString = "%_"; //$NON-NLS-1$
String[] quotedParts = StringUtils.substringsBetween(autArguments, "\"", //$NON-NLS-1$
"\""); //$NON-NLS-1$
if (quotedParts != null) {
for (String quotedPart : quotedParts) {
String escapedQuotePart = new String(quotedPart);
escapedQuotePart = escapedQuotePart.replaceAll("\\s+", //$NON-NLS-1$
delimiterString);
autArguments = autArguments.replace(quotedPart,
escapedQuotePart);
}
}
StringTokenizer args = new StringTokenizer(autArguments,
WHITESPACE_DELIMITER);
while (args.hasMoreTokens()) {
String arg = args.nextToken();
if (arg.contains(delimiterString)) {
arg = arg.replaceAll(delimiterString, " ").replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
argsList.add(arg);
}
}
/**
* @param cmds the commands list
* @param autServerClasspath the autServerClassPath to change
* @param parameters The parameters for starting the AUT.
*/
protected void createAutServerLauncherClasspath(List<String> cmds,
StringBuffer autServerClasspath, Map<String, String> parameters) {
addBaseSettings(cmds, parameters);
cmds.add("-classpath"); //$NON-NLS-1$
StringBuffer autClassPath = createAutClasspath(parameters);
String serverBasePath = createServerBasePath();
cmds.add(autClassPath.append(PATH_SEPARATOR)
.append(serverBasePath).toString());
// add classname of autLauncher
cmds.add(CommandConstants.AUT_SERVER_LAUNCHER);
// add autServerBase dirs to autServerClassPath
autServerClasspath.append(PATH_SEPARATOR).append(serverBasePath);
}
/**
* * Creates the AUT settings.
*
* @param cmds
* the commands list
* @param parameters
* The parameters for starting the AUT.
*/
protected void addBaseSettings(List<String> cmds,
Map<String, String> parameters) {
// add locale
addLocale(cmds, LocaleUtils.toLocale(parameters
.get(AutConfigConstants.AUT_LOCALE)));
// add JRE params
final String jreParams = parameters
.get(AutConfigConstants.JRE_PARAMETER);
if (jreParams != null && jreParams.length() > 0) {
StringTokenizer tok = new StringTokenizer(jreParams,
WHITESPACE_DELIMITER);
while (tok.hasMoreTokens()) {
cmds.add(tok.nextToken());
}
}
// add debug options (if necessary)
addDebugParams(cmds, false);
// add -Duser.dir and workingDir here
}
/**
* Creates the AUT classpath.
* @param parameters The parameters for starting the AUT.
* @return The classpath of the AUT.
*/
protected StringBuffer createAutClasspath(Map parameters) {
// Add AUT classpath
StringBuffer autClassPath = new StringBuffer();
String jarFile = (String)parameters.get(AutConfigConstants.JAR_FILE);
if (jarFile == null) {
jarFile = StringConstants.EMPTY;
}
String manifestClassPath = getClassPathFromManifest(parameters);
if (manifestClassPath.length() > 0) {
autClassPath.append(manifestClassPath).append(PATH_SEPARATOR);
}
autClassPath.append(jarFile);
if (jarFile != null && jarFile.length() > 0) {
autClassPath.append(PATH_SEPARATOR);
}
return autClassPath;
}
}