From: <jbo...@li...> - 2006-04-20 03:30:57
|
Author: mic...@jb... Date: 2006-04-19 23:30:44 -0400 (Wed, 19 Apr 2006) New Revision: 3825 Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java Log: JBRULES-228 Modified: labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java 2006-04-20 03:26:27 UTC (rev 3824) +++ labs/jbossrules/trunk/drools-compiler/src/main/java/org/drools/semantics/java/FunctionFixer.java 2006-04-20 03:30:44 UTC (rev 3825) @@ -15,15 +15,24 @@ * limitations under the License. */ - - +import java.util.HashSet; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * This horrific utility adds in the function class name (which is the same as the functions method name) + * into the RHS guts of a rule. It has to tip toe around method calls, new declarations and other + * stuff like that. + * A better future solution is to use a static import as found in Java 5, then ALL THIS can + * disappear. Oh Happy day. + * @author Michael Neale (sadly..) + * + */ public class FunctionFixer { static Pattern FUNCTION = Pattern.compile("(\\S*\\s*|\\.\\s*)\\b([\\S&&[^\\.]]+)\\s*\\(([^)]*)\\)", Pattern.DOTALL); - + static final Set KEYWORDS = getJavaKeywords(); public String fix(String raw) { //return raw; return fix(raw, FUNCTION); @@ -46,13 +55,15 @@ } } String function = matcher.group(2).trim(); + //if we have a reserved work, DO NOT TOUCH ! + if (KEYWORDS.contains( function )) continue; String params = matcher.group(3).trim(); String target = ucFirst(function) + "." + function + "(" + params + ")"; buf.append( raw.substring( lastIndex, matcher.start( 2 ) ) ); - buf.append( KnowledgeHelperFixer.replace( target, "$", "\\$", 128 ) ); + buf.append( target ); lastIndex = matcher.end(); } buf.append( raw.substring( lastIndex ) ); @@ -62,4 +73,63 @@ private String ucFirst(String name) { return name.toUpperCase().charAt( 0 ) + name.substring( 1 ); } + + /** + * This list was obtained from http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html + */ + private static Set getJavaKeywords() { + Set keys = new HashSet(); + keys.add("abstract"); + keys.add("continue"); + keys.add("for"); + keys.add("new"); + keys.add("switch"); + keys.add("assert"); + keys.add("default"); + keys.add("goto"); + keys.add("package"); + keys.add("synchronized"); + keys.add("boolean"); + keys.add("do"); + keys.add("if"); + keys.add("private"); + keys.add("this"); + keys.add("break"); + keys.add("double"); + keys.add("implements"); + keys.add("protected"); + keys.add("throw"); + keys.add("byte"); + keys.add("else"); + keys.add("import"); + keys.add("public"); + keys.add("throws"); + keys.add("case"); + keys.add("enum"); + keys.add("instanceof"); + keys.add("return"); + keys.add("transient"); + keys.add("catch"); + keys.add("extends"); + keys.add("int"); + keys.add("short"); + keys.add("try"); + keys.add("char"); + keys.add("final"); + keys.add("interface"); + keys.add("static"); + keys.add("void"); + keys.add("class"); + keys.add("finally"); + keys.add("long"); + keys.add("strictfp"); + keys.add("volatile"); + keys.add("const"); + keys.add("float"); + keys.add("native"); + keys.add("super"); + keys.add("while"); + return keys; + } + } \ No newline at end of file Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java =================================================================== --- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java 2006-04-20 03:26:27 UTC (rev 3824) +++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/semantics/java/FunctionFixerTest.java 2006-04-20 03:30:44 UTC (rev 3825) @@ -64,5 +64,11 @@ assertEquals( "\nFoo.foo($list);", fixer.fix( "\nfoo($list);" ) ); } + + public void testReservedWordsInJava() { + FunctionFixer fixer = new FunctionFixer(); + assertEquals( "\nfor(int i=0; i < 2; i++) { /*do noithing*/ }", + fixer.fix( "\nfor(int i=0; i < 2; i++) { /*do noithing*/ }" ) ); + } } \ No newline at end of file |