Hi!

I’m writing a mobile web interface using wicket. Since there are mobile
devices with various screen resolutions, I need to maintain separate set of
htmls (per component class) based on category/resolution. I’m able to define
custom place for htmls (thanks to
http://cwiki.apache.org/WICKET/control-where-html-files-are-loaded-from.html
), but having problem with locating correct file at runtime. Wicket is
invoking locate(Class clazz, String path) of my custom ResourceStreamLocator
for the 1st time only. Then, I assume, its remembering the file path or
stream and always showing htmls for the 1st requesting device category! Is
there any way (a hack may be!) to instruct/force wicket to invoke locate(…)
everytime a request comes?

 

Below a snippet of my current implementation:

 

public class MyWebApplication extends WebApplication {

            …

 

            protected void init() {

                        IResourceSettings resourceSettings =
getResourceSettings();

                        resourceSettings.setResourceStreamLocator(new
MyResourceLocator());

            }

}

 

public class MyResourceLocator extends ResourceStreamLocator {

            …

 

public IResourceStream locate(final Class clazz, final String path) {

                        MySession session = MySession.get();

                        IResourceStream located = locateByClassLoader(clazz,
getHtmlPath(path, session.getDevice()));

                        return located;        

            }

 

            private String getHtmlPath(String path, PlainDevice d) {

                        if (<category-1>) {

                                    return <category-1-folder-path> +
path.substring(path.lastIndexOf("/") + 1);

                        } else {

                                    return <category-2-folder-path> +
path.substring(path.lastIndexOf("/") + 1);

                        }

            }

 

            protected IResourceStream locateByClassLoader(final Class clazz,
final String path) {

                        ClassLoader classLoader = null;

 

        if (classLoader == null) {

            // use context classloader when no specific classloader is set

            // (package resources for instance)

            classLoader = Thread.currentThread().getContextClassLoader();

        }

 

        if (clazz != null) {

            classLoader = clazz.getClassLoader();

        }

 

        if (classLoader == null) {

            // use Wicket classloader when no specific classloader is set

            classLoader = getClass().getClassLoader();

        }

 

        logger.debug("path : " + path);

        // Try loading path using classloader

        final URL url = classLoader.getResource(path);

        if (url != null) {

            return new UrlResourceStream(url);

        }

        return null;

            }

}

 

 

/Anirban

 

 

Reply via email to