[jboss-svn-commits] JBL Code SVN: r6134 - in labs/jbossrules/trunk/drools-ide/src: main/java/org/drools/ide/editors/completion test/java/org/drools/ide/editors/completion

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Sep 10 20:06:43 EDT 2006


Author: KrisVerlaenen
Date: 2006-09-10 20:06:38 -0400 (Sun, 10 Sep 2006)
New Revision: 6134

Added:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/CompletionUtil.java
Modified:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java
   labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java
Log:
JBRULES-471: Add support for "from" keyword

Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/CompletionUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/CompletionUtil.java	2006-09-10 23:44:58 UTC (rev 6133)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/CompletionUtil.java	2006-09-11 00:06:38 UTC (rev 6134)
@@ -0,0 +1,49 @@
+package org.drools.ide.editors.completion;
+
+public class CompletionUtil {
+	
+	private CompletionUtil() {
+	}
+
+    /** Looks behind, gets stuff after the white space. Basically ripping out the last word.*/
+    public static String stripLastWord(String prefix) {
+    	if ("".equals(prefix)) { 
+    		return prefix;
+    	}
+    	if (prefix.charAt(prefix.length() - 1) == ' ') {
+    		return "";
+    	} else {
+	        char[] c = prefix.toCharArray();
+	        int start = 0;
+	        for (int i = c.length - 1; i >=0; i-- ) {
+	            if (Character.isWhitespace(c[i]) || c[i] == '(' || c[i] == ':' || c[i] == ';' || c[i] == '=' || c[i] == '<' || c[i] == '>' || c[i] == '.' || c[i] == '{' || c[i] == '}') {
+	                start = i + 1;
+	                break;
+	            }
+	        }
+	        prefix = prefix.substring(start, prefix.length());
+	        return prefix;
+    	}
+    }
+    
+    public static String stripWhiteSpace(String prefix) {
+    	if ("".equals(prefix)) { 
+    		return prefix;
+    	}
+    	if (prefix.charAt(prefix.length() - 1) == ' ') {
+    		return "";
+    	} else {
+	        char[] c = prefix.toCharArray();
+	        int start = 0;
+	        for (int i = c.length - 1; i >=0; i-- ) {
+	            if (Character.isWhitespace(c[i])) {
+	                start = i + 1;
+	                break;
+	            }
+	        }
+	        prefix = prefix.substring(start, prefix.length());
+	        return prefix;
+    	}
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java	2006-09-10 23:44:58 UTC (rev 6133)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java	2006-09-11 00:06:38 UTC (rev 6134)
@@ -63,7 +63,7 @@
 	        String backText = readBackwards( documentOffset, doc );            
 	
 	        String prefix = "";
-	        prefix = stripWhiteSpace(backText);
+	        prefix = CompletionUtil.stripLastWord(backText);
 	        
 	        List props = null;
 	        Matcher matcher = IMPORT_PATTERN.matcher(backText); 
@@ -166,27 +166,6 @@
         return prefix;
     }
 
-    /** Looks behind, gets stuff after the white space. Basically ripping out the last word.*/
-    protected String stripWhiteSpace(String prefix) {
-    	if ("".equals(prefix)) { 
-    		return prefix;
-    	}
-    	if (prefix.charAt(prefix.length() - 1) == ' ') {
-    		return "";
-    	} else {
-	        char[] c = prefix.toCharArray();
-	        int start = 0;
-	        for (int i = c.length - 1; i >=0; i-- ) {
-	            if (Character.isWhitespace(c[i]) || c[i] == '(' || c[i] == ':' || c[i] == ';' || c[i] == '=' || c[i] == '<' || c[i] == '>' || c[i] == '.' || c[i] == '{' || c[i] == '}') {
-	                start = i + 1;
-	                break;
-	            }
-	        }
-	        prefix = prefix.substring(start, prefix.length());
-	        return prefix;
-    	}
-    }
-    
 	protected List getJavaCompletionProposals(final String javaText, final String prefix, Map params) {
 		final List list = new ArrayList();
 		IEditorInput input = getEditor().getEditorInput();

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java	2006-09-10 23:44:58 UTC (rev 6133)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java	2006-09-11 00:06:38 UTC (rev 6134)
@@ -13,6 +13,7 @@
 import org.drools.lang.descr.EvalDescr;
 import org.drools.lang.descr.ExistsDescr;
 import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.FromDescr;
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -36,6 +37,7 @@
     static final Pattern EXISTS_PATTERN = Pattern.compile(".*\\s+exists\\s*\\(?\\s*((\\S*)\\s*:)?\\s*\\S*", Pattern.DOTALL);
     static final Pattern NOT_PATTERN = Pattern.compile(".*\\s+not\\s*\\(?\\s*((\\S*)\\s*:)?\\s*\\S*", Pattern.DOTALL);
     static final Pattern EVAL_PATTERN = Pattern.compile(".*\\s+eval\\s*\\(\\s*([(^\\))(\\([^\\)]*\\)?)]*)", Pattern.DOTALL);
+    static final Pattern FROM_PATTERN = Pattern.compile(".*\\)\\s+from\\s+", Pattern.DOTALL);
     
 	static final int LOCATION_UNKNOWN = 0;
 	static final int LOCATION_BEGIN_OF_CONDITION = 1;
@@ -50,10 +52,13 @@
 
 	static final int LOCATION_INSIDE_EVAL = 200;
 	
+	static final int LOCATION_FROM = 300;
+	
 	static final String LOCATION_PROPERTY_CLASS_NAME = "ClassName";
 	static final String LOCATION_PROPERTY_PROPERTY_NAME = "PropertyName";
 	static final String LOCATION_PROPERTY_OPERATOR = "Operator";
 	static final String LOCATION_EVAL_CONTENT = "EvalContent";
+	static final String LOCATION_FROM_CONTENT = "FromContent";
 	
     private LocationDeterminator() {
 	}
@@ -120,6 +125,12 @@
 				return new Location(LOCATION_BEGIN_OF_CONDITION);
 			}
 			if (endReached(subDescr)) {
+				Matcher matcher = FROM_PATTERN.matcher(backText);
+				if (matcher.matches()) {
+					Location location = new Location(LOCATION_FROM);
+					location.setProperty(LOCATION_FROM_CONTENT, "");
+					return location;
+				}
 				return new Location(LOCATION_BEGIN_OF_CONDITION);
 			}
 			return determineLocationForDescr(subDescr, backText);
@@ -310,6 +321,11 @@
 				}
 			}
 			return new Location(LOCATION_UNKNOWN);
