package net.thucydides.core.steps;
import com.google.common.collect.Lists;
import net.thucydides.core.annotations.Fields;
import net.thucydides.core.pages.PageObject;
import net.thucydides.core.pages.Pages;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Set;
public class PageObjectDependencyInjector implements DependencyInjector {
private final Pages pages;
public PageObjectDependencyInjector(Pages pages) {
this.pages = pages;
}
public void injectDependenciesInto(Object target) {
List<Field> pageObjectFields = pageObjectFieldsIn(target);
for(Field pageObjectField : pageObjectFields) {
instantiatePageObjectIfNotAssigned(pageObjectField, target);
}
}
private void instantiatePageObjectIfNotAssigned(Field pageObjectField, Object target) {
try {
pageObjectField.setAccessible(true);
if (pageObjectField.get(target) == null) {
Class<PageObject> pageObjectClass = (Class<PageObject>) pageObjectField.getType();
PageObject newPageObject = pages.getPage(pageObjectClass);
injectDependenciesInto(newPageObject);
pageObjectField.set(target, newPageObject);
}
} catch (IllegalAccessException e) {
throw new IllegalArgumentException("Could not instanciate page objects in " + target);
}
}
private List<Field> pageObjectFieldsIn(Object target) {
Set<Field> allFields = Fields.of(target.getClass()).allFields();
List<Field> pageObjectFields = Lists.newArrayList();
for(Field field : allFields) {
if (PageObject.class.isAssignableFrom(field.getType())) {
pageObjectFields.add(field);
}
}
return pageObjectFields;
}
}