SpectrumFieldDecorator.java

package io.github.giulong.spectrum.internals.page_factory;

import io.github.giulong.spectrum.interfaces.Secured;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WrapsElement;
import org.openqa.selenium.interactions.Locatable;
import org.openqa.selenium.support.pagefactory.DefaultFieldDecorator;
import org.openqa.selenium.support.pagefactory.ElementLocator;
import org.openqa.selenium.support.pagefactory.ElementLocatorFactory;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class SpectrumFieldDecorator extends DefaultFieldDecorator {

    public SpectrumFieldDecorator(final ElementLocatorFactory factory) {
        super(factory);
    }

    @Override
    public Object decorate(final ClassLoader loader, final Field field) {
        final ElementLocator locator = factory.createLocator(field);
        if (locator == null) {
            return null;
        }

        if (WebElement.class.isAssignableFrom(field.getType())) {
            final InvocationHandler handler = new SpectrumLocatingElementHandler(locator, field.isAnnotationPresent(Secured.class));
            return Proxy.newProxyInstance(loader, new Class[]{WebElement.class, WrapsElement.class, Locatable.class}, handler);
        }

        if (isDecoratableList(field)) {
            return proxyForListLocator(loader, locator);
        }

        return null;
    }
}