From: Alexey L. <lou...@us...> - 2004-06-29 08:25:44
|
User: loubyansky Date: 04/06/29 01:25:29 Modified: src/main/org/jboss/ejb/plugins/cmp/ejbql Tag: Branch_3_2 EJBQLParser.jjt JBossQLParser.jjt Log: proper indexOf implementation searching for reserved words in a query Revision Changes Path No revision No revision 1.2.4.4 +15 -5 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/EJBQLParser.jjt Index: EJBQLParser.jjt =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/EJBQLParser.jjt,v retrieving revision 1.2.4.3 retrieving revision 1.2.4.4 diff -u -r1.2.4.3 -r1.2.4.4 --- EJBQLParser.jjt 10 May 2004 09:25:17 -0000 1.2.4.3 +++ EJBQLParser.jjt 29 Jun 2004 08:25:28 -0000 1.2.4.4 @@ -46,7 +46,7 @@ * * @author <a href="mailto:da...@da...">Dain Sundstrom</a> * @author <a href="mailto:al...@jb...">Alexey Loubyansky</a> - * @version $Revision: 1.2.4.3 $ + * @version $Revision: 1.2.4.4 $ */ public class EJBQLParser { private Catalog catalog; @@ -66,14 +66,14 @@ token_source.idManager = idManager; String lowerCase = ejbql.toLowerCase(); - int fromBeginIndex = lowerCase.indexOf(" from "); + int fromBeginIndex = indexOf(lowerCase, "from"); if(fromBeginIndex < 0) { throw new ParseException("FROM not found"); } - int fromEndIndex = lowerCase.indexOf(" where "); + int fromEndIndex = indexOf(lowerCase, "where"); if(fromEndIndex < 0) { - fromEndIndex = lowerCase.indexOf("order by"); + fromEndIndex = indexOf(lowerCase, "order by"); } if(fromEndIndex < 0) { fromEndIndex = ejbql.length(); @@ -86,7 +86,7 @@ // everything except for the from clause char[] sansFrom = ejbql.toCharArray(); - clear(sansFrom, fromBeginIndex + 6, fromEndIndex); + clear(sansFrom, fromBeginIndex + 4, fromEndIndex); // From clause ReInit(new CharArrayReader(from)); @@ -103,6 +103,16 @@ return ejbqlNode; } + private static final int indexOf(String ql, String word) + { + int i = ql.indexOf(word); + while(i > 0 && (ql.charAt(i - 1) == '.')) + { + i = ql.indexOf(word, i + 1); + } + return i; + } + private final void clear(char[] c, int beginIndex, int endIndex) { for(int i=beginIndex; i < endIndex; i++) { if(c[i]!='\r' && c[i]!='\n' && c[i]!='\t') { 1.6.2.10 +17 -7 jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/JBossQLParser.jjt Index: JBossQLParser.jjt =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/ejbql/JBossQLParser.jjt,v retrieving revision 1.6.2.9 retrieving revision 1.6.2.10 diff -u -r1.6.2.9 -r1.6.2.10 --- JBossQLParser.jjt 10 May 2004 09:25:17 -0000 1.6.2.9 +++ JBossQLParser.jjt 29 Jun 2004 08:25:28 -0000 1.6.2.10 @@ -47,7 +47,7 @@ * * @author <a href="mailto:da...@da...">Dain Sundstrom</a> * @author <a href="mailto:al...@jb...">Alex Loubyansky</a> - * @version $Revision: 1.6.2.9 $ + * @version $Revision: 1.6.2.10 $ */ public class JBossQLParser { private Catalog catalog; @@ -67,21 +67,21 @@ token_source.idManager = idManager; String lowerCase = ejbql.toLowerCase(); - int fromBeginIndex = lowerCase.indexOf(" from "); + int fromBeginIndex = indexOf(lowerCase, "from"); if(fromBeginIndex < 0) { throw new ParseException("FROM not found"); } - int fromEndIndex = lowerCase.indexOf(" where "); + int fromEndIndex = indexOf(lowerCase, "where"); ///////////////////// CHANGED ////////////////////////////// if(fromEndIndex < 0) { - fromEndIndex = lowerCase.indexOf("order by"); + fromEndIndex = indexOf(lowerCase, "order by"); } if(fromEndIndex < 0) { - fromEndIndex = lowerCase.indexOf(" offset "); + fromEndIndex = indexOf(lowerCase, "offset"); } if(fromEndIndex < 0) { - fromEndIndex = lowerCase.indexOf(" limit "); + fromEndIndex = indexOf(lowerCase, "limit"); } if(fromEndIndex < 0) { fromEndIndex = ejbql.length(); @@ -95,7 +95,7 @@ // everything except for the from clause char[] sansFrom = ejbql.toCharArray(); - clear(sansFrom, fromBeginIndex + 6, fromEndIndex); + clear(sansFrom, fromBeginIndex + 4, fromEndIndex); // From clause ReInit(new CharArrayReader(from)); @@ -112,6 +112,16 @@ return ejbqlNode; } + private static final int indexOf(String ql, String word) + { + int i = ql.indexOf(word); + while(i > 0 && (ql.charAt(i - 1) == '.')) + { + i = ql.indexOf(word, i + 1); + } + return i; + } + private final void clear(char[] c, int beginIndex, int endIndex) { for(int i=beginIndex; i < endIndex; i++) { if(c[i]!='\r' && c[i]!='\n' && c[i]!='\t') { |