You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mc...@apache.org on 2011/10/28 18:42:27 UTC

svn commit: r1190434 - in /commons/proper/ognl/trunk/src: main/java/org/apache/commons/ognl/ test/java/org/apache/commons/ognl/

Author: mcucchiara
Date: Fri Oct 28 16:42:27 2011
New Revision: 1190434

URL: http://svn.apache.org/viewvc?rev=1190434&view=rev
Log:
OGNL-31 - Some CPD fixes around ASTMethod and ASTStaticMethod (contributed by Adrian Cumiskey)

Added:
    commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethodUtil.java
Modified:
    commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethod.java
    commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTStaticMethod.java
    commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/EvaluationPool.java
    commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
    commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java

Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethod.java?rev=1190434&r1=1190433&r2=1190434&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethod.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethod.java Fri Oct 28 16:42:27 2011
@@ -19,38 +19,8 @@ package org.apache.commons.ognl;
  * under the License.
  */
 
-//--------------------------------------------------------------------------
-//Copyright (c) 1998-2004, Drew Davidson and Luke Blanshard
-//All rights reserved.
-
-//Redistribution and use in source and binary forms, with or without
-//modification, are permitted provided that the following conditions are
-//met:
-
-//Redistributions of source code must retain the above copyright notice,
-//this list of conditions and the following disclaimer.
-//Redistributions in binary form must reproduce the above copyright
-//notice, this list of conditions and the following disclaimer in the
-//documentation and/or other materials provided with the distribution.
-//Neither the name of the Drew Davidson nor the names of its contributors
-//may be used to endorse or promote products derived from this software
-//without specific prior written permission.
-
-//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-//"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-//LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
-//FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
-//COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-//INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-//BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
-//OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
-//AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-//OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-//THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-//DAMAGE.
-//--------------------------------------------------------------------------
-
 import org.apache.commons.ognl.enhance.ExpressionCompiler;
+import org.apache.commons.ognl.enhance.OgnlExpressionCompiler;
 import org.apache.commons.ognl.enhance.OrderedReturn;
 import org.apache.commons.ognl.enhance.UnsupportedCompilationException;
 
@@ -58,6 +28,7 @@ import java.lang.reflect.Method;
 
 /**
  * $Id$
+ *
  * @author Luke Blanshard (blanshlu@netscape.net)
  * @author Drew Davidson (drew@ognl.org)
  */
