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.