On Wed, Feb 4, 2009 at 4:45 PM, Musachy Barroso <musa...@gmail.com> wrote: > 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.
JQuery/MooTools/Prototype/.. + external S2 libraries added via the head tag, to the rescue ! ;-) Other than that, I agree: a nice extension tutorial for extending or overriding the Java templates would be a good idea. Phil > > musachy > > On Wed, Feb 4, 2009 at 10:30 AM, Obinna <obi...@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 <ja...@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 <obi...@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-unsubscr...@struts.apache.org > For additional commands, e-mail: dev-h...@struts.apache.org > > -- "We cannot change the cards we are dealt, just how we play the hand." - Randy Pausch --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@struts.apache.org For additional commands, e-mail: dev-h...@struts.apache.org