[jboss-svn-commits] JBL Code SVN: r7122 - 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 19:10:12 EDT 2006


Author: KrisVerlaenen
Date: 2006-10-25 19:10:08 -0400 (Wed, 25 Oct 2006)
New Revision: 7122

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-487: Add eclipse plugin support for "collect" conditional element
 - the DRL editor now fully supports collect

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 23:02:12 UTC (rev 7121)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java	2006-10-25 23:10:08 UTC (rev 7122)
@@ -10,6 +10,8 @@
 import org.drools.compiler.DroolsParserException;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.BaseDescr;
+import org.drools.lang.descr.CollectDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.EvalDescr;
 import org.drools.lang.descr.ExistsDescr;
@@ -18,7 +20,6 @@
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.PatternDescr;
 import org.drools.lang.descr.RestrictionConnectiveDescr;
 import org.drools.lang.descr.RuleDescr;
 
@@ -44,6 +45,7 @@
     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 Pattern COLLECT_PATTERN = Pattern.compile(".*\\)\\s+from\\s+collect\\s*\\(\\s*", Pattern.DOTALL);
     
 	static final int LOCATION_UNKNOWN = 0;
 	static final int LOCATION_BEGIN_OF_CONDITION = 1;
@@ -115,14 +117,14 @@
     	return new Location(LOCATION_UNKNOWN);
 	}
 	
