package org.netbeans.gradle.project.validate;
import java.awt.Color;
import java.util.regex.Pattern;
import javax.swing.JLabel;
import javax.swing.text.JTextComponent;
import org.jtrim.event.ListenerRef;
import org.jtrim.property.MutableProperty;
import org.jtrim.property.PropertyFactory;
import org.jtrim.property.PropertySource;
import org.jtrim.property.ValueConverter;
import org.jtrim.property.swing.SwingProperties;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.project.NbStrings;
import org.openide.WizardDescriptor;
public final class Validators {
private static final Pattern LEGAL_FILENAME_PATTERN = Pattern.compile("[^/./\\:*?\"<>|]*");
private static final Pattern LEGAL_FILENAME_PATTERN_WITH_EXTENSION= Pattern.compile("[^/\\:*?\"<>|]*");
public static PropertySource<String> trimmedText(JTextComponent component) {
MutableProperty<String> property = SwingProperties.textProperty(component);
return PropertyFactory.convert(property, new ValueConverter<String, String>() {
@Override
public String convert(String input) {
return input != null ? input.trim() : "";
}
});
}
public static Validator<String> createNonEmptyValidator(
final Problem.Level severity,
final String errorMessage) {
ExceptionHelper.checkNotNullArgument(severity, "severity");
ExceptionHelper.checkNotNullArgument(errorMessage, "errorMessage");
return new Validator<String>() {
@Override
public Problem validateInput(String inputType) {
return inputType.isEmpty()
? new Problem(severity, errorMessage)
: null;
}
};
}
public static Validator<String> createFileNameWithExtensionValidator(
Problem.Level severity,
String errorMessage) {
return createPatternValidator(LEGAL_FILENAME_PATTERN_WITH_EXTENSION, severity, errorMessage);
}
public static Validator<String> createFileNameValidator(
Problem.Level severity,
String errorMessage) {
return createPatternValidator(LEGAL_FILENAME_PATTERN, severity, errorMessage);
}
public static Validator<String> createPatternValidator(
final Pattern pattern,
final Problem.Level severity,
final String errorMessage) {
ExceptionHelper.checkNotNullArgument(pattern, "pattern");
ExceptionHelper.checkNotNullArgument(severity, "severity");
ExceptionHelper.checkNotNullArgument(errorMessage, "errorMessage");
return new Validator<String>() {
@Override
public Problem validateInput(String inputType) {
if (!pattern.matcher(inputType).matches()) {
return new Problem(severity, errorMessage);
}
return null;
}
};
}
public static <InputType> Validator<InputType> merge(
final Validator<? super InputType> validator1,
final Validator<? super InputType> validator2) {
return new Validator<InputType>() {
@Override
public Problem validateInput(InputType inputType) {
Problem problem1 = validator1.validateInput(inputType);
Problem problem2 = validator2.validateInput(inputType);
if (problem1 == null) {
return problem2;
}
if (problem2 == null) {
return problem1;
}
return problem1.getLevel().getIntValue() >= problem2.getLevel().getIntValue()
? problem1
: problem2;
}
};
}
public static ListenerRef connectLabelToProblems(
BackgroundValidator validator,
final JLabel jLabel) {
ExceptionHelper.checkNotNullArgument(validator, "validator");
ExceptionHelper.checkNotNullArgument(jLabel, "jLabel");
jLabel.setText("");
final PropertySource<Problem> validatorProblem = validator.currentProblem();
return validatorProblem.addChangeListener(new Runnable() {
@Override
public void run() {
Problem currentProblem = validatorProblem.getValue();
String message = currentProblem != null
? currentProblem.getMessage()
: "";
if (message.isEmpty()) {
jLabel.setText("");
}
else {
assert currentProblem != null;
String title;
Color labelColor;
switch (currentProblem.getLevel()) {
case INFO:
labelColor = Color.BLACK;
title = NbStrings.getInfoCaption();
break;
case WARNING:
labelColor = Color.ORANGE.darker();
title = NbStrings.getWarningCaption();
break;
case SEVERE:
labelColor = Color.RED;
title = NbStrings.getErrorCaption();
break;
default:
throw new AssertionError(currentProblem.getLevel().name());
}
jLabel.setForeground(labelColor);
jLabel.setText(title + ": " + message);
}
}
});
}
public static ListenerRef connectWizardDescriptorToProblems(
BackgroundValidator validator,
final WizardDescriptor wizard) {
ExceptionHelper.checkNotNullArgument(validator, "validator");
ExceptionHelper.checkNotNullArgument(wizard, "wizard");
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, null);
final PropertySource<Problem> validatorProblem = validator.currentProblem();
return validatorProblem.addChangeListener(new Runnable() {
@Override
public void run() {
Problem currentProblem = validatorProblem.getValue();
String message = currentProblem != null
? currentProblem.getMessage()
: "";
if (message.isEmpty()) {
wizard.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, null);
}
else {
assert currentProblem != null;
String level;
switch (currentProblem.getLevel()) {
case INFO:
level = WizardDescriptor.PROP_INFO_MESSAGE;
break;
case WARNING:
level = WizardDescriptor.PROP_WARNING_MESSAGE;
break;
case SEVERE:
level = WizardDescriptor.PROP_ERROR_MESSAGE;
break;
default:
throw new AssertionError(currentProblem.getLevel().name());
}
wizard.putProperty(level, message);
}
}
});
}
}