You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by he...@apache.org on 2006/11/06 23:39:29 UTC

svn commit: r471908 - in /jakarta/velocity/engine/trunk/src/java/org/apache/velocity: context/InternalContextAdapterImpl.java context/InternalWrapperContext.java context/VMContext.java runtime/directive/Foreach.java

Author: henning
Date: Mon Nov  6 14:39:28 2006
New Revision: 471908

URL: http://svn.apache.org/viewvc?view=rev&rev=471908
Log:
Allow directives to explicitly localize certain variables in their context.
This is needed to keep foreach loop variables local in nested VMs even when velocimacro.context.local is false (default for VelocityViewServlet)
Fixes VELOCITY-285.

Modified:
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalContextAdapterImpl.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalWrapperContext.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/VMContext.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalContextAdapterImpl.java
URL: http://svn.apache.org/viewvc/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalContextAdapterImpl.java?view=diff&rev=471908&r1=471907&r2=471908
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalContextAdapterImpl.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalContextAdapterImpl.java Mon Nov  6 14:39:28 2006
@@ -202,6 +202,14 @@
     {
         return context.put( key , value );
     }
+    
+    /**
+     * @see InternalWrapperContext#localPut(String, Object)
+     */
+    public Object localPut(final String key, final Object value)
+    {
+	return put(key, value);
+    }
 
     /**
      * @see org.apache.velocity.context.Context#get(java.lang.String)

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalWrapperContext.java
URL: http://svn.apache.org/viewvc/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalWrapperContext.java?view=diff&rev=471908&r1=471907&r2=471908
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalWrapperContext.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/InternalWrapperContext.java Mon Nov  6 14:39:28 2006
@@ -39,4 +39,15 @@
      *
      */
     InternalContextAdapter getBaseContext();
+
+    /**
+     * Allows callers to explicitly put objects in the local context.
+     * Objects added to the context through this method always end up
+     * in the top-level context of possible wrapped contexts.
+     *
+     *  @param key name of item to set.
+     *  @param value object to set to key.
+     *  @return old stored object
+     */
+    Object localPut(final String key, final Object value);
 }

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/VMContext.java
URL: http://svn.apache.org/viewvc/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/VMContext.java?view=diff&rev=471908&r1=471907&r2=471908
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/VMContext.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/context/VMContext.java Mon Nov  6 14:39:28 2006
@@ -126,7 +126,34 @@
      *  @param value object to set to key
      *  @return old stored object
      */
-    public Object put(String key, Object value)
+    public Object put(final String key, final Object value)
+    {
+        return put(key, value, localcontextscope);
+    }
+
+    /**
+     * Allows callers to explicitly put objects in the local context,
+     * no matter what the velocimacro.context.local setting says. Needed
+     * e.g. for loop variables in foreach.
+     *
+     *  @param key name of item to set.
+     *  @param value object to set to key.
+     *  @return old stored object
+     */
+    public Object localPut(final String key, final Object value)
+    {
+        return put(key, value, true);
+    }
+
+    /**
+     *  Internal put method to select between local and global scope.
+     *
+     *  @param key name of item to set
+     *  @param value object to set to key
+     *  @param forceLocal True forces the object into the local scope.
+     *  @return old stored object
+     */
+    protected Object put(final String key, final Object value, final boolean forceLocal)
     {
         /*
          *  first see if this is a vmpa
@@ -140,14 +167,12 @@
         }
         else
         {
-            if(localcontextscope)
+            if(forceLocal)
             {
                 /*
-                 *  if we have localcontextscope mode, then just
-                 *  put in the local context
+                 *  just put in the local context
                  */
-
-                return localcontext.put( key, value );
+                return localcontext.put(key, value);
             }
             else
             {
@@ -155,9 +180,9 @@
                  *  ok, how about the local context?
                  */
 
-                if (localcontext.containsKey( key ))
+                if (localcontext.containsKey(key))
                 {
-                    return localcontext.put( key, value);
+                    return localcontext.put(key, value);
                 }
                 else
                 {
@@ -165,7 +190,7 @@
                      * otherwise, let them push it into the 'global' context
                      */
 
-                    return innerContext.put( key, value );
+                    return innerContext.put(key, value);
                 }
             }
         }

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java
URL: http://svn.apache.org/viewvc/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java?view=diff&rev=471908&r1=471907&r2=471908
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/directive/Foreach.java Mon Nov  6 14:39:28 2006
@@ -98,6 +98,14 @@
         }
 
         /**
+         * @see InternalWrapperContext#localPut(String, Object)
+         */
+        public Object localPut(final String key, final Object value)
+        {
+            return put(key, value);
+        }
+
+       /**
          * Does the context contain the key
          * @see org.apache.velocity.context.InternalContextAdapter#containsKey(java.lang.Object key)
          */
@@ -412,9 +420,9 @@
         while (!maxNbrLoopsExceeded && i.hasNext())
         {
             // TODO: JDK 1.4+ -> valueOf()
-            context.put(counterName , new Integer(counter));
+            context.localPut(counterName , new Integer(counter));
             Object value = i.next();
-            context.put(elementKey, value);
+            context.localPut(elementKey, value);
 
             /*
              * If the value is null, use the special null holder context



---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org