Return-Path: X-Original-To: apmail-activemq-commits-archive@www.apache.org Delivered-To: apmail-activemq-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 349A6D696 for ; Mon, 3 Dec 2012 18:18:32 +0000 (UTC) Received: (qmail 94471 invoked by uid 500); 3 Dec 2012 18:18:31 -0000 Delivered-To: apmail-activemq-commits-archive@activemq.apache.org Received: (qmail 94438 invoked by uid 500); 3 Dec 2012 18:18:31 -0000 Mailing-List: contact commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list commits@activemq.apache.org Received: (qmail 94431 invoked by uid 99); 3 Dec 2012 18:18:31 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 03 Dec 2012 18:18:31 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 03 Dec 2012 18:18:30 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 6A9C723888E4; Mon, 3 Dec 2012 18:18:10 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1416612 - in /activemq/activemq-apollo/trunk: apollo-selector/src/main/java/org/apache/activemq/apollo/filter/ apollo-selector/src/main/javacc/ apollo-stomp/src/main/scala/org/apache/activemq/apollo/stomp/ Date: Mon, 03 Dec 2012 18:18:09 -0000 To: commits@activemq.apache.org From: chirino@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121203181810.6A9C723888E4@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: chirino Date: Mon Dec 3 18:18:06 2012 New Revision: 1416612 URL: http://svn.apache.org/viewvc?rev=1416612&view=rev Log: Support relaxed and strict JMS selector evaluation in regard to String conversions. Modified: activemq/activemq-apollo/trunk/apollo-selector/src/main/java/org/apache/activemq/apollo/filter/ComparisonExpression.java activemq/activemq-apollo/trunk/apollo-selector/src/main/javacc/SelectorParser.jj activemq/activemq-apollo/trunk/apollo-stomp/src/main/scala/org/apache/activemq/apollo/stomp/StompProtocolHandler.scala Modified: activemq/activemq-apollo/trunk/apollo-selector/src/main/java/org/apache/activemq/apollo/filter/ComparisonExpression.java URL: http://svn.apache.org/viewvc/activemq/activemq-apollo/trunk/apollo-selector/src/main/java/org/apache/activemq/apollo/filter/ComparisonExpression.java?rev=1416612&r1=1416611&r2=1416612&view=diff ============================================================================== --- activemq/activemq-apollo/trunk/apollo-selector/src/main/java/org/apache/activemq/apollo/filter/ComparisonExpression.java (original) +++ activemq/activemq-apollo/trunk/apollo-selector/src/main/java/org/apache/activemq/apollo/filter/ComparisonExpression.java Mon Dec 3 18:18:06 2012 @@ -29,6 +29,9 @@ import java.util.regex.Pattern; */ public abstract class ComparisonExpression extends BinaryExpression implements BooleanExpression { + public static final ThreadLocal CONVERT_STRING_EXPRESSIONS = new ThreadLocal(); + + boolean convertStringExpressions = false; private static final Set REGEXP_CONTROL_CHARS = new HashSet(); /** @@ -37,6 +40,7 @@ public abstract class ComparisonExpressi */ public ComparisonExpression(Expression left, Expression right) { super(left, right); + convertStringExpressions = CONVERT_STRING_EXPRESSIONS.get()!=null; } public static BooleanExpression createBetween(Expression value, Expression left, Expression right) { @@ -75,7 +79,6 @@ public abstract class ComparisonExpressi Pattern likePattern; /** - * @param left */ public LikeExpression(Expression right, String like, int escape) { super(right); @@ -352,7 +355,7 @@ public abstract class ComparisonExpressi if (lc != rc) { try { if (lc == Boolean.class) { - if (rc == String.class) { + if (convertStringExpressions && rc == String.class) { rv = Boolean.valueOf((String)rv); } else { return Boolean.FALSE; @@ -368,7 +371,7 @@ public abstract class ComparisonExpressi lv = new Float(((Number)lv).floatValue()); } else if (rc == Double.class) { lv = new Double(((Number)lv).doubleValue()); - } else if (rc == String.class) { + } else if (convertStringExpressions && rc == String.class) { rv = Byte.valueOf((String)rv); } else { return Boolean.FALSE; @@ -382,7 +385,7 @@ public abstract class ComparisonExpressi lv = new Float(((Number)lv).floatValue()); } else if (rc == Double.class) { lv = new Double(((Number)lv).doubleValue()); - } else if (rc == String.class) { + } else if (convertStringExpressions && rc == String.class) { rv = Short.valueOf((String)rv); } else { return Boolean.FALSE; @@ -394,7 +397,7 @@ public abstract class ComparisonExpressi lv = new Float(((Number)lv).floatValue()); } else if (rc == Double.class) { lv = new Double(((Number)lv).doubleValue()); - } else if (rc == String.class) { + } else if (convertStringExpressions && rc == String.class) { rv = Integer.valueOf((String)rv); } else { return Boolean.FALSE; @@ -406,7 +409,7 @@ public abstract class ComparisonExpressi lv = new Float(((Number)lv).floatValue()); } else if (rc == Double.class) { lv = new Double(((Number)lv).doubleValue()); - } else if (rc == String.class) { + } else if (convertStringExpressions && rc == String.class) { rv = Long.valueOf((String)rv); } else { return Boolean.FALSE; @@ -418,7 +421,7 @@ public abstract class ComparisonExpressi rv = new Float(((Number)rv).floatValue()); } else if (rc == Double.class) { lv = new Double(((Number)lv).doubleValue()); - } else if (rc == String.class) { + } else if (convertStringExpressions && rc == String.class) { rv = Float.valueOf((String)rv); } else { return Boolean.FALSE; @@ -430,12 +433,12 @@ public abstract class ComparisonExpressi rv = new Double(((Number)rv).doubleValue()); } else if (rc == Float.class) { rv = new Double(((Number)rv).doubleValue()); - } else if (rc == String.class) { + } else if (convertStringExpressions && rc == String.class) { rv = Double.valueOf((String)rv); } else { return Boolean.FALSE; } - } else if (lc == String.class) { + } else if (convertStringExpressions && lc == String.class) { if (rc == Boolean.class) { lv = Boolean.valueOf((String)lv); Modified: activemq/activemq-apollo/trunk/apollo-selector/src/main/javacc/SelectorParser.jj URL: http://svn.apache.org/viewvc/activemq/activemq-apollo/trunk/apollo-selector/src/main/javacc/SelectorParser.jj?rev=1416612&r1=1416611&r2=1416612&view=diff ============================================================================== --- activemq/activemq-apollo/trunk/apollo-selector/src/main/javacc/SelectorParser.jj (original) +++ activemq/activemq-apollo/trunk/apollo-selector/src/main/javacc/SelectorParser.jj Mon Dec 3 18:18:06 2012 @@ -62,6 +62,7 @@ import org.apache.activemq.apollo.filter public class SelectorParser { private static final LRUCache cache = new LRUCache(100); + private static final String CONVERT_STRING_EXPRESSIONS_PREFIX = "convert_string_expressions:"; public static BooleanExpression parse(String sql) throws FilterException { Object result = cache.get(sql); @@ -70,6 +71,16 @@ public class SelectorParser { } else if (result instanceof BooleanExpression) { return (BooleanExpression) result; } else { + + boolean convertStringExpressions = false; + if( sql.startsWith(CONVERT_STRING_EXPRESSIONS_PREFIX)) { + convertStringExpressions = true; + sql = sql.substring(CONVERT_STRING_EXPRESSIONS_PREFIX.length()); + } + + if( convertStringExpressions ) { + ComparisonExpression.CONVERT_STRING_EXPRESSIONS.set(true); + } try { BooleanExpression e = new SelectorParser(sql).parse(); cache.put(sql, e); @@ -77,6 +88,10 @@ public class SelectorParser { } catch (FilterException t) { cache.put(sql, t); throw t; + } finally { + if( convertStringExpressions ) { + ComparisonExpression.CONVERT_STRING_EXPRESSIONS.remove(); + } } } } Modified: activemq/activemq-apollo/trunk/apollo-stomp/src/main/scala/org/apache/activemq/apollo/stomp/StompProtocolHandler.scala URL: http://svn.apache.org/viewvc/activemq/activemq-apollo/trunk/apollo-stomp/src/main/scala/org/apache/activemq/apollo/stomp/StompProtocolHandler.scala?rev=1416612&r1=1416611&r2=1416612&view=diff ============================================================================== --- activemq/activemq-apollo/trunk/apollo-stomp/src/main/scala/org/apache/activemq/apollo/stomp/StompProtocolHandler.scala (original) +++ activemq/activemq-apollo/trunk/apollo-stomp/src/main/scala/org/apache/activemq/apollo/stomp/StompProtocolHandler.scala Mon Dec 3 18:18:06 2012 @@ -1409,7 +1409,7 @@ class StompProtocolHandler extends Proto case Some(x)=> try { val s = decode_header(x) - (s, SelectorParser.parse(s)) + (s, SelectorParser.parse("convert_string_expressions:"+s)) } catch { case e:FilterException => die("Invalid selector expression: "+e.getMessage)