1 package com.atlassian.webdriver.jira;
2
3 import com.atlassian.pageobjects.PageBinder;
4 import com.atlassian.pageobjects.binder.PostInjectionProcessor;
5 import com.atlassian.pageobjects.util.InjectUtils;
6 import com.atlassian.webdriver.jira.component.ClickableLink;
7 import com.atlassian.webdriver.jira.component.WebDriverLink;
8 import org.openqa.selenium.By;
9
10 import javax.inject.Inject;
11 import java.lang.reflect.Field;
12
13 import static com.atlassian.pageobjects.util.InjectUtils.forEachFieldWithAnnotation;
14
15
16
17
18 public class ClickableLinkPostInjectionProcessor implements PostInjectionProcessor
19 {
20 @Inject
21 PageBinder pageBinder;
22
23 public <T> T process(T pageObject)
24 {
25 injectWebLinks(pageObject);
26 return pageObject;
27 }
28
29 private void injectWebLinks(final Object instance)
30 {
31 forEachFieldWithAnnotation(instance, ClickableLink.class, new InjectUtils.FieldVisitor<ClickableLink>()
32 {
33 public void visit(Field field, ClickableLink annotation)
34 {
35 WebDriverLink link = createLink(annotation);
36 try
37 {
38 field.setAccessible(true);
39 field.set(instance, link);
40 }
41 catch (IllegalAccessException e)
42 {
43 throw new RuntimeException(e);
44 }
45 }
46 });
47 }
48
49 private WebDriverLink createLink(ClickableLink clickableLink)
50 {
51 By by;
52 if (clickableLink.className().length() > 0)
53 {
54 by = By.className(clickableLink.className());
55 }
56 else if (clickableLink.id().length() > 0)
57 {
58 by = By.id(clickableLink.id());
59 }
60 else if (clickableLink.linkText().length() > 0)
61 {
62 by = By.linkText(clickableLink.linkText());
63 }
64 else if (clickableLink.partialLinkText().length() > 0)
65 {
66 by = By.partialLinkText(clickableLink.partialLinkText());
67 }
68 else
69 {
70 throw new IllegalArgumentException("No selector found");
71 }
72
73 return pageBinder.bind(WebDriverLink.class, by, clickableLink.nextPage());
74 }
75 }