You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by si...@apache.org on 2011/10/23 13:35:11 UTC
svn commit: r1187867 - in /commons/proper/ognl/trunk/src: changes/
main/java/org/apache/commons/ognl/ main/java/org/apache/commons/ognl/enhance/
test/java/org/apache/commons/ognl/ test/java/org/apache/commons/ognl/test/
test/java/org/apache/commons/ogn...
Author: simonetripodi
Date: Sun Oct 23 11:35:10 2011
New Revision: 1187867
URL: http://svn.apache.org/viewvc?rev=1187867&view=rev
Log:
[OGNL-23] Class.forName() usage is malicious inside OSGi (contributed by Adrian Cumiskey)
Modified:
commons/proper/ognl/trunk/src/changes/changes.xml
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAnd.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAssign.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTChain.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTCtor.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTList.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMap.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMethod.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTOr.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTProperty.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/ASTTest.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTVarRef.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ClassResolver.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/DefaultClassResolver.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ObjectPropertyAccessor.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlContext.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlRuntime.java
commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/enhance/ExpressionCompiler.java
commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/TestOgnlRuntime.java
commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/ASTMethodTest.java
commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/objects/BeanProviderAccessor.java
Modified: commons/proper/ognl/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/changes/changes.xml?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/changes/changes.xml (original)
+++ commons/proper/ognl/trunk/src/changes/changes.xml Sun Oct 23 11:35:10 2011
@@ -26,6 +26,7 @@
<action issue="OGNL-28" type="update" dev="mcucchiara">Visitor pattern needs way to propagate exceptions (contributed by Daniel Pitts).</action>
<action issue="OGNL-27" type="update" dev="simonetripodi">Move "toString" implementations into visitor pattern (contributed by Daniel Pitts).</action>
<action issue="OGNL-26" type="update" dev="grobmeier">JUnit Tests produce confusing output.</action>
+ <action issue="OGNL-23" type="fix" dev="simonetripodi">Class.forName() usage is malicious inside OSGi (contributed by Adrian Cumiskey)</action>
<action issue="OGNL-21" type="update" dev="grobmeier">Remove dead and broken code from OgnlRuntime/SimpleNode (with contributions by Daniel Pitts)</action>
<action issue="OGNL-24" type="update" dev="grobmeier">Support visitor pattern on AST (contributed by Daniel Pitts)</action>
<action issue="OGNL-15" type="update" dev="simonetripodi">OGNL needs a new Logo</action>
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAnd.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAnd.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAnd.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAnd.java Sun Oct 23 11:35:10 2011
@@ -143,13 +143,13 @@ public class ASTAnd
if ( !OgnlRuntime.isBoolean( first ) && !context.getCurrentType().isPrimitive() )
{
- first = OgnlRuntime.getCompiler().createLocalReference( context, first, context.getCurrentType() );
+ first = OgnlRuntime.getCompiler( context ).createLocalReference( context, first, context.getCurrentType() );
}
String second = OgnlRuntime.getChildSource( context, target, _children[1] );
if ( !OgnlRuntime.isBoolean( second ) && !context.getCurrentType().isPrimitive() )
{
- second = OgnlRuntime.getCompiler().createLocalReference( context, second, context.getCurrentType() );
+ second = OgnlRuntime.getCompiler( context ).createLocalReference( context, second, context.getCurrentType() );
}
result += "(org.apache.commons.ognl.OgnlOps.booleanValue(" + first + ")";
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAssign.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAssign.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAssign.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTAssign.java Sun Oct 23 11:35:10 2011
@@ -57,7 +57,7 @@ class ASTAssign
if ( ASTProperty.class.isInstance( _children[1] ) )
{
- second += "((" + OgnlRuntime.getCompiler().getClassName( target.getClass() ) + ")$2).";
+ second += "((" + OgnlRuntime.getCompiler( context ).getClassName( target.getClass() ) + ")$2).";
}
second += _children[1].toGetSourceString( context, target );
@@ -75,7 +75,7 @@ class ASTAssign
}
second =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"org.apache.commons.ognl.OgnlOps.returnValue(($w)"
+ core + ", ($w) " + seq.getLastExpression() + ")",
Object.class );
@@ -99,7 +99,7 @@ class ASTAssign
result =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context,
"org.apache.commons.ognl.OgnlOps.returnValue(($w)" + result + ", ($w)"
+ ( (OrderedReturn) _children[0] ).getLastExpression() + ")",
@@ -117,7 +117,7 @@ class ASTAssign
if ( ASTProperty.class.isInstance( _children[1] ) )
{
- result += "((" + OgnlRuntime.getCompiler().getClassName( target.getClass() ) + ")$2).";
+ result += "((" + OgnlRuntime.getCompiler( context ).getClassName( target.getClass() ) + ")$2).";
}
String value = _children[1].toSetSourceString( context, target );
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTChain.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTChain.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTChain.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTChain.java Sun Oct 23 11:35:10 2011
@@ -326,7 +326,7 @@ public class ASTChain
&& ( (OrderedReturn) _children[i] ).getLastExpression() != null )
&& ( _parent == null || !ASTSequence.class.isInstance( _parent ) ) )
{
- value = OgnlRuntime.getCompiler().castExpression( context, _children[i], value );
+ value = OgnlRuntime.getCompiler( context ).castExpression( context, _children[i], value );
}
/*
@@ -454,7 +454,7 @@ public class ASTChain
&& ( (OrderedReturn) _children[i] ).getLastExpression() != null )
&& ( _parent == null || !ASTSequence.class.isInstance( _parent ) ) )
{
- value = OgnlRuntime.getCompiler().castExpression( context, _children[i], value );
+ value = OgnlRuntime.getCompiler( context ).castExpression( context, _children[i], value );
}
// System.out.println("astchain setter after cast value is: " + value);
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTCtor.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTCtor.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTCtor.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTCtor.java Sun Oct 23 11:35:10 2011
@@ -320,7 +320,7 @@ public class ASTCtor
{
value =
- "(" + OgnlRuntime.getCompiler().getInterfaceClass( values[i].getClass() ).getName()
+ "(" + OgnlRuntime.getCompiler( context ).getInterfaceClass( values[i].getClass() ).getName()
+ ")" + value;
}
else if ( !ASTConst.class.isInstance( _children[i] )
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTList.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTList.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTList.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTList.java Sun Oct 23 11:35:10 2011
@@ -143,7 +143,7 @@ public class ASTList
value =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "(" + ExpressionCompiler.getCastString( ctorClass )
+ ")org.apache.commons.ognl.OgnlOps.toArray(" + value + ", "
+ ctorClass.getComponentType().getName() + ".class, true)", ctorClass );
@@ -156,7 +156,7 @@ public class ASTList
value =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "((" + wrapClass.getName()
+ ")org.apache.commons.ognl.OgnlOps.convertValue(" + value + ","
+ wrapClass.getName() + ".class, true))." + OgnlRuntime.getNumericValueGetter(
@@ -167,7 +167,7 @@ public class ASTList
value =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "(" + ctorClass.getName()
+ ")org.apache.commons.ognl.OgnlOps.convertValue(" + value + ","
+ ctorClass.getName() + ".class)", ctorClass );
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMap.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMap.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMap.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTMap.java Sun Oct 23 11:35:10 2011
@@ -32,23 +32,9 @@ import java.util.Map;
class ASTMap
extends SimpleNode
{
-
- private static Class defaultMapClass;
-
private String className;
- static
- {
- /* Try to get LinkedHashMap; if older JDK than 1.4 use HashMap */
- try
- {
- defaultMapClass = Class.forName( "java.util.LinkedHashMap" );
- }
- catch ( ClassNotFoundException ex )
- {
- defaultMapClass = HashMap.class;
- }
- }
+ private Map<OgnlContext, Class> defaultMapClassMap = new HashMap<OgnlContext, Class>();
public ASTMap( int id )
{
@@ -83,6 +69,7 @@ class ASTMap
if ( className == null )
{
+ Class defaultMapClass = getDefaultMapClass( context );
try
{
answer = (Map) defaultMapClass.newInstance();
@@ -132,4 +119,23 @@ class ASTMap
{
return visitor.visit( this, data );
}
+
+ private Class getDefaultMapClass( OgnlContext context ) {
+ Class defaultMapClass = defaultMapClassMap.get( context );
+ if (defaultMapClass != null) {
+ return defaultMapClass;
+ }
+
+ /* Try to get LinkedHashMap; if older JDK than 1.4 use HashMap */
+ try
+ {
+ defaultMapClass = OgnlRuntime.classForName( context, "java.util.LinkedHashMap" );
+ }
+ catch ( ClassNotFoundException ex )
+ {
+ defaultMapClass = HashMap.class;
+ }
+ defaultMapClassMap.put( context, defaultMapClass );
+ return defaultMapClass;
+ }
}
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=1187867&r1=1187866&r2=1187867&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 Sun Oct 23 11:35:10 2011
@@ -191,7 +191,7 @@ public class ASTMethod
context.setCurrentType( m.getReturnType() );
context.setCurrentAccessor(
- OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
coreExpression = toSetSourceString( context, target );
if ( coreExpression == null || coreExpression.length() < 1 )
@@ -293,7 +293,7 @@ public class ASTMethod
parmString =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "(" + ExpressionCompiler.getCastString( parms[i] )
+ ")org.apache.commons.ognl.OgnlOps#toArray(" + parmString + ", "
+ parms[i].getComponentType().getName() + ".class, true)", parms[i] );
@@ -306,7 +306,7 @@ public class ASTMethod
parmString =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "((" + wrapClass.getName()
+ ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
+ wrapClass.getName() + ".class, true))." + OgnlRuntime.getNumericValueGetter(
@@ -317,7 +317,7 @@ public class ASTMethod
{
parmString =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "(" + parms[i].getName()
+ ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
+ parms[i].getName() + ".class)", parms[i] );
@@ -369,7 +369,7 @@ public class ASTMethod
}
context.setCurrentType( m.getReturnType() );
- context.setCurrentAccessor( OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ context.setCurrentAccessor( OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
return result;
}
@@ -489,7 +489,7 @@ public class ASTMethod
{
parmString =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "(" + ExpressionCompiler.getCastString( parms[i] )
+ ")org.apache.commons.ognl.OgnlOps#toArray(" + parmString + ", "
+ parms[i].getComponentType().getName() + ".class)", parms[i] );
@@ -501,7 +501,7 @@ public class ASTMethod
parmString =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "((" + wrapClass.getName()
+ ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
+ wrapClass.getName() + ".class, true))." + OgnlRuntime.getNumericValueGetter(
@@ -512,7 +512,7 @@ public class ASTMethod
{
parmString =
OgnlRuntime
- .getCompiler()
+ .getCompiler( context )
.createLocalReference( context, "(" + parms[i].getName()
+ ")org.apache.commons.ognl.OgnlOps#convertValue(" + parmString + ","
+ parms[i].getName() + ".class)", parms[i] );
@@ -557,7 +557,7 @@ public class ASTMethod
}
context.setCurrentType( m.getReturnType() );
- context.setCurrentAccessor( OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ context.setCurrentAccessor( OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
return result + ")" + post;
}
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTOr.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTOr.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTOr.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTOr.java Sun Oct 23 11:35:10 2011
@@ -101,7 +101,7 @@ public class ASTOr
String first = OgnlRuntime.getChildSource( context, target, _children[0] );
if ( !OgnlRuntime.isBoolean( first ) )
{
- first = OgnlRuntime.getCompiler().createLocalReference( context, first, context.getCurrentType() );
+ first = OgnlRuntime.getCompiler( context ).createLocalReference( context, first, context.getCurrentType() );
}
Class firstType = context.getCurrentType();
@@ -109,7 +109,7 @@ public class ASTOr
String second = OgnlRuntime.getChildSource( context, target, _children[1] );
if ( !OgnlRuntime.isBoolean( second ) )
{
- second = OgnlRuntime.getCompiler().createLocalReference( context, second, context.getCurrentType() );
+ second = OgnlRuntime.getCompiler( context ).createLocalReference( context, second, context.getCurrentType() );
}
Class secondType = context.getCurrentType();
@@ -167,7 +167,7 @@ public class ASTOr
+ _children[0].toGetSourceString( context, target );
if ( !OgnlRuntime.isBoolean( first ) )
{
- first = OgnlRuntime.getCompiler().createLocalReference( context, first, Object.class );
+ first = OgnlRuntime.getCompiler( context ).createLocalReference( context, first, Object.class );
}
_children[1].getValue( context, target );
@@ -176,7 +176,7 @@ public class ASTOr
+ _children[1].toSetSourceString( context, target );
if ( !OgnlRuntime.isBoolean( second ) )
{
- second = OgnlRuntime.getCompiler().createLocalReference( context, second, context.getCurrentType() );
+ second = OgnlRuntime.getCompiler( context ).createLocalReference( context, second, context.getCurrentType() );
}
result += "org.apache.commons.ognl.OgnlOps.booleanValue(" + first + ")";
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTProperty.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTProperty.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTProperty.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTProperty.java Sun Oct 23 11:35:10 2011
@@ -85,7 +85,7 @@ public class ASTProperty
{
return OgnlRuntime.getIndexedPropertyType(
context,
- ( source == null ) ? null : OgnlRuntime.getCompiler().getInterfaceClass( source.getClass() ),
+ ( source == null ) ? null : OgnlRuntime.getCompiler( context ).getInterfaceClass( source.getClass() ),
(String) property );
}
}
@@ -206,7 +206,7 @@ public class ASTProperty
context.setCurrentType( getterClass );
context.setCurrentObject( indexedValue );
context.setCurrentAccessor(
- OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
return "." + m.getName() + "(" + srcString + ")";
}
@@ -403,7 +403,7 @@ public class ASTProperty
context.setCurrentType( m.getReturnType() );
context.setCurrentAccessor(
- OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
}
context.setCurrentObject( target );
@@ -501,7 +501,7 @@ public class ASTProperty
}
context.setCurrentType( setterClass );
context.setCurrentAccessor(
- OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
if ( !lastChild )
{
@@ -598,7 +598,7 @@ public class ASTProperty
PropertyDescriptor pd =
OgnlRuntime.getPropertyDescriptor(
- OgnlRuntime.getCompiler().getInterfaceClass(
+ OgnlRuntime.getCompiler( context ).getInterfaceClass(
context.getCurrentObject().getClass() ), name );
if ( pd != null )
@@ -723,7 +723,7 @@ public class ASTProperty
{
context.setCurrentType( m.getReturnType() );
context.setCurrentAccessor(
- OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
}
return result;
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=1187867&r1=1187866&r2=1187867&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 Sun Oct 23 11:35:10 2011
@@ -167,7 +167,7 @@ public class ASTStaticMethod
if ( parms[i].isArray() )
{
parmString =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"("
+ ExpressionCompiler.getCastString( parms[i] )
+ ")org.apache.commons.ognl.OgnlOps.toArray("
@@ -182,7 +182,7 @@ public class ASTStaticMethod
Class wrapClass = OgnlRuntime.getPrimitiveWrapperClass( parms[i] );
parmString =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"(("
+ wrapClass.getName()
+ ")org.apache.commons.ognl.OgnlOps.convertValue("
@@ -197,7 +197,7 @@ public class ASTStaticMethod
else if ( parms[i] != Object.class )
{
parmString =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"("
+ parms[i].getName()
+ ")org.apache.commons.ognl.OgnlOps.convertValue("
@@ -240,7 +240,7 @@ public class ASTStaticMethod
context.setCurrentType( m.getReturnType() );
context.setCurrentAccessor(
- OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
}
}
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTTest.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTTest.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTTest.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTTest.java Sun Oct 23 11:35:10 2011
@@ -81,7 +81,7 @@ class ASTTest
String first = OgnlRuntime.getChildSource( context, target, _children[0] );
if ( !OgnlRuntime.isBoolean( first ) && !context.getCurrentType().isPrimitive() )
{
- first = OgnlRuntime.getCompiler().createLocalReference( context, first, context.getCurrentType() );
+ first = OgnlRuntime.getCompiler( context ).createLocalReference( context, first, context.getCurrentType() );
}
if ( ExpressionNode.class.isInstance( _children[0] ) )
@@ -94,7 +94,7 @@ class ASTTest
if ( !OgnlRuntime.isBoolean( second ) && !context.getCurrentType().isPrimitive() )
{
- second = OgnlRuntime.getCompiler().createLocalReference( context, second, context.getCurrentType() );
+ second = OgnlRuntime.getCompiler( context ).createLocalReference( context, second, context.getCurrentType() );
}
if ( ExpressionNode.class.isInstance( _children[1] ) )
@@ -107,7 +107,7 @@ class ASTTest
if ( !OgnlRuntime.isBoolean( third ) && !context.getCurrentType().isPrimitive() )
{
- third = OgnlRuntime.getCompiler().createLocalReference( context, third, context.getCurrentType() );
+ third = OgnlRuntime.getCompiler( context ).createLocalReference( context, third, context.getCurrentType() );
}
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTVarRef.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTVarRef.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTVarRef.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ASTVarRef.java Sun Oct 23 11:35:10 2011
@@ -122,7 +122,7 @@ public class ASTVarRef
String post = "";
if ( context.getCurrentType() != null )
{
- pre = "((" + OgnlRuntime.getCompiler().getInterfaceClass( context.getCurrentType() ).getName() + ")";
+ pre = "((" + OgnlRuntime.getCompiler( context ).getInterfaceClass( context.getCurrentType() ).getName() + ")";
post = ")";
}
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ClassResolver.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ClassResolver.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ClassResolver.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ClassResolver.java Sun Oct 23 11:35:10 2011
@@ -22,7 +22,7 @@ package org.apache.commons.ognl;
import java.util.Map;
/**
- * This interface defines an object that will resolve a class from a string and a ognl context table.
+ * This interface defines an object that will resolve a class from a string and an ognl context table.
*
* @author Luke Blanshard (blanshlu@netscape.net)
* @author Drew Davidson (drew@ognl.org)
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/DefaultClassResolver.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/DefaultClassResolver.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/DefaultClassResolver.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/DefaultClassResolver.java Sun Oct 23 11:35:10 2011
@@ -23,7 +23,7 @@ import java.util.HashMap;
import java.util.Map;
/**
- * Default class resolution. Uses Class.forName() to look up classes by name. It also looks in the "java.lang" package
+ * Default class resolution. Uses ClassLoader.loadClass() to look up classes by name. It also looks in the "java.lang" package
* if the class named does not give a package specifier, allowing easier usage of these classes.
*
* @author Luke Blanshard (blanshlu@netscape.net)
@@ -35,24 +35,38 @@ public class DefaultClassResolver
private final Map<String, Class<?>> classes = new HashMap<String, Class<?>>( 101 );
/**
+ * Resolves a class for a given className
+ *
+ * @param className The name of the Class
+ * @return The resulting Class object
+ * @throws ClassNotFoundException If the class could not be found
+ */
+ public Class<?> classForName( String className )
+ throws ClassNotFoundException
+ {
+ return classForName( className, null );
+ }
+
+ /**
* {@inheritDoc}
*/
- public Class<?> classForName( String className, Map<String, Object> context )
+ public Class<?> classForName( String className, Map<String, Object> unused )
throws ClassNotFoundException
{
Class<?> result = classes.get( className );
if ( result == null )
{
+ ClassLoader classLoader = ClassLoader.getSystemClassLoader();
try
{
- result = Class.forName( className );
+ result = classLoader.loadClass(className);
}
catch ( ClassNotFoundException ex )
{
if ( className.indexOf( '.' ) == -1 )
{
- result = Class.forName( "java.lang." + className );
+ result = classLoader.loadClass( "java.lang." + className );
classes.put( "java.lang." + className, result );
}
}
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ObjectPropertyAccessor.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ObjectPropertyAccessor.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ObjectPropertyAccessor.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/ObjectPropertyAccessor.java Sun Oct 23 11:35:10 2011
@@ -262,7 +262,7 @@ public class ObjectPropertyAccessor
}
context.setCurrentType( m.getReturnType() );
- context.setCurrentAccessor( OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ context.setCurrentAccessor( OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
return "." + m.getName() + "()";
@@ -303,7 +303,7 @@ public class ObjectPropertyAccessor
{
Class<?> wrapClass = OgnlRuntime.getPrimitiveWrapperClass( parm );
conversion =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"(("
+ wrapClass.getName()
+ ")org.apache.commons.ognl.OgnlOps#convertValue($3,"
@@ -315,7 +315,7 @@ public class ObjectPropertyAccessor
else if ( parm.isArray() )
{
conversion =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"("
+ ExpressionCompiler.getCastString( parm )
+ ")org.apache.commons.ognl.OgnlOps#toArray($3,"
@@ -326,7 +326,7 @@ public class ObjectPropertyAccessor
else
{
conversion =
- OgnlRuntime.getCompiler().createLocalReference( context,
+ OgnlRuntime.getCompiler( context ).createLocalReference( context,
"("
+ parm.getName()
+ ")org.apache.commons.ognl.OgnlOps#convertValue($3,"
@@ -334,7 +334,7 @@ public class ObjectPropertyAccessor
}
context.setCurrentType( m.getReturnType() );
- context.setCurrentAccessor( OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
+ context.setCurrentAccessor( OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, m.getDeclaringClass() ) );
return "." + m.getName() + "(" + conversion + ")";
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlContext.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlContext.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlContext.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/OgnlContext.java Sun Oct 23 11:35:10 2011
@@ -65,7 +65,7 @@ public class OgnlContext
private static boolean DEFAULT_KEEP_LAST_EVALUATION = false;
- public static final ClassResolver DEFAULT_CLASS_RESOLVER = new DefaultClassResolver();
+ public static final DefaultClassResolver DEFAULT_CLASS_RESOLVER = new DefaultClassResolver();
public static final TypeConverter DEFAULT_TYPE_CONVERTER = new DefaultTypeConverter();
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=1187867&r1=1187866&r2=1187867&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 Sun Oct 23 11:35:10 2011
@@ -188,6 +188,9 @@ public class OgnlRuntime
static final IntHashMap<Integer, Boolean> _methodPermCache = new IntHashMap<Integer, Boolean>();
+ static final Map<OgnlContext, OgnlExpressionCompiler> expressionCompilerMap = new HashMap<OgnlContext, OgnlExpressionCompiler>();
+
+
static ClassCacheInspector _cacheInspector;
/**
@@ -195,24 +198,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<?>>();
/**
@@ -430,7 +415,7 @@ public class OgnlRuntime
try
{
- Class.forName( "java.lang.annotation.Annotation" );
+ OgnlRuntime.classForName( null, "java.lang.annotation.Annotation" );
_jdk15 = true;
}
catch ( Exception e )
@@ -467,15 +452,38 @@ public class OgnlRuntime
_compiler = compiler;
}
+ /**
+ * @deprecated use getCompiler(OgnlContext) instead
+ */
public static OgnlExpressionCompiler getCompiler()
{
- return _compiler;
+ return _compiler != null ? _compiler : getCompiler( null );
+ }
+
+ public static OgnlExpressionCompiler getCompiler( OgnlContext ognlContext )
+ {
+ OgnlExpressionCompiler ognlExpressionCompiler = expressionCompilerMap.get(ognlContext);
+ if (ognlExpressionCompiler == null) {
+ try
+ {
+ OgnlRuntime.classForName( ognlContext, "javassist.ClassPool" );
+ ognlExpressionCompiler = new ExpressionCompiler();
+ expressionCompilerMap.put(ognlContext, ognlExpressionCompiler);
+ }
+ catch ( ClassNotFoundException e )
+ {
+ throw new IllegalArgumentException(
+ "Javassist library is missing in classpath! Please add missed dependency!",
+ e );
+ }
+ }
+ return ognlExpressionCompiler;
}
public static void compileExpression( OgnlContext context, Node expression, Object root )
throws Exception
{
- _compiler.compileExpression( context, expression, root );
+ getCompiler( context ).compileExpression( context, expression, root );
}
/**
Modified: commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/enhance/ExpressionCompiler.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/enhance/ExpressionCompiler.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/enhance/ExpressionCompiler.java (original)
+++ commons/proper/ognl/trunk/src/main/java/org/apache/commons/ognl/enhance/ExpressionCompiler.java Sun Oct 23 11:35:10 2011
@@ -156,7 +156,7 @@ public class ExpressionCompiler
|| ( root != null && ASTRootVarRef.class.isInstance( expression ) ) )
{
- Class<?> castClass = OgnlRuntime.getCompiler().getRootExpressionClass( expression, context );
+ Class<?> castClass = OgnlRuntime.getCompiler( context ).getRootExpressionClass( expression, context );
if ( castClass.isArray() || ASTRootVarRef.class.isInstance( expression )
|| ASTThisVarRef.class.isInstance( expression ) )
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=1187867&r1=1187866&r2=1187867&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 Sun Oct 23 11:35:10 2011
@@ -45,7 +45,8 @@ public class TestOgnlRuntime
Method m = OgnlRuntime.getReadMethod( list.getClass(), "total" );
assertNotNull( m );
- assertEquals( ListSource.class, OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, list.getClass() ) );
+ OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
+ assertEquals( ListSource.class, OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, list.getClass() ) );
}
@Test
@@ -57,7 +58,8 @@ public class TestOgnlRuntime
Method m = OgnlRuntime.getReadMethod( list.getClass(), "iterator" );
assertNotNull( m );
- assertEquals( Iterable.class, OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, list.getClass() ) );
+ OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
+ assertEquals( Iterable.class, OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, list.getClass() ) );
}
@Test
@@ -69,7 +71,8 @@ public class TestOgnlRuntime
Method m = OgnlRuntime.getWriteMethod( form.getClass(), "clientId" );
assertNotNull( m );
- assertEquals( IComponent.class, OgnlRuntime.getCompiler().getSuperOrInterfaceClass( m, form.getClass() ) );
+ OgnlContext context = (OgnlContext) Ognl.createDefaultContext( null );
+ assertEquals( IComponent.class, OgnlRuntime.getCompiler( context ).getSuperOrInterfaceClass( m, form.getClass() ) );
}
@Test
Modified: commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/ASTMethodTest.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/ASTMethodTest.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/ASTMethodTest.java (original)
+++ commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/ASTMethodTest.java Sun Oct 23 11:35:10 2011
@@ -59,7 +59,7 @@ public class ASTMethodTest
assert Map.class.isAssignableFrom( context.getPreviousType() );
assert context.getPreviousAccessor() == null;
- assertEquals( OgnlRuntime.getCompiler().castExpression( context, p, ".get(\"value\")" ), ".get(\"value\")" );
+ assertEquals( OgnlRuntime.getCompiler( context ).castExpression( context, p, ".get(\"value\")" ), ".get(\"value\")" );
assert context.get( ExpressionCompiler.PRE_CAST ) == null;
// now test one context level further to see casting work properly on base object types
@@ -79,7 +79,7 @@ public class ASTMethodTest
assertEquals( Object.class, context.getPreviousType() );
assert Map.class.isAssignableFrom( context.getPreviousAccessor() );
- assertEquals( OgnlRuntime.getCompiler().castExpression( context, prop, ".getBean3()" ), ").getBean3()" );
+ assertEquals( OgnlRuntime.getCompiler( context ).castExpression( context, prop, ".getBean3()" ), ").getBean3()" );
}
}
Modified: commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/objects/BeanProviderAccessor.java
URL: http://svn.apache.org/viewvc/commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/objects/BeanProviderAccessor.java?rev=1187867&r1=1187866&r2=1187867&view=diff
==============================================================================
--- commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/objects/BeanProviderAccessor.java (original)
+++ commons/proper/ognl/trunk/src/test/java/org/apache/commons/ognl/test/objects/BeanProviderAccessor.java Sun Oct 23 11:35:10 2011
@@ -76,7 +76,7 @@ public class BeanProviderAccessor
ExpressionCompiler.addCastString( context,
"(("
- + OgnlRuntime.getCompiler().getInterfaceClass( provider.getBean( beanName ).getClass() ).getName()
+ + OgnlRuntime.getCompiler( context ).getInterfaceClass( provider.getBean( beanName ).getClass() ).getName()
+ ")" );
return ".getBean(\"" + beanName + "\"))";