package org.fluentlenium.core.hook; import lombok.experimental.Delegate; import org.fluentlenium.core.DefaultFluentContainer; import org.fluentlenium.core.FluentControl; import org.fluentlenium.core.components.ComponentInstantiator; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.pagefactory.ElementLocator; import java.util.function.Supplier; /** * Base hook implementation. * <p> * You should extends this class to implement your own hook. * * @param <T> type of options for the hook */ public class BaseHook<T> extends DefaultFluentContainer implements FluentHook<T> { private final ComponentInstantiator instantiator; private final Supplier<ElementLocator> locatorSupplier; private final Supplier<String> toStringSupplier; private T options; private final Supplier<WebElement> elementSupplier; /** * Get the underlying element of the hook. * <p> * Can be another hook, or a real element. * * @return underlying element */ @Delegate public final WebElement getElement() { return elementSupplier.get(); } @Override public WebElement getWrappedElement() { return getElement(); } /** * Get the underlying element locator of the hook. * * @return underlying element locator */ @Delegate public final ElementLocator getElementLocator() { return locatorSupplier.get(); } /** * Creates a new base hook. * * @param control control interface * @param instantiator component instantiator * @param elementSupplier element supplier * @param locatorSupplier element locator supplier * @param toStringSupplier element toString supplier * @param options hook options */ public BaseHook(FluentControl control, ComponentInstantiator instantiator, Supplier<WebElement> elementSupplier, Supplier<ElementLocator> locatorSupplier, Supplier<String> toStringSupplier, T options) { super(control); this.instantiator = instantiator; this.elementSupplier = elementSupplier; this.locatorSupplier = locatorSupplier; this.toStringSupplier = toStringSupplier; this.options = options; if (this.options == null) { this.options = newOptions(); // NOPMD ConstructorCallsOverridableMethod } } /** * Builds default options. * * @return default options */ protected T newOptions() { return null; } /** * Get the component instantiator. * * @return component instantiator */ public ComponentInstantiator getInstantiator() { return instantiator; } @Override public T getOptions() { return options; } @Override public String toString() { return toStringSupplier.get(); } }