hi, @rudy: thx for committing it to the sandbox. i reused some parts of it and combined it with my suggestion.
as mentioned by rudy - esp. for extval-constraints it's better to use component initializers. however, the bv module is a bit different. it's also possible to use component initializers, however, you would have to care about a lot of bv-details. >currently< the bv module doesn't expose a lot. in comparison to the core and the property-validation module it isn't that easy to expose useful utils which provide all bv-mechanisms and additional extval/bv features. at least for the first version of the bv-module the intention was to expose only few api's and utils. so we have time to think e.g. about useful utils which are aware of all bv-features. i'll commit the add-on quite soon! regards, gerhard http://www.irian.at Your JSF powerhouse - JSF Consulting, Development and Courses in English and German Professional Support for Apache MyFaces 2010/4/28 Rudy De Busscher <rdebussc...@gmail.com> > 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/component-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.html> > > > < > > http://people.apache.org/%7Egpetracek/myfaces/extval/extval_chapter.html > > > > > > > > > > > > > > > >