Greg Huber created WW-3922:
------------------------------

             Summary: 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


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 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

Reply via email to