I didn't want to open the request before talk to you and discuss this.

There are two options here:

A) support a fallback style
  Maybe a setFallbackStyle in the Session class, together with the style
property. Then ResourceStreamLocator would check for this in the iterator
loop to check for resources with the fallback style.

B) add a new resource locator schema
   Keep the style the way it is, adding a new option:
   This way, nothing regardling the style feature would have to be changed.

  resource[_variation][_style][_locale][.device].extension

The RSL I've sent you before does exactly this, because there's already an
extra loop for an array of extensions. So, in other words, what the code
does is to continue using the same schema that exists today, but adding
extra extensions.

   resource[_variation][_style][_locale].extension

Where "extension" can be: ".android.html" or ".m.html" for generic mobile
version.

What do you think?
*Bruno Borges*
www.brunoborges.com.br
+55 21 76727099



On Thu, Jun 16, 2011 at 6:32 PM, Juergen Donnerstag <
[email protected]> wrote:

> Hi Bruno,
>
> please open a jira feature/improvement request. I'll have a look. Thanks.
>
> -Juergen
>
> On Thu, Jun 16, 2011 at 10:20 PM, Bruno Borges <[email protected]>
> wrote:
> > I came once with this but I don't remember what happend.
> >
> > Anyway, I want to share the idea with you again:
> >
> > We are building mobile web apps and a common scenario that came to us is
> > that mobile web applications often must have specific styles per devices.
> >
> > We have a MobileFilter configured in the web.xml to intercept the request
> > and identify the device, adding the device's name/type/other info to the
> > user's session.
> >
> > When the Wicket Session is created, we get the device name and set it as
> a
> > style, like "android", "iphone" or "blackberry".
> >
> > But the application has tons of HTMLs which are already for desktop
> browser
> > access.
> >
> > So here is what I'm are thinking about:
> >
> > Say there's a HomePage:
> > - HomePage.html
> > - HomePage_android.html
> > - HomePage_iphone.html
> > - HomePage_blackberry.html
> >
> > If a desktop user comes in, HomePage.html is rendered. If an Android user
> > comes in, HomePage_android.html loads fine.
> >
> > The problem is that we often don't have to code specific versions per
> > device. Some pages can have a more generic "mobile" version, like
> rendering
> > a list with <li> instead of <table>.
> >
> > But there's no fallback style.
> >
> > So what we want is that this scenario could work:
> >
> > - ListItems.html (desktop version)
> > - ListItems_android.html (android's specific version)
> > - ListItems_mobile.html (any other mobile devie)
> >
> > If a user from blackberry/iphone/nokia or anything comes in, and based on
> > rules we identify him as a mobile device, we set the fallback style as to
> > "mobile" and the specific style as "his_device".
> >
> > I've come with a ResourceStreamLocator that does this, but not using
> styles.
> > The streamLocator does not accept a list of styles to test, but it
> accepts a
> > list of extensions.
> >
> > So what I did was to have HTML files like such:
> > Page[.device].html (with dot instead of underscore).
> >
> > The whole variation/style/locale would still work without any problem.
> >
> > ## Here is the code:
> >
> > package com.myproject;
> >
> > import java.util.Locale;
> >
> > import org.apache.wicket.Session;
> > import org.apache.wicket.util.resource.IResourceStream;
> > import org.apache.wicket.util.resource.locator.IResourceStreamLocator;
> > import org.apache.wicket.util.resource.locator.ResourceStreamLocator;
> >
> > import com.myproject.Device;
> >
> > /**
> >  * @author Bruno Borges
> >  */
> > public class MobileStreamLocator extends ResourceStreamLocator implements
> > IResourceStreamLocator {
> >
> > @Override
> > public IResourceStream locate(final Class<?> clazz, String path, final
> > String style, final Locale locale,
> > final String extension) {
> >
> > StringBuilder newExtensions = new StringBuilder();
> > newExtensions.append(extension);
> >
> > if ("html".equals(extension) && Session.get() instanceof
> > MobileWicketSession) {
> > MobileWicketSession ms = (MobileWicketSession) Session.get();
> > Device device = ms.getDevice();
> > if (device.isMobile()) {
> > newExtensions = new StringBuilder();
> >
> > // add specific device name
> >
> newExtensions.append(device.getDeviceType()).append(".").append(extension).append(",");
> >
> > // add generic mobile extension
> > newExtensions.append("m.").append(extension).append(",");
> > newExtensions.append(extension);
> > }
> > }
> >
> > return super.locate(clazz, path, style, locale,
> newExtensions.toString());
> > }
> > }
> >
> > *Bruno Borges*
> > www.brunoborges.com.br
> > +55 21 76727099
> >
>

Reply via email to