@@ -85,8 +56,9 @@ public class ASTMethod
     }
 
     /**
-     *  Called from parser action.
-     *  @param methodName sets the name of the method
+     * Called from parser action.
+     *
+     * @param methodName sets the name of the method
      */
     public void setMethodName( String methodName )
     {
@@ -95,6 +67,7 @@ public class ASTMethod
 
     /**
      * Returns the method name that this node will call.
+     *
      * @return the method name
      */
     public String getMethodName()
@@ -152,6 +125,7 @@ public class ASTMethod
     {
         return getterClass;
     }
+
     public String toGetSourceString( OgnlContext context, Object target )
     {
         /*
@@ -162,43 +136,42 @@ public class ASTMethod
         {
             throw new UnsupportedCompilationException( "Target object is null." );
         }
-        
+
         String post = "";
         String result;
-        Method m;
+        Method method;
 
+        OgnlExpressionCompiler compiler = OgnlRuntime.getCompiler( context );
         try
         {
 
-            m =
-                OgnlRuntime.getMethod( context,
-                                       context.getCurrentType() != null ? context.getCurrentType() : target.getClass(),
-                                       methodName, _children, false );
-            if ( m == null ) 
+            method = OgnlRuntime.getMethod( context, context.getCurrentType() != null
+                ? context.getCurrentType()
+                : target.getClass(), methodName, _children, false );
+            if ( method == null )
             {
-                m = OgnlRuntime
-                       .getReadMethod( target.getClass(), methodName, _children != null ? _children.length : -1 );
+                method = OgnlRuntime.getReadMethod( target.getClass(), methodName,
+                                                    _children != null ? _children.length : -1 );
             }
-            
-            if ( m == null )
+
+            if ( method == null )
             {
-                m =
-                    OgnlRuntime.getWriteMethod( target.getClass(), methodName, _children != null ? _children.length
-                                    : -1 );
+                method = OgnlRuntime.getWriteMethod( target.getClass(), methodName,
+                                                     _children != null ? _children.length : -1 );
 
-                if ( m != null )
+                if ( method != null )
                 {
 
-                    context.setCurrentType( m.getReturnType() );
+                    context.setCurrentType( method.getReturnType() );
                     context.setCurrentAccessor(
-                                OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+                        compiler.getSuperOrInterfaceClass( method, method.getDeclaringClass() ) );
 
                     coreExpression = toSetSourceString( context, target );
                     if ( coreExpression == null || coreExpression.length() < 1 )
                     {
                         throw new UnsupportedCompilationException( "can't find suitable getter method" );
                     }
-                    
+
                     coreExpression += ";";
                     lastExpression = "null";
 
@@ -210,12 +183,12 @@ public class ASTMethod
             else
             {
 
-                getterClass = m.getReturnType();
+                getterClass = method.getReturnType();
             }
 
             // TODO: This is a hacky workaround until javassist supports varargs method invocations
 
-            boolean varArgs = OgnlRuntime.isJdk15() && m.isVarArgs();
+            boolean varArgs = OgnlRuntime.isJdk15() && method.isVarArgs();
 
             if ( varArgs )
             {
@@ -223,11 +196,11 @@ public class ASTMethod
                     "Javassist does not currently support varargs method calls" );
             }
 
-            result = "." + m.getName() + "(";
+            result = "." + method.getName() + "(";
 
             if ( ( _children != null ) && ( _children.length > 0 ) )
             {
-                Class[] parms = m.getParameterTypes();
+                Class[] parms = method.getParameterTypes();
                 String prevCast = (String) context.remove( ExpressionCompiler.PRE_CAST );
                 /*
                  * System.out.println("before children methodName is " + methodName + " for target " + target +
@@ -244,95 +217,22 @@ public class ASTMethod
 
                     Class prevType = context.getCurrentType();
 
-                    context.setCurrentObject( context.getRoot() );
-                    context.setCurrentType( context.getRoot() != null ? context.getRoot().getClass() : null );
+                    Object root = context.getRoot();
+                    context.setCurrentObject( root );
+                    context.setCurrentType( root != null ? root.getClass() : null );
                     context.setCurrentAccessor( null );
                     context.setPreviousType( null );
 
-                    Object value = _children[i].getValue( context, context.getRoot() );
-                    String parmString = _children[i].toGetSourceString( context, context.getRoot() );
+                    Node child = _children[i];
 
-                    if ( parmString == null || parmString.trim().length() < 1 )
-                    {
-                        parmString = "null";
-                    }
-                    // to undo type setting of constants when used as method parameters
-                    if ( ASTConst.class.isInstance( _children[i] ) )
-                    {
-                        context.setCurrentType( prevType );
-                    }
+                    String parmString = ASTMethodUtil.getParmString( context, root, child, prevType );
 
-                    parmString =
-                        ExpressionCompiler.getRootExpression( _children[i], context.getRoot(), context ) + parmString;
+                    Class valueClass = ASTMethodUtil.getValueClass( context, root, child );
 
-                    String cast = "";
-                    if ( ExpressionCompiler.shouldCast( _children[i] ) )
-                    {
-                        cast = (String) context.remove( ExpressionCompiler.PRE_CAST );
-                    }
-                    if ( cast == null )
-                    {
-                        cast = "";
-                    }
-                    
-                    if ( !ASTConst.class.isInstance( _children[i] ) )
-                    {
-                        parmString = cast + parmString;
-                    }
-                    
-                    Class valueClass = value != null ? value.getClass() : null;
-                    if ( NodeType.class.isAssignableFrom( _children[i].getClass() ) )
-                    {
-                        valueClass = ( (NodeType) _children[i] ).getGetterClass();
-                    }
-                    
                     if ( ( !varArgs || varArgs && ( i + 1 ) < parms.length ) && valueClass != parms[i] )
                     {
-                        if ( parms[i].isArray() )
-                        {
-
-                            parmString =
-                                OgnlRuntime
-                                    .getCompiler( context )
-                                    .createLocalReference( context, "(" + ExpressionCompiler.getCastString( parms[i] )
-                                        + ")org.apache.commons.ognl.OgnlOps#toArray(" + parmString + ", "
-                                        + parms[i].getComponentType().getName() + ".class, true)", parms[i] );
-
-                        }
-                        else if ( parms[i].isPrimitive() )
-                        {
-
-                            Class wrapClass = OgnlRuntime.getPrimitiveWrapperClass( parms[i] );
-
-                            parmString =
-                                OgnlRuntime
-                                    .getCompiler( context )
-                                    .createLocalReference( context, "((" + wrapClass.getName()
-                                        + ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
-                                        + wrapClass.getName() + ".class, true))." + OgnlRuntime.getNumericValueGetter(
-                                        wrapClass ), parms[i] );
-
-                        }
-                        else if ( parms[i] != Object.class )
-                        {
-                            parmString =
-                                OgnlRuntime
-                                    .getCompiler( context )
-                                    .createLocalReference( context, "(" + parms[i].getName()
-                                        + ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
-                                        + parms[i].getName() + ".class)", parms[i] );
-                        }
-                        else if ( ( NodeType.class.isInstance( _children[i] )
-                            && ( (NodeType) _children[i] ).getGetterClass() != null 
-                            && Number.class.isAssignableFrom( ( (NodeType) _children[i] ).getGetterClass() ) )
-                            || ( valueClass != null && valueClass.isPrimitive() ) )
-                        {
-                            parmString = " ($w) " + parmString;
-                        }
-                        else if ( valueClass != null && valueClass.isPrimitive() )
-                        {
-                            parmString = "($w) " + parmString;
-                        }
+                        parmString = ASTMethodUtil.getParmString( context, parms[i], parmString, child, valueClass,
+                                                                  ".class, true)" );
                     }
 
                     result += parmString;
@@ -362,14 +262,14 @@ public class ASTMethod
 
         result += ")" + post;
 
-        if ( m.getReturnType() == void.class )
+        if ( method.getReturnType() == void.class )
         {
             coreExpression = result + ";";
             lastExpression = "null";
         }
 
-        context.setCurrentType( m.getReturnType() );
-        context.setCurrentAccessor( OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+        context.setCurrentType( method.getReturnType() );
+        context.setCurrentAccessor( compiler.getSuperOrInterfaceClass( method, method.getDeclaringClass() ) );
 
         return result;
     }
@@ -385,15 +285,15 @@ public class ASTMethod
                                         methodName, _children != null ? _children.length : -1 );
         if ( m == null )
         {
-            throw new UnsupportedCompilationException( "Unable to determine setter method generation for "
-                + methodName );
+            throw new UnsupportedCompilationException(
+                "Unable to determine setter method generation for " + methodName );
         }
 
         String post = "";
         String result = "." + m.getName() + "(";
 
-        if ( m.getReturnType() != void.class && m.getReturnType().isPrimitive()
-            && ( _parent == null || !ASTTest.class.isInstance( _parent ) ) )
+        if ( m.getReturnType() != void.class && m.getReturnType().isPrimitive() && ( _parent == null
+            || !ASTTest.class.isInstance( _parent ) ) )
         {
             Class wrapper = OgnlRuntime.getPrimitiveWrapperClass( m.getReturnType() );
 
@@ -409,6 +309,7 @@ public class ASTMethod
             throw new UnsupportedCompilationException( "Javassist does not currently support varargs method calls" );
         }
 
+        OgnlExpressionCompiler compiler = OgnlRuntime.getCompiler( context );
         try
         {
             /*
@@ -435,19 +336,19 @@ public class ASTMethod
                     context.setCurrentAccessor( null );
                     context.setPreviousType( null );
 
-                    Object value = _children[i].getValue( context, context.getRoot() );
-                    String parmString = _children[i].toSetSourceString( context, context.getRoot() );
+                    Node child = _children[i];
+                    Object value = child.getValue( context, context.getRoot() );
+                    String parmString = child.toSetSourceString( context, context.getRoot() );
 
                     if ( context.getCurrentType() == Void.TYPE || context.getCurrentType() == void.class )
                     {
                         throw new UnsupportedCompilationException( "Method argument can't be a void type." );
                     }
-                    
+
                     if ( parmString == null || parmString.trim().length() < 1 )
                     {
-                        if ( ASTProperty.class.isInstance( _children[i] ) || ASTMethod.class.isInstance( _children[i] )
-                            || ASTStaticMethod.class.isInstance( _children[i] )
-                            || ASTChain.class.isInstance( _children[i] ) )
+                        if ( ASTProperty.class.isInstance( child ) || ASTMethod.class.isInstance( child )
+                            || ASTStaticMethod.class.isInstance( child ) || ASTChain.class.isInstance( child ) )
                         {
                             throw new UnsupportedCompilationException(
                                 "ASTMethod setter child returned null from a sub property expression." );
@@ -456,16 +357,15 @@ public class ASTMethod
                     }
 
                     // to undo type setting of constants when used as method parameters
-                    if ( ASTConst.class.isInstance( _children[i] ) )
+                    if ( ASTConst.class.isInstance( child ) )
                     {
                         context.setCurrentType( prevType );
                     }
 
-                    parmString =
-                        ExpressionCompiler.getRootExpression( _children[i], context.getRoot(), context ) + parmString;
+                    parmString = ExpressionCompiler.getRootExpression( child, context.getRoot(), context ) + parmString;
 
                     String cast = "";
-                    if ( ExpressionCompiler.shouldCast( _children[i] ) )
+                    if ( ExpressionCompiler.shouldCast( child ) )
                     {
                         cast = (String) context.remove( ExpressionCompiler.PRE_CAST );
                     }
@@ -474,61 +374,19 @@ public class ASTMethod
                     {
                         cast = "";
                     }
-                    
+
                     parmString = cast + parmString;
 
                     Class valueClass = value != null ? value.getClass() : null;
-                    if ( NodeType.class.isAssignableFrom( _children[i].getClass() ) )
+                    if ( NodeType.class.isAssignableFrom( child.getClass() ) )
                     {
-                        valueClass = ( (NodeType) _children[i] ).getGetterClass();
+                        valueClass = ( (NodeType) child ).getGetterClass();
                     }
-                    
+
                     if ( valueClass != parms[i] )
                     {
-                        if ( parms[i].isArray() )
-                        {
-                            parmString =
-                                OgnlRuntime
-                                    .getCompiler( context )
-                                    .createLocalReference( context, "(" + ExpressionCompiler.getCastString( parms[i] )
-                                        + ")org.apache.commons.ognl.OgnlOps#toArray(" + parmString + ", "
-                                        + parms[i].getComponentType().getName() + ".class)", parms[i] );
-
-                        }
-                        else if ( parms[i].isPrimitive() )
-                        {
-                            Class wrapClass = OgnlRuntime.getPrimitiveWrapperClass( parms[i] );
-
-                            parmString =
-                                OgnlRuntime
-                                    .getCompiler( context )
-                                    .createLocalReference( context, "((" + wrapClass.getName()
-                                        + ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
-                                        + wrapClass.getName() + ".class, true))." + OgnlRuntime.getNumericValueGetter(
-                                        wrapClass ), parms[i] );
-
-                        }
-                        else if ( parms[i] != Object.class )
-                        {
-                            parmString =
-                                OgnlRuntime
-                                    .getCompiler( context )
-                                    .createLocalReference( context, "(" + parms[i].getName()
-                                        + ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
-                                        + parms[i].getName() + ".class)", parms[i] );
-
-                        }
-                        else if ( ( NodeType.class.isInstance( _children[i] )
-                            && ( (NodeType) _children[i] ).getGetterClass() != null 
-                            && Number.class.isAssignableFrom( ( (NodeType) _children[i] ).getGetterClass() ) )
-                            || ( valueClass != null && valueClass.isPrimitive() ) )
-                        {
-                            parmString = " ($w) " + parmString;
-                        }
-                        else if ( valueClass != null && valueClass.isPrimitive() )
-                        {
-                            parmString = "($w) " + parmString;
-                        }
+                        parmString =
+                            ASTMethodUtil.getParmString( context, parms[i], parmString, child, valueClass, ".class)" );
                     }
 
                     result += parmString;
@@ -557,11 +415,11 @@ public class ASTMethod
         }
 
         context.setCurrentType( m.getReturnType() );
-        context.setCurrentAccessor( OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+        context.setCurrentAccessor( compiler.getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
 
         return result + ")" + post;
     }
-    
+
     public <R, P> R accept( NodeVisitor<? extends R, ? super P> visitor, P data )
         throws OgnlException
     {

Added: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethodUtil.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethodUtil.java?rev=1190434&view=auto
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethodUtil.java (added)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethodUtil.java Fri Oct 28 16:42:27 2011
@@ -0,0 +1,122 @@
+package org.apache.commons.ognl;
+
+import org.apache.commons.ognl.enhance.ExpressionCompiler;
+import org.apache.commons.ognl.enhance.OgnlExpressionCompiler;
+
+/*
+ * 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.
+ */
+
+/**
+ * $Id: $
+ */
+class ASTMethodUtil
+{
+
+    private ASTMethodUtil()
+    {
+    }
+
+    static String getParmString( OgnlContext context, Object root, Node child, Class prevType )
+        throws OgnlException
+    {
+        String parmString = child.toGetSourceString( context, root );
+
+        if ( parmString == null || parmString.trim().length() < 1 )
+        {
+            parmString = "null";
+        }
+
+        // to undo type setting of constants when used as method parameters
+        if ( ASTConst.class.isInstance( child ) )
+        {
+            context.setCurrentType( prevType );
+        }
+
+        parmString = ExpressionCompiler.getRootExpression( child, root, context ) + parmString;
+
+        String cast = "";
+        if ( ExpressionCompiler.shouldCast( child ) )
+        {
+            cast = (String) context.remove( ExpressionCompiler.PRE_CAST );
+        }
+
+        if ( cast == null )
+        {
+            cast = "";
+        }
+
+        if ( !ASTConst.class.isInstance( child ) )
+        {
+            parmString = cast + parmString;
+        }
+        return parmString;
+    }
+
+    static Class getValueClass( OgnlContext context, Object root, Node child )
+        throws OgnlException
+    {
+        Object value = child.getValue( context, root );
+        Class valueClass = value != null ? value.getClass() : null;
+        if ( NodeType.class.isAssignableFrom( child.getClass() ) )
+        {
+            valueClass = ( (NodeType) child ).getGetterClass();
+        }
+        return valueClass;
+    }
+
+    static String getParmString( OgnlContext context, Class parm, String parmString, Node child, Class valueClass,
+                                 String endParam )
+    {
+        OgnlExpressionCompiler compiler = OgnlRuntime.getCompiler( context );
+        if ( parm.isArray() )
+        {
+            parmString = compiler.createLocalReference( context, "(" + ExpressionCompiler.getCastString( parm )
+                + ")org.apache.commons.ognl.OgnlOps#toArray(" + parmString + ", " + parm.getComponentType().getName()
+                + endParam, parm );
+
+        }
+        else if ( parm.isPrimitive() )
+        {
+            Class wrapClass = OgnlRuntime.getPrimitiveWrapperClass( parm );
+
+            parmString = compiler.createLocalReference( context, "((" + wrapClass.getName()
+                + ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + "," + wrapClass.getName()
+                + ".class, true))." + OgnlRuntime.getNumericValueGetter( wrapClass ), parm );
+
+        }
+        else if ( parm != Object.class )
+        {
+            parmString = compiler.createLocalReference( context, "(" + parm.getName()
+                + ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + "," + parm.getName() + ".class)",
+                                                        parm );
+
+        }
+        else if ( ( NodeType.class.isInstance( child ) && ( (NodeType) child ).getGetterClass() != null
+            && Number.class.isAssignableFrom( ( (NodeType) child ).getGetterClass() ) ) || ( valueClass != null
+            && valueClass.isPrimitive() ) )
+        {
+            parmString = " ($w) " + parmString;
+        }
+        else if ( valueClass != null && valueClass.isPrimitive() )
+        {
+            parmString = "($w) " + parmString;
+        }
+        return parmString;
+    }
+}

Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTStaticMethod.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTStaticMethod.java?rev=1190434&r1=1190433&r2=1190434&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTStaticMethod.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTStaticMethod.java Fri Oct 28 16:42:27 2011
@@ -20,11 +20,14 @@ package org.apache.commons.ognl;
  */
 
 import org.apache.commons.ognl.enhance.ExpressionCompiler;
+import org.apache.commons.ognl.enhance.OgnlExpressionCompiler;
 import org.apache.commons.ognl.enhance.UnsupportedCompilationException;
+
 import java.lang.reflect.Method;
 
 /**
  * $Id$
+ *
  * @author Luke Blanshard (blanshlu@netscape.net)
  * @author Drew Davidson (drew@ognl.org)
  */
@@ -49,7 +52,9 @@ public class ASTStaticMethod
         super( p, id );
     }
 
-    /** Called from parser action. */
+    /**
+     * Called from parser action.
+     */
     void init( String className, String methodName )
     {
         this.className = className;
@@ -59,7 +64,8 @@ public class ASTStaticMethod
     protected Object getValueBody( OgnlContext context, Object source )
         throws OgnlException
     {
-        Object[] args = OgnlRuntime.getObjectArrayPool().create( jjtGetNumChildren() );
+        ObjectArrayPool objectArrayPool = OgnlRuntime.getObjectArrayPool();
+        Object[] args = objectArrayPool.create( jjtGetNumChildren() );
         Object root = context.getRoot();
 
         try
@@ -68,12 +74,12 @@ public class ASTStaticMethod
             {
                 args[i] = _children[i].getValue( context, root );
             }
-            
+
             return OgnlRuntime.callStaticMethod( context, className, methodName, args );
         }
         finally
         {
-            OgnlRuntime.getObjectArrayPool().recycle( args );
+            objectArrayPool.recycle( args );
         }
     }
 
@@ -98,18 +104,18 @@ public class ASTStaticMethod
 
             if ( clazz == null || m == null )
             {
-                throw new UnsupportedCompilationException( "Unable to find class/method combo " + className + " / "
-                    + methodName );
+                throw new UnsupportedCompilationException(
+                    "Unable to find class/method combo " + className + " / " + methodName );
             }
-            
+
             if ( !context.getMemberAccess().isAccessible( context, clazz, m, methodName ) )
             {
                 throw new UnsupportedCompilationException(
-                               "Method is not accessible, check your jvm runtime security settings. "
-                                   + "For static class method " + className + " / "
-                                   + methodName );
+                    "Method is not accessible, check your jvm runtime security settings. " + "For static class method "
+                        + className + " / " + methodName );
             }
 
