Hi,I looked into this some more, and I noticed getStyle() does exist on component but it's final. My questions are:
1) Why does the getStyle() logic not mirror the getLocale() logic, specifically:
a) why is Component.getStyle() final
b) why doesn't Component.getStyle() consult the parent component for
the style
c) why is Session.getStyle() final (I don't really mind if it is
actually, but then why isn't getLocale() final?)
2) How do variations factor into the whole thing? The getStyle() logic of Component seems a bit of a cludge, returning the style + "_" + variation. It seems to me that actually resource lookup interfaces should have an extra parameter for the variation, i.e., for IStringResourceLoader it would become:
String loadStringResource(Class<?> clazz, String key, Locale locale, String style, String variation);
3) I checked out Wicket 1.4.x and changed getStyle() to non-final and to follow the logic of Locale (that is, Component.getStyle() consults the parent), and now at everything works for me the way I want it to. The only problem I still have is how to make the code properly take into account variations, since now I just copied the getLocale() method:
getStyle() {
if (parent != null)
{
return parent.getStyle();
}
return getSession().getStyle();
}
I'm wondering, what is the chance that this functionality somehow enters
into Wicket (I prefer not to have to run a patched version)? The problem
is, I cannot see any way *without* changing Wicket to make this work,
other than just leaving the style null and abusing the variation for
what is really the style... (since getVariation() does mirror the
getLocale() logic, except that it does not consult the session).
Regards, Sebastiaan Sebastiaan van Erk wrote:
Hi guys, I have an application with the following url scheme: http://www.mydomain.com[/brand][/locale]/app[/wicketrelativepath]The brand and locale parts are optional, and everything after app is the relative path to the Wicket page. The brand determines the style to use.The intention is, that if the brand or locale are specified in the URL they take precedence over any style/locale contained in the session. To accomplish this I did 3 things:1) override WicketFilter's getRelativePath()2) have a filter add style/locale attributes determined from the url to the http session 3) override getLocale() on my base page class (BasePage) to read as follows:@Override public Locale getLocale() {// Get brand based on the style in the url, or default Brand if the style is null...MyBrand brand = MyWebRrequest.get().getBrand(); // First check if there is a required locale (locale in the url). Locale locale = MyWebRequest.get().getRequiredLocale(); if (locale == null) {// No required locale, let's see if the current locale is supported.final Locale currentLocale = super.getLocale(); if (brand.isLocaleSupported(currentLocale)) { locale = currentLocale; } else {// Current locale is not supported, let's see we can use the user's preferred locale. final Locale preferredLocale = MyWebRequest.get().getLocale();if (brand.isLocaleSupported(preferredLocale)) { locale = preferredLocale; } else {// The preferred locale is not supported, use the default locale.locale = brand.getDefaultLocale(); } } } return locale; }This all works fine, for the locale. However, now I run into problems: I want to do a similar thing for the style.What I had at the moment was: public MySession(final MyWebRequest request) { super(request); setStyle(request.getBrand().getStyle()); }Of course this does not work: when you change the url to another brand, it does not create a new session, so you keep the old brand. So I thought I'd override the getStyle() method in MySession. However I can't: Session.getStyle() is final.Finally, I thought I could override Component.getStyle() to have a similar logic to the above code, but I can't do that either: Component does not have a getStyle() method.So my developer-list question is basically: why is there such an asymmetry between style and locale? Why isn't there a getStyle() method on Component, and why is getStyle() on Session final?My "user-list" question is: how can I achieve what I want? Regards, Sebastiaan
smime.p7s
Description: S/MIME Cryptographic Signature
