[ 
https://issues.apache.org/jira/browse/WW-3922?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Greg Huber updated WW-3922:
---------------------------

    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

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

  was:
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}

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

Reply via email to