1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.internal.requests;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.internal.runners.ErrorReportingRunner;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Request;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Runner;
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.manipulation.Filter;
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.manipulation.NoTestsRemainException;
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * A filtered {@link Request}.
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic final class FilterRequest extends Request {
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Request fRequest;
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final Filter fFilter;
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Creates a filtered Request
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param classRequest a {@link Request} describing your Tests
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param filter {@link Filter} to apply to the Tests described in
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * <code>classRequest</code>
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public FilterRequest(Request classRequest, Filter filter) {
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fRequest= classRequest;
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fFilter= filter;
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	@Override
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Runner getRunner() {
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		try {
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			Runner runner= fRequest.getRunner();
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			fFilter.apply(runner);
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			return runner;
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		} catch (NoTestsRemainException e) {
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			return new ErrorReportingRunner(Filter.class, new Exception(String
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					.format("No tests found matching %s from %s", fFilter
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot							.describe(), fRequest.toString())));
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		}
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}