package net.jsunit.interceptor;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.interceptor.Interceptor;
import net.jsunit.InvalidBrowserIdException;
import net.jsunit.action.BrowserSelectionAware;
import net.jsunit.model.Browser;
import java.util.*;
public class BrowserSelectionInterceptor implements Interceptor {
public String intercept(ActionInvocation invocation) throws Exception {
BrowserSelectionAware aware = (BrowserSelectionAware) invocation.getAction();
String[] browserIds = ServletActionContext.getRequest().getParameterValues("browserId");
List<Browser> allBrowsers = aware.getAllBrowsers();
Set<Browser> selectedBrowsers = null;
if (browserIds != null && browserIds.length > 0) {
try {
selectedBrowsers = selectedBrowsers(browserIds, allBrowsers);
} catch (InvalidBrowserIdException e) {
aware.setErrorMessage("Invalid browser ID: " + e.getIdString());
}
}
List<Browser> result;
if (selectedBrowsers == null)
result = allBrowsers;
else
result = new ArrayList<Browser>(selectedBrowsers);
Collections.sort(result);
aware.setSelectedBrowsers(result);
return invocation.invoke();
}
private Set<Browser> selectedBrowsers(String[] selectedBrowserIds, List<Browser> allBrowsers) throws InvalidBrowserIdException {
Set<Browser> result = new HashSet<Browser>();
for (String idString : selectedBrowserIds) {
Browser chosenBrowser = null;
for (Browser browser : allBrowsers) {
try {
int id = Integer.parseInt(idString);
if (browser.hasId(id))
chosenBrowser = browser;
} catch (NumberFormatException e) {
throw new InvalidBrowserIdException(idString);
}
}
if (chosenBrowser == null) {
throw new InvalidBrowserIdException(idString);
} else
result.add(chosenBrowser);
}
return result;
}
public void destroy() {
}
public void init() {
}
}