WW-4685 Uses dedicated prefixes to access I18N and Struts internals
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/431e50e9 Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/431e50e9 Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/431e50e9 Branch: refs/heads/support-2-3 Commit: 431e50e92242b24b98f36eaec9ac84c938bb82b6 Parents: 156db8e Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Wed Sep 7 09:27:43 2016 +0200 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Fri Sep 16 16:00:45 2016 +0200 ---------------------------------------------------------------------- .../struts2/tiles/I18NAttributeEvaluator.java | 68 ++++++++++++++++++++ .../struts2/tiles/StrutsAttributeEvaluator.java | 33 ++-------- .../tiles/StrutsTilesContainerFactory.java | 9 ++- 3 files changed, 80 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/431e50e9/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java ---------------------------------------------------------------------- diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java new file mode 100644 index 0000000..37150ae --- /dev/null +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/I18NAttributeEvaluator.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.struts2.tiles; + +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.LocaleProvider; +import com.opensymphony.xwork2.TextProvider; +import com.opensymphony.xwork2.TextProviderFactory; +import com.opensymphony.xwork2.config.ConfigurationException; +import com.opensymphony.xwork2.ognl.OgnlUtil; +import ognl.OgnlException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.struts2.ServletActionContext; +import org.apache.tiles.evaluator.AbstractAttributeEvaluator; +import org.apache.tiles.evaluator.EvaluationException; +import org.apache.tiles.request.Request; +import org.apache.tiles.request.servlet.ServletUtil; + +import javax.servlet.http.HttpServletRequest; + +public class I18NAttributeEvaluator extends AbstractAttributeEvaluator { + + private static final Logger LOG = LogManager.getLogger(I18NAttributeEvaluator.class); + + @Override + public Object evaluate(String expression, Request request) { + Object result = expression; + + HttpServletRequest httpRequest = ServletUtil.getServletRequest(request).getRequest(); + ActionContext ctx = ServletActionContext.getActionContext(httpRequest); + + if (ctx == null) { + LOG.error("Cannot obtain HttpServletRequest from [{}]", request.getClass().getName()); + throw new ConfigurationException("There is no ActionContext for current request!"); + } + + TextProviderFactory tpf = new TextProviderFactory(); + ctx.getContainer().inject(tpf); + LocaleProvider localeProvider = ctx.getContainer().getInstance(LocaleProvider.class); + + TextProvider textProvider = tpf.createInstance(ctx.getActionInvocation().getAction().getClass(), localeProvider); + + if (textProvider != null) { + LOG.debug("Trying find text [{}] using TextProvider {}", expression, textProvider); + result = textProvider.getText(expression); + } + return result; + } + +} http://git-wip-us.apache.org/repos/asf/struts/blob/431e50e9/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsAttributeEvaluator.java ---------------------------------------------------------------------- diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsAttributeEvaluator.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsAttributeEvaluator.java index 8b98ab2..b4ef56a 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsAttributeEvaluator.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsAttributeEvaluator.java @@ -20,9 +20,6 @@ package org.apache.struts2.tiles; import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.LocaleProvider; -import com.opensymphony.xwork2.TextProvider; -import com.opensymphony.xwork2.TextProviderFactory; import com.opensymphony.xwork2.config.ConfigurationException; import com.opensymphony.xwork2.ognl.OgnlUtil; import com.opensymphony.xwork2.util.logging.Logger; @@ -43,8 +40,6 @@ public class StrutsAttributeEvaluator extends AbstractAttributeEvaluator { public Object evaluate(String expression, TilesRequestContext request) { try { - Object result = null; - HttpServletRequest httpRequest = ServletUtil.getServletRequest(request).getRequest(); ActionContext ctx = ServletActionContext.getActionContext(httpRequest); @@ -53,34 +48,14 @@ public class StrutsAttributeEvaluator extends AbstractAttributeEvaluator { throw new ConfigurationException("There is no ActionContext for current request!"); } - TextProviderFactory tpf = new TextProviderFactory(); - ctx.getContainer().inject(tpf); - LocaleProvider localeProvider = ctx.getContainer().getInstance(LocaleProvider.class); - - TextProvider textProvider = tpf.createInstance(ctx.getActionInvocation().getAction().getClass(), localeProvider); - - if (textProvider != null) { - LOG.debug("Trying find text [{}] using TextProvider {}", expression, textProvider); - result = textProvider.getText(expression); - if (expression.equals(result)) { - LOG.debug("Could not evaluate expression [{}] as a I18N key", expression); - result = null; - } - } + OgnlUtil ognlUtil = ctx.getContainer().getInstance(OgnlUtil.class); - if (result == null) { - OgnlUtil ognlUtil = ctx.getContainer().getInstance(OgnlUtil.class); - LOG.debug("Trying evaluate expression [{}] using OgnlUtil's getValue", expression); - result = ognlUtil.getValue(expression, ctx.getContextMap(), ctx.getValueStack().getRoot()); - } + LOG.debug("Trying evaluate expression [{}] using OgnlUtil's getValue", expression); + Object result = ognlUtil.getValue(expression, ctx.getContextMap(), ctx.getValueStack().getRoot()); LOG.debug("Final result of evaluating expression [{}] is: {}", expression, result); - if (result == null) { - return expression; - } else { - return result; - } + return result; } catch (OgnlException e) { throw new EvaluationException(e); } http://git-wip-us.apache.org/repos/asf/struts/blob/431e50e9/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java ---------------------------------------------------------------------- diff --git a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java index ee6cbfe..c1ca654 100644 --- a/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java +++ b/plugins/tiles/src/main/java/org/apache/struts2/tiles/StrutsTilesContainerFactory.java @@ -83,7 +83,8 @@ import java.util.Set; /** * Dedicated Struts factory to build Tiles container with support for: * - Freemarker - * - Struts I18N & ValueStack (as default) + * - I18N using Struts resource bundles + * - S2 ro access Struts' ValueStack * - OGNL * - EL * @@ -114,6 +115,7 @@ public class StrutsTilesContainerFactory extends BasicTilesContainerFactory { public static final String OGNL = "OGNL"; public static final String EL = "EL"; public static final String S2 = "S2"; + public static final String I18N = "I18N"; @Override protected BasicTilesContainer instantiateContainer(TilesApplicationContext applicationContext) { @@ -190,6 +192,7 @@ public class StrutsTilesContainerFactory extends BasicTilesContainerFactory { BasicAttributeEvaluatorFactory attributeEvaluatorFactory = new BasicAttributeEvaluatorFactory(new DirectAttributeEvaluator()); attributeEvaluatorFactory.registerAttributeEvaluator(S2, createStrutsEvaluator()); + attributeEvaluatorFactory.registerAttributeEvaluator(I18N, createI18NEvaluator()); attributeEvaluatorFactory.registerAttributeEvaluator(OGNL, createOGNLEvaluator()); ELAttributeEvaluator elEvaluator = createELEvaluator(applicationContext); @@ -268,6 +271,10 @@ public class StrutsTilesContainerFactory extends BasicTilesContainerFactory { return new StrutsAttributeEvaluator(); } + protected I18NAttributeEvaluator createI18NEvaluator() { + return new I18NAttributeEvaluator(); + } + protected OGNLAttributeEvaluator createOGNLEvaluator() { try { PropertyAccessor objectPropertyAccessor = OgnlRuntime.getPropertyAccessor(Object.class);