RmsStringInputReader.java
package io.extact.rms.client.console.ui.textio;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
import org.beryx.textio.InputReader;
import org.beryx.textio.TextTerminal;
import lombok.Getter;
public class RmsStringInputReader extends InputReader<String, RmsStringInputReader> {
private PatternMessage patternMessage;
private int minLength = 0;
private int maxLength = -1;
private String excludeCheckString;
public RmsStringInputReader(TextTerminal<?> textTerminalSupplier) {
super(() -> textTerminalSupplier);
valueCheckers.add((val, propName) -> getLengthValidationErrors(val));
valueCheckers.add((val, propName) -> getPatternValidationErrors(val));
}
public RmsStringInputReader withPattern(PatternMessage pm) {
this.patternMessage = pm;
return this;
}
public RmsStringInputReader withMinLength(int minLength) {
this.minLength = minLength;
return this;
}
public RmsStringInputReader withMaxLength(int maxLength) {
this.maxLength = maxLength;
return this;
}
public InputReader<String, RmsStringInputReader> withExcludeCheckString(String string) {
this.excludeCheckString = string;
return this;
}
@Override
protected ParseResult<String> parse(String s) {
return new ParseResult<>(s);
}
@Override
protected void checkConfiguration() throws IllegalArgumentException {
super.checkConfiguration();
if (minLength > 0 && maxLength > 0 && minLength > maxLength) {
throw new IllegalArgumentException("minLength = " + minLength + ", maxLength = " + maxLength);
}
}
protected List<String> getLengthValidationErrors(String s) {
if (isExcludeCheckString(s)) {
return null;
}
int len = (s == null) ? 0 : s.length();
if (minLength > 0 && len < minLength) {
return Collections.singletonList("Please enter at least " + minLength + "character.");
}
if (maxLength > 0 && maxLength < len) {
return Collections.singletonList("Please enter within " +maxLength + "characters.");
}
return null;
}
protected List<String> getPatternValidationErrors(String s) {
if (isExcludeCheckString(s)) {
return null;
}
if ((patternMessage != null) && !patternMessage.getPattern().matcher(s).matches()) {
return Collections.singletonList(patternMessage.getMessage());
}
return null;
}
private boolean isExcludeCheckString(String s) {
return excludeCheckString != null && excludeCheckString.equals(s);
}
@Getter
public enum PatternMessage {
SERIAL_NO("[0-9a-zA-Z\\-]*", "Please enter in half-width alphanumeric hyphen."),
PHONE_NUMBER("[0-9\\-]*", "Please enter in half-width number hyphen.");
private final Pattern pattern;
private final String message;
private PatternMessage(String pattern, String message) {
this.pattern = Pattern.compile(pattern);
this.message = message;
}
}
}