1   package com.atlassian.pageobjects.elements.query.webdriver;
2   
3   import com.atlassian.pageobjects.elements.WebDriverLocatable;
4   import com.atlassian.pageobjects.elements.query.AbstractTimedQuery;
5   import com.atlassian.pageobjects.elements.query.ExpirationHandler;
6   import com.atlassian.pageobjects.elements.query.PollingQuery;
7   import com.atlassian.pageobjects.elements.query.TimedCondition;
8   import com.atlassian.pageobjects.elements.query.TimedQuery;
9   import com.atlassian.pageobjects.elements.timeout.TimeoutType;
10  import com.atlassian.pageobjects.elements.timeout.Timeouts;
11  import com.atlassian.webdriver.AtlassianWebDriver;
12  import com.google.common.base.Supplier;
13  
14  import javax.annotation.concurrent.NotThreadSafe;
15  import javax.inject.Inject;
16  
17  import static com.atlassian.pageobjects.elements.timeout.TimeoutType.DEFAULT;
18  import static com.google.common.base.Preconditions.checkNotNull;
19  import static com.google.common.base.Preconditions.checkState;
20  
21  /**
22   * Creates various WebDriver-based queries.
23   *
24   */
25  @NotThreadSafe
26  public class WebDriverQueryFactory
27  {
28      private final WebDriverLocatable locatable;
29  
30      @Inject
31      private Timeouts timeouts;
32  
33      @Inject
34      private AtlassianWebDriver webDriver;
35  
36      public WebDriverQueryFactory(WebDriverLocatable locatable)
37      {
38          this.locatable = checkNotNull(locatable);
39      }
40  
41      public WebDriverQueryFactory(WebDriverLocatable locatable, Timeouts timeouts, AtlassianWebDriver webDriver)
42      {
43          this.locatable = checkNotNull(locatable);
44          this.timeouts = timeouts;
45          this.webDriver = webDriver;
46      }
47  
48      private long interval = -1L;
49  
50      private long interval()
51      {
52          if (interval == -1)
53          {
54              interval = timeouts.timeoutFor(TimeoutType.EVALUATION_INTERVAL);
55              checkState(interval > 0);
56          }
57          return interval;
58      }
59  
60      public TimedCondition isPresent(TimeoutType timeoutType)
61      {
62          return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isPresent(),
63                  timeouts.timeoutFor(timeoutType), interval());
64      }
65  
66      public TimedCondition isPresent()
67      {
68          return isPresent(DEFAULT);
69      }
70  
71      public TimedCondition isVisible(TimeoutType timeoutType)
72      {
73          return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isVisible(),
74                  timeouts.timeoutFor(timeoutType), interval());
75      }
76  
77      public TimedCondition isVisible()
78      {
79          return isVisible(DEFAULT);
80      }
81  
82      public TimedCondition isEnabled(TimeoutType timeoutType)
83      {
84          return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isEnabled(),
85                  timeouts.timeoutFor(timeoutType), interval());
86      }
87  
88      public TimedCondition isEnabled()
89      {
90          return isEnabled(DEFAULT);
91      }
92  
93      public TimedCondition isSelected(TimeoutType timeoutType)
94      {
95          return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.isSelected(),
96                  timeouts.timeoutFor(timeoutType), interval());
97      }
98  
99      public TimedCondition isSelected()
100     {
101         return isSelected(DEFAULT);
102     }
103 
104     public TimedQuery<String> getText(TimeoutType timeoutType)
105     {
106         return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getText(),
107                 timeouts.timeoutFor(timeoutType), interval());
108     }
109 
110     public TimedQuery<String> getText()
111     {
112         return getText(DEFAULT);
113     }
114 
115     public TimedQuery<String> getValue(TimeoutType timeoutType)
116     {
117         return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getValue(),
118                 timeouts.timeoutFor(timeoutType), interval());
119     }
120 
121     public TimedQuery<String> getValue()
122     {
123         return getValue(DEFAULT);
124     }
125 
126     public TimedCondition hasAttribute(String attributeName, String expectedValue, TimeoutType timeoutType)
127     {
128         return new WebDriverLocatableBasedTimedCondition(locatable, webDriver,
129                 WebDriverQueryFunctions.hasAttribute(attributeName, expectedValue),
130                 timeouts.timeoutFor(timeoutType), interval());
131     }
132 
133     public TimedCondition hasAttribute(String attributeName, String expectedValue)
134     {
135         return hasAttribute(attributeName, expectedValue, DEFAULT);
136     }
137 
138     public TimedQuery<String> getAttribute(String attributeName, TimeoutType timeoutType)
139     {
140         return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver,
141                 WebDriverQueryFunctions.getAttribute(attributeName),
142                 timeouts.timeoutFor(timeoutType), interval());
143     }
144 
145     public TimedQuery<String> getAttribute(String attributeName)
146     {
147         return getAttribute(attributeName, DEFAULT);
148     }
149 
150 
151     public TimedCondition hasClass(String className, TimeoutType timeoutType)
152     {
153         return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasClass(className),
154                 timeouts.timeoutFor(timeoutType), interval());
155     }
156 
157     public TimedCondition hasClass(String className)
158     {
159         return hasClass(className, DEFAULT);
160     }
161 
162     public TimedQuery<String> getTagName(TimeoutType timeoutType)
163     {
164         return new WebDriverLocatableBasedTimedQuery<String>(locatable, webDriver, WebDriverQueryFunctions.getTagName(),
165                 timeouts.timeoutFor(timeoutType), interval());
166     }
167 
168     public TimedQuery<String> getTagName()
169     {
170         return getTagName(DEFAULT);
171     }
172 
173     public TimedCondition hasText(String text, TimeoutType timeoutType)
174     {
175         return new WebDriverLocatableBasedTimedCondition(locatable, webDriver, WebDriverQueryFunctions.hasText(text),
176                 timeouts.timeoutFor(timeoutType), interval());
177     }
178 
179     public TimedCondition hasText(String text)
180     {
181         return hasText(text, DEFAULT);
182     }
183 
184     public <T> TimedQuery<T> forSupplier(final Supplier<T> supplier, TimeoutType timeoutType)
185     {
186         return new AbstractTimedQuery<T>(timeouts.timeoutFor(timeoutType), PollingQuery.DEFAULT_INTERVAL,
187                 ExpirationHandler.RETURN_CURRENT)
188         {
189 
190             @Override
191             protected boolean shouldReturn(T currentEval)
192             {
193                 return true;
194             }
195 
196             @Override
197             protected T currentValue()
198             {
199                 return supplier.get();
200             }
201         };
202     }
203 
204     public <T> TimedQuery<T> forSupplier(final Supplier<T> supplier)
205     {
206         return forSupplier(supplier, DEFAULT);
207     }
208 }