package be.selckin.swu.util.xml;
import com.google.common.base.Supplier;
import nu.xom.Builder;
import nu.xom.ParsingException;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.IValidator;
import org.apache.wicket.validation.ValidationError;
import java.io.IOException;
import java.io.StringReader;
public class XmlParseableValidator implements IValidator<String> {
private Supplier<Builder> builderSupplier;
public XmlParseableValidator(Supplier<Builder> builderSupplier) {
this.builderSupplier = builderSupplier;
}
@Override
public void validate(IValidatable<String> validatable) {
try {
builderSupplier.get().build(new StringReader(validatable.getValue()));
} catch (ParsingException ex) {
error(validatable, toErrorMessage(ex));
} catch (IOException ex) {
error(validatable, ex.getMessage());
}
}
private void error(IValidatable<String> validatable, String msg) {
ValidationError error = new ValidationError();
error.setMessage("Not a valid xml document: " + msg);
validatable.error(error);
}
private String toErrorMessage(ParsingException ex) {
if (ex.getLineNumber() > 0)
return ex.getMessage() + " at line " + ex.getLineNumber() + ", column " + ex.getColumnNumber();
else
return ex.getMessage();
}
}