-	public static Location determineLocationForDescr(PatternDescr descr, String backText) {
+	public static Location determineLocationForDescr(BaseDescr descr, String backText) {
 		if (descr instanceof RuleDescr) {
 			RuleDescr ruleDescr = (RuleDescr) descr;
 			List subDescrs = ruleDescr.getLhs().getDescrs();
 			if (subDescrs.size() == 0) {
 				return new Location(LOCATION_BEGIN_OF_CONDITION);
 			}
-			PatternDescr subDescr = (PatternDescr) subDescrs.get(subDescrs.size() - 1);
+			BaseDescr subDescr = (BaseDescr) subDescrs.get(subDescrs.size() - 1);
 			if (subDescr == null) {
 				Matcher matcher = EXISTS_PATTERN.matcher(backText);
 				if (matcher.matches()) {
@@ -196,7 +198,7 @@
 				return new Location(LOCATION_BEGIN_OF_CONDITION_EXISTS);
 			}
 			if (subDescrs.size() == 1) {
-				PatternDescr subDescr = (PatternDescr) subDescrs.get(0);
+				BaseDescr subDescr = (BaseDescr) subDescrs.get(0);
 				if (subDescr == null) {
 					return new Location(LOCATION_BEGIN_OF_CONDITION_EXISTS);
 				}
@@ -209,7 +211,7 @@
 				return new Location(LOCATION_BEGIN_OF_CONDITION_NOT);
 			}
 			if (subDescrs.size() == 1) {
-				PatternDescr subDescr = (PatternDescr) subDescrs.get(0);
+				BaseDescr subDescr = (BaseDescr) subDescrs.get(0);
 				if (subDescr == null) {
 					return new Location(LOCATION_BEGIN_OF_CONDITION_NOT);
 				}
@@ -224,7 +226,7 @@
 			List subDescrs = ((AndDescr) descr).getDescrs();
 			int size = subDescrs.size();
 			if (size == 2) {
-				PatternDescr subDescr = (PatternDescr) subDescrs.get(1);
+				BaseDescr subDescr = (BaseDescr) subDescrs.get(1);
 				if (subDescr == null) {
 					Matcher matcher = EXISTS_PATTERN.matcher(backText);
 					if (matcher.matches()) {
@@ -248,7 +250,7 @@
 			List subDescrs = ((OrDescr) descr).getDescrs();
 			int size = subDescrs.size();
 			if (size == 2) {
-				PatternDescr subDescr = (PatternDescr) subDescrs.get(1);
+				BaseDescr subDescr = (BaseDescr) subDescrs.get(1);
 				if (subDescr == null) {
 					Matcher matcher = EXISTS_PATTERN.matcher(backText);
 					if (matcher.matches()) {
@@ -307,12 +309,26 @@
 				return getLocationForColumn(columnContents, className);
 			}
 			return new Location(LOCATION_FROM_ACCUMULATE);
+		} else if (descr instanceof CollectDescr) {
+			Matcher matcher = COLLECT_PATTERN.matcher(backText);
+			int end = -1;
+			while (matcher.find()) {
+				end = matcher.end();
+			}
+			String collectText = backText.substring(end);
+			matcher = COLUMN_PATTERN.matcher(collectText);
+			if (matcher.matches()) {
+				String className = matcher.group(3);
+				String columnContents = matcher.group(4);
+				return getLocationForColumn(columnContents, className);
+			}
+			return new Location(LOCATION_FROM_COLLECT);
 		}
 		
 		return new Location(LOCATION_UNKNOWN);
 	}
 	
-	private static boolean endReached(PatternDescr descr) {
+	private static boolean endReached(BaseDescr descr) {
 		if (descr instanceof ColumnDescr) {
 			return (descr.getEndLine() != 0 || descr.getEndColumn() != 0);
 		} else if (descr instanceof ExistsDescr) {
@@ -320,27 +336,27 @@
 			if (descrs.isEmpty()) {
 				return false;
 			}
-			return endReached((PatternDescr) descrs.get(0));
+			return endReached((BaseDescr) descrs.get(0));
 		} else if (descr instanceof NotDescr) {
 			List descrs = ((NotDescr) descr).getDescrs();
 			if (descrs.isEmpty()) {
 				return false;
 			}
-			return endReached((PatternDescr) descrs.get(0));
+			return endReached((BaseDescr) descrs.get(0));
 		} else if (descr instanceof AndDescr) {
 			List descrs = ((AndDescr) descr).getDescrs();
 			if (descrs.size() != 2) {
 				return false;
 			}
-			return endReached((PatternDescr) descrs.get(0))
-				&& endReached((PatternDescr) descrs.get(1));
+			return endReached((BaseDescr) descrs.get(0))
+				&& endReached((BaseDescr) descrs.get(1));
 		} else if (descr instanceof OrDescr) {
 			List descrs = ((OrDescr) descr).getDescrs();
 			if (descrs.size() != 2) {
 				return false;
 			}
-			return endReached((PatternDescr) descrs.get(0))
-				&& endReached((PatternDescr) descrs.get(1));
+			return endReached((BaseDescr) descrs.get(0))
+				&& endReached((BaseDescr) descrs.get(1));
 		} else if (descr instanceof EvalDescr) {
 			// EvalDescr are only added once the end has been reached 
 			return true;
@@ -348,6 +364,8 @@
 			return ((FromDescr) descr).getDataSource() != null;
 		} else if (descr instanceof AccumulateDescr) {
 			return ((AccumulateDescr) descr).getResultCode() != null;
+		} else if (descr instanceof CollectDescr) {
+			return ((CollectDescr) descr).getSourceColumn() != 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-10-25 23:02:12 UTC (rev 7121)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2006-10-25 23:10:08 UTC (rev 7122)
@@ -19,6 +19,7 @@
 import org.drools.ide.util.ProjectClassLoader;
 import org.drools.lang.descr.AccumulateDescr;
 import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.BaseDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.ExistsDescr;
 import org.drools.lang.descr.FactTemplateDescr;
@@ -28,7 +29,6 @@
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.PatternDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.semantics.java.ClassTypeResolver;
 import org.drools.util.asm.ClassFieldInspector;
@@ -132,7 +132,8 @@
 				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_FROM_ACCUMULATE:
+				case LocationDeterminator.LOCATION_FROM_COLLECT :
 				case LocationDeterminator.LOCATION_BEGIN_OF_CONDITION_EXISTS:
 				    // and add imported classes
 				    List imports = getDRLEditor().getImports();
@@ -539,12 +540,12 @@
     	}
     	Iterator iterator = descrs.iterator();
     	while (iterator.hasNext()) {
-    		PatternDescr descr = (PatternDescr) iterator.next();
+    		BaseDescr descr = (BaseDescr) iterator.next();
     		getRuleParameters(result, descr);
 		}
     }
     
-    private void getRuleParameters(Map result, PatternDescr descr) {
+    private void getRuleParameters(Map result, BaseDescr descr) {
 		if (descr == null) {
 			return;
 		}
@@ -580,7 +581,7 @@
     	}
     	Iterator iterator = descrs.iterator();
     	while (iterator.hasNext()) {
-    		PatternDescr descr = (PatternDescr) iterator.next();
+    		BaseDescr descr = (BaseDescr) iterator.next();
     		if (descr instanceof FieldBindingDescr) {
 				FieldBindingDescr fieldDescr = (FieldBindingDescr) descr;
 				String name = fieldDescr.getIdentifier();

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 23:02:12 UTC (rev 7121)
+++ labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java	2006-10-25 23:10:08 UTC (rev 7122)
@@ -6,12 +6,6 @@
  * Test to check the location determination when doing code completion inside
  * rule condtions.
  * 
- * Possible locations:
- * LOCATION_BEGIN_OF_CONDITION
- * 		-> all drools condition keywords + imported classes
- * LOCATION_INSIDE_CONDITION_START
- * 		-> all properties of specified class
- * 
  * @author <a href="mailto:kris_verlaenen at hotmail.com">kris verlaenen </a>
  *
  */
@@ -479,7 +473,7 @@
         assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_START, location.getType());
         assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
 
-// TODO        
+        // TODO        
 //        input = 
 //        	"rule MyRule \n" +
 //        	"	when \n" +
@@ -487,7 +481,7 @@
 //        location = LocationDeterminator.getLocationInCondition(input);
 //        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_START, location.getType());
 //        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
-//
+
 //        input = 
 //        	"rule MyRule \n" +
 //        	"	when \n" +
@@ -1145,6 +1139,60 @@
         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));
+
+        /** FROM COLLECT */
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from collect ( ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_COLLECT, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from collect(";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_FROM_COLLECT, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from collect ( \n" +
+        	"			Cheese( type == $likes )" +
+        	"		) \n" +
+        	"		";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ) from collect ( \n" +
+        	"			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 collect ( \n" +
+        	"			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 collect ( \n" +
+        	"			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