You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by he...@apache.org on 2009/04/22 15:37:01 UTC
svn commit: r767518 - in /struts/struts2/trunk/plugins/javatemplates/src:
main/java/org/apache/struts2/views/java/
main/java/org/apache/struts2/views/java/simple/
test/java/org/apache/struts2/views/java/simple/
Author: hermanns
Date: Wed Apr 22 13:37:01 2009
New Revision: 767518
URL: http://svn.apache.org/viewvc?rev=767518&view=rev
Log:
WW-3009 Extensibility Improvements to javatemplates plugin - patch (project scope)
submitted by Eric Chijioke
Modified:
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
struts/struts2/trunk/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HeadTest.java
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/Attributes.java Wed Apr 22 13:37:01 2009
@@ -30,6 +30,8 @@
*/
public class Attributes extends LinkedHashMap<String, String> {
+ private static final long serialVersionUID = 4103241472140545630L;
+
public Attributes add(String key, String value) {
return add(key, value, true);
}
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTheme.java Wed Apr 22 13:37:01 2009
@@ -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,47 @@
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 +111,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 {
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java Wed Apr 22 13:37:01 2009
@@ -27,12 +27,20 @@
import org.apache.struts2.views.java.simple.SimpleTheme;
import java.util.HashMap;
+import java.util.StringTokenizer;
+
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.ClassLoaderUtil;
+import com.opensymphony.xwork2.inject.Inject;
/**
* 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());
}};
@@ -64,4 +72,34 @@
}
}
+ /**
+ * 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("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");
+ }
+ }
+ }
}
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/XHTMLTagSerializer.java Wed Apr 22 13:37:01 2009
@@ -32,7 +32,7 @@
*/
public class XHTMLTagSerializer implements TagSerializer {
- private Writer writer;
+ protected Writer writer;
public void characters(String text) throws IOException {
characters(text, true);
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/DivHandler.java Wed Apr 22 13:37:01 2009
@@ -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 {
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/HeadHandler.java Wed Apr 22 13:37:01 2009
@@ -37,9 +37,13 @@
attrs.put("type", "text/javascript");
String base = ServletActionContext.getRequest().getContextPath();
+ attrs.put("base", base);
+
StringBuilder sb = new StringBuilder();
- if (base != null)
+ if (base != null) {
sb.append(base);
+ }
+
sb.append("/struts/utils.js");
attrs.put("src", sb.toString());
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SelectHandler.java Wed Apr 22 13:37:01 2009
@@ -76,10 +76,10 @@
//key
Object itemKey = findValue(listKey != null ? listKey : "top");
- String itemKeyStr = StringUtils.defaultString(itemKey.toString());
+ String itemKeyStr = StringUtils.defaultString(itemKey == null ? null : itemKey.toString());
//value
Object itemValue = findValue(listValue != null ? listValue : "top");
- String itemValueStr = StringUtils.defaultString(itemValue.toString());
+ String itemValueStr = StringUtils.defaultString(itemValue == null ? null : itemValue.toString());
boolean selected = ContainUtil.contains(value, itemKey);
writeOption(itemKeyStr, itemValueStr, selected);
Modified: struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java Wed Apr 22 13:37:01 2009
@@ -32,36 +32,41 @@
public class SimpleTheme extends DefaultTheme {
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));
- put("form", new FactoryList(FormHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("form-close", new FactoryList(FormHandler.CloseHandler.class));
- put("a", new FactoryList(AnchorHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("a-close", new FactoryList(AnchorHandler.CloseHandler.class));
- put("checkbox", new FactoryList(CheckboxHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("file", new FactoryList(FileHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("password", new FactoryList(PasswordHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("label", new FactoryList(LabelHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("reset", new FactoryList(ResetHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("submit", new FactoryList(SubmitHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("submit-close", new FactoryList(SubmitHandler.CloseHandler.class));
- put("textarea", new FactoryList(TextAreaHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("actionerror", new FactoryList(ActionErrorHandler.class));
- put("token", new FactoryList(TokenHandler.class));
- put("actionmessage", new FactoryList(ActionMessageHandler.class));
- put("head", new FactoryList(HeadHandler.class));
- put("hidden", new FactoryList(HiddenHandler.class));
- put("fielderror", new FactoryList(FieldErrorHandler.class));
- put("div", new FactoryList(DivHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
- put("div-close", new FactoryList(DivHandler.CloseHandler.class));
- put("empty", new FactoryList(EmptyHandler.class));
- }});
+ 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));
+ put("form", new FactoryList(FormHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("form-close", new FactoryList(FormHandler.CloseHandler.class));
+ put("a", new FactoryList(AnchorHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("a-close", new FactoryList(AnchorHandler.CloseHandler.class));
+ put("checkbox", new FactoryList(CheckboxHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("file", new FactoryList(FileHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("password", new FactoryList(PasswordHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("label", new FactoryList(LabelHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("reset", new FactoryList(ResetHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("submit", new FactoryList(SubmitHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("submit-close", new FactoryList(SubmitHandler.CloseHandler.class));
+ put("textarea", new FactoryList(TextAreaHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("actionerror", new FactoryList(ActionErrorHandler.class));
+ put("token", new FactoryList(TokenHandler.class));
+ put("actionmessage", new FactoryList(ActionMessageHandler.class));
+ put("head", new FactoryList(HeadHandler.class));
+ put("hidden", new FactoryList(HiddenHandler.class));
+ put("fielderror", new FactoryList(FieldErrorHandler.class));
+ put("div", new FactoryList(DivHandler.class, ScriptingEventsHandler.class, CommonAttributesHandler.class));
+ put("div-close", new FactoryList(DivHandler.CloseHandler.class));
+ put("empty", new FactoryList(EmptyHandler.class));
+ }
+ });
setName("simple");
}
private class FactoryList extends ArrayList<TagHandlerFactory> {
+
+ private static final long serialVersionUID = -1551895041394434032L;
+
public FactoryList(Class... classes) {
super();
for (Class cls : classes) {
Modified: struts/struts2/trunk/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HeadTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HeadTest.java?rev=767518&r1=767517&r2=767518&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HeadTest.java (original)
+++ struts/struts2/trunk/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/HeadTest.java Wed Apr 22 13:37:01 2009
@@ -31,7 +31,7 @@
map.putAll(tag.getParameters());
theme.renderTag(getTagName(), context);
String output = writer.getBuffer().toString();
- String expected = s("<script type='text/javascript' src='/some/path/struts/utils.js'></script>");
+ String expected = s("<script type='text/javascript' base='/some/path' src='/some/path/struts/utils.js'></script>");
assertEquals(expected, output);
}