You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@velocity.apache.org by cb...@apache.org on 2016/07/19 07:45:13 UTC
svn commit: r1753343 - in /velocity/engine/trunk: src/changes/
velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/
velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/
Author: cbrisson
Date: Tue Jul 19 07:45:12 2016
New Revision: 1753343
URL: http://svn.apache.org/viewvc?rev=1753343&view=rev
Log:
[engine] applied patch from VELOCITY-815
Modified:
velocity/engine/trunk/src/changes/changes.xml
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java
velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
Modified: velocity/engine/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/src/changes/changes.xml?rev=1753343&r1=1753342&r2=1753343&view=diff
==============================================================================
--- velocity/engine/trunk/src/changes/changes.xml (original)
+++ velocity/engine/trunk/src/changes/changes.xml Tue Jul 19 07:45:12 2016
@@ -27,6 +27,11 @@
<body>
<release version="2.0" date="In Subversion">
+ <action type="fix" dev="cbrisson" issue="VELOCITY-815" due-to="Oswaldo Hernandez">
+ Applied performance patch for MapGetExecutor: it's faster to directly use object
+ instance rather than to inspect all public interfaces
+ </action>
+
<action type="add" dev="cbrisson" issue="VELOCITY-799">
The new configuration property context.autoreference.key, if present, allows to specify the name
of the reference under which the context is accessible in itself
Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java?rev=1753343&r1=1753342&r2=1753343&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java Tue Jul 19 07:45:12 2016
@@ -22,6 +22,7 @@ package org.apache.velocity.runtime.pars
import org.apache.velocity.exception.VelocityException;
import org.slf4j.Logger;
+import java.lang.reflect.Method;
import java.util.Map;
/**
@@ -36,48 +37,69 @@ public class MapGetExecutor
extends AbstractExecutor
{
private final String property;
+ private final boolean isAlive;
- public MapGetExecutor(final Logger log, final Class clazz, final String property)
+ public MapGetExecutor(final Logger log, final Object object, final String property)
{
this.log = log;
this.property = property;
- discover(clazz);
+ isAlive = discover(object);
}
- protected void discover (final Class clazz)
+ @Override
+ public Method getMethod()
{
- Class [] interfaces = clazz.getInterfaces();
- for (int i = 0 ; i < interfaces.length; i++)
+ if (isAlive())
{
- if (interfaces[i].equals(Map.class))
+ return MapGetMethod.instance();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean isAlive()
+ {
+ return isAlive;
+ }
+
+ protected boolean discover (final Object object)
+ {
+ if (object instanceof Map)
+ {
+ if (property != null)
{
- 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;
+ return true;
}
}
+ return false;
}
public Object execute(final Object o)
{
return ((Map) o).get(property);
+ }
+
+ private static final class MapGetMethod
+ {
+ private static final Method instance;
+
+ static
+ {
+ try
+ {
+ instance = Map.class.getMethod("get", new Class[]{Object.class});
+ }
+ catch (final NoSuchMethodException mapGetMethodMissingError)
+ {
+ throw new Error(mapGetMethodMissingError);
+ }
+ }
+
+ private MapGetMethod() { }
+
+ static Method instance()
+ {
+ return instance;
+ }
}
}
Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java
URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java?rev=1753343&r1=1753342&r2=1753343&view=diff
==============================================================================
--- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java (original)
+++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java Tue Jul 19 07:45:12 2016
@@ -244,7 +244,7 @@ public class UberspectImpl implements Ub
*/
if (!executor.isAlive())
{
- executor = new MapGetExecutor(log, claz, identifier);
+ executor = new MapGetExecutor(log, obj, identifier);
}
/*