package org.fluentlenium.configuration; import org.fluentlenium.utils.ReflectionUtils; import org.openqa.selenium.Capabilities; import org.openqa.selenium.remote.DesiredCapabilities; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * A simple {@link CapabilitiesFactory} that create {@link Capabilities} instances using reflection. */ public class ReflectiveCapabilitiesFactory implements CapabilitiesFactory, FactoryNames, ReflectiveFactory { private final String name; private final Object[] args; private final String capabilitiesClassName; private Class<? extends Capabilities> capabilitiesClass; private boolean available; /** * Creates a new reflective capabilities factory. * * @param name factory name * @param capabilitiesClassName capabilities class name * @param args capabilities class constructor arguments */ public ReflectiveCapabilitiesFactory(String name, String capabilitiesClassName, Object... args) { this.name = name; this.capabilitiesClassName = capabilitiesClassName; this.args = args; try { capabilitiesClass = (Class<? extends Capabilities>) Class.forName(capabilitiesClassName); available = Capabilities.class.isAssignableFrom(capabilitiesClass); } catch (ClassNotFoundException e) { available = false; } } /** * Creates a new reflective capabilities factory. * * @param name factory name * @param capabilitiesClass capabilities class * @param args capabilities class constructor arguments */ public ReflectiveCapabilitiesFactory(String name, Class<? extends Capabilities> capabilitiesClass, Object... args) { this.name = name; this.capabilitiesClass = capabilitiesClass; this.args = args; capabilitiesClassName = capabilitiesClass.getName(); available = Capabilities.class.isAssignableFrom(this.capabilitiesClass); } /** * Get the capabilities class * * @return capabilities class */ public Class<? extends Capabilities> getCapabilitiesClass() { return capabilitiesClass; } @Override public boolean isAvailable() { return available; } /** * Creates default capabilities. * * @return default capabilities */ protected DesiredCapabilities newDefaultCapabilities() { return null; } @Override public Capabilities newCapabilities(ConfigurationProperties configuration) { if (!available) { throw new ConfigurationException("Capabilities " + capabilitiesClassName + " is not available."); } try { return ReflectionUtils.newInstance(capabilitiesClass, args); } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { throw new ConfigurationException("Can't create new Capabilities instance", e); } } @Override public String[] getNames() { List<String> names = new ArrayList<>(Arrays.asList(name)); if (capabilitiesClass != null) { names.add(capabilitiesClass.getName()); names.add(capabilitiesClass.getSimpleName()); } return names.toArray(new String[names.size()]); } }