[ https://issues.apache.org/jira/browse/WW-3922?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13559237#comment-13559237 ]
Hudson commented on WW-3922: ---------------------------- Integrated in Struts2-JDK6 #623 (See [https://builds.apache.org/job/Struts2-JDK6/623/]) WW-3922 uses default template engine to support cooperation with other plugins (Revision 1436643) Result = SUCCESS lukaszlenart : Files : * /struts/struts2/trunk/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/JavaTemplateEngine.java > Make javatemplates work with other plugins > ------------------------------------------ > > Key: WW-3922 > URL: https://issues.apache.org/jira/browse/WW-3922 > Project: Struts 2 > Issue Type: Improvement > Components: Plugin - Java Templates > Affects Versions: 2.3.4.1 > Reporter: Greg Huber > Assignee: Lukasz Lenart > Fix For: 2.3.9 > > Attachments: patch.txt, patch.txt > > > 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 > {code:java} > 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()); > } > } > } > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira