1985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin/*
2985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * Copyright (C) 2013 DroidDriver committers
3985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin *
4985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * Licensed under the Apache License, Version 2.0 (the "License");
5985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * you may not use this file except in compliance with the License.
6985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * You may obtain a copy of the License at
7985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin *
8985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin *      http://www.apache.org/licenses/LICENSE-2.0
9985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin *
10985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * Unless required by applicable law or agreed to in writing, software
11985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * distributed under the License is distributed on an "AS IS" BASIS,
12985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * See the License for the specific language governing permissions and
14985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin * limitations under the License.
15985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin */
16985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin
174b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinpackage io.appium.droiddriver.finders;
18985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin
194b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.UiElement;
204b31201b5a2dbf8036da5a8d089a68a39cc1dc44Kevin Jinimport io.appium.droiddriver.util.Preconditions;
21985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin
22985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin/**
230319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * Finds UiElement by applying Finders in turn: using the UiElement returned by
240319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * first Finder as context for the second Finder. It is conceptually similar to
250319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * <a href="http://en.wikipedia.org/wiki/Functional_composition">Function
260319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * composition</a>. The returned UiElement can be thought of as the result of
270319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * second(first(context)).
280319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * <p>
290319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * Note typically first Finder finds the ancestor, then second Finder finds the
300319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * target UiElement, which is a descendant. ChainFinder can be chained with
310319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin * additional Finders to make a "chain".
32985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin */
337576fbbba2bf515908b45293b7156b5bfe088938Kevin Jinpublic class ChainFinder implements Finder {
340319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin  private final Finder first;
350319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin  private final Finder second;
36985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin
370319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin  protected ChainFinder(Finder first, Finder second) {
380319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin    this.first = Preconditions.checkNotNull(first);
390319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin    this.second = Preconditions.checkNotNull(second);
40985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  }
41985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin
42985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  @Override
43985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  public String toString() {
440319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin    return String.format("Chain{%s, %s}", first, second);
45985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  }
46985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin
47985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  @Override
48985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  public UiElement find(UiElement context) {
490319e7c14a536a11851cc30cfa57241ce90fec11Kevin Jin    return second.find(first.find(context));
50985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin  }
51985b3bff6691575b23da83c3e7cfd8552b6f4c55Kevin Jin}
52