1 package com.opencsv;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import org.apache.commons.lang3.ArrayUtils;
20 import org.apache.commons.lang3.ObjectUtils;
21 import org.apache.commons.lang3.StringUtils;
22
23 import java.io.IOException;
24 import java.sql.ResultSet;
25 import java.sql.SQLException;
26 import java.util.*;
27 import java.util.stream.Collectors;
28 import java.util.stream.Stream;
29
30
31
32
33
34 public class ResultSetColumnNameHelperService extends ResultSetHelperService implements ResultSetHelper {
35 private String[] columnNames;
36 private String[] columnHeaders;
37 private final Map<String, Integer> columnNamePositionMap = new HashMap<>();
38 private Locale errorLocale = Locale.getDefault();
39
40
41
42
43 public ResultSetColumnNameHelperService() {
44 }
45
46
47
48
49
50
51
52 public void setErrorLocale(Locale errorLocale) {
53 this.errorLocale = ObjectUtils.defaultIfNull(errorLocale, Locale.getDefault());
54 }
55
56
57
58
59
60
61
62
63
64 public void setColumnNames(String[] columnNames, String[] columnHeaders) {
65 if (columnHeaders.length != columnNames.length) {
66 throw new UnsupportedOperationException(ResourceBundle.getBundle(ICSVParser.DEFAULT_BUNDLE_NAME, errorLocale).getString("column.count.mismatch"));
67 }
68 if (hasInvalidValue(columnNames)) {
69 throw new UnsupportedOperationException(ResourceBundle.getBundle(ICSVParser.DEFAULT_BUNDLE_NAME, errorLocale).getString("column.name.bogus"));
70 }
71 if (hasInvalidValue(columnHeaders)) {
72 throw new UnsupportedOperationException(ResourceBundle.getBundle(ICSVParser.DEFAULT_BUNDLE_NAME, errorLocale).getString("header.name.bogus"));
73 }
74 this.columnNames = Arrays.copyOf(columnNames, columnNames.length);
75 this.columnHeaders = Arrays.copyOf(columnHeaders, columnHeaders.length);
76 }
77
78 private boolean hasInvalidValue(String[] strings) {
79 return Stream.of(strings).anyMatch(s -> StringUtils.isBlank(s));
80 }
81
82
83
84
85
86
87
88 @Override
89 public String[] getColumnNames(ResultSet rs) throws SQLException {
90 if (columnNamePositionMap.isEmpty()) {
91 populateColumnData(rs);
92 }
93 return Arrays.copyOf(columnHeaders, columnHeaders.length);
94 }
95
96 private void populateColumnData(ResultSet rs) throws SQLException {
97 String[] realColumnNames = super.getColumnNames(rs);
98
99 if (columnNames == null) {
100 columnNames = Arrays.copyOf(realColumnNames, realColumnNames.length);
101 columnHeaders = Arrays.copyOf(realColumnNames, realColumnNames.length);
102 }
103
104 for (String name : columnNames) {
105 int position = ArrayUtils.indexOf(realColumnNames, name);
106 if (position == ArrayUtils.INDEX_NOT_FOUND) {
107 throw new UnsupportedOperationException(String.format(ResourceBundle.getBundle(ICSVParser.DEFAULT_BUNDLE_NAME, errorLocale).getString("column.nonexistant"), name));
108 }
109 columnNamePositionMap.put(name, position);
110 }
111 }
112
113
114
115
116
117
118
119
120 @Override
121 public String[] getColumnValues(ResultSet rs) throws SQLException, IOException {
122 if (columnNamePositionMap.isEmpty()) {
123 populateColumnData(rs);
124 }
125 String[] realColumnValues = super.getColumnValues(rs, false, dateFormat, dateTimeFormat);
126 return getColumnValueSubset(realColumnValues);
127 }
128
129
130
131
132
133
134
135
136
137 @Override
138 public String[] getColumnValues(ResultSet rs, boolean trim) throws SQLException, IOException {
139 if (columnNamePositionMap.isEmpty()) {
140 populateColumnData(rs);
141 }
142 String[] realColumnValues = super.getColumnValues(rs, trim, dateFormat, dateTimeFormat);
143 return getColumnValueSubset(realColumnValues);
144 }
145
146
147
148
149
150
151
152
153
154
155
156 @Override
157 public String[] getColumnValues(ResultSet rs, boolean trim, String dateFormatString, String timeFormatString) throws SQLException, IOException {
158 if (columnNamePositionMap.isEmpty()) {
159 populateColumnData(rs);
160 }
161 String[] realColumnValues = super.getColumnValues(rs, trim, dateFormatString, timeFormatString);
162 return getColumnValueSubset(realColumnValues);
163 }
164
165 private String[] getColumnValueSubset(String[] realColumnValues) {
166 return Stream.of(columnNames)
167 .map(c -> realColumnValues[columnNamePositionMap.get(c)])
168 .collect(Collectors.toList())
169 .toArray(ArrayUtils.EMPTY_STRING_ARRAY);
170 }
171 }