You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@bval.apache.org by Rudy De Busscher <rd...@gmail.com> on 2011/08/03 11:38:32 UTC

Re: Question on non default groups value

@All

I tried to make a kind of transformer.  And although it works, I'm not
completely satisfied.
This is was I did.

In the buildForClass method of the MetaBeanBuilder, I call all the
registered transformer and let them do their thing. Something like this:

*org.apache.bval.MetaBeanBuilder#buildForClass

        for (MetaBeanTransformer transformer :
TransformerFactory.getTransformers()) {
            transformer.transform(meta);
        }
        return meta;
*

A possible transform could add a group when the annotation has a kind of
marker:
*
    public void transform(MetaBean metaBean)
    {
        for (MetaProperty metaProperty : metaBean.getProperties())
        {
            for (Validation validation : metaProperty.getValidations())
            {
                ConstraintValidation constraint = (ConstraintValidation)
validation;
                if
(checkHasCrossValidationMarker(constraint.getAnnotation()))
                {
                    constraint.getGroups().remove(Default.class);
                    constraint.getGroups().add(CrossValidationGroup.class);
                }
            }
        }
    }
*
The reason why I'm not satisfied?
- Validation is an interface that I need to cast to ConstraintValidation
- ConstraintValidation is immutable but adding to the groups is possible
through getGroups().add()
- Adding a group like this, doesn't set the attribute (see setGroups;
this.attributes.put(Jsr303MetaBeanFactory.ANNOTATION_GROUPS, ....)

Probably there is a solution with a more complex setup, but I searched and
found a solution that removes the requirement of adding the group which
works in Apache BVal and Hibernate validator with a small performance
penalty.

regards
Rudy

On 22 July 2011 10:51, Gerhard Petracek <ge...@gmail.com> wrote:

> hi rudy,
>
> maybe we should think about both. providing a (different) default group for
> a constraint sounds useful (maybe even for bv 1.1) if you have a constraint
> which is (by definition) only useful for a specific group (in most or all
> cases).
>
> regards,
> gerhard
>
> http://www.irian.at
>
> Your JSF powerhouse -
> JSF Consulting, Development and
> Courses in English and German
>
> Professional Support for Apache MyFaces
>
>
>
> 2011/7/22 Rudy De Busscher <rd...@gmail.com>
>
>> Hi Gerhard,
>>
>> Disabling the standard requirements for just an add on of ExtVal seems a
>> bit too drastic, but a transformer seems a good idea.  I'll try to make
>> something and post it.
>>
>> Regards
>> Rudy.
>>
>>
>> On 18 July 2011 21:58, Gerhard Petracek <ge...@gmail.com>wrote:
>>
>>> hi rudy,
>>>
>>> we could discuss a bval feature which relaxes such rules (it would be
>>> deactivated by default).
>>> or something like transformer for constraints.
>>>
>>> regards,
>>> gerhard
>>>
>>> http://www.irian.at
>>>
>>> Your JSF powerhouse -
>>> JSF Consulting, Development and
>>> Courses in English and German
>>>
>>> Professional Support for Apache MyFaces
>>>
>>>
>>>
>>> 2011/7/18 Rudy De Busscher <rd...@gmail.com>
>>>
>>>> hi  All,
>>>>
>>>> The situation is a bit difficult to describe both I have a use case
>>>> where I would like to create a custom validation annotation where I need to
>>>> define a non empty groups attribute
>>>>
>>>> something like this
>>>> *@Target(value = { ElementType.FIELD})
>>>> @Retention(value = RetentionPolicy.RUNTIME)
>>>> @Constraint(validatedBy = { EqualsValidator.class })
>>>> public @interface Equals
>>>> {
>>>>     String message() default "{duplicated_content_required}";
>>>>
>>>>     Class<?>[] groups() default {CrossValidationGroup.class};
>>>>
>>>>     Class<? extends Payload>[] payload() default {};
>>>>
>>>>     String[] value();
>>>> }
>>>> *
>>>>
>>>> But as expected, I get a error when I try to use the annotation:
>>>> Default value for groups() must be an empty array
>>>>
>>>> But I want to avoid that the user needs to define it always when he uses
>>>> the annotation.
>>>>   *  @Equals(value = "caseSensitiveTarget", groups =
>>>> CrossValidationGroup.class)
>>>>     private String caseSensitiveSource;*
>>>>
>>>>
>>>> Any idea or direction I need to look into are apreciated.
>>>>
>>>> Regards
>>>>
>>>> --
>>>> Rudy De Busscher
>>>> http://www.c4j.be
>>>>
>>>>
>>>
>>
>>
>> --
>> Rudy De Busscher
>> http://www.c4j.be
>>
>>
>


-- 
Rudy De Busscher
http://www.c4j.be