⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rulecompletionprocessor.java

📁 jboss规则引擎
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -