struts-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Musachy Barroso <musa...@gmail.com>
Subject Re: Pluggable themes for JavaTemplates plugin
Date Wed, 04 Feb 2009 15:45:13 GMT
Do you want to implement the plugin using Java instead of FreeMarker?
Unless the output is very simple, generating javascript from java will
be a pain to write and maintain.

musachy

On Wed, Feb 4, 2009 at 10:30 AM, Obinna <obinna@gmail.com> wrote:
> Hi James, Thanks for getting back so quickly.
>
> I see two major areas of extensibility required:
> 1) Allow plugging in of custom themes
> 2) Allow for easy extensibility/re-use of existing themes (currently
> SimpleTheme or DefaultTheme)
>
> 1) We need a way of specifying custom themes to the JavaTemplateEngine via
> configuration. For now, the best I can come up with is a new struts
> configuration constant that takes a comma-delimited list of theme names
>   as its value.
>
>    So lets add something like the following constant to StrutsConstants:
>
>            /** Custom theme classes for the javatemplates rendering engine
> */
>            public static final String STRUTS_JAVATEMPLATES_CUSTOM_THEMES =
> "struts.javatemplates.customThemes";
>
>    We can then specify in our struts.xml
>
>            <constant name="struts.javatemplates.customThemes"
> value="com.example.ui.struts2.MyCustomJavaTheme" />
>
>    and add to the JavaTemplateEngine class
>
>            /**
>             * Allows for providing custom theme classes (implementations of
> the org.apache.struts2.views.java.Theme) interface
>             * for custom rendering of tags using the javatemplates engine
>             * @param themeClasses a comma delimited list of custom theme
> class names
>             */
>            @Inject(StrutsConstants.STRUTS_JAVATEMPLATES_CUSTOM_THEMES)
>            public void setThemeClasses(String themeClasses) {
>
>                StringTokenizer customThemes = new
> StringTokenizer(themeClasses, ",");
>
>                while (customThemes.hasMoreTokens()) {
>                    String themeClass = customThemes.nextToken().trim();
>                    try {
>                        LOG.info("Registering custom theme '" + themeClass +
> "' to javatemplates engine");
>
>
>                        //FIXME: This means Themes must have no-arg
> constructor - should use object factory here
>
> //ObjectFactory.getObjectFactory().buildBean(ClassLoaderUtil.loadClass(themeClass,
> getClass()), null);
>
> themes.add((Theme)ClassLoaderUtil.loadClass(themeClass,
> getClass()).newInstance());
>
>                    } catch (ClassCastException cce) {
>                        LOG.error("Invalid java them class '" + themeClass +
> "'. Class does not implement 'org.apache.struts2.views.java.Theme'
> interface");
>                    } catch (ClassNotFoundException cnf) {
>                        LOG.error("Invalid java theme class '" + themeClass
> + "'. Class not found");
>                    } catch (Exception e) {
>                        LOG.error("Could not find messages file " +
> themeClass + ".properties. Skipping");
>                    }
>                }
>            }
>
>
>    For the custom theme implemetations, most will probably extend
> SimpleTheme/DefaultTheme and simply insert/remove component handlers in
> their desired sequence and perhaps provide
>    a different (or additional) serializer.
>    so it would be nice to:
>
>        - lower the  protection level on some of the methods/members to
> protected
>
>            (eg. make DefaultTheme.handlerFactories protected, make
> FactoryList inner-class protected or a separate public class)
>
>        - provide some utility methods. For example:
>
>                Add to DefaultTheme class:
>
>                     /**
>                     * Set (replace if exists) the tag handler factories for
> specific tag
>                     * @param tagName
>                     * @param handlers
>                     */
>                    protected void setTagHandlerFactories(String tagName,
> List<TagHandlerFactory> handlers) {
>                        if(tagName != null && handlers != null &&
> this.handlerFactories != null) {
>
>                            handlerFactories.put(tagName,handlers);
>                        }
>                    }
>
>                    /**
>                     * Insert a new tag handler into a sequence of tag
> handlers for a specific tag
>                     * TODO: Need to take care of serializers, if handler
> specified is not a TagSerializer it should never
>                     * be placed after the serializer, but if it is not a
> TagSerializer, it should never
>                     * @param tagName
>                     * @param sequence
>                     * @param factory
>                     */
>                    protected void insertTagHandlerFactory(String tagName,
> int sequence, TagHandlerFactory factory) {
>
>                        if(tagName != null && factory != null  &&
> this.handlerFactories != null) {
>
>                            List<TagHandlerFactory> tagHandlerFactories =
> handlerFactories.get(tagName);
>
>                            if(tagHandlerFactories == null) {
>                                    tagHandlerFactories = new
> ArrayList<TagHandlerFactory>(); //TODO: Could use public FactoryList here
>                            }
>
>                            if(sequence > tagHandlerFactories.size()) {
>                                sequence = tagHandlerFactories.size();
>                            }
>
>                            //TODO, need to account for TagHandlers vs.
> TagSerializers here
>                            tagHandlerFactories.add(sequence, factory);
>                        }
>                }
>
>        - Allow multiple TagSerializers (make sure framework supports
> chaining serizliers). For example, in my application I'd like to add a
> serializer which writes some javascript (think Ajax event binding)
>            after
>
>        - The way the serializers are registered simply as the last handler
> is neat, but it may cause some trouble when developers extend the themes and
> iject their own handlers, perhaps
>            I like the chaining, so perhaps this should simply be accounted
> for carefully in the utiolity methods (such as the insertTagHandlerFactory()
> method i suggested above) and in the
>            renderTag() method of the DefaultTheme.
>
>        - DefaultTheme could probably be an abstract class and maybe called
> somehting like AbstractTheme or AbstractThemeSupport
>
>
> Incidentally, the reason I am looking into this is because I am starting to
> write a jQuery Ajax plugin (given the imminent deprecation of dojo, which I
> never really liked so much anyway - too large and clunky)
> I'm not sure how far I'll get on this, but I'm currently optimistic.
>
> Best,
> Eric
>
> On Wed, Feb 4, 2009 at 4:26 PM, James Holmes <james@jamesholmes.com> wrote:
>
>> I don't know if any plugging mechanism for themes has been discussed.
>> Please
>> send us your thoughts.
>>
>> On Wed, Feb 4, 2009 at 2:24 AM, Obinna <obinna@gmail.com> wrote:
>>
>> > Hi,
>> >
>> > I'd like to know if there's a 'recommended' way of extending the
>> > javatemplates theme.
>> > I've been using the default freemarker templates and have developed a few
>> > custom tag templates for some custom tags. I'm eager to port to
>> > javatemplates.
>> >
>> > I noticed that the SimpleTheme is 'hard-coded' in the JavaTemplateEngine
>> > like:
>> >
>> >  private Themes themes = new Themes() {{
>> >        add(new SimpleTheme());
>> >    }};
>> >
>> > which doesn't really allow for registering new themes. I can suggest a
>> > theme
>> > plugin/registry but wondered if it's already been considered. There
>> should
>> > also be a pluggable way of  adding Handlers to a theme.
>> >
>> >
>> > - Eric
>> >
>>
>



-- 
"Hey you! Would you help me to carry the stone?" Pink Floyd

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@struts.apache.org
For additional commands, e-mail: dev-help@struts.apache.org


Mime
View raw message