package net.jsunit.server;
import net.jsunit.InvalidBrowserSpecificationException;
import net.jsunit.RemoteRunSpecification;
import net.jsunit.configuration.RemoteConfiguration;
import net.jsunit.model.Browser;
import net.jsunit.model.BrowserSpecification;
import net.jsunit.model.RemoteServerConfigurationSource;
import java.net.URL;
import java.util.*;
public class RemoteRunSpecificationBuilder {
public RemoteRunSpecification forSingleRemoteBrowser(URL url, Browser remoteBrowser) {
RemoteRunSpecification result = new RemoteRunSpecification(url);
result.addBrowser(remoteBrowser);
return result;
}
public List<RemoteRunSpecification> forAllBrowsersFromRemoteConfigurations(List<RemoteConfiguration> remoteConfigurations) {
List<RemoteRunSpecification> result = new ArrayList<RemoteRunSpecification>();
for (RemoteConfiguration remoteConfiguration : remoteConfigurations)
result.add(new RemoteRunSpecification(remoteConfiguration.getRemoteURL()));
return result;
}
public List<RemoteRunSpecification> forIdStringPairs(String[] pairs, RemoteServerConfigurationSource source)
throws InvalidBrowserSpecificationException {
RemoteRunSpecificationMerger merger = new RemoteRunSpecificationMerger();
for (String pair : pairs) {
String[] ids = pair.split("_");
int urlId;
int browserId;
try {
urlId = Integer.parseInt(ids[0]);
browserId = Integer.parseInt(ids[1]);
} catch (Exception e) {
return throwInvalidRemoteMachineBrowserCombinationException(ids, pair);
}
RemoteConfiguration configuration;
try {
configuration = source.getRemoteMachineConfigurationById(urlId);
} catch (Exception e) {
throw new InvalidBrowserSpecificationException(ids[0], ids[1]);
}
Browser browser = configuration.getBrowserById(browserId);
if (browser == null)
throw new InvalidBrowserSpecificationException(ids[0], ids[1]);
merger.add(configuration.getRemoteURL(), browser);
}
return merger.getResult();
}
private List<RemoteRunSpecification> throwInvalidRemoteMachineBrowserCombinationException(String[] ids, String pair) throws InvalidBrowserSpecificationException {
if (ids.length == 2)
throw new InvalidBrowserSpecificationException(ids[0], ids[1]);
else
throw new InvalidBrowserSpecificationException(pair);
}
public List<RemoteRunSpecification> forAllBrowsersFromRemoteURLs(List<URL> remoteMachineURLs) {
List<RemoteRunSpecification> result = new ArrayList<RemoteRunSpecification>();
for (URL url : remoteMachineURLs)
result.add(new RemoteRunSpecification(url));
return result;
}
public List<RemoteRunSpecification> forAllBrowsersFromRemoteURLs(URL... remoteMachineURLs) {
return forAllBrowsersFromRemoteURLs(Arrays.asList(remoteMachineURLs));
}
public List<RemoteRunSpecification> forBrowserSpecifications(List<BrowserSpecification> browserSpecs, List<RemoteConfiguration> allRemoteMachineConfigurations) throws InvalidBrowserSpecificationException {
RemoteRunSpecificationMerger merger = new RemoteRunSpecificationMerger();
for (BrowserSpecification specification : browserSpecs) {
RemoteConfiguration remoteConfiguration = findRemoteConfigurationFor_in(specification, allRemoteMachineConfigurations);
if (remoteConfiguration == null)
throw new InvalidBrowserSpecificationException(specification.getBrowserType(), specification.getBrowserType());
Browser browser = remoteConfiguration.getBrowserMatching(specification);
if (browser == null)
throw new InvalidBrowserSpecificationException(specification.getBrowserType(), specification.getBrowserType());
merger.add(remoteConfiguration.getRemoteURL(), browser);
}
return merger.getResult();
}
private RemoteConfiguration findRemoteConfigurationFor_in(BrowserSpecification specification, List<RemoteConfiguration> remoteConfigurations) {
for (RemoteConfiguration remoteConfiguration : remoteConfigurations) {
if (specification.matches(remoteConfiguration))
return remoteConfiguration;
}
return null;
}
static class RemoteRunSpecificationMerger {
private Map<String, RemoteRunSpecification> urlToSpec = new HashMap<String, RemoteRunSpecification>();
public void add(URL remoteURL, Browser browser) {
RemoteRunSpecification specForURL = urlToSpec.get(remoteURL.toString());
if (specForURL == null) {
specForURL = new RemoteRunSpecification(remoteURL);
urlToSpec.put(remoteURL.toString(), specForURL);
}
specForURL.addBrowser(browser);
}
public List<RemoteRunSpecification> getResult() {
List<RemoteRunSpecification> result = new ArrayList<RemoteRunSpecification>(urlToSpec.values());
Collections.sort(result, new Comparator<RemoteRunSpecification>() {
public int compare(RemoteRunSpecification first, RemoteRunSpecification second) {
return first.getRemoteMachineBaseURL().toString().compareTo(second.getRemoteMachineBaseURL().toString());
}
});
return result;
}
}
}