1 package com.atlassian.webdriver.testing.rule;
2
3 import com.atlassian.pageobjects.TestedProduct;
4 import com.atlassian.pageobjects.inject.InjectionContext;
5 import com.atlassian.pageobjects.util.InjectingTestedProducts;
6 import com.google.common.base.Supplier;
7 import org.junit.runner.Description;
8 import org.junit.runners.model.Statement;
9
10 import javax.annotation.Nonnull;
11
12 import static com.google.common.base.Preconditions.checkNotNull;
13
14
15
16
17
18
19
20
21
22
23 public final class ClassInjectionRule<P extends TestedProduct<?>> implements InjectingTestRule
24 {
25 private final Supplier<P> product;
26
27 ClassInjectionRule(Supplier<P> productSupplier)
28 {
29 this.product = checkNotNull(productSupplier, "productSupplier");
30 }
31
32
33 @Override
34 public Statement apply(final Statement base, final Description description)
35 {
36 return new Statement() {
37 @Override
38 public void evaluate() throws Throwable
39 {
40 if (supportsInjection())
41 {
42 injectionContext().injectStatic(description.getTestClass());
43 }
44 base.evaluate();
45 }
46 };
47 }
48
49 boolean supportsInjection()
50 {
51 return InjectingTestedProducts.supportsInjection(product.get());
52 }
53
54 InjectionContext injectionContext()
55 {
56 return InjectingTestedProducts.asInjectionContext(product.get());
57 }
58
59 @Override
60 @Nonnull
61 public <T> T getInstance(@Nonnull Class<T> type)
62 {
63 return injectionContext().getInstance(type);
64 }
65
66 @Override
67 public void injectStatic(@Nonnull Class<?> targetClass)
68 {
69 injectionContext().injectStatic(targetClass);
70 }
71
72 @Override
73 public void injectMembers(@Nonnull Object targetInstance)
74 {
75 injectionContext().inject(targetInstance);
76 }
77
78 @Nonnull
79 @Override
80 public <T> T inject(@Nonnull T target)
81 {
82 return injectionContext().inject(target);
83 }
84 }