Author: nbubna
Date: Thu Jul 30 22:10:27 2009
New Revision: 799457

URL: http://svn.apache.org/viewvc?rev=799457&view=rev
Log:
VELOCITY-730 fix MapGet/SetExecutor flaw

Added:
    
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
   (with props)
Modified:
    
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java
    
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapSetExecutor.java

Modified: 
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java?rev=799457&r1=799456&r2=799457&view=diff
==============================================================================
--- 
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java
 (original)
+++ 
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java
 Thu Jul 30 22:10:27 2009
@@ -45,32 +45,24 @@
 
     protected void discover (final Class clazz)
     {
-        Class [] interfaces = clazz.getInterfaces();
-        for (int i = 0 ; i < interfaces.length; i++)
+        if (property != null && Map.class.isAssignableFrom(clazz))
         {
-            if (interfaces[i].equals(Map.class))
+            try
             {
-                try
-                {
-                    if (property != null)
-                    {
-                        setMethod(Map.class.getMethod("get", new Class [] { 
Object.class }));
-                    }
-                }
-                /**
-                 * pass through application level runtime exceptions
-                 */
-                catch( RuntimeException e )
-                {
-                    throw e;
-                }
-                catch(Exception e)
-                {
-                    String msg = "Exception while looking for get('" + 
property + "') method";
-                    log.error(msg, e);
-                    throw new VelocityException(msg, e);
-                }
-                break;
+                setMethod(Map.class.getMethod("get", new Class [] { 
Object.class }));
+            }
+            /**
+             * pass through application level runtime exceptions
+             */
+            catch( RuntimeException e )
+            {
+                throw e;
+            }
+            catch(Exception e)
+            {
+                String msg = "Exception while looking for get('" + property + 
"') method";
+                log.error(msg, e);
+                throw new VelocityException(msg, e);
             }
         }
     }

Modified: 
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapSetExecutor.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapSetExecutor.java?rev=799457&r1=799456&r2=799457&view=diff
==============================================================================
--- 
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapSetExecutor.java
 (original)
+++ 
velocity/engine/trunk/src/java/org/apache/velocity/runtime/parser/node/MapSetExecutor.java
 Thu Jul 30 22:10:27 2009
@@ -45,32 +45,24 @@
 
     protected void discover (final Class clazz)
     {
-        Class [] interfaces = clazz.getInterfaces();
-        for (int i = 0 ; i < interfaces.length; i++)
+        if (property != null && Map.class.isAssignableFrom(clazz))
         {
-            if (interfaces[i].equals(Map.class))
+            try
             {
-                try
-                {
-                    if (property != null)
-                    {
-                        setMethod(Map.class.getMethod("put", new Class [] { 
Object.class, Object.class }));
-                    }
-                }
-                /**
-                 * pass through application level runtime exceptions
-                 */
-                catch( RuntimeException e )
-                {
-                    throw e;
-                }
-                catch(Exception e)
-                {
-                    String msg = "Exception while looking for put('" + 
property + "') method";
-                    log.error(msg, e);
-                    throw new VelocityException(msg, e);
-                }
-                break;
+                setMethod(Map.class.getMethod("put", new Class [] { 
Object.class, Object.class }));
+            }
+            /**
+             * pass through application level runtime exceptions
+             */
+            catch( RuntimeException e )
+            {
+                throw e;
+            }
+            catch(Exception e)
+            {
+                String msg = "Exception while looking for put('" + property + 
"') method";
+                log.error(msg, e);
+                throw new VelocityException(msg, e);
             }
         }
     }

Added: 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
URL: 
http://svn.apache.org/viewvc/velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java?rev=799457&view=auto
==============================================================================
--- 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
 (added)
+++ 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
 Thu Jul 30 22:10:27 2009
@@ -0,0 +1,134 @@
+package org.apache.velocity.test.issues;
+
+/*
+ * 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.    
+ */
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.apache.velocity.test.BaseTestCase;
+import org.apache.velocity.VelocityContext;
+
+/**
+ * This class tests VELOCITY-730.
+ */
+public class Velocity730TestCase extends BaseTestCase
+{
+    public Velocity730TestCase(String name)
+    {
+        super(name);
+        //DEBUG = true;
+    }
+
+    public void setUpContext(VelocityContext ctx)
+    {
+        ctx.put("foo", new Foo());
+    }
+
+    public void testIt()
+    {
+        String template = "$foo.foo #set( $foo.bar = 'foo' ) $foo.bar";
+        assertEvalEquals("bar foo", template);
+    }
+
+    public static interface MyMap extends Map
+    {
+    }
+
+    public abstract static class MyMapImpl
+    {
+        private HashMap map = new HashMap();
+
+        protected Map map()
+        {
+            return map;
+        }
+
+        public void clear() 
+        {
+            map.clear();
+        }
+
+        public boolean containsKey(Object key) 
+        {
+            return map.containsKey(key);
+        }
+
+        public boolean containsValue(Object value) 
+        {
+            return map.containsValue(value);
+        }
+
+        public boolean isEmpty() 
+        {
+            return map.isEmpty();
+        }
+
+        public Set keySet() 
+        {
+            return map.keySet();
+        }
+
+        public void putAll(Map t) 
+        {
+            map.putAll(t);
+        }
+
+        public Object remove(Object key) 
+        {
+            return map.remove(key);
+        }
+
+        public int size() 
+        {
+            return map.size();
+        }
+
+        public Collection values() 
+        {
+            return map.values();
+        }
+
+        public Set entrySet()
+        {
+            return map.entrySet();
+        }
+    }
+
+    private final static class Foo extends MyMapImpl implements MyMap
+    {
+        public Foo()
+        {
+            super();
+            put("foo","bar");
+        }
+
+        public Object get(Object key) 
+        {
+            return map().get(key);
+        }
+
+        public Object put(Object k, Object v)
+        {
+            return map().put(k, v);
+        }
+    }
+
+}

Propchange: 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
------------------------------------------------------------------------------
    svn:executable = *

Propchange: 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
------------------------------------------------------------------------------
    svn:keywords = Revision

Propchange: 
velocity/engine/trunk/src/test/org/apache/velocity/test/issues/Velocity730TestCase.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain


Reply via email to