blob: 8d420ec12d9b0f438bd94ead9fe3e1677668ebba [file] [log] [blame]
package de.ids_mannheim.korap.interfaces.defaults;
import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.config.ConfigLoader;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.interfaces.ValidatorIface;
import de.ids_mannheim.korap.web.utils.KustvaktMap;
import org.apache.commons.validator.routines.*;
import org.apache.commons.validator.routines.RegexValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.*;
/**
* Created by hanl on 09.06.16.
*/
public class ApacheValidator implements ValidatorIface {
private static Logger jlog = LoggerFactory.getLogger(ApacheValidator.class);
private static final String STRING_PATTERN ="^[\\.;:,&\\|@\\[\\]\\=\\*\\/\\/_()\\-0-9\\p{L}\\p{Space}]{0,1024}$";
private Map<String, RegexValidator> validators;
public ApacheValidator () throws IOException {
this.validators = load();
}
private static Map<String, RegexValidator> load () throws IOException {
Map<String, RegexValidator> validatorMap = new HashMap<>();
Properties p = ConfigLoader.loadProperties("validation.properties");
for (String property : p.stringPropertyNames()) {
if (property.startsWith("Validator")) {
String name = property.replace("Validator.", "");
RegexValidator v = new RegexValidator(p.get(property).toString());
validatorMap.put(name, v);
}
}
return validatorMap;
}
@Override
public Map<String, Object> validateMap (Map<String, Object> map) {
Map<String, Object> safeMap = new HashMap<>();
KustvaktMap kmap = new KustvaktMap(map);
if (map != null) {
loop : for (String key : kmap.keySet()) {
Object value = kmap.getRaw(key);
if (value instanceof List) {
List list = (List) value;
for (int i =0;i<list.size();i++) {
if (!isValid(String.valueOf(list.get(i)), key))
list.remove(i);
}
if (list.size() == 1)
value = list.get(0);
else
value = list;
} else {
if (!isValid(kmap.get(key), key))
continue loop;
}
safeMap.put(key, value);
}
}
return safeMap;
}
@Override
public String validateEntry (String input, String type)
throws KustvaktException {
if (!isValid(input, type))
throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT,
"Entry did not validate for type '" + type + "'", input);
return input;
}
@Override
public boolean isValid(String input, String type) {
boolean valid = false;
RegexValidator validator = this.validators.get(type);
if (validator != null) {
valid = validator.isValid(input);
} else {
if (Attributes.EMAIL.equals(type)) {
valid = EmailValidator.getInstance().isValid(input);
} else if ("date".equals(type)) {
valid = DateValidator.getInstance().isValid(input);
} else if ("string".equals(type) && !this.validators.containsKey("string")) {
RegexValidator regex = new RegexValidator(STRING_PATTERN);
valid = regex.isValid(input);
}
else
return this.isValid(input, "string");
}
jlog.debug("validating entry '{}' of type '{}': {}",
input, type, valid ? "Is valid!" : "Is not valid!");
return valid;
}
}