Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.3.4.1
-
None
Description
Hello,
Using the plugin stops the struts2-jquery plugin working. Can the JavaTemplateEngine be modified to call the default template engine (ftl) if it cannot find a plugin java template.
Here are the changes needed to the JavaTemplateEngine.java to get it to work.
Cheers Greg
package org.apache.struts2.views.java; 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.TemplateEngine; import org.apache.struts2.components.template.TemplateEngineManager; import org.apache.struts2.components.template.TemplateRenderingContext; 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.config.ConfigurationException; 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); // The struts template engine manager protected TemplateEngineManager templateEngineManager; // The struts default template type. If struts ever changes this will need // updating. private String defaultTemplateType = "ftl"; @Inject public void setTemplateEngineManager(TemplateEngineManager mgr) { this.templateEngineManager = mgr; } private Themes themes = new Themes() { { add(new SimpleTheme()); } }; @Override protected String getSuffix() { return "java"; } public void renderTemplate(TemplateRenderingContext templateContext) throws Exception { Template t = templateContext.getTemplate(); Theme theme = themes.get(t.getTheme()); if (theme == null) { // Theme not supported, so do what struts would have done if we were // not here. if (LOG.isDebugEnabled()) { LOG.debug("Theme not found " + t.getTheme() + "trying default templete engine using template type " + defaultTemplateType); } final TemplateEngine engine = templateEngineManager .getTemplateEngine(templateContext.getTemplate(), defaultTemplateType); if (engine == null) { // May be the default template has changed? throw new ConfigurationException( "Unable to find a TemplateEngine for template type '" + defaultTemplateType + "' whilst trying to render template " + templateContext.getTemplate()); } else { try { // Retry render engine.renderTemplate(templateContext); } catch (Exception e) { // Give up and throw a new StrutsException(e); throw new StrutsException("Cannot render tag [" + t.getName() + "] because theme [" + t.getTheme() + "] was not found."); } } } else { // Render our template theme.renderTag(t.getName(), templateContext); } } private class Themes { private HashMap<String, Theme> themes = new HashMap<String, Theme>(); public void add(Theme theme) { themes.put(theme.getName(), theme); } public Theme get(String name) { 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(value = "struts.javatemplates.customThemes", required = false) public void setThemeClasses(String themeClasses) { StringTokenizer customThemes = new StringTokenizer(themeClasses, ","); while (customThemes.hasMoreTokens()) { String themeClass = customThemes.nextToken().trim(); try { if (LOG.isInfoEnabled()) { 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"); } } } /** * Allows for providing an alternative default struts theme. Will default to * "ftl" otherwise. * * @param defaultTemplateTheme * the struts default theme */ @Inject(value = "struts.javatemplates.defaultTemplateType", required = false) public void setDefaultTemplateType(String type) { // Make sure we don't set ourself as default for race condition if (type != null && !type.equalsIgnoreCase(getSuffix())) { this.defaultTemplateType = type.toLowerCase(); } else { LOG.error("Invalid struts.javatemplates.defaultTemplateType value. Cannot be " + getSuffix()); } } }