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(); } }