[jboss-svn-commits] JBL Code SVN: r5479 - 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
Fri Aug 4 17:47:20 EDT 2006


Author: KrisVerlaenen
Date: 2006-08-04 17:47:16 -0400 (Fri, 04 Aug 2006)
New Revision: 5479

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-388: Add completion support for multiple restrictions in column constraints
 - extended location determinator (+ test) for multiple restrictions
 - rule completion processor also supports new location "end of condition"

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-08-04 21:39:28 UTC (rev 5478)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/LocationDeterminator.java	2006-08-04 21:47:16 UTC (rev 5479)
@@ -12,10 +12,12 @@
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.EvalDescr;
 import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
 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;
 
 public class LocationDeterminator {
@@ -26,6 +28,10 @@
     static final Pattern COLUMN_PATTERN_MATCHES_ARGUMENT = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s+matches\\s+[^\\s<>!=:]*", Pattern.DOTALL);
     static final Pattern COLUMN_PATTERN_EXCLUDES_ARGUMENT = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s+excludes\\s+[^\\s<>!=:]*", Pattern.DOTALL);
     static final Pattern COLUMN_PATTERN_COMPARATOR_ARGUMENT = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s*([<>=!]+)\\s*[^\\s<>!=:]*", Pattern.DOTALL);
+    static final Pattern COLUMN_PATTERN_CONTAINS_END = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s+contains\\s+[^\\s<>!=:,]+\\s+", Pattern.DOTALL);
+    static final Pattern COLUMN_PATTERN_MATCHES_END = Pattern.compile(".*[(,](\\s*(\\S*)\\s*:)?\\s*([^\\s<>!=:]+)\\s+matches\\s+[^\\s<>!=:,]+\\s+", Pattern.DOTALL);
+    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 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);
@@ -40,6 +46,7 @@
 	static final int LOCATION_INSIDE_CONDITION_START = 100;
 	static final int LOCATION_INSIDE_CONDITION_OPERATOR = 101;
 	static final int LOCATION_INSIDE_CONDITION_ARGUMENT = 102;
+	static final int LOCATION_INSIDE_CONDITION_END = 103;
 
 	static final int LOCATION_INSIDE_EVAL = 200;
 	
@@ -128,6 +135,32 @@
 			if (columnContents == null) {
 				return new Location(LOCATION_BEGIN_OF_CONDITION);
 			}
+			List subDescrs = columnDescr.getDescrs();
+			if (subDescrs.size() > 0) {
+				Object lastDescr = subDescrs.get(subDescrs.size() - 1);
+				if (lastDescr instanceof FieldConstraintDescr) {
+					FieldConstraintDescr lastFieldDescr = (FieldConstraintDescr) lastDescr;
+					List restrictions = lastFieldDescr.getRestrictions();
+					if (restrictions.size() > 1) {
+						// if there are multiple restrictions, filter out all the rest so that
+						// only the last one remains
+						Object last = restrictions.get(restrictions.size() - 1);
+						if (last instanceof RestrictionConnectiveDescr) {
+							RestrictionConnectiveDescr lastRestr = (RestrictionConnectiveDescr) last;
+							char connective = '&';
+							if (lastRestr.getConnective() == RestrictionConnectiveDescr.OR) {
+								connective = '|';
+							}
+							int connectiveLocation = columnContents.lastIndexOf(connective);
+							columnContents = "( " + lastFieldDescr.getFieldName() + " " + columnContents.substring(connectiveLocation + 1);
+						} else {
+							Location location = new Location(LOCATION_INSIDE_CONDITION_END);
+							location.setProperty(LOCATION_PROPERTY_CLASS_NAME, columnDescr.getObjectType());
+							return location;
+						}
+					}
+				}
+			}
 			matcher = COLUMN_PATTERN_OPERATOR.matcher(columnContents);
 	        if (matcher.matches()) {
 				Location location = new Location(LOCATION_INSIDE_CONDITION_OPERATOR);
@@ -167,6 +200,30 @@
 				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);

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-08-04 21:39:28 UTC (rev 5478)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2006-08-04 21:47:16 UTC (rev 5479)
@@ -217,10 +217,10 @@
 						isObject = true;
 					}
 
-				    list.add( new RuleCompletionProposal(prefix.length(), "null", "null", droolsIcon));
+				    list.add( new RuleCompletionProposal(prefix.length(), "null", "null ", droolsIcon));
 					if ("boolean".equals(type)) {
-					    list.add( new RuleCompletionProposal(prefix.length(), "true", "true", droolsIcon));
-					    list.add( new RuleCompletionProposal(prefix.length(), "false", "false", droolsIcon));
+					    list.add( new RuleCompletionProposal(prefix.length(), "true", "true ", droolsIcon));
+					    list.add( new RuleCompletionProposal(prefix.length(), "false", "false ", droolsIcon));
 					}
 					if (isObject || "java.lang.String".equals(type)) {
 						list.add( new RuleCompletionProposal(prefix.length(), "\"\"", "\"\"", 1, droolsIcon));
@@ -278,6 +278,10 @@
 			    	}
 			    	list.addAll(getJavaCompletionProposals(content, prefix, params));
 			    	break;
+				case LocationDeterminator.LOCATION_INSIDE_CONDITION_END :
+				    list.add( new RuleCompletionProposal(prefix.length(), "&", "& ", droolsIcon));
+				    list.add( new RuleCompletionProposal(prefix.length(), "|", "| ", droolsIcon));
+				    list.add( new RuleCompletionProposal(prefix.length(), ",", ", ", droolsIcon));
 			}
 		}
 	}

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-08-04 21:39:28 UTC (rev 5478)
+++ labs/jbossrules/trunk/drools-ide/src/test/java/org/drools/ide/editors/completion/LocationDeterminatorTest.java	2006-08-04 21:47:16 UTC (rev 5479)
@@ -840,6 +840,127 @@
         	"       ";
         location = LocationDeterminator.getLocationInCondition(input);
         assertEquals(LocationDeterminator.LOCATION_BEGIN_OF_CONDITION, location.getType());
+
+        /** MULTIPLE RESTRICTIONS */
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 & ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 & " +
+        	"       ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( name : property1, property2 > 0 & ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property2", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property1 < 20, property2 > 0 & ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property2", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 & < ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_ARGUMENT, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+        assertEquals("<", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_OPERATOR));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 | ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 | \n" +
+        	"       ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( name : property1, property2 > 0 | ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property2", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property1 < 20, property2 > 0 | ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR, location.getType());
+        assertEquals("Class", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME));
+        assertEquals("property2", location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME));
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_END, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 \n" +
+        	"       ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_END, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 & < 10 ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_END, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property > 0 | < 10 ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_END, location.getType());
+
+        input = 
+        	"rule MyRule \n" +
+        	"	when \n" +
+        	"		Class ( property == \"test\" | == \"test2\" ";
+        location = LocationDeterminator.getLocationInCondition(input);
+        assertEquals(LocationDeterminator.LOCATION_INSIDE_CONDITION_END, location.getType());
     }
     
 }




More information about the jboss-svn-commits mailing list