hi, i committed the first versions of the add-ons at [1] and [2]. -> you are welcome to test it!
regards, gerhard [1] http://code.google.com/p/os890/source/browse/#svn/trunk/java/web/jsf/extval/required_label [2] http://code.google.com/p/os890/source/browse/#svn/trunk/java/web/jsf/extval.bv/required_label http://www.irian.at Your JSF powerhouse - JSF Consulting, Development and Courses in English and German Professional Support for Apache MyFaces 2010/4/28 Gerhard Petracek <gerhard.petra...@gmail.com> > hi tom, > > yes - the add-on i'll commit will also work with bv! > > 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 Tom M. <mynewsgro...@arcor.de> > > 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> >> > > > > >> > > > > >> > > > >> > > >> >> >