33import java .sql .ResultSet ;
44import java .sql .ResultSetMetaData ;
55import java .sql .SQLException ;
6+ import java .util .ArrayList ;
67import java .util .Collections ;
78import java .util .HashSet ;
89import java .util .LinkedHashMap ;
10+ import java .util .List ;
911import java .util .Map ;
1012import java .util .Set ;
1113
14+ import org .apache .commons .lang .StringUtils ;
15+
1216import com .t11e .discovery .datatool .column .BooleanColumnProcessor ;
1317import com .t11e .discovery .datatool .column .DateColumnProcessor ;
14- import com .t11e .discovery .datatool .column .IColumnProcessor ;
18+ import com .t11e .discovery .datatool .column .IItemPropertiesFromColumnProcessor ;
19+ import com .t11e .discovery .datatool .column .ItemPropertiesFromColumnProcessor ;
20+ import com .t11e .discovery .datatool .column .ItemPropertiesFromUnscopedJsonColumnProcessor ;
1521import com .t11e .discovery .datatool .column .JsonColumnProcessor ;
1622import com .t11e .discovery .datatool .column .LowerCaseStringColumnProcessor ;
1723import com .t11e .discovery .datatool .column .StringColumnProcessor ;
2127
2228public class ResultSetConvertor
2329{
30+ private static final IItemPropertiesFromColumnProcessor JSON = new ItemPropertiesFromColumnProcessor (
31+ JsonColumnProcessor .INSTANCE );
32+ private static final IItemPropertiesFromColumnProcessor [] LOWER_STRING = new IItemPropertiesFromColumnProcessor []{
33+ new ItemPropertiesFromColumnProcessor (LowerCaseStringColumnProcessor .INSTANCE )};
34+ private static final IItemPropertiesFromColumnProcessor [] UPPER_STRING = new IItemPropertiesFromColumnProcessor []{
35+ new ItemPropertiesFromColumnProcessor (UpperCaseStringColumnProcessor .INSTANCE )};
36+ private static final IItemPropertiesFromColumnProcessor [] STRING = new IItemPropertiesFromColumnProcessor []{
37+ new ItemPropertiesFromColumnProcessor (StringColumnProcessor .INSTANCE )};
38+ private static final IItemPropertiesFromColumnProcessor [] DATE = new IItemPropertiesFromColumnProcessor []{
39+ new ItemPropertiesFromColumnProcessor (DateColumnProcessor .INSTANCE )};
40+ private static final IItemPropertiesFromColumnProcessor [] TIME = new IItemPropertiesFromColumnProcessor []{
41+ new ItemPropertiesFromColumnProcessor (TimeColumnProcessor .INSTANCE )};
42+ private static final IItemPropertiesFromColumnProcessor [] TIMESTAMP = new IItemPropertiesFromColumnProcessor []{
43+ new ItemPropertiesFromColumnProcessor (TimestampColumnProcessor .INSTANCE )};
44+
2445 private final PropertyCase propertyCase ;
25- private final Set <String > jsonColumns ;
46+ private final Set <String > scopedJsonColumns ;
47+ private final Set <String > unscopedJsonColumns ;
2648 private final Set <String > changeValueCaseColumns ;
27- private IColumnProcessor [] columnProcessors ;
49+ private IItemPropertiesFromColumnProcessor [] [] columnProcessors ;
2850 private String [] columnNames ;
2951
30- public ResultSetConvertor (final PropertyCase propertyCase , final Set <String > jsonColumns ,
52+ public ResultSetConvertor (final PropertyCase propertyCase , final Set <String > scopedJsonColumns ,
53+ final Set <String > unscopedJsonColumns ,
3154 final Set <String > potentialChangeValueCaseColumns )
3255 {
3356 this .propertyCase = propertyCase ;
@@ -43,7 +66,8 @@ public ResultSetConvertor(final PropertyCase propertyCase, final Set<String> jso
4366 {
4467 changeValueCaseColumns = Collections .emptySet ();
4568 }
46- this .jsonColumns = jsonColumns != null ? jsonColumns : Collections .<String > emptySet ();
69+ this .scopedJsonColumns = scopedJsonColumns != null ? scopedJsonColumns : Collections .<String > emptySet ();
70+ this .unscopedJsonColumns = unscopedJsonColumns != null ? unscopedJsonColumns : Collections .<String > emptySet ();
4771 }
4872
4973 public Map <String , Object > getRowAsMap (final ResultSet rs )
@@ -55,14 +79,13 @@ public Map<String, Object> getRowAsMap(final ResultSet rs)
5579 for (int idx = 0 ; idx < columnProcessors .length ; ++idx )
5680 {
5781 final int column = idx + 1 ;
58- final IColumnProcessor columnProcessor = columnProcessors [idx ];
59- if (columnProcessor != null )
82+ final IItemPropertiesFromColumnProcessor [] processors = columnProcessors [idx ];
83+ if (processors != null )
6084 {
6185 final String name = columnNames [idx ];
62- final Object value = columnProcessor .processColumn (rs , column );
63- if (value != null )
86+ for (final IItemPropertiesFromColumnProcessor processor : processors )
6487 {
65- properties . put ( name , value );
88+ processor . processColumn ( properties , rs , column , name );
6689 }
6790 }
6891 }
@@ -75,7 +98,7 @@ private void lazyInitialize(final ResultSet rs)
7598 if (columnProcessors == null )
7699 {
77100 final ResultSetMetaData metaData = rs .getMetaData ();
78- final IColumnProcessor [] processors = new IColumnProcessor [metaData .getColumnCount ()];
101+ final IItemPropertiesFromColumnProcessor [][] processors = new IItemPropertiesFromColumnProcessor [metaData .getColumnCount ()][ ];
79102 final String [] names = new String [processors .length ];
80103 for (int idx = 0 ; idx < processors .length ; idx ++)
81104 {
@@ -89,18 +112,18 @@ private void lazyInitialize(final ResultSet rs)
89112 }
90113 }
91114
92- private IColumnProcessor getColumnProcessor (
115+ private IItemPropertiesFromColumnProcessor [] getColumnProcessor (
93116 final ResultSetMetaData md ,
94117 final int column ,
95118 final String columnLabel )
96119 throws SQLException
97120 {
98- IColumnProcessor output ;
121+ IItemPropertiesFromColumnProcessor [] output ;
99122 switch (md .getColumnType (column ))
100123 {
101124 case java .sql .Types .BIT :
102125 case java .sql .Types .BOOLEAN :
103- output = BooleanColumnProcessor .INSTANCE ;
126+ output = new ItemPropertiesFromColumnProcessor []{ new ItemPropertiesFromColumnProcessor ( BooleanColumnProcessor .INSTANCE )} ;
104127 break ;
105128 case java .sql .Types .TINYINT :
106129 case java .sql .Types .SMALLINT :
@@ -111,46 +134,58 @@ private IColumnProcessor getColumnProcessor(
111134 case java .sql .Types .DOUBLE :
112135 case java .sql .Types .NUMERIC :
113136 case java .sql .Types .DECIMAL :
114- output = StringColumnProcessor . INSTANCE ;
137+ output = STRING ;
115138 break ;
116139 case java .sql .Types .CHAR :
117140 case java .sql .Types .VARCHAR :
118141 case java .sql .Types .LONGVARCHAR :
119142 case java .sql .Types .CLOB :
120143 {
121- if (columnLabel != null && jsonColumns .contains (columnLabel ))
144+ final String columnLabelLower = StringUtils .lowerCase (columnLabel );
145+ if (columnLabel != null &&
146+ (scopedJsonColumns .contains (columnLabelLower )
147+ || unscopedJsonColumns .contains (columnLabelLower )))
122148 {
123- output = JsonColumnProcessor .INSTANCE ;
149+ final List <IItemPropertiesFromColumnProcessor > jsonProcessors = new ArrayList <IItemPropertiesFromColumnProcessor >(2 );
150+ if (scopedJsonColumns .contains (columnLabelLower ))
151+ {
152+ jsonProcessors .add (JSON );
153+ }
154+ if (unscopedJsonColumns .contains (columnLabelLower ))
155+ {
156+ jsonProcessors .add (new ItemPropertiesFromUnscopedJsonColumnProcessor (JsonColumnProcessor .INSTANCE , propertyCase ));
157+ }
158+ output = jsonProcessors .toArray (new IItemPropertiesFromColumnProcessor [jsonProcessors .size ()]);
124159 }
125160 else if (columnLabel != null && changeValueCaseColumns .contains (columnLabel ))
126161 {
127162 switch (propertyCase )
128163 {
129164 case LOWER :
130- output = LowerCaseStringColumnProcessor . INSTANCE ;
165+ output = LOWER_STRING ;
131166 break ;
132167 case UPPER :
133- output = UpperCaseStringColumnProcessor . INSTANCE ;
168+ output = UPPER_STRING ;
134169 break ;
135170 default :
136- output = StringColumnProcessor . INSTANCE ;
171+ output = STRING ;
137172 break ;
138173 }
139174 }
140175 else
141176 {
142- output = StringColumnProcessor . INSTANCE ;
177+ output = STRING ;
143178 }
144179 break ;
145180 }
146181 case java .sql .Types .DATE :
147- output = DateColumnProcessor . INSTANCE ;
182+ output = DATE ;
148183 break ;
149184 case java .sql .Types .TIME :
150- output = TimeColumnProcessor . INSTANCE ;
185+ output = TIME ;
151186 break ;
152187 case java .sql .Types .TIMESTAMP :
153- output = TimestampColumnProcessor . INSTANCE ;
188+ output = TIMESTAMP ;
154189 break ;
155190 case java .sql .Types .BINARY :
156191 case java .sql .Types .VARBINARY :
0 commit comments