/* * Copyright (C) 2013 DroidDriver committers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.appium.droiddriver.finders; import io.appium.droiddriver.UiElement; import io.appium.droiddriver.util.Preconditions; /** * Finds UiElement by applying Finders in turn: using the UiElement returned by * first Finder as context for the second Finder. It is conceptually similar to * <a href="http://en.wikipedia.org/wiki/Functional_composition">Function * composition</a>. The returned UiElement can be thought of as the result of * second(first(context)). * <p> * Note typically first Finder finds the ancestor, then second Finder finds the * target UiElement, which is a descendant. ChainFinder can be chained with * additional Finders to make a "chain". */ public class ChainFinder implements Finder { private final Finder first; private final Finder second; protected ChainFinder(Finder first, Finder second) { this.first = Preconditions.checkNotNull(first); this.second = Preconditions.checkNotNull(second); } @Override public String toString() { return String.format("Chain{%s, %s}", first, second); } @Override public UiElement find(UiElement context) { return second.find(first.find(context)); } }