Hi Gerhard, hi Rudy,

thanks for your explanation so far. MetaData, Transformers, Component
Initializers and so on have become clear(er) to me now. 

Thanks for the coded add-on which covers some more aspects than I thought of
(possibly EL expression in the label’s value, etc.) and which is working for
ExtVal based annotations. I changed my renderer only code to your example.

Still I have to say as in a mail of mine before, this is NOT working for
bean validation annotations since in
ExtValUtils.getTransformedMetaDataWith() no meta data is extracted because a
validation strategy class cannot be located through different naming
conventions (like '
javax.validation.constraints.NotNull[Validation]Strategy'). Seems there is
some configuration or mapping missing? I could not find any hints in Rudy's
code.

Only if I leave out the check for !metaDataResult.isEmpty() it is working,
the setting of the attribute required is done in
org.apache.myfaces.extensions.validator.beanval.HtmlCoreComponentsComponentI
nitializer since the super call isComponentRequired(UIComponent) returns
true what is not based on the annotations but on other component attributes
like not being disabled nor being readonly. 

Can you took another look into this?

Thank you.

Tom



> -----Ursprüngliche Nachricht-----
> Von: Rudy De Busscher [mailto:rdebussc...@gmail.com]
> Gesendet: Mittwoch, 28. April 2010 12:00
> An: MyFaces Discussion
> Betreff: Re: ExtVal: Rendering component with visual indication for
> required fields
> 
> Tom,
> 
> I quickly assembled the add-on I was thinking about a few months ago.
> You
> can find it here (1)
> 
> If you check out the code and do a mvn install in the requiredLabel
> directory, the add-on is locally available.
> 
> You then can use it in your project by including following dependency
> in
> your POM.
>         <dependency>
>             <groupId>sandbox890.extensions.validator.addon</groupId>
>             <artifactId>required-label</artifactId>
> 
>             <version>1.2.3-SNAPSHOT</version>
>         </dependency>
> 
> It summarizes the discussions we had here how you could implement the
> requirement of showing a marker.  I did a quick test with the @Required
> annotation and it works as expected.  The Bean validation annotations
> should
> also work.
> 
> (1) http://sandbox890.googlecode.com/svn/trunk/addons
> 
> regards
> Rudy.
> 
> 
> On 28 April 2010 00:55, Gerhard Petracek <gerhard.petra...@gmail.com>
> wrote:
> 
> > hi tom,
> >
> > some additions:
> >
> > first of all: thx for your questions. such questions allow us to
> improve
> > the
> > documentation!
> > (+ usually there is a simple solution provided by extval and you
> don't have
> > to care about such extval internals.)
> >
> > @renderer interceptors:
> > the concept allows extval to do all the magic it offers. however,
> usually
> > it's an internal concept.
> > you just need it e.g. for add-ons (the label support you would like
> to
> > implement is such an add-on)
> >
> > *...@meta-data transformers*
> > if you have custom constraints, you normally impl. a meta-data
> transformer
> > for each annotation you would like to use for component
> initialization.
> > *and that's it.*
> > *
> > *
> > *(in case of bv it's a bit more difficult - e.g.: you have to care
> about
> > group validation, composite constraints,...).*
> > *
> > *
> > you can transform information provided by concrete meta-data to a
> generic
> > representation.
> > e.g. @Size (bv) and @Length (extval) provide the same information. so
> you
> > just have to impl. a transformer e.g. for @Size which extracts the
> > information.
> > as soon as you forward the extracted information to extval, the
> framework
> > does the rest (if it knows how to handle the provided information).
> so you
> > don't have to care about all the other details and internals.
> >
> > @component initialization (i just use trinidad as concrete example):
> > you just have to impl. a component initializer e.g. for your
> component lib
> > if
> >  - you have (input) components which provide special features and the
> > components aren't supported by extval (or an extval-add-on).
> >  - you have a new type of meta-data (e.g. if you would like to add a
> > client-side validator for validating @EMail)
> >
> > e.g. trinidad offers client-side validation. so the optional trinidad
> > module
> > of extval uses the information provided by the transformers to add
> > client-side validators and to set properties of the trinidad
> components. so
> > trinidad isn't aware of extal. it just gets plain (initialized)
> trinidad
> > components. the trinidad support module isn't aware of a concrete
> > annotation
> > like @Length - it just knows that there is a generic representation
> to
> > express e.g. min and max length (independent of the used constraint).
> ->
> > you
> > get client-side validation based on constraints and support modules
> like
> > the
> > trinidad module aren't aware of the concrete annotations. so you can
> impl.
> > your custom constraints or use bv constraints,... - as soon as you
> > transform
> > the provided information to a known (generic) format, extval is able
> to use
> > the information to prepare the components for the rendering process.
> > (+ there are further possibilities which depend on the concrete
> > company/projects.)
> >
> > @your suggestion:
> > as you see - you don't have to use all mechanisms provided by extval
> - your
> > impl. also works. the only downside is that you have to support
> features
> > like group validation, composite constraints, validation payload,...
> on
> > your
> > own (+ the impl. depends on a bv constraint - so we can't use it as
> generic
> > add-on).
> >
> > if you impl. it based on my example (just without trinidad), you
> could
> > reuse
> > all features provided by extval and you don't have to care about
> mechanisms
> > like group-validation,... - you can delegate such tasks to extval.
> >
> > additional hint:
> > the trinidad support module autom. activates initialization of the
> required
> > attribute [1] (by default initialization of the required attribute is
> > deactivated) -> if you use my suggestion without trinidad, you also
> have to
> > activate the initialization of the required attribute in the startup
> > listener.
> >
> > regards,
> > gerhard
> >
> > [1]
> >
> >
> https://svn.apache.org/repos/asf/myfaces/extensions/validator/trunk/com
> ponent-support/trinidad-
> support/src/main/java/org/apache/myfaces/extensions/validator/trinidad/
> startup/TrinidadModuleStartupListener.java
> >
> > http://www.irian.at
> >
> > Your JSF powerhouse -
> > JSF Consulting, Development and
> > Courses in English and German
> >
> > Professional Support for Apache MyFaces
> >
> >
> >
> > 2010/4/27 Rudy De Busscher <rdebussc...@gmail.com>
> >
> > > Hi Tom,
> > >
> > > a little more explanation of the *"... and do the component
> > initialization
> > > of this EditableValueHolder"* .
> > >
> > > When you have an outputLabel in the RendererInterceptor, the
> > > EditableValueHolder that goes with it, (the component referenced in
> the
> > for
> > > attribute) isn't initialized by ExtVal yet.  So if you ask the
> Required
> > > attribute of it, it will return false, no matter what annotations
> there
> > are
> > > placed on the property in the backing bean. (except of course when
> you
> > have
> > > set the required attribute in the screen).
> > >
> > > So if you want to know if the input field is required at that time
> you
> > must
> > > analyze the annotations.  The method
> > > ExtValUtils.configureComponentWithMetaData() does just that so you
> can
> > look
> > > at the required property of the UIInput after the method executed.
> > >
> > > Why RendererInterceptor and component initialization ??
> > > Well the  RendererInterceptor has more functionality then just
> > intercepting
> > > the rendering of the component.  It adds extra functionality for
> encode
> > and
> > > decode.  So the component initializer is made to add information
> from the
> > > annotations to the UIComponent just before rendering.  But the
> > interceptor
> > > is also responsible for coordination of the validation after a
> decode is
> > > done.
> > >
> > > In your case, a label has nothing to decode so there is no need to
> have
> > > this
> > > separation.
> > >
> > > Hopes this clarifies a bit.
> > >
> > > regards
> > > Rudy.
> > >
> > > On 27 April 2010 21:25, Tom M. <mynewsgro...@arcor.de> wrote:
> > >
> > > > Hi Gerhard,
> > > >
> > > > what I had already used before asking in the mailing list was:
> > > > - ExtVal Core
> > > > - BeanValidation (using JSR-303 annotations)
> > > > - PropertyValidation (using basic code for custom cross
> validation
> > > > annotation and provided out-of-the-box annotations such as
> @RequiredIf)
> > > > - I did not want to use Trinidad since other component libraries
> are to
> > > be
> > > > used in the project.
> > > > - I have absolutely no validation code in the html templates (no
> > > validator
> > > > tags, no required attribute, nothing of that at all), only using
> > > > annotations
> > > > and in consequence separating page structure/layout from
> validation
> > rules
> > > > in
> > > > the domain objects (also founded in the organization of the
> development
> > > > teams).
> > > >
> > > > This combination works perfect so far: validating the data
> according to
> > > the
> > > > annotations, transforming messages und even generating a html
> maxlength
> > > > attribute for @Size.max (nice!).
> > > >
> > > > Since I found it quite hard to understand how ExtVal is working
> in
> > detail
> > > > (even with your hints and links stated), I found a very simple
> solution
> > > > that
> > > > is working for me:
> > > > - I asked myself why do I need a renderer interceptor AND a
> component
> > > > initializer? From my point of view adding the '*' to the label
> text is
> > > more
> > > > a question of rendering the label's text. And I could not figure
> out
> > what
> > > > Rudy meant with "... and do the component initialization of this
> > > > EditableValueHolder" or what to do since I want to change the
> label not
> > > the
> > > > input component.
> > > > - By obmitting the component initializer, there is no need for
> meta
> > data
> > > > and
> > > > a transformer...
> > > > - I used some code I found in ExtVal classes, especially from
> > > ExtValUtils.
> > > >
> > > > So this is my simple (non standard?) solution which works for the
> > > @NotNull
> > > > annotation:
> > > >
> > > >   public class RequiredLabelRendererInterceptor extends
> > > > AbstractRendererInterceptor {
> > > >
> > > >        public static final String REQUIRED_SYMBOL = "*";
> > > >
> > > >        @Override
> > > >        public void beforeEncodeBegin(FacesContext facesContext,
> > > UIComponent
> > > > uiComponent, Renderer wrapped) throws IOException {
> > > >
> > > >                if (uiComponent instanceof HtmlOutputLabel) {
> > > >
> > > >                        HtmlOutputLabel labelComp =
> (HtmlOutputLabel)
> > > > uiComponent;
> > > >                        UIComponent inputComp = ...; // find by
> label
> > > > attribute 'for'
> > > >
> > > >                        MetaDataExtractor extractor =
> > > > createMetaDataExtractor();
> > > >                        for (MetaDataEntry entry :
> > > > extractor.extract(facesContext, inputComp).getMetaDataEntries())
> {
> > > >
> > > checkAndHandleRequiredAttribute(labelComp,
> > > > entry.getKey());
> > > >                        }
> > > >                }
> > > >        }
> > > >
> > > >        private MetaDataExtractor createMetaDataExtractor() {
> > > >                return
> ExtValContext.getContext().getFactoryFinder()
> > > >
> > > > .getFactory(FactoryNames.COMPONENT_META_DATA_EXTRACTOR_FACTORY,
> > > > ComponentMetaDataExtractorFactory.class)
> > > >                        .create();
> > > >        }
> > > >
> > > >        private void
> checkAndHandleRequiredAttribute(HtmlOutputLabel
> > > > labelComp, String key) {
> > > >
> > > >                if (NotNull.class.getName().equals(key)) {
> > > >                        String label = (String)
> labelComp.getValue();
> > > >                        if (!label.startsWith(REQUIRED_SYMBOL)) {
> > > >
> > > > labelComp.setValue(REQUIRED_SYMBOL+labelComp.getValue());
> > > >                         }
> > > >                 }
> > > >        }
> > > >   }
> > > >
> > > > A question to:
> > > > >> e.g.: instead of using coreOutputLabel at:
> > > > >>  ExtValUtils.configureComponentWithMetaData(facesContext,
> > > > >> coreOutputLabel, metaDataResult); you could use the
> targetComponent
> > > > >> (= the input component). after this call you can check if the
> > > > >> targetComponent is required.
> > > >
> > > > Does that mean after configuring the component's attribute
> 'required'
> > > would
> > > > be set? I didn't try that. Is there really a need for the
> component
> > > > initialize and initiating the call via
> > > > ExtValUtils.configureComponentWithMetaData()?
> > > >
> > > > For my already mentioned @RequiredExactlyOneOf cross validation
> > > annotation
> > > > (which works fine regarding validation), I managed to render all
> labels
> > > > belonging to the specified attributes via the renderer
> interceptor. But
> > > > this
> > > > only works if the annotation is defined at the attribute that
> occurs
> > > first
> > > > in the html in order to manipulate the labels that are rendered
> later
> > on.
> > > > Possibly there would be a better solution to avoid this tight
> coupling
> > by
> > > > really using ExtVal's infrastructure!?
> > > >
> > > > Tom
> > > >
> > > >
> > > >
> > > > > -----Ursprüngliche Nachricht-----
> > > > > Von: Gerhard Petracek [mailto:gerhard.petra...@gmail.com]
> > > > > Gesendet: Dienstag, 27. April 2010 00:45
> > > > > An: MyFaces Discussion
> > > > > Betreff: Re: ExtVal: Rendering component with visual indication
> for
> > > > > required fields
> > > > >
> > > > > hi thomas,
> > > > >
> > > > > basically you have 3 possibilities with extval:
> > > > >  - use simple but dynamic validation, jpa based validation and
> > > > > cross-validation -> use extval-core + extval-property-
> validation (+
> > > > > your
> > > > > custom constraints)
> > > > >  - use bean-validation + some advanced extval mechanisms for it
> ->
> > use
> > > > > extval-core + extval-bean-validation + an impl. of bv (+ custom
> > > > > bv-constraints)
> > > > >  - create your own validation module(s)/concepts -> use extval-
> core +
> > > > > your
> > > > > own mechanisms on top of it
> > > > >
> > > > > for sure you can combine all modules. you just have to take
> care that
> > > > > you
> > > > > don't mix different types of constraints and their concepts
> (esp. in
> > > > > combination with extval add-ons). however, i would suggest that
> you
> > > > > just use
> > > > > one validation-module of extval. and as soon as you are using
> it for
> > a
> > > > > real
> > > > > app, you should also think about tweaking it (e.g. see [1])
> > > > >
> > > > > two (simple) sample setups for extval + bv are available at [2]
> and
> > > > > [3].
> > > > > a nice intro is available at [4].
> > > > >
> > > > > regards,
> > > > > gerhard
> > > > >
> > > > > [1]
> > > http://wiki.apache.org/myfaces/Extensions/Validator/JSR303/Advanced
> > > > > [2]
> > > > >
> > >
> https://svn.apache.org/repos/asf/myfaces/extensions/validator/trunk/exa
> > > > > mples/hello_bean-validation/
> > > > > [3]
> > > > >
> > >
> https://svn.apache.org/repos/asf/myfaces/extensions/validator/trunk/exa
> > > > > mples/feature-set_02/
> > > > > [4]
> > > > >
> >
> http://people.apache.org/~gpetracek/myfaces/extval/extval_chapter.html<
> http://people.apache.org/%7Egpetracek/myfaces/extval/extval_chapter.htm
> l>
> > > <
> >
> http://people.apache.org/%7Egpetracek/myfaces/extval/extval_chapter.htm
> l>
> > > >
> > > >
> > >
> >

Reply via email to