@@ -44,6 +44,7 @@ public class NumberInput extends AbstractTextComponent<Number, NumberInputContex
44
44
private static final Logger log = LoggerFactory .getLogger (NumberInput .class );
45
45
private final Number defaultValue ;
46
46
private Class <? extends Number > clazz ;
47
+ private boolean required ;
47
48
private NumberInputContext currentContext ;
48
49
49
50
public NumberInput (Terminal terminal ) {
@@ -55,32 +56,41 @@ public NumberInput(Terminal terminal, String name) {
55
56
}
56
57
57
58
public NumberInput (Terminal terminal , String name , Number defaultValue ) {
58
- this (terminal , name , defaultValue , Integer .class , null );
59
+ this (terminal , name , defaultValue , Integer .class );
59
60
}
60
61
61
62
public NumberInput (Terminal terminal , String name , Number defaultValue , Class <? extends Number > clazz ) {
62
- this (terminal , name , defaultValue , clazz , null );
63
+ this (terminal , name , defaultValue , clazz , false );
63
64
}
64
65
65
- public NumberInput (Terminal terminal , String name , Number defaultValue , Class <? extends Number > clazz ,
66
+ public NumberInput (Terminal terminal , String name , Number defaultValue , Class <? extends Number > clazz , boolean required ) {
67
+ this (terminal , name , defaultValue , clazz , required , null );
68
+ }
69
+
70
+ public NumberInput (Terminal terminal , String name , Number defaultValue , Class <? extends Number > clazz , boolean required ,
66
71
Function <NumberInputContext , List <AttributedString >> renderer ) {
67
72
super (terminal , name , null );
68
73
setRenderer (renderer != null ? renderer : new DefaultRenderer ());
69
74
setTemplateLocation ("classpath:org/springframework/shell/component/number-input-default.stg" );
70
75
this .defaultValue = defaultValue ;
71
76
this .clazz = clazz ;
77
+ this .required = required ;
72
78
}
73
79
74
80
public void setNumberClass (Class <? extends Number > clazz ) {
75
81
this .clazz = clazz ;
76
82
}
77
83
84
+ public void setRequired (boolean required ) {
85
+ this .required = required ;
86
+ }
87
+
78
88
@ Override
79
89
public NumberInputContext getThisContext (ComponentContext <?> context ) {
80
90
if (context != null && currentContext == context ) {
81
91
return currentContext ;
82
92
}
83
- currentContext = NumberInputContext .of (defaultValue , clazz );
93
+ currentContext = NumberInputContext .of (defaultValue , clazz , required );
84
94
currentContext .setName (getName ());
85
95
Optional .ofNullable (context ).map (ComponentContext ::stream )
86
96
.ifPresent (entryStream -> entryStream .forEach (e -> currentContext .put (e .getKey (), e .getValue ())));
@@ -121,6 +131,9 @@ protected boolean read(BindingReader bindingReader, KeyMap<String> keyMap, Numbe
121
131
}
122
132
else if (context .getDefaultValue () != null ) {
123
133
context .setResultValue (context .getDefaultValue ());
134
+ } else if (required ) {
135
+ context .setMessage ("This field is mandatory" , TextComponentContext .MessageLevel .ERROR );
136
+ break ;
124
137
}
125
138
return true ;
126
139
default :
@@ -186,6 +199,20 @@ public interface NumberInputContext extends TextComponentContext<Number, NumberI
186
199
*/
187
200
void setDefaultClass (Class <? extends Number > defaultClass );
188
201
202
+ /**
203
+ * Sets flag for mandatory input.
204
+ *
205
+ * @param required true if input is required
206
+ */
207
+ void setRequired (boolean required );
208
+
209
+ /**
210
+ * Returns flag if input is required.
211
+ *
212
+ * @return true if input is required, false otherwise
213
+ */
214
+ boolean isRequired ();
215
+
189
216
/**
190
217
* Gets an empty {@link NumberInputContext}.
191
218
*
@@ -201,7 +228,7 @@ public static NumberInputContext empty() {
201
228
* @return number input context
202
229
*/
203
230
public static NumberInputContext of (Number defaultValue ) {
204
- return new DefaultNumberInputContext (defaultValue , Integer .class );
231
+ return new DefaultNumberInputContext (defaultValue , Integer .class , false );
205
232
}
206
233
207
234
/**
@@ -210,18 +237,29 @@ public static NumberInputContext of(Number defaultValue) {
210
237
* @return number input context
211
238
*/
212
239
public static NumberInputContext of (Number defaultValue , Class <? extends Number > defaultClass ) {
213
- return new DefaultNumberInputContext (defaultValue , defaultClass );
240
+ return new DefaultNumberInputContext (defaultValue , defaultClass , false );
241
+ }
242
+
243
+ /**
244
+ * Gets an {@link NumberInputContext}.
245
+ *
246
+ * @return number input context
247
+ */
248
+ public static NumberInputContext of (Number defaultValue , Class <? extends Number > defaultClass , boolean required ) {
249
+ return new DefaultNumberInputContext (defaultValue , defaultClass , required );
214
250
}
215
251
}
216
252
217
253
private static class DefaultNumberInputContext extends BaseTextComponentContext <Number , NumberInputContext > implements NumberInputContext {
218
254
219
255
private Number defaultValue ;
220
256
private Class <? extends Number > defaultClass ;
257
+ private boolean required ;
221
258
222
- public DefaultNumberInputContext (Number defaultValue , Class <? extends Number > defaultClass ) {
259
+ public DefaultNumberInputContext (Number defaultValue , Class <? extends Number > defaultClass , boolean required ) {
223
260
this .defaultValue = defaultValue ;
224
261
this .defaultClass = defaultClass ;
262
+ this .required = required ;
225
263
}
226
264
227
265
@ Override
@@ -244,11 +282,22 @@ public void setDefaultClass(Class<? extends Number> defaultClass) {
244
282
this .defaultClass = defaultClass ;
245
283
}
246
284
285
+ @ Override
286
+ public void setRequired (boolean required ) {
287
+ this .required = required ;
288
+ }
289
+
290
+ @ Override
291
+ public boolean isRequired () {
292
+ return required ;
293
+ }
294
+
247
295
@ Override
248
296
public Map <String , Object > toTemplateModel () {
249
297
Map <String , Object > attributes = super .toTemplateModel ();
250
298
attributes .put ("defaultValue" , getDefaultValue () != null ? getDefaultValue () : null );
251
299
attributes .put ("defaultClass" , getDefaultClass ().getSimpleName ());
300
+ attributes .put ("required" , isRequired ());
252
301
Map <String , Object > model = new HashMap <>();
253
302
model .put ("model" , attributes );
254
303
return model ;
0 commit comments