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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to