Add config validators

This commit is contained in:
2022-09-03 21:14:07 +02:00
parent 5e27a72499
commit b5030f9401
18 changed files with 592 additions and 126 deletions

View File

@@ -0,0 +1,53 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import at.pcgamingfreaks.yaml.YAML;
import org.apache.commons.cli.CommandLine;
import java.util.List;
import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty.ARGUMENTS;
public class BooleanValidator extends ConfigValidator<Boolean> {
public BooleanValidator(ConfigProperty property, boolean required) {
super(property, required, null);
}
public ValidationResult validate(YAML yaml, CommandLine cmd) {
System.out.printf("Checking %s... ", property.prop());
boolean result;
if (cmd.hasOption(property.prop())) {
result = true;
} else if (yaml.isSet(ARGUMENTS.prop())
&& yaml.getStringList(ARGUMENTS.prop(), List.of()).contains(property.prop())) {
result = true;
} else if (required) {
System.out.println("missing");
return ValidationResult.MISSING;
} else {
System.out.println("ok");
return ValidationResult.NOT_PRESENT;
}
if (!isValid(result) || !setValue(result)) {
System.out.println("invalid");
return ValidationResult.INVALID;
}
System.out.println("ok");
return ValidationResult.VALID;
}
@Override
Boolean parse(String value) {
throw new RuntimeException("This should not be called");
}
@Override
boolean isValid(Boolean result) {
return true; // skip
}
}

View File

