Hi!

Wicket also supports ".xml" files instead of ".properties", so that is not
the problem.
I was able to follow Wicket trying both "X.properties" and "X.xml" for any
location.

So, that is not the problem.



Newgro wrote:
> 
> Am Montag, 13. Oktober 2008 11:28:07 schrieb Christian Oldiges:
>> Hello!
>>
>> First here is my setup and the situation in which I discovered the
>> problem
>> which might be a bug in FormComponent$MessageSource:
>>
>> I am using v1.3.4 and I have a problem placing a resource string for a
>> customized subclass of CheckBox.
>>
>> My component tree looks like this:
>>
>> page.form.main.data
>>
>> -page is a subclass of WebPage, the page.html file contains several
>> <wicket:fragment> tags which are used to create a wizard style UI
>> -form is a Form object
>> -main is a Fragment object
>> -data is a customized subclass of CheckBox
>>
>> Now my problem:
>>
>> We have created the CheckBox subclass because it contains spezialized
>> behaviour and we need customized error messages, especially for the case
>> when the checkbox is NOT marked by the user when the form is submitted.
>>
>> For that reason we created a "data.xml" next to the "data.class" which is
>> supposed to contain the error messages. Now, the data component marks
>> itself as required and thus triggers a "Required" error resource key
>> lookup
>> upon form validation when the checkbox wasnt checked.
>>
>> I was surprised to find that the "Required" key is never ever tried on
>> the
>> "data.xml" resource file, so I fired up the debugger to check out whats
>> happening and I think the problem is located in
>>
>> FormComponent$MessageSource.getMessage(String key):
>>
>> ---------------------------------------------------------------------------
>>----------- public String getMessage(String key)
>>              {
>>                      final FormComponent formComponent = FormComponent.this;
>>
>>                      // retrieve prefix that will be used to construct 
>> message keys
>>                      String prefix = formComponent.getValidatorKeyPrefix();
>>                      if (Strings.isEmpty(prefix))
>>                      {
>>                              prefix = "";
>>                      }
>>
>>                      final Localizer localizer = 
>> formComponent.getLocalizer();
>>
>>                      String resource = prefix + getId() + "." + key;
>>
>>                      // First use the parent for resolving so that
>>                      // form1.textfield1.Required can be used.
>>
>>                      // Note: It is important that the default value of "" 
>> is provided
>>                      // to getString() not to throw a 
>> MissingResourceException or to
>>                      // return a default string like "[Warning: String ..."
>>                      String message = getString(localizer, resource,
>> formComponent.getParent());
>>
>>                      // If not found, than ...
>>                      if (Strings.isEmpty(message))
>>                      {
>>                              // Try a variation of the resource key
>>
>>                              resource = prefix + key;
>>
>>                              message = getString(localizer, resource, 
>> formComponent.getParent());
>>                      }
>> ---------------------------------------------------------------------------
>>-----------
>>
>> This method is called with key="Required" on the instance belonging to
>> the
>> "data" FormComponent.
>>
>> At first the id of the FormComponent is prefixed and getString() is
>> called
>> for the parent of the FormComponent. This would be "data.Required" and
>> the
>> component would be the "main" Fragment. That call doesnt return any
>> useful
>> value, which is expected.
>>
>> Now, the second call of the getString() method doesnt include any
>> component
>> id anymore in the resource key, so it is "Required" and is called again
>> for
>> the parent of the FormComponent. The getString() at some point gets into
>> the ComponentStringResourceLoader class to the
>> loadStringResource(component,key) method.
>>
>> key = "Required" and component is again the "main" Fragment and that is
>> the
>> problem IMO.
>>
>> The component stack created in loadStringResource contains:
>>
>> "page", "form" and "main" but NOT the "data" component, so the key
>> "Required" is never tried on the resource file "data.xml".
>>
>> If the second getString call
>>
>>                              message = getString(localizer, resource, 
>> formComponent.getParent());
>>
>> were changed like this:
>>
>>                              message = getString(localizer, resource, 
>> formComponent);
>>
>> the component stack would go all the way down to the component itself and
>> would not stop at the parent.
>>
>>
>> Is this a bug or am I missing something regarding the lookup mechanism???
>>
>>
>>
>> BTW: Great job on the WiA book!!!
> 
> Small question for understanding: Did you set your own localizer? AFAIK
> wicket 
> uses property files for localization and if it finds no file on the 
> appropriate place it goes up the component hirarchie. So you would need a 
> Data.properties file with the strings in it. Maybe im missed something.
> 
> Cheers
> Per
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Possible-bug-in-FormComponent%24MessageSource-regarding-resource-string-lookups-tp19951394p19957041.html
Sent from the Wicket - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to