[jboss-svn-commits] JBL Code SVN: r7120 - 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
Wed Oct 25 18:24:28 EDT 2006


Author: KrisVerlaenen
Date: 2006-10-25 18:24:24 -0400 (Wed, 25 Oct 2006)
New Revision: 7120

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/RuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java
Log:
JBRULES-478: eclipse plugin support for 'accumulate'
 - drl editor now has full support for accumulate

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-10-25 22:13:34 UTC (rev 7119)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java	2006-10-25 22:24:24 UTC (rev 7120)
@@ -8,6 +8,7 @@
 
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
+import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.EvalDescr;
@@ -34,10 +35,15 @@
     static final Pattern COLUMN_PATTERN_EXCLUDES_END = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s+excludes\\s+[^\\s<>!=:,]+\\s+", Pattern.DOTALL);
     static final Pattern COLUMN_PATTERN_COMPARATOR_END = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s*([<>=!]+)\\s*[^\\s<>!=:,]+\\s+", Pattern.DOTALL);
 
+    static final Pattern COLUMN_PATTERN = Pattern.compile("((\\S+)\\s*:\\s*)?(\\S+)\\s*(\\(.*)", Pattern.DOTALL);
     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 Pattern ACCUMULATE_PATTERN = Pattern.compile(".*\\)\\s+from\\s+accumulate\\s*\\(\\s*", Pattern.DOTALL);
+    static final Pattern ACCUMULATE_PATTERN_INIT = Pattern.compile(".*,\\s*init\\s*\\(\\s*(.*)", Pattern.DOTALL);
+    static final Pattern ACCUMULATE_PATTERN_ACTION = Pattern.compile(".*,\\s*init\\s*\\(\\s*(.*)\\)\\s*,\\s*action\\s*\\(\\s*(.*)", Pattern.DOTALL);
+    static final Pattern ACCUMULATE_PATTERN_RESULT = Pattern.compile(".*,\\s*init\\s*\\(\\s*(.*)\\)\\s*,\\s*action\\s*\\(\\s*(.*)\\)\\s*,\\s*result\\s*\\(\\s*(.*)", Pattern.DOTALL);
     
 	static final int LOCATION_UNKNOWN = 0;
 	static final int LOCATION_BEGIN_OF_CONDITION = 1;
@@ -53,12 +59,23 @@
 	static final int LOCATION_INSIDE_EVAL = 200;
 	
 	static final int LOCATION_FROM = 300;
+	static final int LOCATION_FROM_COLLECT = 301;
+	static final int LOCATION_FROM_ACCUMULATE = 302;
+	static final int LOCATION_FROM_ACCUMULATE_INIT = 303;
+	static final int LOCATION_FROM_ACCUMULATE_INIT_INSIDE = 304;
+	static final int LOCATION_FROM_ACCUMULATE_ACTION = 305;
+	static final int LOCATION_FROM_ACCUMULATE_ACTION_INSIDE = 306;
+	static final int LOCATION_FROM_ACCUMULATE_RESULT = 307;
+	static final int LOCATION_FROM_ACCUMULATE_RESULT_INSIDE = 308;
 	
 	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";
+	static final String LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT = "FromAccumulateInitContent";
+	static final String LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT = "FromAccumulateActionContent";
+	static final String LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT = "FromAccumulateResultContent";
 	
     private LocationDeterminator() {
 	}
@@ -172,78 +189,7 @@
 					}
 				}
 			}