@@ -0,0 +1,84 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import at.pcgamingfreaks.yaml.YAML;
import at.pcgamingfreaks.yaml.YamlKeyNotFoundException;
import lombok.RequiredArgsConstructor;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@RequiredArgsConstructor
public abstract class ConfigValidator<FieldType> {
protected final ConfigProperty property;
protected final boolean required;
protected final FieldType defaultValue;
public ValidationResult validate(YAML yaml, CommandLine cmd) {
System.out.printf("Checking %s... ", property.prop());
String resultString = null;
if (cmd.hasOption(property.prop())) {
resultString = cmd.getOptionValue(property.prop());
} else if (yaml.isSet(property.prop())) {
try {
resultString = yaml.getString(property.prop());
} catch (YamlKeyNotFoundException ignored) {}
} else if (required) {
System.out.println("missing");
return ValidationResult.MISSING;
} else {
System.out.println("ok");
return ValidationResult.NOT_PRESENT;
}
FieldType result = parse(resultString);
if (!isValid(result) || !setValue(result)) {
System.out.println("invalid");
return ValidationResult.INVALID;
}
System.out.println("ok");
return ValidationResult.VALID;
}
abstract FieldType parse(String value);
abstract boolean isValid(FieldType result);
protected boolean setValue(FieldType result) {
List<Method> methods = Arrays.stream(Config.getInstance().getClass().getDeclaredMethods())
.filter(containsSetterOf(property))
.collect(Collectors.toList());
if (methods.size() != 1) {
return false;
}
try {
methods.get(0).invoke(Config.getInstance(), result);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
return true;
}
protected Predicate<Method> containsSetterOf(ConfigProperty property) {
return method -> StringUtils.containsIgnoreCase(method.getName(), "set")
&& StringUtils.containsIgnoreCase(method.getName(), property.prop().replace("-", ""));
}
protected Predicate<Method> containsGetterOf(ConfigProperty property) {
return method -> StringUtils.containsIgnoreCase(method.getName(), "get")
&& StringUtils.containsIgnoreCase(method.getName(), property.prop().replace("-", ""));
}
}

View File

@@ -0,0 +1,23 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import java.io.File;
import java.nio.file.Path;
import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_MERGER;
import static at.pcgamingfreaks.mkvaudiosubtitlechanger.model.MkvToolNix.MKV_PROP_EDIT;
public class MkvToolNixPathValidator extends PathValidator {
public MkvToolNixPathValidator(ConfigProperty property, boolean required, File defaultValue) {
super(property, required, defaultValue);
}
@Override
protected boolean isValid(File result) {
return result.isDirectory()
&& Path.of(result.getAbsolutePath() + "/" + MKV_MERGER + ".exe").toFile().isFile()
&& Path.of(result.getAbsolutePath() + "/" + MKV_PROP_EDIT+ ".exe").toFile().isFile();
// TODO: make linux compatible
}
}

View File

@@ -0,0 +1,28 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import at.pcgamingfreaks.yaml.YAML;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.lang3.StringUtils;
public class OperatingSystemValidator extends BooleanValidator {
public OperatingSystemValidator(ConfigProperty property) {
super(property, false);
}
@Override
public ValidationResult validate(YAML yaml, CommandLine cmd) {
System.out.printf("Checking %s... ", property.prop());
Boolean result = StringUtils.containsIgnoreCase(System.getProperty("os.name"), "windows");
if (!isValid(result) || !setValue(result)) {
System.out.println("invalid");
return ValidationResult.INVALID;
}
System.out.println("ok");
return ValidationResult.VALID;
}
}

View File

@@ -0,0 +1,24 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import java.io.File;
import java.nio.file.Path;
public class PathValidator extends ConfigValidator<File> {
public PathValidator(ConfigProperty property, boolean required, File defaultValue) {
super(property, required, defaultValue);
}
@Override
protected File parse(String value) {
return value != null ? Path.of(value).toFile() : defaultValue;
}
@Override
protected boolean isValid(File result) {
return result.isDirectory() || result.isFile();
}
}

View File

@@ -0,0 +1,26 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class PatternValidator extends ConfigValidator<Pattern> {
public PatternValidator(ConfigProperty property, boolean required, Pattern defaultValue) {
super(property, required, defaultValue);
}
@Override
Pattern parse(String value) {
try {
return Pattern.compile(value);
} catch (PatternSyntaxException e) {
return null;
}
}
@Override
boolean isValid(Pattern result) {
return result != null;
}
}

View File

@@ -0,0 +1,90 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.Config;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.config.ValidationResult;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import at.pcgamingfreaks.yaml.YAML;
import at.pcgamingfreaks.yaml.YamlKeyNotFoundException;
import org.apache.commons.cli.CommandLine;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SetValidator extends ConfigValidator<Set<String>> {
private final boolean append;
public SetValidator(ConfigProperty property, boolean required, boolean append) {
super(property, required, null);
this.append = append;
}
public ValidationResult validate(YAML yaml, CommandLine cmd) {
System.out.printf("Checking %s... ", property.prop());
List<String> resultList = null;
if (cmd.hasOption(property.prop())) {
resultList = List.of(cmd.getOptionValues(property.prop()));
} else if (yaml.isSet(property.prop())) {
try {
resultList = yaml.getStringList(property.prop());
} catch (YamlKeyNotFoundException ignored) {}
} else if (required) {
System.out.println("missing");
return ValidationResult.MISSING;
} else {
System.out.println("not present");
return ValidationResult.NOT_PRESENT;
}
Set<String> result = parse(resultList);
if (!isValid(result) || !setValue(result)) {
System.out.println("invalid");
return ValidationResult.INVALID;
}
System.out.println("ok");
return ValidationResult.VALID;
}
@Override
Set<String> parse(String value) {
throw new RuntimeException("This should not be called");
}
protected Set<String> parse(List<String> value) {
return new HashSet<>(value);
}
@Override
boolean isValid(Set<String> result) {
return true;
}
protected boolean setValue(Set<String> result) {
List<Method> methods = append
? Arrays.stream(Config.getInstance().getClass().getDeclaredMethods())
.filter(containsGetterOf(property))
.collect(Collectors.toList())
: Arrays.stream(Config.getInstance().getClass().getDeclaredMethods())
.filter(containsSetterOf(property))
.collect(Collectors.toList());
if (methods.size() != 1) {
return false;
}
try {
if (append) {
((Set<String>) methods.get(0).invoke(Config.getInstance())).addAll(result);
} else {
methods.get(0).invoke(Config.getInstance(), result);
}
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
return true;
}
}

View File

@@ -0,0 +1,20 @@
package at.pcgamingfreaks.mkvaudiosubtitlechanger.config.validator;
import at.pcgamingfreaks.mkvaudiosubtitlechanger.model.ConfigProperty;
import org.apache.commons.lang3.StringUtils;
public class ThreadValidator extends ConfigValidator<Integer>{
public ThreadValidator(ConfigProperty property, boolean required, Integer defaultValue) {
super(property, required, defaultValue);
}
@Override
Integer parse(String value) {
return StringUtils.isNumeric(value) ? Integer.parseInt(value) : defaultValue;
}
@Override
boolean isValid(Integer result) {
return result > 0;
}
}