📄 rulecompletionprocessor.java
字号:
package org.drools.ide.editors.completion;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsParserException;
import org.drools.ide.DroolsIDEPlugin;
import org.drools.ide.DroolsPluginImages;
import org.drools.ide.editors.DRLRuleEditor;
import org.drools.ide.editors.DSLAdapter;
import org.drools.ide.util.ProjectClassLoader;
import org.drools.lang.descr.AndDescr;
import org.drools.lang.descr.ColumnDescr;
import org.drools.lang.descr.ExistsDescr;
import org.drools.lang.descr.FieldBindingDescr;
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;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.part.FileEditorInput;
/**
* For handling within rules, including DSLs.
* At present this provides a fixed list, plus what is available
* in the DSL configuration.
*
* TODO: This can be enhanced to look back for declarations, and introspect to get
* field names. (More can be done as well, this would just be the first step).
*
* This also handles queries, as they are just a type of rule essentially.
*
* @author Michael Neale, Kris Verlanen
*/
public class RuleCompletionProcessor extends DefaultCompletionProcessor {
private static final Pattern query = Pattern.compile(".*\\Wquery\\W.*", Pattern.DOTALL);
private static final Image droolsIcon = DroolsPluginImages.getImage(DroolsPluginImages.DROOLS);
private static final Image dslIcon = DroolsPluginImages.getImage( DroolsPluginImages.DSL_EXPRESSION );
private static final Image classIcon = DroolsPluginImages.getImage(DroolsPluginImages.CLASS);
private static final Pattern START_OF_CONSEQUENCE = Pattern.compile(".*then\\s*", Pattern.DOTALL);
public RuleCompletionProcessor(DRLRuleEditor editor) {
super(editor);
}
protected List getCompletionProposals(ITextViewer viewer, final int documentOffset) {
try {
final List list = new ArrayList();
DSLAdapter adapter = getDSLAdapter(viewer);
IDocument doc = viewer.getDocument();
String backText = readBackwards(documentOffset, doc);
final String prefix = stripWhiteSpace(backText);
if (backText.length() < 5) {
return list;
}
if (consequence(backText)) {
List dslConsequences = adapter.listConsequenceItems();
addDSLProposals(list, prefix, dslConsequences);
if (!adapter.hasConsequences()) {
// only add functions and keywords if at the beginning of a new statement
String backTextWithoutPrefix = backText.substring(0, backText.length() - prefix.length());
if (START_OF_CONSEQUENCE.matcher(backTextWithoutPrefix).matches()
|| START_OF_NEW_JAVA_STATEMENT.matcher(backTextWithoutPrefix).matches()) {
addRHSCompletionProposals(list, prefix);
addRHSFunctionCompletionProposals(viewer, list, prefix);
}
addRHSJavaCompletionProposals(list, backText, prefix);
}
} else if (condition(backText) || query(backText)) {
List dslConditions = adapter.listConditionItems();
addDSLProposals(list, prefix, dslConditions);
addLHSCompletionProposals(viewer, list, adapter, prefix, backText);
} else {
//we are in rule header
addRuleHeaderItems(list, prefix);
}
filterProposalsOnPrefix(prefix, list);
return list;
} catch (Throwable t) {
DroolsIDEPlugin.log(t);
}
return null;
}
private void addLHSCompletionProposals(ITextViewer viewer, final List list, DSLAdapter adapter, final String prefix, String backText) throws CoreException, DroolsParserException {
Iterator iterator;
if (!adapter.hasConditions()) {
// determine location in condition
LocationDeterminator.Location location = LocationDeterminator.getLocationInCondition(backText);
switch (location.getType()) {
case LocationDeterminator.LOCATION_BEGIN_OF_CONDITION:
// if we are at the beginning of a new condition
// add drools keywords
list.add( new RuleCompletionProposal(prefix.length(), "and", "and ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), "or", "or ", droolsIcon));
RuleCompletionProposal prop = new RuleCompletionProposal(prefix.length(), "eval", "eval( )", 6 );
prop.setImage(droolsIcon);
list.add(prop);
prop = new RuleCompletionProposal(prefix.length(), "then", "then" + System.getProperty("line.separator") + "\t");
prop.setImage(droolsIcon);
list.add(prop);
// we do not break but also add all elements that are needed for and/or
case LocationDeterminator.LOCATION_BEGIN_OF_CONDITION_AND_OR:
list.add( new RuleCompletionProposal(prefix.length(), "not", "not ", droolsIcon));
// we do not break but also add all elements that are needed for not
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_BEGIN_OF_CONDITION_EXISTS:
// and add imported classes
List imports = getDRLEditor().getImports();
iterator = imports.iterator();
while (iterator.hasNext()) {
String name = (String) iterator.next();
int index = name.lastIndexOf(".");
if (index != -1) {
String className = name.substring(index + 1);
RuleCompletionProposal p = new RuleCompletionProposal(prefix.length(), className, className + "( )", className.length() + 2);
p.setPriority(-1);
p.setImage(classIcon);
list.add(p);
}
}
List classesInPackage = getDRLEditor().getClassesInPackage();
iterator = classesInPackage.iterator();
while (iterator.hasNext()) {
String name = (String) iterator.next();
int index = name.lastIndexOf(".");
if (index != -1) {
String className = name.substring(index + 1);
RuleCompletionProposal p = new RuleCompletionProposal(prefix.length(), className, className + "( )", className.length() + 2);
p.setPriority(-1);
p.setImage(classIcon);
list.add(p);
}
}
break;
case LocationDeterminator.LOCATION_INSIDE_CONDITION_START :
String className = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME);
if (className != null) {
ClassTypeResolver resolver = new ClassTypeResolver(getDRLEditor().getImports(), ProjectClassLoader.getProjectClassLoader(getEditor()));
try {
Class clazz = resolver.resolveType(className);
if (clazz != null) {
Iterator iterator2 = new ClassFieldInspector(clazz).getFieldNames().keySet().iterator();
while (iterator2.hasNext()) {
String name = (String) iterator2.next();
RuleCompletionProposal p = new RuleCompletionProposal(prefix.length(), name, name + " ");
p.setImage(methodIcon);
list.add(p);
}
}
} catch (IOException exc) {
// Do nothing
} catch (ClassNotFoundException exc) {
// Do nothing
}
}
break;
case LocationDeterminator.LOCATION_INSIDE_CONDITION_OPERATOR :
className = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME);
String property = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME);
String type = getPropertyClass(className, property);
list.add( new RuleCompletionProposal(prefix.length(), "==", "== ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), "!=", "!= ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), ":", ": ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), "->", "-> ( )", 5, droolsIcon));
if (isComparable(type)) {
list.add( new RuleCompletionProposal(prefix.length(), "<", "< ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), "<=", "<= ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), ">", "> ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), ">=", ">= ", droolsIcon));
}
if (type.equals("java.lang.String")) {
list.add( new RuleCompletionProposal(prefix.length(), "matches", "matches \"\"", 9, droolsIcon));
}
if (isSubtypeOf(type, "java.util.Collection")) {
list.add( new RuleCompletionProposal(prefix.length(), "contains", "contains ", droolsIcon));
list.add( new RuleCompletionProposal(prefix.length(), "excludes", "excludes ", droolsIcon));
}
break;
case LocationDeterminator.LOCATION_INSIDE_CONDITION_ARGUMENT :
// determine type
className = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_CLASS_NAME);
property = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_PROPERTY_NAME);
String operator = (String) location.getProperty(LocationDeterminator.LOCATION_PROPERTY_OPERATOR);
type = getPropertyClass(className, property);
if ("contains".equals(operator) || "excludes".equals(operator)) {
type = "java.lang.Object";
}
boolean isObject = false;
if ("java.lang.Object".equals(type)) {
isObject = true;
}
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));
}
if (isObject || "java.lang.String".equals(type)) {
list.add( new RuleCompletionProposal(prefix.length(), "\"\"", "\"\"", 1, droolsIcon));
}
if (isObject || "java.util.Date".equals(type)) {
list.add( new RuleCompletionProposal(prefix.length(), "\"dd-mmm-yyyy\"", "\"dd-mmm-yyyy\"", 1, droolsIcon));
}
list.add( new RuleCompletionProposal(prefix.length(), "()", "( )", 2, droolsIcon));
DrlParser parser = new DrlParser();
try {
PackageDescr descr = parser.parse(backText);
List rules = descr.getRules();
if (rules != null && rules.size() == 1) {
Map result = new HashMap();
getRuleParameters(result, ((RuleDescr) rules.get(0)).getLhs().getDescrs());
Iterator iterator2 = result.entrySet().iterator();
while (iterator2.hasNext()) {
Map.Entry entry = (Map.Entry) iterator2.next();
String paramName = (String) entry.getKey();
String paramType = (String) entry.getValue();
if (isSubtypeOf(paramType, type)) {
RuleCompletionProposal proposal = new RuleCompletionProposal(prefix.length(), paramName);
proposal.setPriority(-1);
proposal.setImage(methodIcon);
list.add(proposal);
}
}
}
} catch (DroolsParserException exc) {
// do nothing
}
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));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -