package net.jsunit.configuration;
import net.jsunit.model.Browser;
import net.jsunit.utility.StringUtility;
import org.jdom.Element;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
public enum ConfigurationProperty {
BROWSER_FILE_NAMES("browserFileNames", "Browser file names", false, true) {
public String getValueString(Configuration configuration) {
StringBuffer buffer = new StringBuffer();
for (Iterator it = configuration.getBrowsers().iterator(); it.hasNext();) {
Browser browser = (Browser) it.next();
buffer.append(browser.getFileName());
if (it.hasNext())
buffer.append(",");
}
return buffer.toString();
}
protected void addContentTo(Configuration configuration, Element element) {
for (Browser browser : configuration.getBrowsers()) {
Element fileNameElement = new Element("browserFileName");
fileNameElement.setAttribute("id", String.valueOf(browser.getId()));
fileNameElement.setText(browser.getFileName());
element.addContent(fileNameElement);
}
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String browserFileNamesString = source.browserFileNames();
try {
List<String> browserFileNames = StringUtility.listFromCommaDelimitedString(browserFileNamesString);
Set<String> alreadyAddedBrowserFileNames = new HashSet<String>();
int id = 0;
List<Browser> browsers = new ArrayList<Browser>();
for (String browserFileName : browserFileNames) {
if (!alreadyAddedBrowserFileNames.contains(browserFileName) || Browser.DEFAULT_SYSTEM_BROWSER.equals(browserFileName))
{
browsers.add(new Browser(browserFileName, id++));
alreadyAddedBrowserFileNames.add(browserFileName);
}
}
configuration.setBrowsers(browsers);
} catch (Exception e) {
throw new ConfigurationException(this, browserFileNamesString, e);
}
}
},
CLOSE_BROWSERS_AFTER_TEST_RUNS("closeBrowsersAfterTestRuns", "Close browsers?", false, false) {
public String getValueString(Configuration configuration) {
return String.valueOf(configuration.shouldCloseBrowsersAfterTestRuns());
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String string = source.closeBrowsersAfterTestRuns();
if (StringUtility.isEmpty(string))
string = String.valueOf(true);
configuration.setCloseBrowsersAfterTestRuns(Boolean.valueOf(string));
}
},
DESCRIPTION("description", "Description", false, false) {
public String getValueString(Configuration configuration) {
String description = configuration.getDescription();
if (StringUtility.isEmpty(description))
return "";
return description;
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
configuration.setDescription(source.description());
}
},
IGNORE_UNRESPONSIVE_REMOTE_MACHINES("ignoreUnresponsiveRemoteMachines", "Ignore unresponsive remove machines?", false, false) {
public String getValueString(Configuration configuration) {
return String.valueOf(configuration.shouldIgnoreUnresponsiveRemoteMachines());
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String string = source.ignoreUnresponsiveRemoteMachines();
if (StringUtility.isEmpty(string))
string = String.valueOf(false);
configuration.setIgnoreUnresponsiveRemoteMachines(Boolean.valueOf(string));
}
},
LOGS_DIRECTORY("logsDirectory", "Logs directory", false, false) {
public String getValueString(Configuration configuration) {
return configuration.getLogsDirectory().getAbsolutePath();
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String logsDirectoryString = source.logsDirectory();
try {
if (StringUtility.isEmpty(logsDirectoryString))
logsDirectoryString = "logs";
configuration.setLogsDirectory(new File(logsDirectoryString));
} catch (Exception e) {
throw new ConfigurationException(this, logsDirectoryString, e);
}
}
},
PORT("port", "Port", false, false) {
public String getValueString(Configuration configuration) {
return String.valueOf(configuration.getPort());
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String portString = source.port();
if (StringUtility.isEmpty(portString))
portString = "8080";
try {
configuration.setPort(Integer.parseInt(portString));
} catch (NumberFormatException e) {
throw new ConfigurationException(this, portString, e);
}
}
},
REMOTE_MACHINE_URLS("remoteMachineURLs", "Remote machine URLs", true, true) {
public String getValueString(Configuration configuration) {
return StringUtility.commaSeparatedString(configuration.getRemoteMachineURLs());
}
protected void addContentTo(Configuration configuration, Element element) {
for (int i = 0; i < configuration.getRemoteMachineURLs().size(); i++) {
URL remoteMachineURL = configuration.getRemoteMachineURLs().get(i);
Element urlElement = new Element("remoteMachineURL");
urlElement.setAttribute("id", String.valueOf(i));
urlElement.setText(remoteMachineURL.toString());
element.addContent(urlElement);
}
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String remoteMachineURLs = source.remoteMachineURLs();
List<String> strings = StringUtility.listFromCommaDelimitedString(remoteMachineURLs);
List<URL> result = new ArrayList<URL>(strings.size());
Set<String> alreadyAddedURLStrings = new HashSet<String>();
for (String string : strings)
try {
URL attemptedURL = new URL(string);
URL normalizedURL = new URL(attemptedURL.getProtocol(), attemptedURL.getHost(), attemptedURL.getPort(), "/jsunit");
if (!alreadyAddedURLStrings.contains(normalizedURL.toString())) {
result.add(normalizedURL);
alreadyAddedURLStrings.add(normalizedURL.toString());
}
} catch (MalformedURLException e) {
throw new ConfigurationException(this, remoteMachineURLs, e);
}
configuration.setRemoteMachineURLs(result);
}
},
RESOURCE_BASE("resourceBase", "Resource base", false, false) {
public String getValueString(Configuration configuration) {
return configuration.getResourceBase().getAbsolutePath();
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String resourceBaseString = source.resourceBase();
if (StringUtility.isEmpty(resourceBaseString))
resourceBaseString = ".";
try {
configuration.setResourceBase(new File(resourceBaseString));
} catch (Exception e) {
throw new ConfigurationException(this, resourceBaseString, e);
}
}
},
TIMEOUT_SECONDS("timeoutSeconds", "Test timeout (seconds)", false, false) {
public String getValueString(Configuration configuration) {
return String.valueOf(configuration.getTimeoutSeconds());
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String timeoutSecondsString = source.timeoutSeconds();
if (StringUtility.isEmpty(timeoutSecondsString))
timeoutSecondsString = "60";
try {
configuration.setTimeoutSeconds(Integer.parseInt(timeoutSecondsString));
} catch (NumberFormatException e) {
throw new ConfigurationException(ConfigurationProperty.TIMEOUT_SECONDS, timeoutSecondsString, e);
}
}
},
URL("url", "Test Page URL", true, false) {
public String getValueString(Configuration configuration) {
URL testURL = configuration.getTestURL();
return testURL == null ? "" : testURL.toString();
}
public void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException {
String urlString = source.url();
if (StringUtility.isEmpty(urlString))
return;
try {
configuration.setTestURL(new URL(urlString));
} catch (MalformedURLException e) {
throw new ConfigurationException(this, urlString, e);
}
}
};
private String name;
private String displayName;
private boolean isURL;
private boolean isMultiValued;
private ConfigurationProperty(String name, String displayName, boolean isURL, boolean isMultiValued) {
this.displayName = displayName;
this.name = name;
this.isURL = isURL;
this.isMultiValued = isMultiValued;
}
public String getName() {
return name;
}
public abstract String getValueString(Configuration configuration);
public void addXmlTo(Element parentElement, Configuration configuration) {
Element element = new Element(name);
addContentTo(configuration, element);
parentElement.addContent(element);
}
protected void addContentTo(Configuration configuration, Element element) {
element.setText(getValueString(configuration));
}
public static List<ConfigurationProperty> all() {
List<ConfigurationProperty> result = Arrays.asList(ConfigurationProperty.values());
Collections.sort(result, comparator());
return result;
}
public static Comparator<ConfigurationProperty> comparator() {
return new Comparator<ConfigurationProperty>() {
public int compare(ConfigurationProperty property1, ConfigurationProperty property2) {
return property1.name().compareTo(property2.name());
}
};
}
public String getDisplayName() {
return displayName;
}
public boolean isURL() {
return isURL;
}
public List<String> getValueStrings(Configuration configuration) {
List<String> result = new ArrayList<String>();
if (isMultiValued())
for (String value : StringUtility.listFromCommaDelimitedString(getValueString(configuration)))
result.add(value);
else
result.add(getValueString(configuration));
return result;
}
private boolean isMultiValued() {
return isMultiValued;
}
public abstract void configure(Configuration configuration, ConfigurationSource source) throws ConfigurationException;
}