aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Brisson <cbrisson@apache.org>2016-07-13 09:32:28 +0000
committerClaude Brisson <cbrisson@apache.org>2016-07-13 09:32:28 +0000
commitf576abbf6b3487ed0ceb08e96fba7f5d781b6b72 (patch)
treee5fdd1bbfe4fb9a2c49cdc2a001cbc74c343484e
parenta1c137acd7a3c375fabf22f7f6791b057138daa4 (diff)
downloadapache-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
-rw-r--r--src/changes/changes.xml5
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/VelocityContext.java18
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/AbstractContext.java12
-rwxr-xr-xvelocity-engine-core/src/main/java/org/apache/velocity/context/ChainedInternalContextAdapter.java10
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/Context.java6
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextAdapterImpl.java10
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/InternalContextBase.java20
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/InternalHousekeepingContext.java8
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/context/InternalWrapperContext.java2
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/Parse.java2
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/runtime/directive/VelocimacroProxy.java2
-rw-r--r--velocity-engine-core/src/test/java/org/apache/velocity/test/misc/TestContext.java18
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&lt;tab&gt;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();
}
}
}