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

io.github.xinyangpan.cucumber.element.ElementData Maven / Gradle / Ivy

package io.github.xinyangpan.cucumber.element;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;

import org.assertj.core.util.Sets;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import cucumber.api.DataTable;
import io.github.xinyangpan.cucumber.util.ElementUtils;

public class ElementData {
	// 
	private final List baseElements = Lists.newArrayList();
	// -----------------------------
	// ----- Constructors
	// -----------------------------

	public ElementData(DataTable dataTable, Function, E> newElement) {
		this(dataTable.asMaps(String.class, String.class), null, newElement);
	}
	
	public ElementData(DataTable dataTable, E scenarioVariable, Function, E> newElement) {
		this(dataTable.asMaps(String.class, String.class), scenarioVariable, newElement);
	}

	public ElementData(List> elementMaps, E scenarioVariable, Function, E> newElement) {
		for (Map elementMap : elementMaps) {
			E baseElement = newElement.apply(applyVariable(elementMap, scenarioVariable));
			if (baseElement.isNotIgnoreRow()) {
				this.baseElements.add(baseElement);
			}
		}
	}

	// Only Support Element Single Value
	public Map applyVariable(Map elementMap, E scenarioVariable) {
		if (scenarioVariable == null) {
			return elementMap;
		}
		if (scenarioVariable.dataMap().isEmpty()) {
			return elementMap;
		}
		Map maps = Maps.newHashMap(elementMap);
		for (Entry singleVar : scenarioVariable.dataMap().entrySet()) {
			String variableName = "$" + singleVar.getKey();
			String variableValue = singleVar.getValue();
			for (Entry e : maps.entrySet()) {
				if (Objects.equals(variableName, e.getValue())) {
					e.setValue(variableValue);
				}
			}
		}
		return maps;
	}

	// -----------------------------
	// ----- public Non-Static Methods
	// -----------------------------

	public void convert(Map> funcName2FunctionMap) {
		Set fieldNames = this.getElementKeys();
		for (String fieldName : fieldNames) {
			if (fieldName.contains("@")) {
				String[] fieldNameArray = fieldName.split("@");
				String newFieldName = fieldNameArray[0];
				String functionName;
				if (fieldNameArray.length == 1) {
					functionName = newFieldName;
				} else {
					functionName = fieldNameArray[1];
				}
				this.convert(fieldName, newFieldName, funcName2FunctionMap.get(functionName));
			}
		}
	}

	public ElementData convert(String oldKey, String newKey, Function valueConverter) {
		if (!this.getElementKeys().contains(oldKey)) {
			return this;
		}
		for (E baseElement : baseElements) {
			baseElement.convert(oldKey, newKey, valueConverter);
		}
		return this;
	}

	public List getElements() {
		return baseElements;
	}

	public  List getElements(Supplier elementCreator) {
		List values = Lists.newArrayList();
		for (E baseElement : baseElements) {
			T target = elementCreator.get();
			baseElement.putValuesTo(target);
			values.add(target);
		}
		return values;
	}

	public  List getElements(Class clazz) {
		return getElements(() -> ElementUtils.newInstance(clazz));
	}

	public E getOnlyElement() {
		return Iterables.getOnlyElement(baseElements, null);
	}

	public  T getOnlyElement(Class clazz) {
		E baseElement = this.getOnlyElement();
		T t = ElementUtils.newInstance(clazz);
		baseElement.putValuesTo(t);
		return t;
	}

	public boolean isEmpty() {
		return baseElements.isEmpty();
	}

	// -----------------------------
	// ----- private
	// -----------------------------

	private Set getElementKeys() {
		if (baseElements.isEmpty()) {
			return Sets.newHashSet();
		}
		return baseElements.get(0).getKeySet();
	}

	// -----------------------------
	// ----- Get Set ToString HashCode Equals
	// -----------------------------

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("DataTableWrapper [valueMaps=");
		builder.append(baseElements);
		builder.append("]");
		return builder.toString();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy