38
38
39
39
package oracle .jdbc .provider .parameter ;
40
40
41
- import java .util .Arrays ;
42
41
import java .util .HashMap ;
43
42
import java .util .Map ;
44
43
import java .util .TreeMap ;
44
+ import java .util .TreeSet ;
45
+ import java .util .Map .Entry ;
46
+ import java .util .Set ;
45
47
import java .util .function .BiConsumer ;
46
- import java .util .function .Consumer ;
47
48
import java .util .function .Function ;
49
+ import java .util .stream .Collectors ;
48
50
49
51
import static java .lang .String .format ;
50
52
import static java .util .Objects .requireNonNull ;
51
53
54
+ import java .util .Arrays ;
55
+
52
56
final class ParameterSetParserImpl implements ParameterSetParser {
53
57
54
58
/** Parameter value parsers mapped to a case insensitive parameter name */
@@ -65,14 +69,19 @@ public ParameterSet parseNamedValues(Map<String, String> namedValues) {
65
69
66
70
ParameterSetBuilder builder = ParameterSet .builder ();
67
71
68
- for (ParameterParser parameterParser : parameterParsers .values ())
69
- parameterParser .setDefaultValue (builder );
72
+ // Make a copy of the keyset containing lower case keys, from which we will
73
+ // remove those present in the namedValues map
74
+ Set <String > missingKeys = parameterParsers
75
+ .keySet ().stream ().map (String ::toLowerCase ).collect (Collectors .toSet ());
70
76
71
77
for (Map .Entry <String , String > namedValue : namedValues .entrySet ()) {
72
78
73
79
String name = namedValue .getKey ();
74
80
ParameterParser parameterParser = parameterParsers .get (name );
75
81
82
+ // remove key from missing keys
83
+ missingKeys .remove (name .toLowerCase ());
84
+
76
85
if (parameterParser == null ) {
77
86
throw new IllegalArgumentException (format (
78
87
"Unrecognized parameter name: \" %s\" . Valid parameter names are: %s" ,
@@ -82,6 +91,11 @@ public ParameterSet parseNamedValues(Map<String, String> namedValues) {
82
91
parameterParser .setValue (builder , namedValue .getValue ());
83
92
}
84
93
94
+ // Set value null to parameters that were not present in namedValues
95
+ for (String missingKey : missingKeys ) {
96
+ parameterParsers .get (missingKey ).setValue (builder , null );
97
+ }
98
+
85
99
return builder .build ();
86
100
}
87
101
@@ -106,7 +120,6 @@ public ParameterSetParser build() {
106
120
public Builder addParameter (String name , Parameter <String > parameter ) {
107
121
addParameterParser (
108
122
name ,
109
- ParameterParser .SET_NO_DEFAULT ,
110
123
(value , builder ) -> builder .add (name , parameter , value ));
111
124
return this ;
112
125
}
@@ -115,9 +128,9 @@ public Builder addParameter(String name, Parameter<String> parameter) {
115
128
public Builder addParameter (
116
129
String name , Parameter <String > parameter , String defaultValue ) {
117
130
addParameterParser (
118
- name ,
119
- ( builder ) -> builder .add (name , parameter , defaultValue ),
120
- ( value , builder ) -> builder . add ( name , parameter , value ));
131
+ name ,
132
+ ( value , builder ) -> builder .add (name , parameter ,
133
+ value == null ? defaultValue : value ));
121
134
return this ;
122
135
}
123
136
@@ -126,7 +139,6 @@ public <T> Builder addParameter(
126
139
String name , Parameter <T > parameter , Function <String , T > valueParser ) {
127
140
addParameterParser (
128
141
name ,
129
- ParameterParser .SET_NO_DEFAULT ,
130
142
(value , builder ) ->
131
143
builder .add (name , parameter , valueParser .apply (value )));
132
144
return this ;
@@ -138,37 +150,29 @@ public <T> Builder addParameter(
138
150
Function <String , T > valueParser ) {
139
151
addParameterParser (
140
152
name ,
141
- builder -> builder .add (name , parameter , defaultValue ),
142
- (value , builder ) ->
143
- builder .add (name , parameter , valueParser .apply (value )));
153
+ (value , builder ) -> {
154
+ // If the value is null set the default value.
155
+ if (value != null )
156
+ builder .add (name , parameter , valueParser .apply (value ));
157
+ else
158
+ builder .add (name , parameter , defaultValue );
159
+ });
144
160
return this ;
145
161
}
146
162
147
163
@ Override
148
164
public Builder addParameter (
149
165
String name , BiConsumer <String , ParameterSetBuilder > valueSetter ) {
150
- addParameterParser (
151
- name , ParameterParser .SET_NO_DEFAULT , valueSetter );
152
- return this ;
153
- }
154
-
155
- @ Override
156
- public Builder addParameter (
157
- String name ,
158
- Consumer <ParameterSetBuilder > defaultValueSetter ,
159
- BiConsumer <String , ParameterSetBuilder > valueSetter ) {
160
-
161
- addParameterParser (name , defaultValueSetter , valueSetter );
166
+ addParameterParser (name , valueSetter );
162
167
return this ;
163
168
}
164
169
165
170
private void addParameterParser (
166
171
String name ,
167
- Consumer <ParameterSetBuilder > defaultValueSetter ,
168
172
BiConsumer <String , ParameterSetBuilder > valueSetter ) {
169
173
170
174
ParameterParser parameterParser =
171
- new ParameterParser (defaultValueSetter , valueSetter );
175
+ new ParameterParser (valueSetter );
172
176
parameterParsers .put (name , parameterParser );
173
177
}
174
178
@@ -180,27 +184,14 @@ private void addParameterParser(
180
184
*/
181
185
private static final class ParameterParser {
182
186
183
- /** A consumer that sets no default value for a parameter */
184
- private static final Consumer <ParameterSetBuilder > SET_NO_DEFAULT =
185
- builder -> { };
186
-
187
- /** A consumer that sets a default value for a parameter */
188
- private final Consumer <ParameterSetBuilder > defaultValueSetter ;
189
-
190
187
/** A consumer that parses and sets a value for a parameter */
191
188
private final BiConsumer <String , ParameterSetBuilder > valueSetter ;
192
189
193
190
private ParameterParser (
194
- Consumer <ParameterSetBuilder > defaultValueSetter ,
195
191
BiConsumer <String , ParameterSetBuilder > valueSetter ) {
196
- this .defaultValueSetter = defaultValueSetter ;
197
192
this .valueSetter = valueSetter ;
198
193
}
199
194
200
- void setDefaultValue (ParameterSetBuilder builder ) {
201
- defaultValueSetter .accept (builder );
202
- }
203
-
204
195
void setValue (ParameterSetBuilder builder , String value ) {
205
196
valueSetter .accept (value , builder );
206
197
}
0 commit comments