+            OgnlExpressionCompiler compiler = OgnlRuntime.getCompiler( context );
             if ( ( _children != null ) && ( _children.length > 0 ) )
             {
                 Class[] parms = m.getParameterTypes();
@@ -123,91 +129,40 @@ public class ASTStaticMethod
 
                     Class prevType = context.getCurrentType();
 
-                    Object value = _children[i].getValue( context, context.getRoot() );
-                    String parmString = _children[i].toGetSourceString( context, context.getRoot() );
-
-                    if ( parmString == null || parmString.trim().length() < 1 )
-                    {
-                        parmString = "null";
-                    }
-                    
-                    // to undo type setting of constants when used as method parameters
-                    if ( ASTConst.class.isInstance( _children[i] ) )
-                    {
-                        context.setCurrentType( prevType );
-                    }
+                    Node child = _children[i];
+                    Object root = context.getRoot();
 
-                    parmString =
-                        ExpressionCompiler.getRootExpression( _children[i], context.getRoot(), context ) + parmString;
+                    String parmString = ASTMethodUtil.getParmString( context, root, child, prevType );
 
-                    String cast = "";
-                    if ( ExpressionCompiler.shouldCast( _children[i] ) )
-                    {
-                        cast = (String) context.remove( ExpressionCompiler.PRE_CAST );
-                    }
+                    Class valueClass = ASTMethodUtil.getValueClass( context, root, child );
 
-                    if ( cast == null )
-                    {
-                        cast = "";
-                    }
-                    
-                    if ( !ASTConst.class.isInstance( _children[i] ) )
-                    {
-                        parmString = cast + parmString;
-                    }
-                    
-                    Class valueClass = value != null ? value.getClass() : null;
-                    if ( NodeType.class.isAssignableFrom( _children[i].getClass() ) )
-                    {
-                        valueClass = ( (NodeType) _children[i] ).getGetterClass();
-                    }
-                    
                     if ( valueClass != parms[i] )
                     {
                         if ( parms[i].isArray() )
                         {
-                            parmString =
-                                OgnlRuntime.getCompiler( context ).createLocalReference( context,
-                                                                "("
-                                                                    + ExpressionCompiler.getCastString( parms[i] )
-                                                                    + ")org.apache.commons.ognl.OgnlOps.toArray("
-                                                                    + parmString
-                                                                    + ", "
-                                                                    + parms[i].getComponentType().getName()
-                                                                    + ".class, true)", parms[i] );
+                            parmString = compiler.createLocalReference( context, "(" + ExpressionCompiler.getCastString(
+                                parms[i] ) + ")org.apache.commons.ognl.OgnlOps.toArray(" + parmString + ", "
+                                + parms[i].getComponentType().getName() + ".class, true)", parms[i] );
 
                         }
                         else if ( parms[i].isPrimitive() )
                         {
                             Class wrapClass = OgnlRuntime.getPrimitiveWrapperClass( parms[i] );
 
-                            parmString =
-                                OgnlRuntime.getCompiler( context ).createLocalReference( context,
-                                                            "(("
-                                                                + wrapClass.getName()
-                                                                + ")org.apache.commons.ognl.OgnlOps.convertValue("
-                                                                + parmString
-                                                                + ","
-                                                                + wrapClass.getName()
-                                                                + ".class, true))."
-                                                                + OgnlRuntime.getNumericValueGetter( wrapClass ),
-                                                            parms[i] );
+                            parmString = compiler.createLocalReference( context, "((" + wrapClass.getName()
+                                + ")org.apache.commons.ognl.OgnlOps.convertValue(" + parmString + ","
+                                + wrapClass.getName() + ".class, true))." + OgnlRuntime.getNumericValueGetter(
+                                wrapClass ), parms[i] );
 
                         }
                         else if ( parms[i] != Object.class )
                         {
-                            parmString =
-                                OgnlRuntime.getCompiler( context ).createLocalReference( context,
-                                                            "("
-                                                                + parms[i].getName()
-                                                                + ")org.apache.commons.ognl.OgnlOps.convertValue("
-                                                                + parmString + ","
-                                                                + parms[i].getName() + ".class)",
-                                                            parms[i] );
+                            parmString = compiler.createLocalReference( context, "(" + parms[i].getName()
+                                + ")org.apache.commons.ognl.OgnlOps.convertValue(" + parmString + ","
+                                + parms[i].getName() + ".class)", parms[i] );
                         }
-                        else if ( ( NodeType.class.isInstance( _children[i] )
-                            && ( (NodeType) _children[i] ).getGetterClass() != null 
-                            && Number.class.isAssignableFrom( ( (NodeType) _children[i] ).getGetterClass() ) )
+                        else if ( ( NodeType.class.isInstance( child ) && ( (NodeType) child ).getGetterClass() != null
+                            && Number.class.isAssignableFrom( ( (NodeType) child ).getGetterClass() ) )
                             || valueClass.isPrimitive() )
                         {
                             parmString = " ($w) " + parmString;
@@ -239,8 +194,7 @@ public class ASTStaticMethod
                 getterClass = m.getReturnType();
 
                 context.setCurrentType( m.getReturnType() );
-                context.setCurrentAccessor( 
-                    OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+                context.setCurrentAccessor( compiler.getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
             }
 
         }
@@ -256,7 +210,7 @@ public class ASTStaticMethod
     {
         return toGetSourceString( context, target );
     }
-    
+
     public <R, P> R accept( NodeVisitor<? extends R, ? super P> visitor, P data )
         throws OgnlException
     {

Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/EvaluationPool.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/EvaluationPool.java?rev=1190434&r1=1190433&r2=1190434&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/EvaluationPool.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/EvaluationPool.java Fri Oct 28 16:42:27 2011
@@ -31,6 +31,10 @@ public final class EvaluationPool
         this( 0 );
     }
 
+    /*
+     * @deprecated evaluation-pool now relies on the jvm garbage collection
+     * therefore providing an initialSize is unnecessary
+     */
     public EvaluationPool( int initialSize )
     {
         super();

Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlRuntime.java?rev=1190434&r1=1190433&r2=1190434&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlRuntime.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlRuntime.java Fri Oct 28 16:42:27 2011
@@ -230,9 +230,6 @@ public class OgnlRuntime
 
     static final Cache<Method, Boolean> _methodPermCache = cacheFactory.createCache( methodPermCacheEntryFactory );
 
-    static final Map<OgnlContext, OgnlExpressionCompiler> expressionCompilerMap =
-        new HashMap<OgnlContext, OgnlExpressionCompiler>();
-
     static ClassCacheInspector _cacheInspector;
 
     /**
@@ -240,23 +237,6 @@ public class OgnlRuntime
      */
     private static OgnlExpressionCompiler _compiler;
 
-    /**
-     * Lazy loading of Javassist library
-     */
-    static
-    {
-        try
-        {
-            Class.forName( "javassist.ClassPool" );
-            _compiler = new ExpressionCompiler();
-        }
-        catch ( ClassNotFoundException e )
-        {
-            throw new IllegalArgumentException(
-                "Javassist library is missing in classpath! Please add missed dependency!", e );
-        }
-    }
-
     private static Map<Class<?>, Class<?>> PRIMITIVE_WRAPPER_CLASSES = new IdentityHashMap<Class<?>, Class<?>>();
 
     /**
@@ -516,28 +496,25 @@ public class OgnlRuntime
      */
     public static OgnlExpressionCompiler getCompiler()
     {
-        return _compiler != null ? _compiler : getCompiler( null );
+        return getCompiler( null );
     }
 
     public static OgnlExpressionCompiler getCompiler( OgnlContext ognlContext )
     {
-        OgnlExpressionCompiler ognlExpressionCompiler = expressionCompilerMap.get( ognlContext );
-        if ( ognlExpressionCompiler == null )
+        if ( _compiler == null )
         {
             try
             {
                 OgnlRuntime.classForName( ognlContext, "javassist.ClassPool" );
-                ognlExpressionCompiler = new ExpressionCompiler();
-                expressionCompilerMap.put( ognlContext, ognlExpressionCompiler );
+                _compiler = new ExpressionCompiler();
             }
             catch ( ClassNotFoundException e )
             {
                 throw new IllegalArgumentException(
-                                                    "Javassist library is missing in classpath! Please add missed dependency!",
-                                                    e );
+                    "Javassist library is missing in classpath! Please add missed dependency!", e );
             }
         }
-        return ognlExpressionCompiler;
+        return _compiler;
     }
 
     public static void compileExpression( OgnlContext context, Node expression, Object root )

Modified: commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java?rev=1190434&r1=1190433&r2=1190434&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java (original)
+++ commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java Fri Oct 28 16:42:27 2011
@@ -19,6 +19,7 @@
  */
 package org.apache.commons.ognl;
 
+import org.apache.commons.ognl.enhance.OgnlExpressionCompiler;
 import org.apache.commons.ognl.internal.CacheException;
 import org.apache.commons.ognl.test.objects.BaseGeneric;
 import org.apache.commons.ognl.test.objects.Bean1;
@@ -57,117 +58,120 @@ public class TestOgnlRuntime
 {
 
     @Test
-    public void test_Get_Super_Or_Interface_Class( )
+    public void test_Get_Super_Or_Interface_Class()
         throws Exception
     {
-        ListSource list = new ListSourceImpl( );
+        ListSource list = new ListSourceImpl();
 
-        Method m = OgnlRuntime.getReadMethod( list.getClass( ), "total" );
+        Method m = OgnlRuntime.getReadMethod( list.getClass(), "total" );
         assertNotNull( m );
 
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
-        assertEquals( ListSource.class, OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, list.getClass() ) );
+        assertEquals( ListSource.class,
+                      OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, list.getClass() ) );
     }
 
     @Test
-    public void test_Get_Private_Class( )
+    public void test_Get_Private_Class()
         throws Exception
     {
         List list = Arrays.asList( "hello", "world" );
 
-        Method m = OgnlRuntime.getReadMethod( list.getClass( ), "iterator" );
+        Method m = OgnlRuntime.getReadMethod( list.getClass(), "iterator" );
         assertNotNull( m );
 
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
-        assertEquals( Iterable.class, OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, list.getClass() ) );
+        assertEquals( Iterable.class,
+                      OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, list.getClass() ) );
     }
 
     @Test
-    public void test_Complicated_Inheritance( )
+    public void test_Complicated_Inheritance()
         throws Exception
     {
-        IForm form = new FormImpl( );
+        IForm form = new FormImpl();
 
-        Method m = OgnlRuntime.getWriteMethod( form.getClass( ), "clientId" );
+        Method m = OgnlRuntime.getWriteMethod( form.getClass(), "clientId" );
         assertNotNull( m );
 
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
-        assertEquals( IComponent.class, OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, form.getClass() ) );
+        assertEquals( IComponent.class,
+                      OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, form.getClass() ) );
     }
 
     @Test
