package cucumber.runtime.xstream; import cucumber.runtime.table.CamelCaseStringConverter; import java.util.ArrayList; import java.util.List; import static java.util.Arrays.asList; public class ComplexTypeWriter extends CellWriter { private final List<String> columnNames; private final List<String> fieldNames = new ArrayList<String>(); private final List<String> fieldValues = new ArrayList<String>(); private int nodeDepth = 0; public ComplexTypeWriter(List<String> columnNames) { this.columnNames = columnNames; } @Override public List<String> getHeader() { return columnNames.isEmpty() ? fieldNames : columnNames; } @Override public List<String> getValues() { CamelCaseStringConverter converter = new CamelCaseStringConverter(); if (!columnNames.isEmpty()) { String[] explicitFieldValues = new String[columnNames.size()]; int n = 0; for (String columnName : columnNames) { int index = fieldNames.indexOf(converter.map(columnName)); if (index == -1) { explicitFieldValues[n] = ""; } else { explicitFieldValues[n] = fieldValues.get(index); } n++; } return asList(explicitFieldValues); } else { return fieldValues; } } @Override public void startNode(String name) { if (nodeDepth == 1) { this.fieldNames.add(name); } nodeDepth++; } @Override public void addAttribute(String name, String value) { } @Override public void setValue(String value) { fieldValues.add(value == null ? "" : value); } @Override public void endNode() { nodeDepth--; } @Override public void flush() { throw new UnsupportedOperationException(); } @Override public void close() { throw new UnsupportedOperationException(); } }