+		} else if (descr instanceof FromDescr) {
+			Location location = new Location(LOCATION_FROM);
+			String content = CompletionUtil.stripWhiteSpace(backText);
+			location.setProperty(LOCATION_FROM_CONTENT, content);
+			return location;
 		}
 		
 		return new Location(LOCATION_UNKNOWN);
@@ -330,12 +346,6 @@
 				return false;
 			}
 			return endReached((PatternDescr) descrs.get(0));
-		} else if (descr instanceof NotDescr) {
-			List descrs = ((NotDescr) descr).getDescrs();
-			if (descrs.isEmpty()) {
-				return false;
-			}
-			return endReached((PatternDescr) descrs.get(0));
 		} else if (descr instanceof AndDescr) {
 			List descrs = ((AndDescr) descr).getDescrs();
 			if (descrs.size() != 2) {
@@ -350,9 +360,11 @@
 			}
 			return endReached((PatternDescr) descrs.get(0))
 				&& endReached((PatternDescr) descrs.get(1));
-		} if (descr instanceof EvalDescr) {
+		} else if (descr instanceof EvalDescr) {
 			// EvalDescr are only added once the end has been reached 
 			return true;
+		} else if (descr instanceof FromDescr) {
+			return ((FromDescr) descr).getDataSource() != null;
 		}
 		return false;
 	}

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2006-09-10 23:44:58 UTC (rev 6133)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2006-09-11 00:06:38 UTC (rev 6134)
@@ -23,6 +23,7 @@
 import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FieldBindingDescr;
 import org.drools.lang.descr.FieldTemplateDescr;
+import org.drools.lang.descr.FromDescr;
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -68,7 +69,7 @@
 	        IDocument doc = viewer.getDocument();
 	        String backText = readBackwards(documentOffset, doc);            
 	
-	        final String prefix = stripWhiteSpace(backText);
+	        final String prefix = CompletionUtil.stripLastWord(backText);
             
 	        if (backText.length() < 5) {
 	        	return list;
@@ -116,6 +117,7 @@
 					// add drools keywords
 				    list.add( new RuleCompletionProposal(prefix.length(), "and", "and ", droolsIcon));
 				    list.add( new RuleCompletionProposal(prefix.length(), "or", "or ", droolsIcon));
+				    list.add( new RuleCompletionProposal(prefix.length(), "from", "from ", droolsIcon));
 				    RuleCompletionProposal prop = new RuleCompletionProposal(prefix.length(), "eval", "eval(  )", 6 );
 					prop.setImage(droolsIcon);
 				    list.add(prop);
@@ -297,6 +299,38 @@
 				    list.add( new RuleCompletionProposal(prefix.length(), "&", "& ", droolsIcon));
 				    list.add( new RuleCompletionProposal(prefix.length(), "|", "| ", droolsIcon));
 				    list.add( new RuleCompletionProposal(prefix.length(), ",", ", ", droolsIcon));
+				    break;
+				case LocationDeterminator.LOCATION_FROM :
+					String fromText = (String) location.getProperty(LocationDeterminator.LOCATION_FROM_CONTENT);
+					int index = fromText.indexOf('.');
+					if (index == -1) {
+						// add all functions
+						if ("".equals(fromText)) {
+					        List functions = getDRLEditor().getFunctions();
+					        iterator = functions.iterator();
+					        while (iterator.hasNext()) {
+					            String name = (String) iterator.next() + "()";
+					        	prop = new RuleCompletionProposal(prefix.length(), name, name, name.length() - 1);
+					        	prop.setPriority(-1);
+					        	prop.setImage(methodIcon);
+					        	list.add(prop);
+					        }
+						}
+				        
+		    			params = new HashMap();
+						try {
+					    	parser = new DrlParser();
+				    		PackageDescr descr = parser.parse(backText);
+				    		List rules = descr.getRules();
+				    		if (rules != null && rules.size() == 1) {
+				    			getRuleParameters(params, ((RuleDescr) rules.get(0)).getLhs().getDescrs());
+				    		}
+				    	} catch (DroolsParserException exc) {
+				    		// do nothing
+				    	}
+				    	list.addAll(getJavaCompletionProposals(fromText, prefix, params));
+					}
+					break;
 			}
 		}
 	}
