diff options
author | Claude Brisson <cbrisson@apache.org> | 2016-07-13 09:32:28 +0000 |
---|---|---|
committer | Claude Brisson <cbrisson@apache.org> | 2016-07-13 09:32:28 +0000 |
commit | f576abbf6b3487ed0ceb08e96fba7f5d781b6b72 (patch) | |
tree | e5fdd1bbfe4fb9a2c49cdc2a001cbc74c343484e | |
parent | a1c137acd7a3c375fabf22f7f6791b057138daa4 (diff) | |
download | apache-velocity-engine-f576abbf6b3487ed0ceb08e96fba7f5d781b6b72.tar.gz |
Take advantage of the major version jump to enforce String keys in internal context API (fixes VELOCITY-266)
git-svn-id: https://svn.apache.org/repos/asf/velocity/engine/trunk@1752378 13f79535-47bb-0310-9956-ffa450edef68
12 files changed, 57 insertions, 56 deletions
diff --git a/src/changes/changes.xml b/src/changes/changes.xml index cd4e315e..7d1d7bbb 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -27,6 +27,11 @@ <body> <release version="2.0" date="In Subversion"> + <action type="fix" dev="cbrisson" issue="VELOCITY-266"> + Take advantage of the major version jump to enforce String keys + in internal Context API + </action> + <action type="fix" dev="sdimitriu" issue="VELOCITY-863" due-to="Mike Kienenberger"> Fix regression: #set<tab>left-paren no longer valid grammar Patch from Mike Kienenberger applied + added test diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/VelocityContext.java b/velocity-engine-core/src/main/java/org/apache/velocity/VelocityContext.java index 84502f9e..af53b258 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/VelocityContext.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/VelocityContext.java @@ -58,7 +58,7 @@ public class VelocityContext extends AbstractContext implements Cloneable /** * Storage for key/value pairs. */ - private Map context = null; + private Map<String, Object> context = null; /** * Creates a new instance (with no inner context). @@ -73,7 +73,7 @@ public class VelocityContext extends AbstractContext implements Cloneable * context). * @param context */ - public VelocityContext(Map context) + public VelocityContext(Map<String, Object> context) { this(context, null); } @@ -101,10 +101,10 @@ public class VelocityContext extends AbstractContext implements Cloneable * create default storage. * @param innerContext Inner context. */ - public VelocityContext(Map context, Context innerContext) + public VelocityContext(Map<String, Object> context, Context innerContext) { super(innerContext); - this.context = (context == null ? new HashMap() : context); + this.context = (context == null ? new HashMap<String, Object>() : context); } /** @@ -139,7 +139,7 @@ public class VelocityContext extends AbstractContext implements Cloneable * @param key name of value to check * @return true if non-null value in store */ - public boolean internalContainsKey(Object key) + public boolean internalContainsKey(String key) { return context.containsKey( key ); } @@ -149,9 +149,9 @@ public class VelocityContext extends AbstractContext implements Cloneable * * @return keys as [] */ - public Object[] internalGetKeys() + public String[] internalGetKeys() { - return context.keySet().toArray(); + return context.keySet().toArray(new String[context.size()]); } /** @@ -161,7 +161,7 @@ public class VelocityContext extends AbstractContext implements Cloneable * @param key name of value to remove * @return value removed */ - public Object internalRemove(Object key) + public Object internalRemove(String key) { return context.remove( key ); } @@ -177,7 +177,7 @@ public class VelocityContext extends AbstractContext implements Cloneable try { clone = (VelocityContext) super.clone(); - clone.context = new HashMap(context); + clone.context = new HashMap<String, Object>(context); } catch (CloneNotSupportedException ignored) { diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/AbstractContext.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/AbstractContext.java index bce0638c..7149474a 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/AbstractContext.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/AbstractContext.java @@ -90,7 +90,7 @@ public abstract class AbstractContext extends InternalContextBase * @param key key to test for existence * @return true if found, false if not */ - public abstract boolean internalContainsKey(Object key); + public abstract boolean internalContainsKey(String key); /** * Implement to return an object array of key @@ -101,7 +101,7 @@ public abstract class AbstractContext extends InternalContextBase * * @return array of keys */ - public abstract Object[] internalGetKeys(); + public abstract String[] internalGetKeys(); /** * Implement to remove an item from your storage. @@ -112,7 +112,7 @@ public abstract class AbstractContext extends InternalContextBase * @param key key to remove * @return object removed if exists, else null */ - public abstract Object internalRemove(Object key); + public abstract Object internalRemove(String key); /** * default CTOR @@ -207,7 +207,7 @@ public abstract class AbstractContext extends InternalContextBase * @param key The key to look for. * @return true if the key is in the context, false if not. */ - public boolean containsKey(Object key) + public boolean containsKey(String key) { if (key == null) { @@ -228,7 +228,7 @@ public abstract class AbstractContext extends InternalContextBase * @return Object[] of keys in the Context. Does not return * keys in chained context. */ - public Object[] getKeys() + public String[] getKeys() { return internalGetKeys(); } @@ -240,7 +240,7 @@ public abstract class AbstractContext extends InternalContextBase * @return The value that the key was mapped to, or <code>null</code> * if unmapped. */ - public Object remove(Object key) + public Object remove(String key) { if (key == null) { diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/ChainedInternalContextAdapter.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/ChainedInternalContextAdapter.java index 6af29515..658b1094 100755 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/ChainedInternalContextAdapter.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/ChainedInternalContextAdapter.java @@ -99,7 +99,7 @@ public abstract class ChainedInternalContextAdapter implements InternalContextAd /** * @see org.apache.velocity.context.Context#containsKey(java.lang.Object) */ - public boolean containsKey(Object key) + public boolean containsKey(String key) { return wrappedContext.containsKey(key); } @@ -107,7 +107,7 @@ public abstract class ChainedInternalContextAdapter implements InternalContextAd /** * @see org.apache.velocity.context.Context#getKeys() */ - public Object[] getKeys() + public String[] getKeys() { return wrappedContext.getKeys(); } @@ -115,7 +115,7 @@ public abstract class ChainedInternalContextAdapter implements InternalContextAd /** * @see org.apache.velocity.context.Context#remove(java.lang.Object) */ - public Object remove(Object key) + public Object remove(String key) { return wrappedContext.remove(key); } @@ -147,7 +147,7 @@ public abstract class ChainedInternalContextAdapter implements InternalContextAd /** * @see org.apache.velocity.context.InternalHousekeepingContext#getTemplateNameStack() */ - public Object[] getTemplateNameStack() + public String[] getTemplateNameStack() { return wrappedContext.getTemplateNameStack(); } @@ -187,7 +187,7 @@ public abstract class ChainedInternalContextAdapter implements InternalContextAd /** * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroNameStack() */ - public Object[] getMacroNameStack() + public String[] getMacroNameStack() { return wrappedContext.getMacroNameStack(); } diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/Context.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/Context.java index 9aedd405..8b243463 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/Context.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/Context.java @@ -60,13 +60,13 @@ public interface Context * @param key The key to look for. * @return Whether the key is in the context. */ - boolean containsKey(Object key); + boolean containsKey(String key); /** * Get all the keys for the values in the context. * @return All the keys for the values in the context. */ - Object[] getKeys(); + String[] getKeys(); /** * Removes the value associated with the specified key from the context. @@ -75,5 +75,5 @@ public interface Context * @return The value that the key was mapped to, or <code>null</code> * if unmapped. */ - Object remove(Object key); + Object remove(String key); } diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java index 503f7f3e..03d9edfe 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java @@ -140,7 +140,7 @@ public final class InternalContextAdapterImpl implements InternalContextAdapter /** * @see org.apache.velocity.context.InternalHousekeepingContext#getTemplateNameStack() */ - public Object[] getTemplateNameStack() + public String[] getTemplateNameStack() { return icb.getTemplateNameStack(); } @@ -185,7 +185,7 @@ public final class InternalContextAdapterImpl implements InternalContextAdapter * @see org.apache.velocity.context.InternalHousekeepingContext#getMacroNameStack() * @since 1.6 */ - public Object[] getMacroNameStack() + public String[] getMacroNameStack() { return icb.getMacroNameStack(); } @@ -261,7 +261,7 @@ public final class InternalContextAdapterImpl implements InternalContextAdapter /** * @see org.apache.velocity.context.Context#containsKey(java.lang.Object) */ - public boolean containsKey(Object key) + public boolean containsKey(String key) { return context.containsKey( key ); } @@ -269,7 +269,7 @@ public final class InternalContextAdapterImpl implements InternalContextAdapter /** * @see org.apache.velocity.context.Context#getKeys() */ - public Object[] getKeys() + public String[] getKeys() { return context.getKeys(); } @@ -277,7 +277,7 @@ public final class InternalContextAdapterImpl implements InternalContextAdapter /** * @see org.apache.velocity.context.Context#remove(java.lang.Object) */ - public Object remove(Object key) + public Object remove(String key) { return context.remove( key ); } diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextBase.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextBase.java index 06cfe9b5..3783e9ed 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextBase.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextBase.java @@ -57,12 +57,12 @@ class InternalContextBase implements InternalHousekeepingContext, InternalEventC /** * Template name stack. The stack top contains the current template name. */ - private Stack templateNameStack = new Stack(); + private Stack<String> templateNameStack = new Stack<String>(); /** * Velocimacro name stack. The stack top contains the current macro name. */ - private Stack macroNameStack = new Stack(); + private Stack<String> macroNameStack = new Stack<String>(); /** * EventCartridge we are to carry. Set by application @@ -109,17 +109,17 @@ class InternalContextBase implements InternalHousekeepingContext, InternalEventC if ( templateNameStack.empty() ) return "<undef>"; else - return (String) templateNameStack.peek(); + return templateNameStack.peek(); } /** * get the current template name stack * - * @return Object[] with the template name stack contents. + * @return String[] with the template name stack contents. */ - public Object[] getTemplateNameStack() + public String[] getTemplateNameStack() { - return templateNameStack.toArray(); + return templateNameStack.toArray(new String[templateNameStack.size()]); } /** @@ -153,7 +153,7 @@ class InternalContextBase implements InternalHousekeepingContext, InternalEventC } else { - return (String) macroNameStack.peek(); + return macroNameStack.peek(); } } @@ -170,11 +170,11 @@ class InternalContextBase implements InternalHousekeepingContext, InternalEventC /** * get the current macro name stack * - * @return Object[] with the macro name stack contents. + * @return String[] with the macro name stack contents. */ - public Object[] getMacroNameStack() + public String[] getMacroNameStack() { - return macroNameStack.toArray(); + return macroNameStack.toArray(new String[macroNameStack.size()]); } /** diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalHousekeepingContext.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalHousekeepingContext.java index 0ee9fa04..a92f5cd3 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalHousekeepingContext.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalHousekeepingContext.java @@ -62,9 +62,9 @@ interface InternalHousekeepingContext /** * Returns the template name stack in form of an array. * - * @return Object[] with the template name stack contents. + * @return String[] with the template name stack contents. */ - Object[] getTemplateNameStack(); + String[] getTemplateNameStack(); /** * set the current macro name on top of stack @@ -95,9 +95,9 @@ interface InternalHousekeepingContext /** * Returns the macro name stack in form of an array. * - * @return Object[] with the macro name stack contents. + * @return String[] with the macro name stack contents. */ - Object[] getMacroNameStack(); + String[] getMacroNameStack(); /** * returns an IntrospectionCache Data (@see IntrospectionCacheData) diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalWrapperContext.java b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalWrapperContext.java index 273d1aaa..7dbbbb46 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalWrapperContext.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/context/InternalWrapperContext.java @@ -54,6 +54,6 @@ public interface InternalWrapperContext /** * Tests if the key exists in the specified scope */ - boolean containsKey(Object key); + boolean containsKey(String key); } diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Parse.java b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Parse.java index 5dbbd0fe..2153a4d6 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Parse.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Parse.java @@ -190,7 +190,7 @@ public class Parse extends InputBase /* * see if we have exceeded the configured depth. */ - Object[] templateStack = context.getTemplateNameStack(); + String[] templateStack = context.getTemplateNameStack(); if (templateStack.length >= maxDepth) { StringBuffer path = new StringBuffer(); diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java index b7fc6c73..ee5ee793 100644 --- a/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java +++ b/velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java @@ -275,7 +275,7 @@ public class VelocimacroProxy extends Directive if (maxCallDepth > 0 && maxCallDepth == context.getCurrentMacroCallDepth()) { String templateName = context.getCurrentTemplateName(); - Object[] stack = context.getMacroNameStack(); + String[] stack = context.getMacroNameStack(); StringBuffer out = new StringBuffer(100) .append("Max calling depth of ").append(maxCallDepth) diff --git a/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/TestContext.java b/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/TestContext.java index 23ee1efc..7d0ef513 100644 --- a/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/TestContext.java +++ b/velocity-engine-core/src/test/java/org/apache/velocity/test/misc/TestContext.java @@ -35,9 +35,9 @@ import org.apache.velocity.context.Context; public class TestContext implements Context { Context innerContext = new VelocityContext(); - Map originalKeys = new HashMap(); + Map<String, String> originalKeys = new HashMap<String, String>(); - public boolean containsKey(Object key) + public boolean containsKey(String key) { return innerContext.containsKey(normalizeKey(key)); } @@ -47,9 +47,9 @@ public class TestContext implements Context return innerContext.get(normalizeKey(key)); } - public Object[] getKeys() + public String[] getKeys() { - return originalKeys.values().toArray(); + return originalKeys.values().toArray(new String[originalKeys.size()]); } public Object put(String key, Object value) @@ -59,25 +59,21 @@ public class TestContext implements Context return innerContext.put(normalizedKey, value); } - public Object remove(Object key) + public Object remove(String key) { originalKeys.remove(key); return innerContext.remove(normalizeKey(key)); } - private String normalizeKey(Object key) + private String normalizeKey(String key) { if (key == null) { return null; } - else if (key.toString() == null) - { - return null; - } else { - return key.toString().toUpperCase(); + return key.toUpperCase(); } } } |