1 | |
package org.jbehave.core.model; |
2 | |
|
3 | |
import java.util.ArrayList; |
4 | |
import java.util.HashMap; |
5 | |
import java.util.LinkedHashMap; |
6 | |
import java.util.List; |
7 | |
import java.util.Map; |
8 | |
import java.util.Properties; |
9 | |
|
10 | |
import static java.lang.Boolean.parseBoolean; |
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
|
18 | |
|
19 | |
|
20 | |
|
21 | |
|
22 | |
|
23 | |
|
24 | |
|
25 | |
public class TableTransformers { |
26 | |
|
27 | |
public static final String FROM_LANDSCAPE = "FROM_LANDSCAPE"; |
28 | 1813 | private final Map<String, TableTransformer> transformers = new HashMap<String, TableTransformer>(); |
29 | |
|
30 | 1813 | public TableTransformers() { |
31 | 1813 | useTransformer(FROM_LANDSCAPE, new FromLandscape()); |
32 | 1813 | } |
33 | |
|
34 | |
public String transform(String transformerName, String tableAsString, Properties properties) { |
35 | 5 | TableTransformer transformer = transformers.get(transformerName); |
36 | 5 | if (transformer != null) { |
37 | 4 | return transformer.transform(tableAsString, properties); |
38 | |
} |
39 | 1 | return tableAsString; |
40 | |
} |
41 | |
|
42 | |
public void useTransformer(String name, TableTransformer transformer) { |
43 | 1815 | transformers.put(name, transformer); |
44 | 1815 | } |
45 | |
|
46 | |
public interface TableTransformer { |
47 | |
String transform(String tableAsString, Properties properties); |
48 | |
} |
49 | |
|
50 | 1813 | public static class FromLandscape implements TableTransformer { |
51 | |
|
52 | |
private static final String ROW_SEPARATOR = "\n"; |
53 | |
|
54 | |
public String transform(String tableAsString, Properties properties) { |
55 | 2 | boolean trim = parseBoolean(properties.getProperty("trim", "true")); |
56 | 2 | String ignorableSeparator = properties.getProperty("ignorableSeparator", "|--"); |
57 | 2 | String headerSeparator = properties.getProperty("headerSeparator", "|"); |
58 | 2 | String valueSeparator = properties.getProperty("valueSeparator", "|"); |
59 | 2 | Map<String, List<String>> data = new LinkedHashMap<String, List<String>>(); |
60 | 2 | String[] rowsAsString = tableAsString.split(ROW_SEPARATOR); |
61 | 6 | for (int row = 0; row < rowsAsString.length; row++) { |
62 | 4 | String rowAsString = rowsAsString[row]; |
63 | 4 | if (rowAsString.startsWith(ignorableSeparator) || rowAsString.length() == 0) { |
64 | |
|
65 | 0 | continue; |
66 | |
} else { |
67 | 4 | List<String> values = TableUtils.parseRow(rowAsString, valueSeparator, trim); |
68 | 4 | String header = values.get(0); |
69 | 4 | List<String> rowValues = new ArrayList<String>(values); |
70 | 4 | rowValues.remove(0); |
71 | 4 | data.put(header, rowValues); |
72 | |
} |
73 | |
} |
74 | 2 | StringBuffer sb = new StringBuffer(); |
75 | 2 | int numberOfRows = 1; |
76 | 2 | sb.append(headerSeparator); |
77 | 2 | for (String header : data.keySet()) { |
78 | 4 | sb.append(header).append(headerSeparator); |
79 | 4 | numberOfRows = data.get(header).size(); |
80 | |
} |
81 | 2 | sb.append(ROW_SEPARATOR); |
82 | 6 | for (int r = 0; r < numberOfRows; r++) { |
83 | 4 | sb.append(valueSeparator); |
84 | 4 | for (List<String> rows : data.values()) { |
85 | 8 | sb.append(rows.get(r)).append(valueSeparator); |
86 | |
} |
87 | 4 | sb.append(ROW_SEPARATOR); |
88 | |
} |
89 | 2 | return sb.toString(); |
90 | |
} |
91 | |
|
92 | |
} |
93 | |
|
94 | |
} |