package org.arquillian.cube.docker.impl.beforeStop;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.arquillian.cube.docker.impl.client.config.CustomBeforeStopAction;
import org.arquillian.cube.docker.impl.docker.DockerClientExecutor;
import org.arquillian.cube.impl.model.CubeId;
import org.arquillian.cube.spi.beforeStop.BeforeStopAction;
public class CustomBeforeStopActionInstantiator implements BeforeStopAction {
private CubeId containerId;
private DockerClientExecutor dockerClientExecutor;
private CustomBeforeStopAction customBeforeStopAction;
public CustomBeforeStopActionInstantiator(CubeId containerId, DockerClientExecutor dockerClientExecutor,
CustomBeforeStopAction customBeforeStopAction) {
this.containerId = containerId;
this.dockerClientExecutor = dockerClientExecutor;
this.customBeforeStopAction = customBeforeStopAction;
}
@Override
public void doBeforeStop() {
try {
String classname = customBeforeStopAction.getStrategy();
Class<? extends BeforeStopAction> customStrategy =
(Class<? extends BeforeStopAction>) Class.forName(classname);
BeforeStopAction customStrategyInstance = customStrategy.newInstance();
// Inject if there is a field of type Cube, DockerClientExecutor
final Field[] fields = customStrategyInstance.getClass().getDeclaredFields();
for (Field field : fields) { // Inject if there is a field of type Cube, DockerClientExecutor
if (field.getType().isAssignableFrom(DockerClientExecutor.class)) {
field.setAccessible(true);
field.set(customStrategyInstance, this.dockerClientExecutor);
} else if (field.getType().isAssignableFrom(CubeId.class)) {
field.setAccessible(true);
field.set(customStrategyInstance, this.containerId);
}
}
for (PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(customStrategyInstance.getClass())
.getPropertyDescriptors()) {
final Method writeMethod = propertyDescriptor.getWriteMethod();
if (writeMethod != null) {
if (writeMethod.getParameterTypes()[0].isAssignableFrom(CubeId.class)) {
writeMethod.invoke(customStrategyInstance, this.containerId);
} else if (writeMethod.getParameterTypes()[0].isAssignableFrom(DockerClientExecutor.class)) {
writeMethod.invoke(customStrategyInstance, this.dockerClientExecutor);
}
}
}
// Finally, we call the beforeStop method
customStrategyInstance.doBeforeStop();
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException | IntrospectionException | InvocationTargetException e) {
throw new IllegalArgumentException(e);
}
}
}