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