You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Eric Chijioke (JIRA)" <ji...@apache.org> on 2009/02/23 22:39:47 UTC

[jira] Created: (WW-3009) Extensibility Improvements to javatemplates plugin - patch (project scope)

Extensibility Improvements to javatemplates plugin - patch (project scope)
--------------------------------------------------------------------------

                 Key: WW-3009
                 URL: https://issues.apache.org/struts/browse/WW-3009
             Project: Struts 2
          Issue Type: Improvement
          Components: Plugin - Tags
    Affects Versions: 2.1.6
            Reporter: Eric Chijioke


Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(working copy)
@@ -20,16 +20,19 @@
  */
 package org.apache.struts2.views.java;
 
+import java.util.LinkedHashMap;
+
 import com.opensymphony.xwork2.util.TextUtils;
 
-import java.util.LinkedHashMap;
 
 /**
  * Map of tag attributes, used for rendering the tags
  */
 public class Attributes extends LinkedHashMap<String, String> {
 
-    public Attributes add(String key, String value) {
+	private static final long serialVersionUID = 4103241472140545630L;
+
+	public Attributes add(String key, String value) {
         return add(key, value, true);
     }
 
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(working copy)
@@ -26,6 +26,7 @@
 /**
  * Default implementation of TagHandlerFactory 
  */
+@SuppressWarnings("unchecked")
 public class DefaultTagHandlerFactory implements TagHandlerFactory {
    private static final Logger LOG = LoggerFactory.getLogger(DefaultTagHandlerFactory.class);
           
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(working copy)
@@ -20,14 +20,14 @@
  */
 package org.apache.struts2.views.java;
 
-import org.apache.struts2.StrutsException;
-import org.apache.struts2.components.template.TemplateRenderingContext;
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.struts2.StrutsException;
+import org.apache.struts2.components.template.TemplateRenderingContext;
+
 import com.opensymphony.xwork2.util.logging.Logger;
 import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
@@ -38,7 +38,7 @@
     private static final Logger LOG = LoggerFactory.getLogger(DefaultTheme.class);
 
     private String name;
-    private Map<String, List<TagHandlerFactory>> handlerFactories;
+    protected Map<String, List<TagHandlerFactory>> handlerFactories;
 
     protected void setName(String name) {
         this.name = name;
@@ -48,6 +48,45 @@
         this.handlerFactories = handlers;
     }
 
+    /**
+     * 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);
+    	}
+    }
+
     public String getName() {
         return name;
     }
@@ -70,7 +109,7 @@
             handlers.add(0, prev);
         }
 
-        TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
+        //TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
 
         TagGenerator gen = (TagGenerator) handlers.get(0);
         try {
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(working copy)
@@ -20,19 +20,27 @@
  */
 package org.apache.struts2.views.java;
 
+import java.util.HashMap;
+import java.util.StringTokenizer;
+
 import org.apache.struts2.StrutsException;
 import org.apache.struts2.components.template.BaseTemplateEngine;
 import org.apache.struts2.components.template.Template;
 import org.apache.struts2.components.template.TemplateRenderingContext;
 import org.apache.struts2.views.java.simple.SimpleTheme;
 
-import java.util.HashMap;
+import com.opensymphony.xwork2.inject.Inject;
+import com.opensymphony.xwork2.util.ClassLoaderUtil;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
 
 /**
  * Template engine that renders tags using java implementations
  */
 public class JavaTemplateEngine extends BaseTemplateEngine {
 
+    private static final Logger LOG = LoggerFactory.getLogger(JavaTemplateEngine.class);
+    
     private Themes themes = new Themes() {{
         add(new SimpleTheme());
     }};
@@ -63,5 +71,35 @@
             return themes.get(name);
         }
     }
+    
+    /**
+     * 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)
+    @Inject("struts.javatemplates.customThemes")
+    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");
+            }
+        }
+    }
 }
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(working copy)
@@ -20,10 +20,10 @@
  */
 package org.apache.struts2.views.java;
 
+import java.io.IOException;
+
 import org.apache.struts2.components.template.TemplateRenderingContext;
 
-import java.io.IOException;
-
 public interface TagHandler {
 
     void setNext(TagHandler next);
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(working copy)
@@ -20,18 +20,19 @@
  */
 package org.apache.struts2.views.java;
 
-import com.opensymphony.xwork2.util.TextUtils;
-import org.apache.struts2.components.template.TemplateRenderingContext;
-
 import java.io.IOException;
 import java.io.Writer;
 
+import org.apache.struts2.components.template.TemplateRenderingContext;
+
+import com.opensymphony.xwork2.util.TextUtils;
+
 /**
  * Write tags as XHTML
  */
 public class XHTMLTagSerializer implements TagSerializer {
 
-    private Writer writer;
+    protected Writer writer;
 
     public void characters(String text) throws IOException {
         characters(text, true);
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id: AbstractTagHandler.java 726340 2008-12-14 02:45:05Z musachy $
+ * $Id: AbstractMessageListHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
+ * $Id: ActionErrorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
+ * $Id: AnchorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id: CommonAttributesHandler.java 726340 2008-12-14 02:45:05Z musachy $
+ * $Id: DivHandler.java,v 1.1 2009/02/09 07:18:10 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -35,7 +35,7 @@
                 .addIfExists("class", params.get("cssClass"))
                 .addIfExists("style", params.get("cssStyle"))
                 .addIfExists("title", params.get("title"));
-        start("div", attrs);
+        super.start("div", attrs);
     }
 
     public static class CloseHandler extends AbstractTagHandler implements TagGenerator {
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: FieldErrorHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: FileHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: HeadHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -32,14 +32,17 @@
 public class HeadHandler extends AbstractTagHandler implements TagGenerator {
 
     public void generate() throws IOException {
-        Map<String, Object> params = context.getParameters();
-        Attributes attrs = new Attributes();
+        
+    	Map<String, Object> params = context.getParameters();
+        
+    	Attributes attrs = new Attributes();
         attrs.put("type", "text/javascript");
 
         String base = ServletActionContext.getRequest().getContextPath();
+        attrs.put("base", base);
+        
         StringBuilder sb = new StringBuilder();
-        if (base != null)
-            sb.append(base);
+        if (base != null) {  sb.append(base); }
         sb.append("/struts/utils.js");
         attrs.put("src", sb.toString());
 
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: HiddenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: LabelHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: PasswordHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: ResetHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(working copy)
@@ -76,10 +76,10 @@
 
                 //key
                 Object itemKey = findValue(listKey != null ? listKey : "top");
-                String itemKeyStr = TextUtils.noNull(itemKey.toString());
+                String itemKeyStr = TextUtils.noNull(itemKey == null ? null : itemKey.toString());
                 //value
                 Object itemValue = findValue(listValue != null ? listValue : "top");
-                String itemValueStr = TextUtils.noNull(itemValue.toString());
+                String itemValueStr = TextUtils.noNull(itemValue == null ? null : itemValue.toString());
 
                 boolean selected = ContainUtil.contains(value, itemKey);
                 writeOption(itemKeyStr, itemValueStr, selected);
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(working copy)
@@ -20,19 +20,25 @@
  */
 package org.apache.struts2.views.java.simple;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
 import org.apache.struts2.views.java.DefaultTagHandlerFactory;
 import org.apache.struts2.views.java.DefaultTheme;
 import org.apache.struts2.views.java.TagHandlerFactory;
 import org.apache.struts2.views.java.XHTMLTagSerializer;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
+@SuppressWarnings("unchecked")
 public class SimpleTheme extends DefaultTheme {
+	
+    @SuppressWarnings("serial")
+	public SimpleTheme() {
+    	
+        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {
+			
 
-    public SimpleTheme() {
-        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {{
+		{
             put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
             put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
             put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
@@ -60,9 +66,13 @@
         }});
         setName("simple");
     }
+    
+    @SuppressWarnings("unchecked")
+    public class FactoryList extends ArrayList<TagHandlerFactory> {
+    	
+    	private static final long serialVersionUID = -1551895041394434032L;
 
-    private class FactoryList extends ArrayList<TagHandlerFactory> {
-        public FactoryList(Class... classes) {
+    	public FactoryList(Class... classes) {
             super();
             for (Class cls : classes) {
                 add(new DefaultTagHandlerFactory(cls));
@@ -70,5 +80,4 @@
             add(new DefaultTagHandlerFactory(XHTMLTagSerializer.class));
         }
     }
-
 }
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: SubmitHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: TextAreaHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java
===================================================================
--- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(revision 731227)
+++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(working copy)
@@ -1,5 +1,5 @@
 /*
- * $Id$
+ * $Id: TokenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
  *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Resolved: (WW-3009) Extensibility Improvements to javatemplates plugin - patch (project scope)

Posted by "Rainer Hermanns (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/struts/browse/WW-3009?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rainer Hermanns resolved WW-3009.
---------------------------------

    Resolution: Fixed
      Assignee: Rainer Hermanns

Thanks for the patch, applied to trunk

> Extensibility Improvements to javatemplates plugin - patch (project scope)
> --------------------------------------------------------------------------
>
>                 Key: WW-3009
>                 URL: https://issues.apache.org/struts/browse/WW-3009
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Plugin - Tags
>    Affects Versions: 2.1.6
>            Reporter: Eric Chijioke
>            Assignee: Rainer Hermanns
>             Fix For: 2.1.7
>
>         Attachments: path-from-comment.patch
>
>
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(working copy)
> @@ -20,16 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.LinkedHashMap;
> +
>  import com.opensymphony.xwork2.util.TextUtils;
>  
> -import java.util.LinkedHashMap;
>  
>  /**
>   * Map of tag attributes, used for rendering the tags
>   */
>  public class Attributes extends LinkedHashMap<String, String> {
>  
> -    public Attributes add(String key, String value) {
> +	private static final long serialVersionUID = 4103241472140545630L;
> +
> +	public Attributes add(String key, String value) {
>          return add(key, value, true);
>      }
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(working copy)
> @@ -26,6 +26,7 @@
>  /**
>   * Default implementation of TagHandlerFactory 
>   */
> +@SuppressWarnings("unchecked")
>  public class DefaultTagHandlerFactory implements TagHandlerFactory {
>     private static final Logger LOG = LoggerFactory.getLogger(DefaultTagHandlerFactory.class);
>            
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(working copy)
> @@ -20,14 +20,14 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import org.apache.struts2.StrutsException;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.util.ArrayList;
>  import java.util.List;
>  import java.util.Map;
>  
> +import org.apache.struts2.StrutsException;
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
>  import com.opensymphony.xwork2.util.logging.Logger;
>  import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
> @@ -38,7 +38,7 @@
>      private static final Logger LOG = LoggerFactory.getLogger(DefaultTheme.class);
>  
>      private String name;
> -    private Map<String, List<TagHandlerFactory>> handlerFactories;
> +    protected Map<String, List<TagHandlerFactory>> handlerFactories;
>  
>      protected void setName(String name) {
>          this.name = name;
> @@ -48,6 +48,45 @@
>          this.handlerFactories = handlers;
>      }
>  
> +    /**
> +     * 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);
> +    	}
> +    }
> +
>      public String getName() {
>          return name;
>      }
> @@ -70,7 +109,7 @@
>              handlers.add(0, prev);
>          }
>  
> -        TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
> +        //TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
>  
>          TagGenerator gen = (TagGenerator) handlers.get(0);
>          try {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(working copy)
> @@ -20,19 +20,27 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.HashMap;
> +import java.util.StringTokenizer;
> +
>  import org.apache.struts2.StrutsException;
>  import org.apache.struts2.components.template.BaseTemplateEngine;
>  import org.apache.struts2.components.template.Template;
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  import org.apache.struts2.views.java.simple.SimpleTheme;
>  
> -import java.util.HashMap;
> +import com.opensymphony.xwork2.inject.Inject;
> +import com.opensymphony.xwork2.util.ClassLoaderUtil;
> +import com.opensymphony.xwork2.util.logging.Logger;
> +import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
>  /**
>   * Template engine that renders tags using java implementations
>   */
>  public class JavaTemplateEngine extends BaseTemplateEngine {
>  
> +    private static final Logger LOG = LoggerFactory.getLogger(JavaTemplateEngine.class);
> +    
>      private Themes themes = new Themes() {{
>          add(new SimpleTheme());
>      }};
> @@ -63,5 +71,35 @@
>              return themes.get(name);
>          }
>      }
> +    
> +    /**
> +     * 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)
> +    @Inject("struts.javatemplates.customThemes")
> +    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");
> +            }
> +        }
> +    }
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(working copy)
> @@ -20,10 +20,10 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.io.IOException;
> +
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  
> -import java.io.IOException;
> -
>  public interface TagHandler {
>  
>      void setNext(TagHandler next);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(working copy)
> @@ -20,18 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import com.opensymphony.xwork2.util.TextUtils;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.io.Writer;
>  
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
> +import com.opensymphony.xwork2.util.TextUtils;
> +
>  /**
>   * Write tags as XHTML
>   */
>  public class XHTMLTagSerializer implements TagSerializer {
>  
> -    private Writer writer;
> +    protected Writer writer;
>  
>      public void characters(String text) throws IOException {
>          characters(text, true);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: AbstractTagHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AbstractMessageListHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: ActionErrorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AnchorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: CommonAttributesHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: DivHandler.java,v 1.1 2009/02/09 07:18:10 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -35,7 +35,7 @@
>                  .addIfExists("class", params.get("cssClass"))
>                  .addIfExists("style", params.get("cssStyle"))
>                  .addIfExists("title", params.get("title"));
> -        start("div", attrs);
> +        super.start("div", attrs);
>      }
>  
>      public static class CloseHandler extends AbstractTagHandler implements TagGenerator {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FieldErrorHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FileHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HeadHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -32,14 +32,17 @@
>  public class HeadHandler extends AbstractTagHandler implements TagGenerator {
>  
>      public void generate() throws IOException {
> -        Map<String, Object> params = context.getParameters();
> -        Attributes attrs = new Attributes();
> +        
> +    	Map<String, Object> params = context.getParameters();
> +        
> +    	Attributes attrs = new Attributes();
>          attrs.put("type", "text/javascript");
>  
>          String base = ServletActionContext.getRequest().getContextPath();
> +        attrs.put("base", base);
> +        
>          StringBuilder sb = new StringBuilder();
> -        if (base != null)
> -            sb.append(base);
> +        if (base != null) {  sb.append(base); }
>          sb.append("/struts/utils.js");
>          attrs.put("src", sb.toString());
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HiddenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: LabelHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: PasswordHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: ResetHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(working copy)
> @@ -76,10 +76,10 @@
>  
>                  //key
>                  Object itemKey = findValue(listKey != null ? listKey : "top");
> -                String itemKeyStr = TextUtils.noNull(itemKey.toString());
> +                String itemKeyStr = TextUtils.noNull(itemKey == null ? null : itemKey.toString());
>                  //value
>                  Object itemValue = findValue(listValue != null ? listValue : "top");
> -                String itemValueStr = TextUtils.noNull(itemValue.toString());
> +                String itemValueStr = TextUtils.noNull(itemValue == null ? null : itemValue.toString());
>  
>                  boolean selected = ContainUtil.contains(value, itemKey);
>                  writeOption(itemKeyStr, itemValueStr, selected);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(working copy)
> @@ -20,19 +20,25 @@
>   */
>  package org.apache.struts2.views.java.simple;
>  
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +
>  import org.apache.struts2.views.java.DefaultTagHandlerFactory;
>  import org.apache.struts2.views.java.DefaultTheme;
>  import org.apache.struts2.views.java.TagHandlerFactory;
>  import org.apache.struts2.views.java.XHTMLTagSerializer;
>  
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.List;
> -
> +@SuppressWarnings("unchecked")
>  public class SimpleTheme extends DefaultTheme {
> +	
> +    @SuppressWarnings("serial")
> +	public SimpleTheme() {
> +    	
> +        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {
> +			
>  
> -    public SimpleTheme() {
> -        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {{
> +		{
>              put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
> @@ -60,9 +66,13 @@
>          }});
>          setName("simple");
>      }
> +    
> +    @SuppressWarnings("unchecked")
> +    public class FactoryList extends ArrayList<TagHandlerFactory> {
> +    	
> +    	private static final long serialVersionUID = -1551895041394434032L;
>  
> -    private class FactoryList extends ArrayList<TagHandlerFactory> {
> -        public FactoryList(Class... classes) {
> +    	public FactoryList(Class... classes) {
>              super();
>              for (Class cls : classes) {
>                  add(new DefaultTagHandlerFactory(cls));
> @@ -70,5 +80,4 @@
>              add(new DefaultTagHandlerFactory(XHTMLTagSerializer.class));
>          }
>      }
> -
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: SubmitHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TextAreaHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TokenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WW-3009) Extensibility Improvements to javatemplates plugin - patch (project scope)

Posted by "Musachy Barroso (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/struts/browse/WW-3009?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Musachy Barroso updated WW-3009:
--------------------------------

    Fix Version/s: 2.1.7

> Extensibility Improvements to javatemplates plugin - patch (project scope)
> --------------------------------------------------------------------------
>
>                 Key: WW-3009
>                 URL: https://issues.apache.org/struts/browse/WW-3009
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Plugin - Tags
>    Affects Versions: 2.1.6
>            Reporter: Eric Chijioke
>             Fix For: 2.1.7
>
>         Attachments: path-from-comment.patch
>
>
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(working copy)
> @@ -20,16 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.LinkedHashMap;
> +
>  import com.opensymphony.xwork2.util.TextUtils;
>  
> -import java.util.LinkedHashMap;
>  
>  /**
>   * Map of tag attributes, used for rendering the tags
>   */
>  public class Attributes extends LinkedHashMap<String, String> {
>  
> -    public Attributes add(String key, String value) {
> +	private static final long serialVersionUID = 4103241472140545630L;
> +
> +	public Attributes add(String key, String value) {
>          return add(key, value, true);
>      }
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(working copy)
> @@ -26,6 +26,7 @@
>  /**
>   * Default implementation of TagHandlerFactory 
>   */
> +@SuppressWarnings("unchecked")
>  public class DefaultTagHandlerFactory implements TagHandlerFactory {
>     private static final Logger LOG = LoggerFactory.getLogger(DefaultTagHandlerFactory.class);
>            
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(working copy)
> @@ -20,14 +20,14 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import org.apache.struts2.StrutsException;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.util.ArrayList;
>  import java.util.List;
>  import java.util.Map;
>  
> +import org.apache.struts2.StrutsException;
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
>  import com.opensymphony.xwork2.util.logging.Logger;
>  import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
> @@ -38,7 +38,7 @@
>      private static final Logger LOG = LoggerFactory.getLogger(DefaultTheme.class);
>  
>      private String name;
> -    private Map<String, List<TagHandlerFactory>> handlerFactories;
> +    protected Map<String, List<TagHandlerFactory>> handlerFactories;
>  
>      protected void setName(String name) {
>          this.name = name;
> @@ -48,6 +48,45 @@
>          this.handlerFactories = handlers;
>      }
>  
> +    /**
> +     * 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);
> +    	}
> +    }
> +
>      public String getName() {
>          return name;
>      }
> @@ -70,7 +109,7 @@
>              handlers.add(0, prev);
>          }
>  
> -        TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
> +        //TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
>  
>          TagGenerator gen = (TagGenerator) handlers.get(0);
>          try {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(working copy)
> @@ -20,19 +20,27 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.HashMap;
> +import java.util.StringTokenizer;
> +
>  import org.apache.struts2.StrutsException;
>  import org.apache.struts2.components.template.BaseTemplateEngine;
>  import org.apache.struts2.components.template.Template;
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  import org.apache.struts2.views.java.simple.SimpleTheme;
>  
> -import java.util.HashMap;
> +import com.opensymphony.xwork2.inject.Inject;
> +import com.opensymphony.xwork2.util.ClassLoaderUtil;
> +import com.opensymphony.xwork2.util.logging.Logger;
> +import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
>  /**
>   * Template engine that renders tags using java implementations
>   */
>  public class JavaTemplateEngine extends BaseTemplateEngine {
>  
> +    private static final Logger LOG = LoggerFactory.getLogger(JavaTemplateEngine.class);
> +    
>      private Themes themes = new Themes() {{
>          add(new SimpleTheme());
>      }};
> @@ -63,5 +71,35 @@
>              return themes.get(name);
>          }
>      }
> +    
> +    /**
> +     * 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)
> +    @Inject("struts.javatemplates.customThemes")
> +    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");
> +            }
> +        }
> +    }
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(working copy)
> @@ -20,10 +20,10 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.io.IOException;
> +
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  
> -import java.io.IOException;
> -
>  public interface TagHandler {
>  
>      void setNext(TagHandler next);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(working copy)
> @@ -20,18 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import com.opensymphony.xwork2.util.TextUtils;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.io.Writer;
>  
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
> +import com.opensymphony.xwork2.util.TextUtils;
> +
>  /**
>   * Write tags as XHTML
>   */
>  public class XHTMLTagSerializer implements TagSerializer {
>  
> -    private Writer writer;
> +    protected Writer writer;
>  
>      public void characters(String text) throws IOException {
>          characters(text, true);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: AbstractTagHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AbstractMessageListHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: ActionErrorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AnchorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: CommonAttributesHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: DivHandler.java,v 1.1 2009/02/09 07:18:10 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -35,7 +35,7 @@
>                  .addIfExists("class", params.get("cssClass"))
>                  .addIfExists("style", params.get("cssStyle"))
>                  .addIfExists("title", params.get("title"));
> -        start("div", attrs);
> +        super.start("div", attrs);
>      }
>  
>      public static class CloseHandler extends AbstractTagHandler implements TagGenerator {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FieldErrorHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FileHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HeadHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -32,14 +32,17 @@
>  public class HeadHandler extends AbstractTagHandler implements TagGenerator {
>  
>      public void generate() throws IOException {
> -        Map<String, Object> params = context.getParameters();
> -        Attributes attrs = new Attributes();
> +        
> +    	Map<String, Object> params = context.getParameters();
> +        
> +    	Attributes attrs = new Attributes();
>          attrs.put("type", "text/javascript");
>  
>          String base = ServletActionContext.getRequest().getContextPath();
> +        attrs.put("base", base);
> +        
>          StringBuilder sb = new StringBuilder();
> -        if (base != null)
> -            sb.append(base);
> +        if (base != null) {  sb.append(base); }
>          sb.append("/struts/utils.js");
>          attrs.put("src", sb.toString());
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HiddenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: LabelHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: PasswordHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: ResetHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(working copy)
> @@ -76,10 +76,10 @@
>  
>                  //key
>                  Object itemKey = findValue(listKey != null ? listKey : "top");
> -                String itemKeyStr = TextUtils.noNull(itemKey.toString());
> +                String itemKeyStr = TextUtils.noNull(itemKey == null ? null : itemKey.toString());
>                  //value
>                  Object itemValue = findValue(listValue != null ? listValue : "top");
> -                String itemValueStr = TextUtils.noNull(itemValue.toString());
> +                String itemValueStr = TextUtils.noNull(itemValue == null ? null : itemValue.toString());
>  
>                  boolean selected = ContainUtil.contains(value, itemKey);
>                  writeOption(itemKeyStr, itemValueStr, selected);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(working copy)
> @@ -20,19 +20,25 @@
>   */
>  package org.apache.struts2.views.java.simple;
>  
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +
>  import org.apache.struts2.views.java.DefaultTagHandlerFactory;
>  import org.apache.struts2.views.java.DefaultTheme;
>  import org.apache.struts2.views.java.TagHandlerFactory;
>  import org.apache.struts2.views.java.XHTMLTagSerializer;
>  
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.List;
> -
> +@SuppressWarnings("unchecked")
>  public class SimpleTheme extends DefaultTheme {
> +	
> +    @SuppressWarnings("serial")
> +	public SimpleTheme() {
> +    	
> +        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {
> +			
>  
> -    public SimpleTheme() {
> -        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {{
> +		{
>              put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
> @@ -60,9 +66,13 @@
>          }});
>          setName("simple");
>      }
> +    
> +    @SuppressWarnings("unchecked")
> +    public class FactoryList extends ArrayList<TagHandlerFactory> {
> +    	
> +    	private static final long serialVersionUID = -1551895041394434032L;
>  
> -    private class FactoryList extends ArrayList<TagHandlerFactory> {
> -        public FactoryList(Class... classes) {
> +    	public FactoryList(Class... classes) {
>              super();
>              for (Class cls : classes) {
>                  add(new DefaultTagHandlerFactory(cls));
> @@ -70,5 +80,4 @@
>              add(new DefaultTagHandlerFactory(XHTMLTagSerializer.class));
>          }
>      }
> -
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: SubmitHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TextAreaHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TokenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Commented: (WW-3009) Extensibility Improvements to javatemplates plugin - patch (project scope)

Posted by "Eric Chijioke (JIRA)" <ji...@apache.org>.
    [ https://issues.apache.org/struts/browse/WW-3009?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=46100#action_46100 ] 

Eric Chijioke commented on WW-3009:
-----------------------------------

Fantastic! Thanks for this!

2009/4/22 Rainer Hermanns (JIRA) <ji...@apache.org>



> Extensibility Improvements to javatemplates plugin - patch (project scope)
> --------------------------------------------------------------------------
>
>                 Key: WW-3009
>                 URL: https://issues.apache.org/struts/browse/WW-3009
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Plugin - Tags
>    Affects Versions: 2.1.6
>            Reporter: Eric Chijioke
>            Assignee: Rainer Hermanns
>             Fix For: 2.1.7
>
>         Attachments: path-from-comment.patch
>
>
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(working copy)
> @@ -20,16 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.LinkedHashMap;
> +
>  import com.opensymphony.xwork2.util.TextUtils;
>  
> -import java.util.LinkedHashMap;
>  
>  /**
>   * Map of tag attributes, used for rendering the tags
>   */
>  public class Attributes extends LinkedHashMap<String, String> {
>  
> -    public Attributes add(String key, String value) {
> +	private static final long serialVersionUID = 4103241472140545630L;
> +
> +	public Attributes add(String key, String value) {
>          return add(key, value, true);
>      }
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(working copy)
> @@ -26,6 +26,7 @@
>  /**
>   * Default implementation of TagHandlerFactory 
>   */
> +@SuppressWarnings("unchecked")
>  public class DefaultTagHandlerFactory implements TagHandlerFactory {
>     private static final Logger LOG = LoggerFactory.getLogger(DefaultTagHandlerFactory.class);
>            
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(working copy)
> @@ -20,14 +20,14 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import org.apache.struts2.StrutsException;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.util.ArrayList;
>  import java.util.List;
>  import java.util.Map;
>  
> +import org.apache.struts2.StrutsException;
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
>  import com.opensymphony.xwork2.util.logging.Logger;
>  import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
> @@ -38,7 +38,7 @@
>      private static final Logger LOG = LoggerFactory.getLogger(DefaultTheme.class);
>  
>      private String name;
> -    private Map<String, List<TagHandlerFactory>> handlerFactories;
> +    protected Map<String, List<TagHandlerFactory>> handlerFactories;
>  
>      protected void setName(String name) {
>          this.name = name;
> @@ -48,6 +48,45 @@
>          this.handlerFactories = handlers;
>      }
>  
> +    /**
> +     * 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);
> +    	}
> +    }
> +
>      public String getName() {
>          return name;
>      }
> @@ -70,7 +109,7 @@
>              handlers.add(0, prev);
>          }
>  
> -        TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
> +        //TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
>  
>          TagGenerator gen = (TagGenerator) handlers.get(0);
>          try {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(working copy)
> @@ -20,19 +20,27 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.HashMap;
> +import java.util.StringTokenizer;
> +
>  import org.apache.struts2.StrutsException;
>  import org.apache.struts2.components.template.BaseTemplateEngine;
>  import org.apache.struts2.components.template.Template;
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  import org.apache.struts2.views.java.simple.SimpleTheme;
>  
> -import java.util.HashMap;
> +import com.opensymphony.xwork2.inject.Inject;
> +import com.opensymphony.xwork2.util.ClassLoaderUtil;
> +import com.opensymphony.xwork2.util.logging.Logger;
> +import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
>  /**
>   * Template engine that renders tags using java implementations
>   */
>  public class JavaTemplateEngine extends BaseTemplateEngine {
>  
> +    private static final Logger LOG = LoggerFactory.getLogger(JavaTemplateEngine.class);
> +    
>      private Themes themes = new Themes() {{
>          add(new SimpleTheme());
>      }};
> @@ -63,5 +71,35 @@
>              return themes.get(name);
>          }
>      }
> +    
> +    /**
> +     * 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)
> +    @Inject("struts.javatemplates.customThemes")
> +    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");
> +            }
> +        }
> +    }
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(working copy)
> @@ -20,10 +20,10 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.io.IOException;
> +
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  
> -import java.io.IOException;
> -
>  public interface TagHandler {
>  
>      void setNext(TagHandler next);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(working copy)
> @@ -20,18 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import com.opensymphony.xwork2.util.TextUtils;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.io.Writer;
>  
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
> +import com.opensymphony.xwork2.util.TextUtils;
> +
>  /**
>   * Write tags as XHTML
>   */
>  public class XHTMLTagSerializer implements TagSerializer {
>  
> -    private Writer writer;
> +    protected Writer writer;
>  
>      public void characters(String text) throws IOException {
>          characters(text, true);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: AbstractTagHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AbstractMessageListHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: ActionErrorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AnchorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: CommonAttributesHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: DivHandler.java,v 1.1 2009/02/09 07:18:10 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -35,7 +35,7 @@
>                  .addIfExists("class", params.get("cssClass"))
>                  .addIfExists("style", params.get("cssStyle"))
>                  .addIfExists("title", params.get("title"));
> -        start("div", attrs);
> +        super.start("div", attrs);
>      }
>  
>      public static class CloseHandler extends AbstractTagHandler implements TagGenerator {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FieldErrorHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FileHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HeadHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -32,14 +32,17 @@
>  public class HeadHandler extends AbstractTagHandler implements TagGenerator {
>  
>      public void generate() throws IOException {
> -        Map<String, Object> params = context.getParameters();
> -        Attributes attrs = new Attributes();
> +        
> +    	Map<String, Object> params = context.getParameters();
> +        
> +    	Attributes attrs = new Attributes();
>          attrs.put("type", "text/javascript");
>  
>          String base = ServletActionContext.getRequest().getContextPath();
> +        attrs.put("base", base);
> +        
>          StringBuilder sb = new StringBuilder();
> -        if (base != null)
> -            sb.append(base);
> +        if (base != null) {  sb.append(base); }
>          sb.append("/struts/utils.js");
>          attrs.put("src", sb.toString());
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HiddenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: LabelHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: PasswordHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: ResetHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(working copy)
> @@ -76,10 +76,10 @@
>  
>                  //key
>                  Object itemKey = findValue(listKey != null ? listKey : "top");
> -                String itemKeyStr = TextUtils.noNull(itemKey.toString());
> +                String itemKeyStr = TextUtils.noNull(itemKey == null ? null : itemKey.toString());
>                  //value
>                  Object itemValue = findValue(listValue != null ? listValue : "top");
> -                String itemValueStr = TextUtils.noNull(itemValue.toString());
> +                String itemValueStr = TextUtils.noNull(itemValue == null ? null : itemValue.toString());
>  
>                  boolean selected = ContainUtil.contains(value, itemKey);
>                  writeOption(itemKeyStr, itemValueStr, selected);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(working copy)
> @@ -20,19 +20,25 @@
>   */
>  package org.apache.struts2.views.java.simple;
>  
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +
>  import org.apache.struts2.views.java.DefaultTagHandlerFactory;
>  import org.apache.struts2.views.java.DefaultTheme;
>  import org.apache.struts2.views.java.TagHandlerFactory;
>  import org.apache.struts2.views.java.XHTMLTagSerializer;
>  
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.List;
> -
> +@SuppressWarnings("unchecked")
>  public class SimpleTheme extends DefaultTheme {
> +	
> +    @SuppressWarnings("serial")
> +	public SimpleTheme() {
> +    	
> +        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {
> +			
>  
> -    public SimpleTheme() {
> -        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {{
> +		{
>              put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
> @@ -60,9 +66,13 @@
>          }});
>          setName("simple");
>      }
> +    
> +    @SuppressWarnings("unchecked")
> +    public class FactoryList extends ArrayList<TagHandlerFactory> {
> +    	
> +    	private static final long serialVersionUID = -1551895041394434032L;
>  
> -    private class FactoryList extends ArrayList<TagHandlerFactory> {
> -        public FactoryList(Class... classes) {
> +    	public FactoryList(Class... classes) {
>              super();
>              for (Class cls : classes) {
>                  add(new DefaultTagHandlerFactory(cls));
> @@ -70,5 +80,4 @@
>              add(new DefaultTagHandlerFactory(XHTMLTagSerializer.class));
>          }
>      }
> -
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: SubmitHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TextAreaHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TokenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


[jira] Updated: (WW-3009) Extensibility Improvements to javatemplates plugin - patch (project scope)

Posted by "Dave Newton (JIRA)" <ji...@apache.org>.
     [ https://issues.apache.org/struts/browse/WW-3009?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Dave Newton updated WW-3009:
----------------------------

    Attachment: path-from-comment.patch

Attached comment as text file.

> Extensibility Improvements to javatemplates plugin - patch (project scope)
> --------------------------------------------------------------------------
>
>                 Key: WW-3009
>                 URL: https://issues.apache.org/struts/browse/WW-3009
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Plugin - Tags
>    Affects Versions: 2.1.6
>            Reporter: Eric Chijioke
>         Attachments: path-from-comment.patch
>
>
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java	(working copy)
> @@ -20,16 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.LinkedHashMap;
> +
>  import com.opensymphony.xwork2.util.TextUtils;
>  
> -import java.util.LinkedHashMap;
>  
>  /**
>   * Map of tag attributes, used for rendering the tags
>   */
>  public class Attributes extends LinkedHashMap<String, String> {
>  
> -    public Attributes add(String key, String value) {
> +	private static final long serialVersionUID = 4103241472140545630L;
> +
> +	public Attributes add(String key, String value) {
>          return add(key, value, true);
>      }
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java	(working copy)
> @@ -26,6 +26,7 @@
>  /**
>   * Default implementation of TagHandlerFactory 
>   */
> +@SuppressWarnings("unchecked")
>  public class DefaultTagHandlerFactory implements TagHandlerFactory {
>     private static final Logger LOG = LoggerFactory.getLogger(DefaultTagHandlerFactory.class);
>            
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java	(working copy)
> @@ -20,14 +20,14 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import org.apache.struts2.StrutsException;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.util.ArrayList;
>  import java.util.List;
>  import java.util.Map;
>  
> +import org.apache.struts2.StrutsException;
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
>  import com.opensymphony.xwork2.util.logging.Logger;
>  import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
> @@ -38,7 +38,7 @@
>      private static final Logger LOG = LoggerFactory.getLogger(DefaultTheme.class);
>  
>      private String name;
> -    private Map<String, List<TagHandlerFactory>> handlerFactories;
> +    protected Map<String, List<TagHandlerFactory>> handlerFactories;
>  
>      protected void setName(String name) {
>          this.name = name;
> @@ -48,6 +48,45 @@
>          this.handlerFactories = handlers;
>      }
>  
> +    /**
> +     * 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);
> +    	}
> +    }
> +
>      public String getName() {
>          return name;
>      }
> @@ -70,7 +109,7 @@
>              handlers.add(0, prev);
>          }
>  
> -        TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
> +        //TagSerializer ser = (TagSerializer) handlers.get(handlers.size() - 1);
>  
>          TagGenerator gen = (TagGenerator) handlers.get(0);
>          try {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java	(working copy)
> @@ -20,19 +20,27 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.util.HashMap;
> +import java.util.StringTokenizer;
> +
>  import org.apache.struts2.StrutsException;
>  import org.apache.struts2.components.template.BaseTemplateEngine;
>  import org.apache.struts2.components.template.Template;
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  import org.apache.struts2.views.java.simple.SimpleTheme;
>  
> -import java.util.HashMap;
> +import com.opensymphony.xwork2.inject.Inject;
> +import com.opensymphony.xwork2.util.ClassLoaderUtil;
> +import com.opensymphony.xwork2.util.logging.Logger;
> +import com.opensymphony.xwork2.util.logging.LoggerFactory;
>  
>  /**
>   * Template engine that renders tags using java implementations
>   */
>  public class JavaTemplateEngine extends BaseTemplateEngine {
>  
> +    private static final Logger LOG = LoggerFactory.getLogger(JavaTemplateEngine.class);
> +    
>      private Themes themes = new Themes() {{
>          add(new SimpleTheme());
>      }};
> @@ -63,5 +71,35 @@
>              return themes.get(name);
>          }
>      }
> +    
> +    /**
> +     * 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)
> +    @Inject("struts.javatemplates.customThemes")
> +    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");
> +            }
> +        }
> +    }
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/TagHandler.java	(working copy)
> @@ -20,10 +20,10 @@
>   */
>  package org.apache.struts2.views.java;
>  
> +import java.io.IOException;
> +
>  import org.apache.struts2.components.template.TemplateRenderingContext;
>  
> -import java.io.IOException;
> -
>  public interface TagHandler {
>  
>      void setNext(TagHandler next);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java	(working copy)
> @@ -20,18 +20,19 @@
>   */
>  package org.apache.struts2.views.java;
>  
> -import com.opensymphony.xwork2.util.TextUtils;
> -import org.apache.struts2.components.template.TemplateRenderingContext;
> -
>  import java.io.IOException;
>  import java.io.Writer;
>  
> +import org.apache.struts2.components.template.TemplateRenderingContext;
> +
> +import com.opensymphony.xwork2.util.TextUtils;
> +
>  /**
>   * Write tags as XHTML
>   */
>  public class XHTMLTagSerializer implements TagSerializer {
>  
> -    private Writer writer;
> +    protected Writer writer;
>  
>      public void characters(String text) throws IOException {
>          characters(text, true);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AbstractMessageListHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: AbstractTagHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AbstractMessageListHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ActionErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: ActionErrorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: SelectHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: AnchorHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id: CommonAttributesHandler.java 726340 2008-12-14 02:45:05Z musachy $
> + * $Id: DivHandler.java,v 1.1 2009/02/09 07:18:10 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -35,7 +35,7 @@
>                  .addIfExists("class", params.get("cssClass"))
>                  .addIfExists("style", params.get("cssStyle"))
>                  .addIfExists("title", params.get("title"));
> -        start("div", attrs);
> +        super.start("div", attrs);
>      }
>  
>      public static class CloseHandler extends AbstractTagHandler implements TagGenerator {
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FieldErrorHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FieldErrorHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/FileHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: FileHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HeadHandler.java,v 1.1 2009/02/09 07:18:13 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> @@ -32,14 +32,17 @@
>  public class HeadHandler extends AbstractTagHandler implements TagGenerator {
>  
>      public void generate() throws IOException {
> -        Map<String, Object> params = context.getParameters();
> -        Attributes attrs = new Attributes();
> +        
> +    	Map<String, Object> params = context.getParameters();
> +        
> +    	Attributes attrs = new Attributes();
>          attrs.put("type", "text/javascript");
>  
>          String base = ServletActionContext.getRequest().getContextPath();
> +        attrs.put("base", base);
> +        
>          StringBuilder sb = new StringBuilder();
> -        if (base != null)
> -            sb.append(base);
> +        if (base != null) {  sb.append(base); }
>          sb.append("/struts/utils.js");
>          attrs.put("src", sb.toString());
>  
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HiddenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: HiddenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/LabelHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: LabelHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/PasswordHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: PasswordHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/ResetHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: ResetHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java	(working copy)
> @@ -76,10 +76,10 @@
>  
>                  //key
>                  Object itemKey = findValue(listKey != null ? listKey : "top");
> -                String itemKeyStr = TextUtils.noNull(itemKey.toString());
> +                String itemKeyStr = TextUtils.noNull(itemKey == null ? null : itemKey.toString());
>                  //value
>                  Object itemValue = findValue(listValue != null ? listValue : "top");
> -                String itemValueStr = TextUtils.noNull(itemValue.toString());
> +                String itemValueStr = TextUtils.noNull(itemValue == null ? null : itemValue.toString());
>  
>                  boolean selected = ContainUtil.contains(value, itemKey);
>                  writeOption(itemKeyStr, itemValueStr, selected);
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java	(working copy)
> @@ -20,19 +20,25 @@
>   */
>  package org.apache.struts2.views.java.simple;
>  
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.List;
> +
>  import org.apache.struts2.views.java.DefaultTagHandlerFactory;
>  import org.apache.struts2.views.java.DefaultTheme;
>  import org.apache.struts2.views.java.TagHandlerFactory;
>  import org.apache.struts2.views.java.XHTMLTagSerializer;
>  
> -import java.util.ArrayList;
> -import java.util.HashMap;
> -import java.util.List;
> -
> +@SuppressWarnings("unchecked")
>  public class SimpleTheme extends DefaultTheme {
> +	
> +    @SuppressWarnings("serial")
> +	public SimpleTheme() {
> +    	
> +        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {
> +			
>  
> -    public SimpleTheme() {
> -        setHandlerFactories(new HashMap<String, List<TagHandlerFactory>>() {{
> +		{
>              put("text", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("textfield", new FactoryList(TextFieldHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
>              put("select", new FactoryList(SelectHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
> @@ -60,9 +66,13 @@
>          }});
>          setName("simple");
>      }
> +    
> +    @SuppressWarnings("unchecked")
> +    public class FactoryList extends ArrayList<TagHandlerFactory> {
> +    	
> +    	private static final long serialVersionUID = -1551895041394434032L;
>  
> -    private class FactoryList extends ArrayList<TagHandlerFactory> {
> -        public FactoryList(Class... classes) {
> +    	public FactoryList(Class... classes) {
>              super();
>              for (Class cls : classes) {
>                  add(new DefaultTagHandlerFactory(cls));
> @@ -70,5 +80,4 @@
>              add(new DefaultTagHandlerFactory(XHTMLTagSerializer.class));
>          }
>      }
> -
>  }
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: SubmitHandler.java,v 1.1 2009/02/09 07:18:12 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TextAreaHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TextAreaHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file
> Index: plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java
> ===================================================================
> --- plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(revision 731227)
> +++ plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/TokenHandler.java	(working copy)
> @@ -1,5 +1,5 @@
>  /*
> - * $Id$
> + * $Id: TokenHandler.java,v 1.1 2009/02/09 07:18:11 echijioke Exp $
>   *
>   * Licensed to the Apache Software Foundation (ASF) under one
>   * or more contributor license agreements.  See the NOTICE file

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.