@@ -525,22 +559,32 @@
     	Iterator iterator = descrs.iterator();
     	while (iterator.hasNext()) {
     		PatternDescr descr = (PatternDescr) iterator.next();
-    		if (descr instanceof ColumnDescr) {
-				String name = ((ColumnDescr) descr).getIdentifier();
-				if (name != null) {
-					result.put(name, ((ColumnDescr) descr).getObjectType());
-				}
-				getRuleSubParameters(result, ((ColumnDescr) descr).getDescrs(), ((ColumnDescr) descr).getObjectType());
-			} else if (descr instanceof AndDescr) {
-				getRuleParameters(result, ((AndDescr) descr).getDescrs());
-			} else if (descr instanceof OrDescr) {
-				getRuleParameters(result, ((OrDescr) descr).getDescrs());
-			} else if (descr instanceof ExistsDescr) {
-				getRuleParameters(result, ((ExistsDescr) descr).getDescrs());
-			} else if (descr instanceof NotDescr) {
-				getRuleParameters(result, ((NotDescr) descr).getDescrs());
+    		getRuleParameters(result, descr);
+		}
+    }
+    
+    private void getRuleParameters(Map result, PatternDescr descr) {
+		if (descr == null) {
+			return;
+		}
+		if (descr instanceof ColumnDescr) {
+			String name = ((ColumnDescr) descr).getIdentifier();
+			if (name != null) {
+				result.put(name, ((ColumnDescr) descr).getObjectType());
 			}
+			getRuleSubParameters(result, ((ColumnDescr) descr).getDescrs(), ((ColumnDescr) descr).getObjectType());
+		} else if (descr instanceof AndDescr) {
+			getRuleParameters(result, ((AndDescr) descr).getDescrs());
+		} else if (descr instanceof OrDescr) {
+			getRuleParameters(result, ((OrDescr) descr).getDescrs());
+		} else if (descr instanceof ExistsDescr) {
+			getRuleParameters(result, ((ExistsDescr) descr).getDescrs());
+		} else if (descr instanceof NotDescr) {
+			getRuleParameters(result, ((NotDescr) descr).getDescrs());
+		} else if (descr instanceof FromDescr) {
+			getRuleParameters(result, ((FromDescr) descr).getReturnedColumn());
 		}
+
     }
     
     private void getRuleSubParameters(Map result, List descrs, String clazz) {

Modified: labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java	2006-09-10 23:44:58 UTC (rev 6133)
+++ labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/DRLCompletionProcessorTest.java	2006-09-11 00:06:38 UTC (rev 6134)
@@ -8,14 +8,11 @@
 public class DRLCompletionProcessorTest extends TestCase {
 
     public void testLookBehind() {
-        DefaultCompletionProcessor proc = new DefaultCompletionProcessor(null);
+        assertEquals("something", CompletionUtil.stripLastWord(" something"));
+        assertEquals("another", CompletionUtil.stripLastWord("another"));
         
-        assertEquals("something", proc.stripWhiteSpace(" something"));
-        assertEquals("another", proc.stripWhiteSpace("another"));
-        
         String s = "rule something \n\nwhen";
-        assertEquals("when", proc.stripWhiteSpace(s));
-        
+        assertEquals("when", CompletionUtil.stripLastWord(s));
     }
     
     public void testPrefixFiltering() {

Modified: labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java	2006-09-10 23:44:58 UTC (rev 6133)
+++ labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java	2006-09-11 00:06:38 UTC (rev 6134)
@@ -961,6 +961,61 @@
         	"		Class ( property == \"test\" | == \"test2\" ";
         location = LocationDeterminator.getLocationInCondition(input);
         assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_END, location.getType());
+
+        /** FROM */
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) fr";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM, location.getType());
+        assertEquals("", location.getProperty(LocationDeterminator.LOCATION_FROM_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from myGlob";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM, location.getType());
+        assertEquals("myGlob", location.getProperty(LocationDeterminator.LOCATION_FROM_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from myGlobal.get";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM, location.getType());
+        assertEquals("myGlobal.get", location.getProperty(LocationDeterminator.LOCATION_FROM_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from myGlobal.getList() \n" +
+        	"       ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from getDroolsFunction() \n" +
+        	"       ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
     }
     
 }




More information about the jboss-svn-commits mailing list