Coverage Report - org.jbehave.core.model.ExamplesTable
 
Classes in this File Line Coverage Branch Coverage Complexity
ExamplesTable
100%
42/42
100%
10/10
1.385
 
 1  
 package org.jbehave.core.model;
 2  
 
 3  
 import java.util.ArrayList;
 4  
 import java.util.HashMap;
 5  
 import java.util.List;
 6  
 import java.util.Map;
 7  
 
 8  
 import org.apache.commons.lang.builder.ToStringBuilder;
 9  
 import org.apache.commons.lang.builder.ToStringStyle;
 10  
 
 11  
 /**
 12  
  * <p>
 13  
  * Represents a tabular structure to hold example data for parameters named via the headers:
 14  
  * <p/>
 15  
  * <pre>
 16  
  * |header 1|header 2| .... |header n|
 17  
  * |value 11|value 12| .... |value 1n|
 18  
  * ...
 19  
  * |value m1|value m2| .... |value mn|
 20  
  * </pre>
 21  
  * <p>Different header and value column separators can be specified to replace the default separator "|":</p>
 22  
  * <pre>
 23  
  * !!header 1!!header 2!! .... !!header n!!
 24  
  * !value 11!value 12! .... !value 1n!
 25  
  * ...
 26  
  * !value m1!value m2| .... !value mn!
 27  
  * </pre>
 28  
  */
 29  
 public class ExamplesTable {
 30  
 
 31  
     private static final String NEWLINE = "\n";
 32  
     private static final String HEADER_SEPARATOR = "|";
 33  
     private static final String VALUE_SEPARATOR = "|";
 34  161
     private final List<Map<String, String>> data = new ArrayList<Map<String, String>>();
 35  
     private final String tableAsString;
 36  
     private final String headerSeparator;
 37  
     private final String valueSeparator;
 38  161
     private final List<String> headers = new ArrayList<String>();
 39  
 
 40  
     public ExamplesTable(String tableAsString) {
 41  42
         this(tableAsString, HEADER_SEPARATOR, VALUE_SEPARATOR);
 42  42
     }
 43  
 
 44  161
     public ExamplesTable(String tableAsString, String headerSeparator, String valueSeparator) {
 45  161
         this.tableAsString = tableAsString;
 46  161
         this.headerSeparator = headerSeparator;
 47  161
         this.valueSeparator = valueSeparator;
 48  161
         parse();
 49  161
     }
 50  
 
 51  
     private void parse() {
 52  161
         data.clear();
 53  161
         String[] rows = tableAsString.trim().split(NEWLINE);
 54  161
         headers.clear();
 55  368
         for (int row = 0; row < rows.length; row++) {
 56  207
             if (row == 0) {
 57  161
                 List<String> columns = columnsFor(rows[row], headerSeparator);
 58  161
                 headers.addAll(columns);
 59  161
             } else {
 60  46
                 List<String> columns = columnsFor(rows[row], valueSeparator);
 61  46
                 Map<String, String> map = new HashMap<String, String>();
 62  140
                 for (int column = 0; column < columns.size(); column++) {
 63  94
                     map.put(headers.get(column), columns.get(column));
 64  
                 }
 65  46
                 data.add(map);
 66  
             }
 67  
         }
 68  161
     }
 69  
 
 70  
     private List<String> columnsFor(String row, String separator) {
 71  207
         List<String> columns = new ArrayList<String>();
 72  559
         for (String column : row.split(buildRegex(separator))) {
 73  352
             columns.add(column.trim());
 74  
         }
 75  
         // we'll always have a leading column to the left side of the separator which we ignore
 76  207
         columns.remove(0);
 77  207
         return columns;
 78  
     }
 79  
 
 80  
     private String buildRegex(String separator) {
 81  207
         char[] chars = separator.toCharArray();
 82  207
         StringBuffer sb = new StringBuffer();
 83  416
         for ( char c : chars ){
 84  209
             sb.append("\\").append(c);
 85  
         }
 86  207
         return sb.toString();
 87  
     }
 88  
 
 89  
     public List<String> getHeaders() {
 90  19
         return headers;
 91  
     }
 92  
 
 93  
     public Map<String, String> getRow(int row) {
 94  58
         return data.get(row);
 95  
     }
 96  
 
 97  
     public int getRowCount() {
 98  18
         return data.size();
 99  
     }
 100  
 
 101  
     public List<Map<String, String>> getRows() {
 102  20
         return data;
 103  
     }
 104  
 
 105  
     public String getHeaderSeparator() {
 106  2
         return headerSeparator;
 107  
     }
 108  
 
 109  
     public String getValueSeparator() {
 110  2
         return valueSeparator;
 111  
     }
 112  
 
 113  
     public String asString() {
 114  9
         return tableAsString;
 115  
     }
 116  
 
 117  
     @Override
 118  
     public String toString() {
 119  15
         return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
 120  
     }
 121  
 
 122  
 }