-    public void test_Get_Read_Method( )
+    public void test_Get_Read_Method()
         throws Exception
     {
         Method m = OgnlRuntime.getReadMethod( Bean2.class, "pageBreakAfter" );
         assertNotNull( m );
 
-        assertEquals( "isPageBreakAfter", m.getName( ) );
+        assertEquals( "isPageBreakAfter", m.getName() );
     }
 
     class TestGetters
     {
-        public boolean isEditorDisabled( )
+        public boolean isEditorDisabled()
         {
             return false;
         }
 
-        public boolean isDisabled( )
+        public boolean isDisabled()
         {
             return true;
         }
 
-        public boolean isNotAvailable( )
+        public boolean isNotAvailable()
         {
             return false;
         }
 
-        public boolean isAvailable( )
+        public boolean isAvailable()
         {
             return true;
         }
     }
 
     @Test
-    public void test_Get_Read_Method_Multiple( )
+    public void test_Get_Read_Method_Multiple()
         throws Exception
     {
         Method m = OgnlRuntime.getReadMethod( TestGetters.class, "disabled" );
         assertNotNull( m );
 
-        assertEquals( "isDisabled", m.getName( ) );
+        assertEquals( "isDisabled", m.getName() );
     }
 
     @Test
-    public void test_Get_Read_Method_Multiple_Boolean_Getters( )
+    public void test_Get_Read_Method_Multiple_Boolean_Getters()
         throws Exception
     {
         Method m = OgnlRuntime.getReadMethod( TestGetters.class, "available" );
         assertNotNull( m );
 
-        assertEquals( "isAvailable", m.getName( ) );
+        assertEquals( "isAvailable", m.getName() );
 
         m = OgnlRuntime.getReadMethod( TestGetters.class, "notAvailable" );
         assertNotNull( m );
 
-        assertEquals( "isNotAvailable", m.getName( ) );
+        assertEquals( "isNotAvailable", m.getName() );
     }
 
     @Test