-			matcher = COLUMN_PATTERN_OPERATOR.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_OPERATOR);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_COMPARATOR_ARGUMENT.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
-				location.setProperty(LOCATION_PROPERTY_OPERATOR, matcher.group(4));
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_CONTAINS_ARGUMENT.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
-				location.setProperty(LOCATION_PROPERTY_OPERATOR, "contains");
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_EXCLUDES_ARGUMENT.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
-				location.setProperty(LOCATION_PROPERTY_OPERATOR, "excludes");
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_MATCHES_ARGUMENT.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
-				location.setProperty(LOCATION_PROPERTY_OPERATOR, "matches");
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_CONTAINS_END.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_END);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_MATCHES_END.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_END);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_EXCLUDES_END.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_END);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				return location;
-	        }
-	        matcher = COLUMN_PATTERN_COMPARATOR_END.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_END);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				return location;
-	        }
-			matcher = COLUMN_PATTERN_START.matcher(columnContents);
-	        if (matcher.matches()) {
-				Location location = new Location(LOCATION_INSIDE_CONDITION_START);
-				location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-				return location;
-	        }
-			Location location = new Location(LOCATION_INSIDE_CONDITION_START);
-			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
-			return location;
+			return getLocationForColumn(columnContents, columnDescr.getObjectType());
 		} else if (descr instanceof ExistsDescr) {
 			List subDescrs = ((ExistsDescr) descr).getDescrs();
 			if (subDescrs.size() == 0) {
@@ -326,6 +272,41 @@
 			String content = CompletionUtil.stripWhiteSpace(backText);
 			location.setProperty(LOCATION_FROM_CONTENT, content);
 			return location;
+		} else if (descr instanceof AccumulateDescr) {
+			Matcher matcher = ACCUMULATE_PATTERN.matcher(backText);
+			int end = -1;
+			while (matcher.find()) {
+				end = matcher.end();
+			}
+			String accumulateText = backText.substring(end);
+			matcher = ACCUMULATE_PATTERN_RESULT.matcher(accumulateText);
+			if (matcher.matches()) {
+				Location location = new Location(LOCATION_FROM_ACCUMULATE_RESULT_INSIDE);
+				location.setProperty(LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT, matcher.group(1));
+				location.setProperty(LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT, matcher.group(2));
+				location.setProperty(LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT, matcher.group(3));
+				return location;
+			}
+			matcher = ACCUMULATE_PATTERN_ACTION.matcher(accumulateText);
+			if (matcher.matches()) {
+				Location location =  new Location(LOCATION_FROM_ACCUMULATE_ACTION_INSIDE);
+				location.setProperty(LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT, matcher.group(1));
+				location.setProperty(LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT, matcher.group(2));
+				return location;
+			}
+			matcher = ACCUMULATE_PATTERN_INIT.matcher(accumulateText);
+			if (matcher.matches()) {
+				Location location =  new Location(LOCATION_FROM_ACCUMULATE_INIT_INSIDE);
+				location.setProperty(LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT, matcher.group(1));
+				return location;
+			}
+			matcher = COLUMN_PATTERN.matcher(accumulateText);
+			if (matcher.matches()) {
+				String className = matcher.group(3);
+				String columnContents = matcher.group(4);
+				return getLocationForColumn(columnContents, className);
+			}
+			return new Location(LOCATION_FROM_ACCUMULATE);
 		}
 		
 		return new Location(LOCATION_UNKNOWN);
@@ -365,7 +346,84 @@
 			return true;
 		} else if (descr instanceof FromDescr) {
 			return ((FromDescr) descr).getDataSource() != null;
+		} else if (descr instanceof AccumulateDescr) {
+			return ((AccumulateDescr) descr).getResultCode() != null;
 		}
 		return false;
 	}
+	
+	private static Location getLocationForColumn(String columnContents, String className) {
+		Matcher matcher = COLUMN_PATTERN_OPERATOR.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_OPERATOR);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
+			return location;
+        }
+        matcher = COLUMN_PATTERN_COMPARATOR_ARGUMENT.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
+			location.setProperty(LOCATION_PROPERTY_OPERATOR, matcher.group(4));
+			return location;
+        }
+        matcher = COLUMN_PATTERN_CONTAINS_ARGUMENT.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
+			location.setProperty(LOCATION_PROPERTY_OPERATOR, "contains");
+			return location;
+        }
+        matcher = COLUMN_PATTERN_EXCLUDES_ARGUMENT.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
+			location.setProperty(LOCATION_PROPERTY_OPERATOR, "excludes");
+			return location;
+        }
+        matcher = COLUMN_PATTERN_MATCHES_ARGUMENT.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_ARGUMENT);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			location.setProperty(LOCATION_PROPERTY_PROPERTY_NAME, matcher.group(3));
+			location.setProperty(LOCATION_PROPERTY_OPERATOR, "matches");
+			return location;
+        }
+        matcher = COLUMN_PATTERN_CONTAINS_END.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_END);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			return location;
+        }
+        matcher = COLUMN_PATTERN_MATCHES_END.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_END);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			return location;
+        }
+        matcher = COLUMN_PATTERN_EXCLUDES_END.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_END);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			return location;
+        }
+        matcher = COLUMN_PATTERN_COMPARATOR_END.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_END);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			return location;
+        }
+		matcher = COLUMN_PATTERN_START.matcher(columnContents);
+        if (matcher.matches()) {
+			Location location = new Location(LOCATION_INSIDE_CONDITION_START);
+			location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+			return location;
+        }
+		Location location = new Location(LOCATION_INSIDE_CONDITION_START);
+		location.setProperty(LOCATION_PROPERTY_CLASS_NAME, className);
+		return location;
+	}
 }

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-10-25 22:13:34 UTC (rev 7119)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2006-10-25 22:24:24 UTC (rev 7120)
@@ -17,6 +17,7 @@
 import org.drools.ide.editors.DRLRuleEditor;
 import org.drools.ide.editors.DSLAdapter;
 import org.drools.ide.util.ProjectClassLoader;
