[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