com.epam.jdi.light.elements.complex.UIList Maven / Gradle / Ivy
package com.epam.jdi.light.elements.complex;
/**
* Created by Roman Iovlev on 14.02.2018
* Email: [email protected]; Skype: roman.iovlev
*/
import com.epam.jdi.light.common.JDIAction;
import com.epam.jdi.light.common.UIUtils;
import com.epam.jdi.light.elements.base.JDIBase;
import com.epam.jdi.light.elements.composite.Section;
import com.epam.jdi.light.elements.init.SiteInfo;
import com.epam.jdi.light.elements.pageobjects.annotations.Title;
import com.epam.jdi.tools.CacheValue;
import com.epam.jdi.tools.LinqUtils;
import com.epam.jdi.tools.Timer;
import com.epam.jdi.tools.map.MapArray;
import org.hamcrest.Matcher;
import org.openqa.selenium.WebElement;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import static com.epam.jdi.light.common.Exceptions.exception;
import static com.epam.jdi.light.elements.init.PageFactory.initElements;
import static com.epam.jdi.light.logger.LogLevels.DEBUG;
import static com.epam.jdi.tools.EnumUtils.getEnumValue;
import static com.epam.jdi.tools.ReflectionUtils.getValueField;
import static com.epam.jdi.tools.ReflectionUtils.isClass;
public class UIList extends JDIBase implements IList {
private CacheValue> elements = new CacheValue<>();
private CacheValue> values = new CacheValue<>();
private Class classType;
public String titleFieldName = NO_TITLE_FIELD;
public static final String NO_TITLE_FIELD = "NO TITLE FIELD";
public UIList(Class classType) {
this.classType = classType;
elements.setForce(new MapArray<>());
values.setForce(new ArrayList<>());
}
@JDIAction(level = DEBUG)
public List elements() {
if (values.hasValue())
return values.get();
if (elements.hasValue())
return elements.get().values();
return values.set(LinqUtils.select(
Timer.getByCondition(() -> getAll(), l -> l.size() > 0), this::initElement));
}
@JDIAction(level = DEBUG)
public void clear() {
elements.clear();
values.clear();
}
public MapArray getMap() {
if (elements.hasValue())
return elements.get();
List els = getAll();
return elements.set(values.hasValue()
? new MapArray<>(
LinqUtils.select(els, this::elementTitle),
values.get())
: new MapArray<>(els,
this::elementTitle,
this::initElement));
}
private String elementTitle(WebElement el) {
if (titleFieldName == null)
identifyTitleField();
return titleFieldName.equals(NO_TITLE_FIELD)
? el.getText()
: getElementTitle(el, titleFieldName);
}
private String getElementTitle(WebElement el, String titleField) {
T element = initElement(el);
Field field = null;
try { field = element.getClass().getField(titleField);
} catch (NoSuchFieldException ex) { /* if titleField defined then field always exist */ }
return ((WebElement) getValueField(field, element)).getText();
}
private T initElement(WebElement el) {
try {
T element = classType.newInstance();
if (isClass(classType, Section.class)) {
Section section = (Section)element;
section.setWebElement(el);
section.parent = this;
}
SiteInfo info = new SiteInfo();
info.instance = element;
info.driverName = driverName;
initElements(info);
return element;
} catch (Exception ex) {
throw exception("Can't instantiate list element");
}
}
public List asData(Class entityClass) {
return getMap().select((k, v) -> UIUtils.asEntity(v, entityClass));
}
@JDIAction(level = DEBUG)
public T get(String name) {
return getMap().get(name);
}
private void identifyTitleField() {
Field[] fields = classType.getFields();
Field expectedFields = LinqUtils.first(fields, f -> f.isAnnotationPresent(Title.class));
if (expectedFields == null)
throw exception("No title name specified for '%s' class", classType.getSimpleName());
titleFieldName = expectedFields.getName();
}
@JDIAction
public void showAll() {
if (!isClass(classType, Section.class))
throw exception("Show all can be executed only for List of Sections. Please add ' extend Section' to your PageObject class in List");
int size;
do {
size = size();
js().executeScript("arguments[0].scrollIntoView(true);", ((Section)get(size-1)).get());
clear();
} while (size < size());
}
public T get(Enum name) {
return get(getEnumValue(name));
}
public String getValue() {
return getMap().toString();
}
public void is(Class entityClass, Matcher> condition) {
org.hamcrest.MatcherAssert.assertThat(asData(entityClass), condition);
}
public void assertThat(Class entityClass, Matcher> condition) {
is(entityClass, condition);
}
}