Uploaded image for project: 'Struts 2'
  1. Struts 2
  2. WW-3922

Make javatemplates work with other plugins

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 2.3.4.1
    • 2.3.12
    • 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());
      		}
      
      	}
      }
      
      

      Attachments

        1. patch.txt
          8 kB
          Greg Huber
        2. patch.txt
          8 kB
          Greg Huber

        Activity

          People

            lukaszlenart Lukasz Lenart
            ghuber Greg Huber
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: