All Downloads are FREE. Search and download functionalities are using the official Maven repository.

info.novatec.testit.webtester.internal.implementation.pages.ByteBuddyPageFactory Maven / Gradle / Ivy

package info.novatec.testit.webtester.internal.implementation.pages;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

import info.novatec.testit.webtester.browser.Browser;
import info.novatec.testit.webtester.internal.implementation.PageFactory;
import info.novatec.testit.webtester.internal.implementation.pages.exceptions.PageCreationException;
import info.novatec.testit.webtester.internal.postconstruct.PostConstructInvoker;
import info.novatec.testit.webtester.internal.postconstruct.PostConstructMustBeChecker;
import info.novatec.testit.webtester.internal.implementation.pages.exceptions.PageMustBeInterfaceException;
import info.novatec.testit.webtester.pages.Page;


public class ByteBuddyPageFactory implements PageFactory {

    private final Browser browser;

    public ByteBuddyPageFactory(Browser browser) {
        this.browser = browser;
    }

    @Override
    public  T createInstanceOf(Class type) {
        assertIsInterface(type);

        Arrays.stream(type.getDeclaredConstructors()).forEach(constructor -> constructor.setAccessible(true));

        Class typeImpl = PageImplementation.getOrCreate(type);
        T page = createInstance(typeImpl);
        invokePostConstructChecks(type, page);
        return page;
    }

    private  void assertIsInterface(Class pageType) {
        if (!pageType.isInterface()) {
            throw new PageMustBeInterfaceException(pageType);
        }
    }

    @SuppressWarnings("unchecked")
    private  T createInstance(Class pageImplType) {
        try {
            Constructor constructor = pageImplType.getConstructor(Browser.class);
            return ( T ) constructor.newInstance(browser);
        } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
            throw new PageCreationException(pageImplType, e);
        }
    }

    private void invokePostConstructChecks(Class type, Page page) {
        PostConstructMustBeChecker.checkMustMethods(type, page);
        PostConstructInvoker.invokePostConstructMethods(type, page);
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy