Author: henrib
Date: Tue Nov 10 19:52:51 2009
New Revision: 834631
URL: http://svn.apache.org/viewvc?rev=834631&view=rev
Log:
Fixed test that breaks build (use introspection instead of direct dependency
upon com.sun.tools...);
Added invokeMethod on JexlEngine + test; completes the get/setProperty
Added tests to improve coverage
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/Interpreter.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlEngine.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreator.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreatorTest.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/Foo.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ForEachTest.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/MethodTest.java
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ScriptTest.java
commons/proper/jexl/trunk/xdocs/reference/examples.xml
commons/proper/jexl/trunk/xdocs/reference/syntax.xml
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/Interpreter.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/Interpreter.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/Interpreter.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/Interpreter.java
Tue Nov 10 19:52:51 2009
@@ -733,19 +733,6 @@
return map;
}
- /**
- * Replace all numbers in an arguments array with the smallest type that
will fit.
- * @param args the argument array
- */
- protected final void narrowArguments(Object[] args) {
- for (int a = 0; a < args.length; a++) {
- Object arg = args[a];
- if (arg instanceof Number) {
- args[a] = arithmetic.narrow((Number) arg);
- }
- }
- }
-
/** {...@inheritdoc} */
public Object visit(ASTMethodNode node, Object data) {
// the object to invoke the method on should be in the data argument
@@ -787,8 +774,9 @@
JexlMethod vm = uberspect.getMethod(data, methodName, argv, node);
// DG: If we can't find an exact match, narrow the parameters and
try again!
if (vm == null) {
- narrowArguments(argv);
- vm = uberspect.getMethod(data, methodName, argv, node);
+ if (arithmetic.narrowArguments(argv)) {
+ vm = uberspect.getMethod(data, methodName, argv, node);
+ }
if (vm == null) {
xjexl = new JexlException(node, "unknown or ambiguous
method", null);
}
@@ -826,9 +814,9 @@
// DG: If we can't find an exact match, narrow the parameters and
// try again!
if (ctor == null) {
- // replace all numbers with the smallest type that will fit
- narrowArguments(argv);
- ctor = uberspect.getConstructor(cobject, argv, node);
+ if (arithmetic.narrowArguments(argv)) {
+ ctor = uberspect.getConstructor(cobject, argv, node);
+ }
if (ctor == null) {
xjexl = new JexlException(node, "unknown constructor",
null);
}
@@ -880,8 +868,9 @@
// try again!
if (vm == null) {
// replace all numbers with the smallest type that will fit
- narrowArguments(argv);
- vm = uberspect.getMethod(namespace, function, argv, node);
+ if (arithmetic.narrowArguments(argv)) {
+ vm = uberspect.getMethod(namespace, function, argv, node);
+ }
if (vm == null) {
xjexl = new JexlException(node, "unknown function", null);
}
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlArithmetic.java
Tue Nov 10 19:52:51 2009
@@ -237,6 +237,27 @@
}
/**
+ * Replace all numbers in an arguments array with the smallest type that
will fit.
+ * @param args the argument array
+ * @return true if some arguments were narrowed and args array is modified,
+ * false if no narrowing occured and args array has not been
modified
+ */
+ protected boolean narrowArguments(Object[] args) {
+ boolean narrowed = false;
+ for (int a = 0; a < args.length; ++a) {
+ Object arg = args[a];
+ if (arg instanceof Number) {
+ Object narg = narrow((Number) arg);
+ if (narg != arg) {
+ narrowed = true;
+ }
+ args[a] = narg;
+ }
+ }
+ return narrowed;
+ }
+
+ /**
* Add two values together.
* <p>
* If any numeric add fails on coercion to the appropriate type,
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlEngine.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlEngine.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlEngine.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl/JexlEngine.java
Tue Nov 10 19:52:51 2009
@@ -39,8 +39,10 @@
import org.apache.commons.jexl.parser.TokenMgrError;
import org.apache.commons.jexl.parser.ASTJexlScript;
import org.apache.commons.jexl.util.Introspector;
+import org.apache.commons.jexl.util.introspection.DebugInfo;
import org.apache.commons.jexl.util.introspection.Uberspect;
import org.apache.commons.jexl.util.introspection.Info;
+import org.apache.commons.jexl.util.introspection.JexlMethod;
/**
* <p>
@@ -251,7 +253,7 @@
if (size <= 0) {
cache = null;
} else if (cache == null || cache.size() != size) {
- cache = new SoftCache<String,ASTJexlScript>(size);
+ cache = new SoftCache<String, ASTJexlScript>(size);
}
}
}
@@ -305,7 +307,7 @@
* expression nor a reference.
*/
public Expression createExpression(String expression)
- throws ParseException {
+ throws ParseException {
return createExpression(expression, null);
}
@@ -325,8 +327,7 @@
// Parse the expression
ASTJexlScript tree = parse(expression, info);
if (tree.jjtGetNumChildren() > 1) {
- logger.warn("The JEXL Expression created will be a reference"
- + " to the first expression from the supplied script: \""
+ expression + "\" ");
+ logger.warn("The JEXL Expression created will be a reference" + "
to the first expression from the supplied script: \"" + expression + "\" ");
}
return new ExpressionImpl(this, expression, tree);
}
@@ -545,6 +546,41 @@
}
/**
+ * Invokes an object's method by name and arguments.
+ * @param obj the method's invoker object
+ * @param meth the method's name
+ * @param args the method's arguments
+ * @return the method returned value or null if it failed and engine is
silent
+ * @throws JexlException if method could not be found or failed and engine
is not silent
+ */
+ public Object invokeMethod(Object obj, String meth, Object... args) {
+ JexlException xjexl = null;
+ Object result = null;
+ try {
+ JexlMethod method = uberspect.getMethod(obj, meth, args,
DebugInfo.NONE);
+ if (method == null && arithmetic.narrowArguments(args)) {
+ method = uberspect.getMethod(obj, meth, args, DebugInfo.NONE);
+ }
+ if (method != null) {
+ result = method.invoke(obj, args);
+ } else {
+ xjexl = new JexlException(null, "failed finding method " +
meth);
+ }
+ } catch (Exception xany) {
+ xjexl = new JexlException(null, "failed executing method " + meth,
xany);
+ } finally {
+ if (xjexl != null) {
+ if (silent) {
+ logger.warn(xjexl.getMessage(), xjexl.getCause());
+ return null;
+ }
+ throw xjexl;
+ }
+ }
+ return result;
+ }
+
+ /**
* Creates an interpreter.
* @param context a JexlContext; if null, the EMPTY_CONTEXT is used
instead.
* @return an Interpreter
@@ -556,22 +592,23 @@
return new Interpreter(this, context);
}
- /**
- * A soft reference on cache.
- * <p>The cache is held through a soft reference, allowing it to be GCed
under
- * memory pressure.</p>
- * @param <K> the cache key entry type
- * @param <V> the cache key value type
- */
- protected class SoftCache<K,V> {
- /**
- * The cache size.
- */
+ /**
+ * A soft reference on cache.
+ * <p>The cache is held through a soft reference, allowing it to be GCed
under
+ * memory pressure.</p>
+ * @param <K> the cache key entry type
+ * @param <V> the cache key value type
+ */
+ protected class SoftCache<K, V> {
+ /**
+ * The cache size.
+ */
private final int size;
/**
* The soft reference to the cache map.
*/
private SoftReference<Map<K, V>> ref = null;
+
/**
* Creates a new instance of a soft cache.
* @param theSize the cache size
@@ -593,9 +630,9 @@
* @return the cache entry set
*/
@SuppressWarnings("unchecked")
- Set<Entry<K,V>> entrySet() {
- Map<K, V> map = ref != null? ref.get() : null;
- return map != null? map.entrySet() : (Set<Entry<K,V>>)
Collections.EMPTY_SET;
+ Set<Entry<K, V>> entrySet() {
+ Map<K, V> map = ref != null ? ref.get() : null;
+ return map != null ? map.entrySet() : (Set<Entry<K, V>>)
Collections.EMPTY_SET;
}
/**
@@ -604,8 +641,8 @@
* @return the cache entry value
*/
V get(K key) {
- final Map<K, V> map = ref != null? ref.get() : null;
- return map != null? map.get(key) : null;
+ final Map<K, V> map = ref != null ? ref.get() : null;
+ return map != null ? map.get(key) : null;
}
/**
@@ -614,7 +651,7 @@
* @param script the cache entry value
*/
void put(K key, V script) {
- Map<K, V> map = ref != null? ref.get() : null;
+ Map<K, V> map = ref != null ? ref.get() : null;
if (map == null) {
map = createCache(size);
ref = new SoftReference<Map<K, V>>(map);
@@ -630,10 +667,11 @@
* @param cacheSize the cache size, must be > 0
* @return a Map usable as a cache bounded to the given size
*/
- protected <K,V> Map<K, V> createCache(final int cacheSize) {
+ protected <K, V> Map<K, V> createCache(final int cacheSize) {
return new java.util.LinkedHashMap<K, V>(cacheSize, LOAD_FACTOR, true)
{
/** Serial version UID. */
private static final long serialVersionUID = 3801124242820219131L;
+
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > cacheSize;
@@ -668,7 +706,7 @@
StackTraceElement[] stack = xinfo.getStackTrace();
StackTraceElement se = null;
Class<?> clazz = getClass();
- for(int s = 1; s < stack.length; ++s, se = null) {
+ for (int s = 1; s < stack.length; ++s, se = null) {
se = stack[s];
String className = se.getClassName();
if (!className.equals(clazz.getName())) {
@@ -687,7 +725,7 @@
}
}
if (se != null) {
- info = new
Info(se.getClassName()+"."+se.getMethodName(), se.getLineNumber(), 0);
+ info = new Info(se.getClassName() + "." +
se.getMethodName(), se.getLineNumber(), 0);
}
}
tree = parser.parse(reader, info);
@@ -749,4 +787,4 @@
}
}
-}
\ No newline at end of file
+}
Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreator.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreator.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreator.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreator.java
Tue Nov 10 19:52:51 2009
@@ -28,17 +28,33 @@
* load it through a dedicated class loader.
*/
public class ClassCreator {
+ private final JexlEngine jexl;
private final File base;
private File packageDir = null;
private int seed = 0;
private String className = null;
private String sourceName = null;
private ClassLoader loader = null;
+ public static final boolean canRun = comSunToolsJavacMain();
+ /**
+ * Check if we can invoke Sun's java compiler.
+ * @return true if it is possible, false otherwise
+ */
+ private static boolean comSunToolsJavacMain() {
+ try {
+ Class<?> javac =
ClassCreatorTest.class.getClassLoader().loadClass("com.sun.tools.javac.Main");
+ return javac != null;
+ } catch (Exception xany) {
+ return false;
+ }
+ }
- public ClassCreator(File theBase) throws Exception {
+ public ClassCreator(JexlEngine theJexl, File theBase) throws Exception {
+ jexl = theJexl;
base = theBase;
}
+
public void clear() {
seed = 0;
packageDir = null;
@@ -106,8 +122,13 @@
}
Class<?> compile() throws Exception {
- String[] source = {packageDir.getPath() + "/" + sourceName};
- if (com.sun.tools.javac.Main.compile(source) >= 0) {
+ String source = packageDir.getPath() + "/" + sourceName;
+ Class<?> javac =
getClassLoader().loadClass("com.sun.tools.javac.Main");
+ if (javac == null) {
+ return null;
+ }
+ Integer r = (Integer) jexl.invokeMethod(javac, "compile", source);
+ if (r >= 0) {
return
getClassLoader().loadClass("org.apache.commons.jexl.generated." + className);
}
return null;
Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreatorTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreatorTest.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreatorTest.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ClassCreatorTest.java
Tue Nov 10 19:52:51 2009
@@ -33,13 +33,14 @@
static final Log logger = LogFactory.getLog(JexlTestCase.class);
static final int LOOPS = 8;
private File base = null;
+ private JexlEngine jexl = null;
@Override
public void setUp() throws Exception {
- base = new File(System.getProperty("java.io.tmpdir")
- + File.pathSeparator
- + "jexl"
- + System.currentTimeMillis());
+ base = new File(System.getProperty("java.io.tmpdir") +
File.pathSeparator + "jexl" + System.currentTimeMillis());
+ jexl = new JexlEngine();
+ jexl.setCache(512);
+
}
@Override
@@ -72,7 +73,7 @@
return id;
}
}
-
+
// A soft reference on class
static final class ClassReference extends WeakReference<Class<?>> {
ClassReference(Class<?> clazz, ReferenceQueue<Object> queue) {
@@ -87,7 +88,11 @@
}
public void testOne() throws Exception {
- ClassCreator cctor = new ClassCreator(base);
+ // abort test if class creator can not run
+ if (!ClassCreator.canRun) {
+ return;
+ }
+ ClassCreator cctor = new ClassCreator(jexl, base);
cctor.setSeed(1);
Class<?> foo1 = cctor.createClass();
assertEquals("foo1", foo1.getSimpleName());
@@ -95,23 +100,25 @@
}
public void testMany() throws Exception {
+ // abort test if class creator can not run
+ if (!ClassCreator.canRun) {
+ return;
+ }
int pass = 0;
int gced = -1;
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
List<Reference<?>> stuff = new ArrayList<Reference<?>>();
// keeping a reference on methods prevent classes from being GCed
// List<Object> mm = new ArrayList<Object>();
- JexlEngine jexl = new JexlEngine();
- jexl.setCache(512);
Expression expr = jexl.createExpression("foo.value");
Expression newx = jexl.createExpression("foo = new(clazz)");
JexlContext context = JexlHelper.createContext();
- ClassCreator cctor = new ClassCreator(base);
+ ClassCreator cctor = new ClassCreator(jexl, base);
for (int i = 0; i < LOOPS && gced < 0; ++i) {
cctor.setSeed(i);
Class<?> clazz;
- if (pass ==0) {
+ if (pass == 0) {
clazz = cctor.createClass();
} else {
clazz = cctor.getClassInstance();
Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/Foo.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/Foo.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/Foo.java
(original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/Foo.java
Tue Nov 10 19:52:51 2009
@@ -17,6 +17,7 @@
package org.apache.commons.jexl;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
/**
@@ -31,6 +32,11 @@
private boolean beenModified = false;
private String property1 = "some value";
public Foo() {}
+ public class Cheezy {
+ public Iterator<String> iterator() {
+ return getCheeseList().iterator();
+ }
+ }
public String bar()
{
@@ -70,6 +76,11 @@
return answer;
}
+ public Cheezy getCheezy()
+ {
+ return new Cheezy();
+ }
+
public String[] getArray()
{
return ArrayAccessTest.GET_METHOD_ARRAY;
Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ForEachTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ForEachTest.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ForEachTest.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ForEachTest.java
Tue Nov 10 19:52:51 2009
@@ -120,5 +120,16 @@
Object o = e.evaluate(jc);
assertEquals("Result is not last evaluated expression", "brie", o);
}
+
+ public void testForEachWithIteratorMethod() throws Exception {
+ Expression e = JEXL.createExpression("for(item : list.cheezy) item");
+ JexlContext jc = JexlHelper.createContext();
+ jc.getVars().put("list", new Foo());
+ Object o = e.evaluate(jc);
+ assertEquals("Result is not last evaluated expression", "brie", o);
+ }
+ static public void main(String[] args) throws Exception {
+ (new ForEachTest("*")).runTest("testForEachWithIteratorMethod");
+ }
}
\ No newline at end of file
Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/MethodTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/MethodTest.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/MethodTest.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/MethodTest.java
Tue Nov 10 19:52:51 2009
@@ -48,6 +48,9 @@
public static int PLUS20(int num) {
return num + 20;
}
+ public static Class<?> NPEIfNull(Object x) {
+ return x.getClass();
+ }
}
@Override
@@ -60,6 +63,24 @@
asserter.assertExpression("test.testVarArgs(1,2,3,4,5)", "Test");
}
+ public void testInvoke() throws Exception {
+ Functor func = new Functor();
+ assertEquals(Integer.valueOf(10), JEXL.invokeMethod(func, "ten"));
+ assertEquals(Integer.valueOf(42), JEXL.invokeMethod(func, "PLUS20",
22));
+ try {
+ JEXL.invokeMethod(func, "nonExistentMethod");
+ fail("method does not exist!");
+ } catch(Exception xj0) {
+ // ignore
+ }
+ try {
+ JEXL.invokeMethod(func, "NPEIfNull", null);
+ fail("method should have thrown!");
+ } catch(Exception xj0) {
+ // ignore
+ }
+ }
+
/**
* test a simple method expression
*/
Modified:
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ScriptTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ScriptTest.java?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ScriptTest.java
(original)
+++
commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl/ScriptTest.java
Tue Nov 10 19:52:51 2009
@@ -52,8 +52,14 @@
* Test creating a script from a string.
*/
public void testSimpleScript() throws Exception {
+ simpleScript(true);
+ }
+ public void testLegacySimpleScript() throws Exception {
+ simpleScript(false);
+ }
+ private void simpleScript(boolean jexl) throws Exception {
String code = "while (x < 10) x = x + 1;";
- Script s = JEXL.createScript(code);
+ Script s = jexl? JEXL.createScript(code) :
ScriptFactory.createScript(code);
JexlContext jc = JexlHelper.createContext();
jc.getVars().put("x", new Integer(1));
@@ -61,10 +67,16 @@
assertEquals("Result is wrong", new Integer(10), o);
assertEquals("getText is wrong", code, s.getText());
}
-
+
public void testScriptFromFile() throws Exception {
+ scriptFromFile(true);
+ }
+ public void testLegacyScriptFromFile() throws Exception {
+ scriptFromFile(false);
+ }
+ private void scriptFromFile(boolean jexl) throws Exception {
File testScript = new File(TEST1);
- Script s = JEXL.createScript(testScript);
+ Script s = jexl? JEXL.createScript(testScript) :
ScriptFactory.createScript(testScript);
JexlContext jc = JexlHelper.createContext();
jc.getVars().put("out", System.out);
Object result = s.execute(jc);
@@ -73,19 +85,31 @@
}
public void testScriptFromURL() throws Exception {
+ scriptFromURL(true);
+ }
+ public void testLegacyScriptFromURL() throws Exception {
+ scriptFromURL(false);
+ }
+ private void scriptFromURL(boolean jexl) throws Exception {
URL testUrl = new File("src/test/scripts/test1.jexl").toURI().toURL();
- Script s = JEXL.createScript(testUrl);
+ Script s = jexl? JEXL.createScript(testUrl) :
ScriptFactory.createScript(testUrl);
JexlContext jc = JexlHelper.createContext();
jc.getVars().put("out", System.out);
Object result = s.execute(jc);
assertNotNull("No result", result);
assertEquals("Wrong result", new Integer(7), result);
}
-
+
public void testScriptUpdatesContext() throws Exception {
+ scriptUpdatesContext(true);
+ }
+ public void testLegacyScriptUpdatesContext() throws Exception {
+ scriptUpdatesContext(false);
+ }
+ private void scriptUpdatesContext(boolean jexl) throws Exception {
String jexlCode = "resultat.setCode('OK')";
- Expression e = JEXL.createExpression(jexlCode);
- Script s = JEXL.createScript(jexlCode);
+ Expression e = jexl? JEXL.createExpression(jexlCode) :
ExpressionFactory.createExpression(jexlCode);
+ Script s = jexl? JEXL.createScript(jexlCode) :
ScriptFactory.createScript(jexlCode);
Tester resultatJexl = new Tester();
JexlContext jc = JexlHelper.createContext();
@@ -98,4 +122,5 @@
s.execute(jc);
assertEquals("OK", resultatJexl.getCode());
}
+
}
Modified: commons/proper/jexl/trunk/xdocs/reference/examples.xml
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/xdocs/reference/examples.xml?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
--- commons/proper/jexl/trunk/xdocs/reference/examples.xml (original)
+++ commons/proper/jexl/trunk/xdocs/reference/examples.xml Tue Nov 10 19:52:51
2009
@@ -18,7 +18,7 @@
<document>
<properties>
- <title>Commons JEXL Examples</title>
+ <title>Commons JEXL 1.0 Examples</title>
</properties>
<body>
Modified: commons/proper/jexl/trunk/xdocs/reference/syntax.xml
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/xdocs/reference/syntax.xml?rev=834631&r1=834630&r2=834631&view=diff
==============================================================================
--- commons/proper/jexl/trunk/xdocs/reference/syntax.xml (original)
+++ commons/proper/jexl/trunk/xdocs/reference/syntax.xml Tue Nov 10 19:52:51
2009
@@ -170,6 +170,13 @@
with <code>]</code>, e.g.
<source>[ 1, 2, "three" ]</source>
<p>This syntax creates an <code>Object[]</code>.</p>
+ <p>
+ JEXL will attempt to strongly type the array; if all entries are
of the same class or if all
+ entries are Number instance, the array literal will be an
<code>MyClass[]</code> in the former
+ case, a <code>Number[]</code> in the latter case.</p>
+ <p>Furthermore, if all entries in the array literal are of the
same class
+ and that class has an equivalent primitive type, the array
returned will be a primitive array. e.g.
+ <code>[1, 2, 3]</code> will be interpreted as
<code>int[]</code>.</p>
</td>
</tr>
<tr>