[
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