+import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.ExistsDescr;
@@ -131,6 +132,7 @@
 				case LocationDeterminator.LOCATION_BEGIN_OF_CONDITION_NOT:
 					list.add( new RuleCompletionProposal(prefix.length(), "exists", "exists ", droolsIcon));
 				    // we do not break but also add all elements that are needed for exists
+				case LocationDeterminator.LOCATION_FROM_ACCUMULATE :
 				case LocationDeterminator.LOCATION_BEGIN_OF_CONDITION_EXISTS:
 				    // and add imported classes
 				    List imports = getDRLEditor().getImports();
@@ -272,28 +274,7 @@
 				    break;
 				case LocationDeterminator.LOCATION_INSIDE_EVAL :
 					String content = (String) location.getProperty(LocationDeterminator.LOCATION_EVAL_CONTENT);
-	    			Map 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());
-			    			// rule params are already added by JavaCompletionProposals
-			    			// 
-			    			// Iterator iterator2 = params.keySet().iterator();
-			    			// while (iterator2.hasNext()) {
-			    			// 	String name = (String) iterator2.next();
-			    			// 	RuleCompletionProposal proposal = new RuleCompletionProposal(prefix.length(), name);
-			    			// 	proposal.setPriority(-1);
-			    			// 	proposal.setImage(methodIcon);
-							// 	list.add(proposal);
-			    			// }
-			    		}
-			    	} catch (DroolsParserException exc) {
-			    		// do nothing
-			    	}
-			    	list.addAll(getJavaCompletionProposals(content, prefix, params));
+	    			list.addAll(getJavaCompletionProposals(content, prefix, getRuleParameters(backText)));
 			    	break;
 				case LocationDeterminator.LOCATION_INSIDE_CONDITION_END :
 				    list.add( new RuleCompletionProposal(prefix.length(), "&", "& ", droolsIcon));
@@ -319,21 +300,24 @@
 					        	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));
+				        list.addAll(getJavaCompletionProposals(fromText, prefix, getRuleParameters(backText)));
 					}
 					break;
+				case LocationDeterminator.LOCATION_FROM_ACCUMULATE_INIT_INSIDE :
+					content = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT);
+			    	list.addAll(getJavaCompletionProposals(content, prefix, getRuleParameters(backText)));
+					break;
+				case LocationDeterminator.LOCATION_FROM_ACCUMULATE_ACTION_INSIDE :
+					content = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT);
+					content += (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT);
+			    	list.addAll(getJavaCompletionProposals(content, prefix, getRuleParameters(backText)));
+					break;
+				case LocationDeterminator.LOCATION_FROM_ACCUMULATE_RESULT_INSIDE :
+					content = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT);
+					content += (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT);
+					content += (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT);
+			    	list.addAll(getJavaCompletionProposals(content, prefix, getRuleParameters(backText)));
+					break;
 			}
 		}
 	}
@@ -383,6 +367,21 @@
 		return null;
 	}
 	
