Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 59103200B4C for ; Fri, 22 Jul 2016 09:32:58 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 57CF7160A77; Fri, 22 Jul 2016 07:32:58 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 807E3160A5A for ; Fri, 22 Jul 2016 09:32:57 +0200 (CEST) Received: (qmail 13590 invoked by uid 500); 22 Jul 2016 07:32:54 -0000 Mailing-List: contact commits-help@velocity.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@velocity.apache.org Delivered-To: mailing list commits@velocity.apache.org Received: (qmail 13506 invoked by uid 99); 22 Jul 2016 07:32:54 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd3-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 22 Jul 2016 07:32:54 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd3-us-west.apache.org (ASF Mail Server at spamd3-us-west.apache.org) with ESMTP id 703EB186FAA for ; Fri, 22 Jul 2016 07:32:54 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd3-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 0.374 X-Spam-Level: X-Spam-Status: No, score=0.374 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RP_MATCHES_RCVD=-1.426] autolearn=disabled Received: from mx2-lw-us.apache.org ([10.40.0.8]) by localhost (spamd3-us-west.apache.org [10.40.0.10]) (amavisd-new, port 10024) with ESMTP id rT4R3oA-6EWf for ; Fri, 22 Jul 2016 07:32:53 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx2-lw-us.apache.org (ASF Mail Server at mx2-lw-us.apache.org) with ESMTP id BA9DA5FBB5 for ; Fri, 22 Jul 2016 07:32:52 +0000 (UTC) Received: from svn01-us-west.apache.org (svn.apache.org [10.41.0.6]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id C97C0E05CC for ; Fri, 22 Jul 2016 07:32:51 +0000 (UTC) Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id F0A0A3A01DD for ; Fri, 22 Jul 2016 07:32:50 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1753755 - in /velocity/engine/trunk/velocity-engine-core/src: main/java/org/apache/velocity/runtime/parser/node/ main/java/org/apache/velocity/util/ main/java/org/apache/velocity/util/introspection/ test/java/org/apache/velocity/test/ Date: Fri, 22 Jul 2016 07:32:50 -0000 To: commits@velocity.apache.org From: cbrisson@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20160722073250.F0A0A3A01DD@svn01-us-west.apache.org> archived-at: Fri, 22 Jul 2016 07:32:58 -0000 Author: cbrisson Date: Fri Jul 22 07:32:50 2016 New Revision: 1753755 URL: http://svn.apache.org/viewvc?rev=1753755&view=rev Log: [engine] support .empty; fixes VELOCITY-843 Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java?rev=1753755&r1=1753754&r2=1753755&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/BooleanPropertyExecutor.java Fri Jul 22 07:32:50 2016 @@ -46,9 +46,23 @@ public class BooleanPropertyExecutor ext * @since 1.5 */ public BooleanPropertyExecutor(final Logger log, final Introspector introspector, - final Class clazz, final String property) + final Class clazz, final String property) { - super(log, introspector, clazz, property); + this(log, introspector, clazz, property, false); + } + + /** + * @param log + * @param introspector + * @param clazz + * @param property + * @maram wrapArray + * @since 1.5 + */ + public BooleanPropertyExecutor(final Logger log, final Introspector introspector, + final Class clazz, final String property, final boolean wrapArray) + { + super(log, introspector, clazz, property, wrapArray); } protected void discover(final Class clazz, final String property) Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java?rev=1753755&r1=1753754&r2=1753755&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/runtime/parser/node/PropertyExecutor.java Fri Jul 22 07:32:50 2016 @@ -21,6 +21,7 @@ package org.apache.velocity.runtime.pars import org.apache.commons.lang3.StringUtils; import org.apache.velocity.exception.VelocityException; +import org.apache.velocity.util.ArrayListWrapper; import org.apache.velocity.util.introspection.Introspector; import org.slf4j.Logger; @@ -32,6 +33,7 @@ import java.lang.reflect.InvocationTarge public class PropertyExecutor extends AbstractExecutor { private final Introspector introspector; + private final boolean wrapArray; /** * @param log @@ -41,10 +43,25 @@ public class PropertyExecutor extends Ab * @since 1.5 */ public PropertyExecutor(final Logger log, final Introspector introspector, - final Class clazz, final String property) + final Class clazz, final String property) + { + this(log, introspector, clazz, property, false); + } + + /** + * @param log + * @param introspector + * @param clazz + * @param property + * @param wrapArray + * @since 1.5 + */ + public PropertyExecutor(final Logger log, final Introspector introspector, + final Class clazz, final String property, final boolean wrapArray) { this.log = log; this.introspector = introspector; + this.wrapArray = wrapArray; // Don't allow passing in the empty string or null because // it will either fail with a StringIndexOutOfBounds error @@ -124,6 +141,10 @@ public class PropertyExecutor extends Ab public Object execute(Object o) throws IllegalAccessException, InvocationTargetException { + if (wrapArray) + { + o = new ArrayListWrapper(o); + } return isAlive() ? getMethod().invoke(o, ((Object []) null)) : null; } } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java?rev=1753755&r1=1753754&r2=1753755&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/ArrayListWrapper.java Fri Jul 22 07:32:50 2016 @@ -55,4 +55,9 @@ public class ArrayListWrapper extends Ab return Array.getLength(array); } + public boolean isEmpty() + { + return Array.getLength(array) == 0; + } + } Modified: velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java?rev=1753755&r1=1753754&r2=1753755&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/main/java/org/apache/velocity/util/introspection/UberspectImpl.java Fri Jul 22 07:32:50 2016 @@ -292,6 +292,15 @@ public class UberspectImpl implements Ub identifier); } + /* + * and idem on an array + */ + if (!executor.isAlive() && obj.getClass().isArray()) + { + executor = new BooleanPropertyExecutor(log, introspector, ArrayListWrapper.class, + identifier, true); + } + return (executor.isAlive()) ? new VelGetterImpl(executor) : null; } Modified: velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java URL: http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java?rev=1753755&r1=1753754&r2=1753755&view=diff ============================================================================== --- velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java (original) +++ velocity/engine/trunk/velocity-engine-core/src/test/java/org/apache/velocity/test/ArrayMethodsTestCase.java Fri Jul 22 07:32:50 2016 @@ -112,6 +112,8 @@ public class ArrayMethodsTestCase extend boolean isEmpty = (size == 0); checkResult("isEmpty()", String.valueOf(isEmpty), compareToList); + checkPropertyResult("empty", String.valueOf(isEmpty), compareToList); + // check that the wrapping doesn't apply to java.lang.Object methods // such as toString() (for backwards compatibility). assertFalse(evaluate("$array").equals(evaluate("$list"))); @@ -175,13 +177,33 @@ public class ArrayMethodsTestCase extend assertEquals(result, listResult); } - info(" <$!array."+method+"> resolved to <"+result+">"); + info(" <$!array." + method + "> resolved to <" + result + ">"); if (compareToList) { info(" <$!list."+method+"> resolved to "+listResult+">"); } } + private void checkPropertyResult(String property, String expected, + boolean compareToList) throws Exception + { + String result = evaluate("$!array."+property); + assertEquals(expected, result); + + String listResult = null; + if (compareToList) + { + listResult = evaluate("$!list."+property); + assertEquals(result, listResult); + } + + info(" <$!array."+property+"> resolved to <"+result+">"); + if (compareToList) + { + info(" <$!list."+property+"> resolved to "+listResult+">"); + } + } + }