package detective.core.dsl.table; import groovy.lang.GroovyObject; import groovy.lang.GroovyObjectSupport; import groovy.lang.MetaClass; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import scala.reflect.internal.Trees.This; import detective.core.dsl.DslException; import detective.core.runner.PropertyToStringDelegate; public class Row extends GroovyObjectSupport implements GroovyObject{ private List<Object> values = new ArrayList<Object>(); private Map<Object, Integer> headToIndexMap = new HashMap<Object, Integer>(); private Row header = null; public Row(Object firstValue){ this.values.add(firstValue); } public Row or(Object arg) { values.add(arg); return this; } public Object[] asArray() { return values.toArray(); } public Map<String, Object> asMap(){ Map<String, Object> map = new HashMap<String, Object>(); for (String head : getHeaderAsStrings()){ map.put(head, this.getProperty(head)); } return map; } public int size(){ return values.size(); } @Override public String toString() { return "Row " + values + " Header " + header.values; } /** * Setup header if have */ public void setRowHeader(Row header){ this.header = header; if (header == null || header.size() == 0) return; if (header.size() != this.size()) throw new DslException("Size of header and row not same, header we got " + header + " row we got: " + this); this.headToIndexMap.clear(); for (int i = 0; i < header.size(); i++){ headToIndexMap.put(getHeaderText(header.values.get(i)), i); } } public boolean headExists(String header){ return headToIndexMap.containsKey(header); } public Row getHeader(){ return this.header; } public String[] getHeaderAsStrings(){ Row headerRow = getHeader(); List<String> headers = new ArrayList<String>(); for (Object obj : headerRow.asArray()){ String header = Row.getHeaderText(obj); headers.add(header); } return headers.toArray(new String[]{}); } @Override public Object getProperty(String propertyName) { if (this.headToIndexMap.containsKey(propertyName)) return values.get(headToIndexMap.get(propertyName)); return super.getProperty(propertyName); } public static String getHeaderText(Object obj){ String header = obj.toString(); if (obj instanceof PropertyToStringDelegate) header = ((PropertyToStringDelegate)obj).getFullPropertyName(); return header; } }