Hi

Looks promising. Nice that JSR-303 can gather all the validations
error in one go, so you got them all.
I recon for starters you try to implement this as a new
bean-validation component.

Then later we can see how to hookup with a predicate.


On Sun, Mar 21, 2010 at 12:02 PM, Christian Mueller
<christian.muel...@gmail.com> wrote:
>
> Hello Claus!
>
> My first and easiest implementation of the bean-validator looks like (it is
> inspired from the schema validation component):
>
> public class BeanValidatorComponent extends DefaultComponent {
>
>    protected Endpoint createEndpoint(String uri, String remaining,
> Map<String, Object> parameters) throws Exception {
>        BeanValidator beanValidator = new BeanValidator();
>
>        configureValidator(beanValidator, uri, remaining, parameters);
>
>        return new ProcessorEndpoint(uri, this, beanValidator);
>    }
>
>    protected void configureValidator(BeanValidator beanValidator, String
> uri, String remaining, Map<String, Object> parameters) throws Exception {
>        ValidatorFactory factory =
> Validation.buildDefaultValidatorFactory();
>        Validator validator = factory.getValidator();
>
>        beanValidator.setValidator(validator);
>    }
> }
>
> public class BeanValidator implements Processor {
>
>    private Validator validator;
>
>    public void process(Exchange exchange) throws Exception {
>        Object bean = exchange.getIn().getBody();
>
>        Set<ConstraintViolation> constraintViolations =
> validator.validate(bean);
>        handleErrors(exchange, constraintViolations);
>    }
>
>    public void handleErrors(Exchange exchange, Set<ConstraintViolation>
> constraintViolations) throws ValidationException {
>        if (!constraintViolations.isEmpty()) {
>            throw new BeanValidationException(exchange,
> constraintViolations, exchange.getIn().getBody());
>        }
>    }
>
>    public Validator getValidator() {
>        return validator;
>    }
>
>    public void setValidator(Validator validator) {
>        this.validator = validator;
>    }
> }
>
> public class BeanValidationException extends ValidationException {
>
>    private Set<ConstraintViolation> constraintViolations;
>
>    public BeanValidationException(Exchange exchange,
> Set<ConstraintViolation> constraintViolations, Object bean) {
>        super(exchange, buildMessage(constraintViolations, bean));
>        this.constraintViolations = constraintViolations;
>    }
>
>    protected static String buildMessage(Set<ConstraintViolation>
> constraintViolations, Object bean) {
>        StringBuffer buffer = new StringBuffer("Validation failed for: ");
>        buffer.append(bean);
>
>        buffer.append(" errors: [");
>        for (ConstraintViolation constraintViolation : constraintViolations)
> {
>            buffer.append("property: " +
> constraintViolation.getPropertyPath() + "; value: " +
> constraintViolation.getInvalidValue() + "; constraint: " +
> constraintViolation.getMessage() + "; ");
>        }
>        buffer.append("]");
>
>        return buffer.toString();
>    }
>
>    public Set<ConstraintViolation> getConstraintViolations() {
>        return constraintViolations;
>    }
> }
>
> I think this shows how the Validation API works. The Validator will not
> throw any exception, if the validation fails. It returns a Set with
> ConstraintViolations. Some features of the Validator API are not shown, but
> interesting for the users:
> - Validating groups
> (http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-usingvalidator-validationgroups)
> - Creating custom constraints
> (http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-customconstraints)
> - XML configuration
> (http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-xmlconfiguration)
> - Configure custom ValidationProviderResolver, MessageInterpolator,
> TraversableResolver or ConstraintValidatorFactory
> (http://docs.jboss.org/hibernate/stable/validator/reference/en/html_single/#validator-bootstrapping)
>
> Because the validate method of the Validator doesn't throw an exception but
> returns a Set with ConstraintViolations, I'm afraid we could not use the
> bean component.
>
> I found the following two still open issues for this topic:
> http://issues.apache.org/activemq/browse/CAMEL-1276
> http://issues.apache.org/activemq/browse/CAMEL-1537
>
> You and others prefers to use Predicates/Processors like this:
>
> from("foo")
>  .filter().validate(theValidationEndpointUri)
>  .to("blah")
>
> or
>
> from("foo")
>  .validate(nonblocking)
>  .to("bar")
>
> Now, I think also this is the better solution to implements these
> requirements. But I'm not so familiar with implementing
> Predicates/Processors and extend the Java/XML DSL. Could you give me a hint,
> where I could find a good sample in the Camel code to implement a
> Predicate/Processor?
>
> Regards,
> Christian
>
> --
> View this message in context: 
> http://old.nabble.com/Proposal-for-a-new-camel-bean-validation-component-based-on-jsr-303-tp27950969p27975303.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>



-- 
Claus Ibsen
Apache Camel Committer

Author of Camel in Action: http://www.manning.com/ibsen/
Open Source Integration: http://fusesource.com
Blog: http://davsclaus.blogspot.com/
Twitter: http://twitter.com/davsclaus

Reply via email to