-    public void test_Find_Method_Mixed_Boolean_Getters( )
+    public void test_Find_Method_Mixed_Boolean_Getters()
         throws Exception
     {
         Method m = OgnlRuntime.getReadMethod( GetterMethods.class, "allowDisplay" );
         assertNotNull( m );
 
-        assertEquals( "getAllowDisplay", m.getName( ) );
+        assertEquals( "getAllowDisplay", m.getName() );
     }
 
     @Test
-    public void test_Get_Appropriate_Method( )
+    public void test_Get_Appropriate_Method()
         throws Exception
     {
-        ListSource list = new ListSourceImpl( );
+        ListSource list = new ListSourceImpl();
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
 
         Object ret = OgnlRuntime.callMethod( context, list, "addValue", new String[]{ null } );
@@ -176,7 +180,7 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void test_Call_Static_Method_Invalid_Class( )
+    public void test_Call_Static_Method_Invalid_Class()
     {
 
         try
@@ -191,18 +195,18 @@ public class TestOgnlRuntime
         {
 
             assertTrue( MethodFailedException.class.isInstance( et ) );
-            assertTrue( et.getMessage( ).contains( "made.up.Name" ) );
+            assertTrue( et.getMessage().contains( "made.up.Name" ) );
         }
     }
 
     @Test
-    public void test_Setter_Returns( )
+    public void test_Setter_Returns()
         throws Exception
     {
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
-        SetterReturns root = new SetterReturns( );
+        SetterReturns root = new SetterReturns();
 
-        Method m = OgnlRuntime.getWriteMethod( root.getClass( ), "value" );
+        Method m = OgnlRuntime.getWriteMethod( root.getClass(), "value" );
         assertTrue( m != null );
 
         Ognl.setValue( "value", context, root, "12__" );
@@ -210,47 +214,47 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void test_Call_Method_VarArgs( )
+    public void test_Call_Method_VarArgs()
         throws Exception
     {
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
-        GenericService service = new GenericServiceImpl( );
+        GenericService service = new GenericServiceImpl();
 
-        GameGenericObject argument = new GameGenericObject( );
+        GameGenericObject argument = new GameGenericObject();
 
-        Object[] args = OgnlRuntime.getObjectArrayPool( ).create( 2 );
+        Object[] args = OgnlRuntime.getObjectArrayPool().create( 2 );
         args[0] = argument;
 
         assertEquals( "Halo 3", OgnlRuntime.callMethod( context, service, "getFullMessageFor", args ) );
     }
 
     @Test
-    public void test_Class_Cache_Inspector( )
+    public void test_Class_Cache_Inspector()
         throws Exception
     {
-        OgnlRuntime.clearCache( );
-        assertEquals( 0, OgnlRuntime._propertyDescriptorCache.getSize( ) );
+        OgnlRuntime.clearCache();
+        assertEquals( 0, OgnlRuntime._propertyDescriptorCache.getSize() );
 
-        Root root = new Root( );
+        Root root = new Root();
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
         Node expr = Ognl.compileExpression( context, root, "property.bean3.value != null" );
 
-        assertTrue( (Boolean) expr.getAccessor( ).get( context, root ) );
+        assertTrue( (Boolean) expr.getAccessor().get( context, root ) );
 
-        int size = OgnlRuntime._propertyDescriptorCache.getSize( );
+        int size = OgnlRuntime._propertyDescriptorCache.getSize();
         assertTrue( size > 0 );
 
-        OgnlRuntime.clearCache( );
-        assertEquals( 0, OgnlRuntime._propertyDescriptorCache.getSize( ) );
+        OgnlRuntime.clearCache();
+        assertEquals( 0, OgnlRuntime._propertyDescriptorCache.getSize() );
 
         // now register class cache prevention
 
-        OgnlRuntime.setClassCacheInspector( new TestCacheInspector( ) );
+        OgnlRuntime.setClassCacheInspector( new TestCacheInspector() );
 
         expr = Ognl.compileExpression( context, root, "property.bean3.value != null" );
-        assertTrue( (Boolean) expr.getAccessor( ).get( context, root ) );
+        assertTrue( (Boolean) expr.getAccessor().get( context, root ) );
 
-        assertEquals( ( size - 1 ), OgnlRuntime._propertyDescriptorCache.getSize( ) );
+        assertEquals( ( size - 1 ), OgnlRuntime._propertyDescriptorCache.getSize() );
     }
 
     class TestCacheInspector
@@ -264,7 +268,7 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void test_Set_Generic_Parameter_Types( )
+    public void test_Set_Generic_Parameter_Types()
         throws Exception
     {
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
@@ -272,13 +276,13 @@ public class TestOgnlRuntime
         Method m = OgnlRuntime.getSetMethod( context, GenericCracker.class, "param" );
         assertNotNull( m );
 
-        Class[] types = m.getParameterTypes( );
+        Class[] types = m.getParameterTypes();
         assertEquals( 1, types.length );
         assertEquals( Integer.class, types[0] );
     }
 
     @Test
-    public void test_Get_Generic_Parameter_Types( )
+    public void test_Get_Generic_Parameter_Types()
         throws Exception
     {
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
@@ -286,11 +290,11 @@ public class TestOgnlRuntime
         Method m = OgnlRuntime.getGetMethod( context, GenericCracker.class, "param" );
         assertNotNull( m );
 
-        assertEquals( Integer.class, m.getReturnType( ) );
+        assertEquals( Integer.class, m.getReturnType() );
     }
 
     @Test
-    public void test_Find_Parameter_Types( )
+    public void test_Find_Parameter_Types()
         throws Exception
     {
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
@@ -304,7 +308,7 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void test_Find_Parameter_Types_Superclass( )
+    public void test_Find_Parameter_Types_Superclass()
         throws Exception
     {
         OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
@@ -318,7 +322,7 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void test_Get_Declared_Methods_With_Synthetic_Methods( )
+    public void test_Get_Declared_Methods_With_Synthetic_Methods()
         throws Exception
     {
         List result = OgnlRuntime.getDeclaredMethods( SubclassSyntheticObject.class, "list", false );
@@ -327,17 +331,17 @@ public class TestOgnlRuntime
         // "public volatile java.util.List org.ognl.test.objects.SubclassSyntheticObject.getList()",
         // causing method return size to be 3
 
-        assertEquals( 2, result.size( ) );
+        assertEquals( 2, result.size() );
     }
 
     @Test
-    public void test_Get_Property_Descriptors_With_Synthetic_Methods( )
+    public void test_Get_Property_Descriptors_With_Synthetic_Methods()
         throws Exception
     {
         PropertyDescriptor pd = OgnlRuntime.getPropertyDescriptor( SubclassSyntheticObject.class, "list" );
 
         assert pd != null;
-        assert OgnlRuntime.isMethodCallable( pd.getReadMethod( ) );
+        assert OgnlRuntime.isMethodCallable( pd.getReadMethod() );
     }
 
     private static class GenericParent<T>
@@ -364,7 +368,7 @@ public class TestOgnlRuntime
      * Tests OGNL parameter discovery.
      */
     @Test
-    public void testOGNLParameterDiscovery( )
+    public void testOGNLParameterDiscovery()
         throws NoSuchMethodException, CacheException
     {
         Method saveMethod = GenericParent.class.getMethod( "save", Object.class );
@@ -380,7 +384,7 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void testGetField( )
+    public void testGetField()
         throws OgnlException
     {
         Field field = OgnlRuntime.getField( OtherObjectIndexed.class, "attributes" );
@@ -388,7 +392,7 @@ public class TestOgnlRuntime
     }
 
     @Test
-    public void testGetSetMethod( )
+    public void testGetSetMethod()
         throws IntrospectionException, OgnlException
     {
         Method setter = OgnlRuntime.getSetMethod( null, Bean1.class, "bean2" );
@@ -396,4 +400,14 @@ public class TestOgnlRuntime
         assertNotNull( getter );
         assertNull( setter );
     }
+
+    @Test
+    public void testGetCompiler()
+    {
+        OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
+        OgnlExpressionCompiler compiler1 = OgnlRuntime.getCompiler( context );
+        context.put( "root2", new Root() );
+        OgnlExpressionCompiler compiler2 = OgnlRuntime.getCompiler( context );
+        assertSame( "compilers are not the same", compiler1, compiler2 );
+    }
 }