@@ -44,21 +44,28 @@ public class StringInput extends AbstractTextComponent<String, StringInputContex
44
44
private final String defaultValue ;
45
45
private StringInputContext currentContext ;
46
46
private Character maskCharacter ;
47
+ private boolean mandatory ;
47
48
48
49
public StringInput (Terminal terminal ) {
49
- this (terminal , null , null , null );
50
+ this (terminal , null , null , null , false );
50
51
}
51
52
52
53
public StringInput (Terminal terminal , String name , String defaultValue ) {
53
- this (terminal , name , defaultValue , null );
54
+ this (terminal , name , defaultValue , null , false );
54
55
}
55
56
56
57
public StringInput (Terminal terminal , String name , String defaultValue ,
57
58
Function <StringInputContext , List <AttributedString >> renderer ) {
59
+ this (terminal , name , defaultValue , renderer , false );
60
+ }
61
+
62
+ public StringInput (Terminal terminal , String name , String defaultValue ,
63
+ Function <StringInputContext , List <AttributedString >> renderer , boolean mandatory ) {
58
64
super (terminal , name , null );
59
65
setRenderer (renderer != null ? renderer : new DefaultRenderer ());
60
66
setTemplateLocation ("classpath:org/springframework/shell/component/string-input-default.stg" );
61
67
this .defaultValue = defaultValue ;
68
+ this .mandatory = mandatory ;
62
69
}
63
70
64
71
/**
@@ -70,12 +77,21 @@ public void setMaskCharacter(Character maskCharacter) {
70
77
this .maskCharacter = maskCharacter ;
71
78
}
72
79
80
+ /**
81
+ * Sets a mandatory flag to check that the result is not empty
82
+ *
83
+ * @param mandatory if input is required
84
+ */
85
+ public void setMandatory (boolean mandatory ) {
86
+ this .mandatory = mandatory ;
87
+ }
88
+
73
89
@ Override
74
90
public StringInputContext getThisContext (ComponentContext <?> context ) {
75
91
if (context != null && currentContext == context ) {
76
92
return currentContext ;
77
93
}
78
- currentContext = StringInputContext .of (defaultValue , maskCharacter );
94
+ currentContext = StringInputContext .of (defaultValue , maskCharacter , mandatory );
79
95
currentContext .setName (getName ());
80
96
context .stream ().forEach (e -> {
81
97
currentContext .put (e .getKey (), e .getValue ());
@@ -116,6 +132,9 @@ protected boolean read(BindingReader bindingReader, KeyMap<String> keyMap, Strin
116
132
}
117
133
else if (context .getDefaultValue () != null ) {
118
134
context .setResultValue (context .getDefaultValue ());
135
+ } else if (mandatory ) {
136
+ context .setMessage ("This field is mandatory" , TextComponentContext .MessageLevel .ERROR );
137
+ break ;
119
138
}
120
139
return true ;
121
140
default :
@@ -175,13 +194,27 @@ public interface StringInputContext extends TextComponentContext<String, StringI
175
194
*/
176
195
Character getMaskCharacter ();
177
196
197
+ /**
198
+ * Sets flag for mandatory input.
199
+ *
200
+ * @param mandatory true if input is mandatory
201
+ */
202
+ void setMandatory (boolean mandatory );
203
+
204
+ /**
205
+ * Returns flag if input is required.
206
+ *
207
+ * @return true if input is required, false otherwise
208
+ */
209
+ boolean isMandatory ();
210
+
178
211
/**
179
212
* Gets an empty {@link StringInputContext}.
180
213
*
181
214
* @return empty path input context
182
215
*/
183
216
public static StringInputContext empty () {
184
- return of (null , null );
217
+ return of (null , null , false );
185
218
}
186
219
187
220
/**
@@ -190,7 +223,16 @@ public static StringInputContext empty() {
190
223
* @return path input context
191
224
*/
192
225
public static StringInputContext of (String defaultValue , Character maskCharacter ) {
193
- return new DefaultStringInputContext (defaultValue , maskCharacter );
226
+ return of (defaultValue , maskCharacter , false );
227
+ }
228
+
229
+ /**
230
+ * Gets an {@link StringInputContext}.
231
+ *
232
+ * @return path input context
233
+ */
234
+ public static StringInputContext of (String defaultValue , Character maskCharacter , boolean mandatory ) {
235
+ return new DefaultStringInputContext (defaultValue , maskCharacter , mandatory );
194
236
}
195
237
}
196
238
@@ -199,10 +241,12 @@ private static class DefaultStringInputContext extends BaseTextComponentContext<
199
241
200
242
private String defaultValue ;
201
243
private Character maskCharacter ;
244
+ private boolean mandatory ;
202
245
203
- public DefaultStringInputContext (String defaultValue , Character maskCharacter ) {
246
+ public DefaultStringInputContext (String defaultValue , Character maskCharacter , boolean mandatory ) {
204
247
this .defaultValue = defaultValue ;
205
248
this .maskCharacter = maskCharacter ;
249
+ this .mandatory = mandatory ;
206
250
}
207
251
208
252
@ Override
@@ -220,6 +264,11 @@ public void setMaskCharacter(Character maskCharacter) {
220
264
this .maskCharacter = maskCharacter ;
221
265
}
222
266
267
+ @ Override
268
+ public void setMandatory (boolean mandatory ) {
269
+ this .mandatory = mandatory ;
270
+ }
271
+
223
272
@ Override
224
273
public String getMaskedInput () {
225
274
return maybeMask (getInput ());
@@ -240,6 +289,11 @@ public Character getMaskCharacter() {
240
289
return maskCharacter ;
241
290
}
242
291
292
+ @ Override
293
+ public boolean isMandatory () {
294
+ return mandatory ;
295
+ }
296
+
243
297
@ Override
244
298
public Map <String , Object > toTemplateModel () {
245
299
Map <String , Object > attributes = super .toTemplateModel ();
@@ -248,6 +302,7 @@ public Map<String, Object> toTemplateModel() {
248
302
attributes .put ("maskedResultValue" , getMaskedResultValue ());
249
303
attributes .put ("maskCharacter" , getMaskCharacter ());
250
304
attributes .put ("hasMaskCharacter" , hasMaskCharacter ());
305
+ attributes .put ("mandatory" , isMandatory ());
251
306
Map <String , Object > model = new HashMap <>();
252
307
model .put ("model" , attributes );
253
308
return model ;
0 commit comments