+	private Map getRuleParameters(String backText) {
+		Map result = new HashMap();
+		try {
+	    	DrlParser parser = new DrlParser();
+    		PackageDescr descr = parser.parse(backText);
+    		List rules = descr.getRules();
+    		if (rules != null && rules.size() == 1) {
+    			getRuleParameters(result, ((RuleDescr) rules.get(0)).getLhs().getDescrs());
+    		}
+    	} catch (DroolsParserException exc) {
+    		// do nothing
+    	}
+    	return result;
+	}
+	
 	private boolean isComparable(String type) {
 		if (type == null) {
 			return false;
@@ -530,29 +529,8 @@
     private void addRHSJavaCompletionProposals(List list, String backText, String prefix) {
     	int thenPosition = backText.lastIndexOf("then");
     	String conditions = backText.substring(0, thenPosition);
-		Map params = new HashMap();
-    	DrlParser parser = new DrlParser();
-    	try {
-    		PackageDescr descr = parser.parse(conditions);
-    		List rules = descr.getRules();
-    		if (rules != null && rules.size() == 1) {
-    			getRuleParameters(params, ((RuleDescr) rules.get(0)).getLhs().getDescrs());
-    			// rule params are already added by JavaCompletionProposals
-    			// 
-    			// Iterator iterator = params.keySet().iterator();
-    			// while (iterator.hasNext()) {
-    			// 	String name = (String) iterator.next();
-    			// 	RuleCompletionProposal prop = new RuleCompletionProposal(prefix.length(), name, name + ".");
-				// 	prop.setPriority(-1);
-				// 	prop.setImage(methodIcon);
-				// 	list.add(prop);
-    			// }
-    		}
-    	} catch (DroolsParserException exc) {
-    		// do nothing
-    	}
-    	String consequence = backText.substring(thenPosition + 4);
-    	list.addAll(getJavaCompletionProposals(consequence, prefix, params));
+		String consequence = backText.substring(thenPosition + 4);
+    	list.addAll(getJavaCompletionProposals(consequence, prefix, getRuleParameters(conditions)));
     }
     
     private void getRuleParameters(Map result, List descrs) {
@@ -586,6 +564,12 @@
 			getRuleParameters(result, ((NotDescr) descr).getDescrs());
 		} else if (descr instanceof FromDescr) {
 			getRuleParameters(result, ((FromDescr) descr).getReturnedColumn());
+		} else if (descr instanceof AccumulateDescr) {
+			AccumulateDescr accumulateDescr = (AccumulateDescr) descr;
+			getRuleParameters(result, accumulateDescr.getResultColumn());
+			if (accumulateDescr.getSourceColumn() != null) {
+				getRuleParameters(result, accumulateDescr.getSourceColumn());
+			}
 		}
 
     }

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-10-25 22:13:34 UTC (rev 7119)
+++ labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java	2006-10-25 22:24:24 UTC (rev 7120)
@@ -1016,6 +1016,135 @@
         	"       ";
         location = LocationDeterminator.getLocationInCondition(input);
         assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        /** FROM ACCUMULATE */
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate ( ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate(";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( int total = 0; ), \n" +
+        	"			action( total += $cheese.getPrice(); ), \n" +
+        	"           result( new Integer( total ) ) \n" +
+        	"		) \n" +
+        	"		";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE_INIT_INSIDE, location.getType());
+        assertEquals("", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( int total = 0; ), \n" +
+        	"			action( ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE_ACTION_INSIDE, location.getType());
+        assertEquals("int total = 0; ", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT));
+        assertEquals("", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( int total = 0; ), \n" +
+        	"			action( total += $cheese.getPrice(); ), \n" +
+        	"           result( ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE_RESULT_INSIDE, location.getType());
+        assertEquals("int total = 0; ", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT));
+        assertEquals("total += $cheese.getPrice(); ", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT));
+        assertEquals("", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( int total =";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE_INIT_INSIDE, location.getType());
+        assertEquals("int total =", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( int total = 0; ), \n" +
+        	"			action( total += $ch";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE_ACTION_INSIDE, location.getType());
+        assertEquals("int total = 0; ", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT));
+        assertEquals("total += $ch", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == $likes ), \n" +
+        	"			init( int total = 0; ), \n" +
+        	"			action( total += $cheese.getPrice(); ), \n" +
+        	"           result( new Integer( tot";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_ACCUMULATE_RESULT_INSIDE, location.getType());
+        assertEquals("int total = 0; ", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_INIT_CONTENT));
+        assertEquals("total += $cheese.getPrice(); ", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_ACTION_CONTENT));
+        assertEquals("new Integer( tot", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_FROM_ACCUMULATE_RESULT_CONTENT));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_START, location.getType());
+        assertEquals("Cheese", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Cheese", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("type", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from accumulate( \n" +
+        	"			$cheese : Cheese( type == ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_ARGUMENT, location.getType());
+        assertEquals("Cheese", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("type", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
     }
     
 }




More information about the jboss-svn-commits mailing list