[jboss-svn-commits] JBL Code SVN: r5523 - in labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide: builder editors editors/completion editors/outline

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Aug 6 17:57:16 EDT 2006


Author: KrisVerlaenen
Date: 2006-08-06 17:57:12 -0400 (Sun, 06 Aug 2006)
New Revision: 5523

Added:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/TemplateTreeNode.java
Modified:
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/builder/DroolsBuilder.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java
   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/RuleCompletionProcessor.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/keywords.properties
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/PackageTreeNode.java
   labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java
Log:
JBRULES-328: Eclipse support for FactTemplates:
 - Builder takes new Template errors into account
 - Folding now supports templates
 - DRL editor caches templates
 - template keyword added
 - code completion now also adds all templates defined, and is capable of 
   proposing the appropriate properties (and operators and arguments)
 - outline view supports templates


Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/builder/DroolsBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/builder/DroolsBuilder.java	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/builder/DroolsBuilder.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -11,6 +11,8 @@
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsError;
 import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.FactTemplateError;
+import org.drools.compiler.FieldTemplateError;
 import org.drools.compiler.FunctionError;
 import org.drools.compiler.GlobalError;
 import org.drools.compiler.PackageBuilder;
@@ -180,6 +182,7 @@
                     markers.add(new DroolsBuildMarker(recogErr.getMessage(), recogErr.line)); //flick back the line number
                 }
             } catch (Exception t) {
+            	t.printStackTrace();
                 throw t;
             } finally {
                 Thread.currentThread().setContextClassLoader(oldLoader);
@@ -238,6 +241,10 @@
         		} else {
         			markers.add(new DroolsBuildMarker(functionError.getFunctionDescr().getName() + ":" + functionError.getMessage(), -1));
         		}
+        	} else if (error instanceof FieldTemplateError) {
+        		markers.add(new DroolsBuildMarker(error.getMessage(), ((FieldTemplateError) error).getLine()));
+        	} else if (error instanceof FactTemplateError) {
+        		markers.add(new DroolsBuildMarker(error.getMessage(), ((FactTemplateError) error).getLine()));
         	} else {
         		markers.add(new DroolsBuildMarker("Unknown DroolsError " + error.getClass() + ": " + error));
         	}

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLReconcilingStrategy.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -25,6 +25,7 @@
 public class DRLReconcilingStrategy implements IReconcilingStrategy {
 
     private static final Pattern RULE_PATTERN = Pattern.compile("\\n\\s*(rule\\s+.*?\\n\\s*end)", Pattern.DOTALL);
+    private static final Pattern TEMPLATE_PATTERN = Pattern.compile("\\n\\s*(template\\s+.*?\\n\\s*end)", Pattern.DOTALL);
     private static final Pattern QUERY_PATTERN = Pattern.compile("\\n\\s*(query\\s+.*?\\n\\s*end)", Pattern.DOTALL);
     private static final Pattern FUNCTION_PATTERN = Pattern.compile("\\n\\s*(function\\s+[^\\{]*\\{)", Pattern.DOTALL);
     private static final Pattern IMPORT_PATTERN = Pattern.compile("\\n\\s*((\\s*import\\s+[^\\s;]+;?[\\t\\x0B\\f\\r]*\\n)+)", Pattern.DOTALL);
@@ -115,6 +116,10 @@
         while (matcher.find()) {
 			positions.add(new Position(matcher.start(1), matcher.end(1) - matcher.start(1)));
         }
+        matcher = TEMPLATE_PATTERN.matcher(input);
+        while (matcher.find()) {
+			positions.add(new Position(matcher.start(1), matcher.end(1) - matcher.start(1)));
+        }
         matcher = IMPORT_PATTERN.matcher(input);
         while (matcher.find()) {
 			positions.add(new Position(matcher.start(1), matcher.end(1) - matcher.start(1)));

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -5,6 +5,8 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import org.drools.compiler.DrlParser;
 import org.drools.compiler.DroolsParserException;
@@ -13,6 +15,7 @@
 import org.drools.ide.debug.core.IDroolsDebugConstants;
 import org.drools.ide.editors.outline.RuleContentOutlinePage;
 import org.drools.ide.editors.scanners.RuleEditorMessages;
+import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FunctionDescr;
 import org.drools.lang.descr.PackageDescr;
 import org.eclipse.core.resources.IMarker;
@@ -53,6 +56,7 @@
 	private DSLAdapter dslAdapter;
 	private List imports;
 	private List functions;
+	private Map templates;
 	private String packageName;
 	private List classesInPackage;
 	private RuleContentOutlinePage ruleContentOutline = null;
@@ -158,12 +162,19 @@
 			}
 	        // functions
 	        List functionDescrs = descr.getFunctions();
-	        List functions = new ArrayList(functionDescrs.size());
+	        functions = new ArrayList(functionDescrs.size());
 	        iterator = functionDescrs.iterator();
 	        while (iterator.hasNext()) {
 				functions.add(((FunctionDescr) iterator.next()).getName());
 			}
-	        this.functions = functions;
+	        // templates
+	        List templateDescrs = descr.getFactTemplates();
+	        templates = new HashMap(templateDescrs.size());
+	        iterator = templateDescrs.iterator();
+	        while (iterator.hasNext()) {
+	        	FactTemplateDescr template = (FactTemplateDescr) iterator.next();
+	        	templates.put(template.getName(), template);
+			}
 		} catch (CoreException exc) {
 			DroolsIDEPlugin.log(exc);
 		} catch (DroolsParserException exc) {
@@ -178,6 +189,20 @@
 		return functions;
 	}
 	
+	public Set getTemplates() {
+		if (templates == null) {
+			loadImportsAndFunctions();
+		}
+		return templates.keySet();
+	}
+	
+	public FactTemplateDescr getTemplate(String name) {
+		if (templates == null) {
+			loadImportsAndFunctions();
+		}
+		return (FactTemplateDescr) templates.get(name);
+	}
+	
 	public String getPackage() {
 		if (packageName == null) {
 			loadImportsAndFunctions();
@@ -250,6 +275,7 @@
 		dslAdapter = null;
 		imports = null;
 		functions = null;
+		templates = null;
 		packageName = null;
 		classesInPackage = null;
 	}

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-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/DefaultCompletionProcessor.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -41,6 +41,7 @@
     private static final String NEW_RULE_TEMPLATE = "rule \"new rule\"" + System.getProperty("line.separator") + "\twhen" + System.getProperty("line.separator") + "\t\t" + System.getProperty("line.separator") + "\tthen" + System.getProperty("line.separator") + "\t\t" + System.getProperty("line.separator") + "end";
     private static final String NEW_QUERY_TEMPLATE = "query \"query name\"" + System.getProperty("line.separator") + "\t#conditions" + System.getProperty("line.separator") + "end";
     private static final String NEW_FUNCTION_TEMPLATE = "function void yourFunction(Type arg) {" + System.getProperty("line.separator") + "\t/* code goes here*/" + System.getProperty("line.separator") + "}";
+    private static final String NEW_TEMPLATE_TEMPLATE = "template Name" + System.getProperty("line.separator") + "\t" + System.getProperty("line.separator") + "end";
     private static final Pattern IMPORT_PATTERN = Pattern.compile(".*\n\\W*import\\W[^;\\s]*", Pattern.DOTALL);
     // TODO: doesn't work for { inside functions
     private static final Pattern FUNCTION_PATTERN = Pattern.compile( ".*\n\\W*function\\s+(\\S+)\\s+(\\S+)\\s*\\(([^\\)]*)\\)\\s*\\{([^\\}]*)", Pattern.DOTALL);
@@ -140,6 +141,7 @@
         list.add(new RuleCompletionProposal(prefix.length(), "package", "package "));
         list.add(new RuleCompletionProposal(prefix.length(), "query", NEW_QUERY_TEMPLATE));
         list.add(new RuleCompletionProposal(prefix.length(), "function", NEW_FUNCTION_TEMPLATE, 14));
+        list.add(new RuleCompletionProposal(prefix.length(), "template", NEW_TEMPLATE_TEMPLATE, 9));
         filterProposalsOnPrefix(prefix, list);
         return list;
     }

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-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/completion/RuleCompletionProcessor.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -6,6 +6,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.regex.Pattern;
 
@@ -19,7 +20,9 @@
 import org.drools.lang.descr.AndDescr;
 import org.drools.lang.descr.ColumnDescr;
 import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FactTemplateDescr;
 import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldTemplateDescr;
 import org.drools.lang.descr.NotDescr;
 import org.drools.lang.descr.OrDescr;
 import org.drools.lang.descr.PackageDescr;
@@ -28,9 +31,13 @@
 import org.drools.semantics.java.ClassTypeResolver;
 import org.drools.util.asm.ClassFieldInspector;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jface.text.IDocument;
 import org.eclipse.jface.text.ITextViewer;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
 import org.eclipse.ui.part.FileEditorInput;
 
 /**
@@ -154,26 +161,38 @@
 				        	list.add(p);
 				        }
 				    }
+				    Set templates = getDRLEditor().getTemplates();
+				    iterator = templates.iterator();
+				    while (iterator.hasNext()) {
+				        String name = (String) iterator.next();
+			        	RuleCompletionProposal p = new RuleCompletionProposal(prefix.length(), name, name + "(  )", name.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);
-							    }
+						boolean isTemplate = addFactTemplatePropertyProposals(prefix, className, list);
+						if (!isTemplate) {
+							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
 							}
-						} catch (IOException exc) {
-							// Do nothing
-						} catch (ClassNotFoundException exc) {
-							// Do nothing
 						}
 					}
 					break;
@@ -287,21 +306,46 @@
 	}
 	
 	private String getPropertyClass(String className, String propertyName) {
-		if (className != null) {
-			ClassTypeResolver resolver = new ClassTypeResolver(getDRLEditor().getImports(), ProjectClassLoader.getProjectClassLoader(getEditor()));
-			try {
-				Class clazz = resolver.resolveType(className);
-				if (clazz != null) {
-					Class clazzz = (Class) new ClassFieldInspector(clazz).getFieldTypes().get(propertyName);
-					if (clazzz != null) {
-						return clazzz.getName();
+		if (className != null && propertyName != null) {
+			FactTemplateDescr template = getDRLEditor().getTemplate(className);
+			if (template != null) {
+		    	Iterator iterator = template.getFields().iterator();
+		    	while (iterator.hasNext()) {
+		    		FieldTemplateDescr field = (FieldTemplateDescr) iterator.next();
+		    		if (propertyName.equals(field.getName())) {
+		    			String type = field.getClassType();
+		    			if (isPrimitiveType(type)) {
+		    				return type;
+		    			}
+		    			ClassTypeResolver resolver = new ClassTypeResolver(getDRLEditor().getImports(), ProjectClassLoader.getProjectClassLoader(getEditor()));
+						try {
+							Class clazz = resolver.resolveType(type);
+							if (clazz != null) {
+								return clazz.getName();
+							}
+						} catch (ClassNotFoundException exc) {
+							exc.printStackTrace();
+							// Do nothing
+						}
+		    		}
+		    	}
+		    	// if not found, return null
+			} else {
+				ClassTypeResolver resolver = new ClassTypeResolver(getDRLEditor().getImports(), ProjectClassLoader.getProjectClassLoader(getEditor()));
+				try {
+					Class clazz = resolver.resolveType(className);
+					if (clazz != null) {
+						Class clazzz = (Class) new ClassFieldInspector(clazz).getFieldTypes().get(propertyName);
+						if (clazzz != null) {
+							return clazzz.getName();
+						}
 					}
+				} catch (IOException exc) {
+					// Do nothing
+				} catch (ClassNotFoundException exc) {
+					// Do nothing
 				}
-			} catch (IOException exc) {
-				// Do nothing
-			} catch (ClassNotFoundException exc) {
-				// Do nothing
-			}
+			} 
 		}
 		return null;
 	}
@@ -313,6 +357,9 @@
 		if (isPrimitiveNumericType(type)) {
 			return true;
 		}
+		if (isObjectNumericType(type)) {
+			return true;
+		}
 		if (isSubtypeOf(type, "java.lang.Comparable")) {
 			return true;
 		}
@@ -331,6 +378,13 @@
 				|| type.equals("char");
 	}
 	
+	private boolean isObjectNumericType(String type) {
+		return type.equals("java.lang.Byte") || type.equals("java.lang.Short")
+				|| type.equals("java.lang.Integer") || type.equals("java.lang.Long")
+				|| type.equals("java.lang.Float") || type.equals("java.lang.Double")
+				|| type.equals("java.lang.Char");
+	}
+	
 	/**
 	 * Returns true if the first class is the same or a subtype of the second class.
 	 * @param class1
@@ -557,5 +611,20 @@
         }
         return adapter;
     }
-
+    
+    private boolean addFactTemplatePropertyProposals(String prefix, String templateName, List list) {
+    	FactTemplateDescr descr = getDRLEditor().getTemplate(templateName);
+    	if (descr == null) {
+    		return false;
+    	}
+    	Iterator iterator = descr.getFields().iterator();
+    	while (iterator.hasNext()) {
+    		FieldTemplateDescr field = (FieldTemplateDescr) iterator.next();
+	        String fieldName = field.getName();
+        	RuleCompletionProposal p = new RuleCompletionProposal(prefix.length(), fieldName, fieldName + " ");
+        	p.setImage(methodIcon);
+        	list.add(p);
+    	}
+    	return true;
+    }
 }

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/keywords.properties
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/keywords.properties	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/keywords.properties	2006-08-06 21:57:12 UTC (rev 5523)
@@ -24,3 +24,7 @@
 auto-focus
 activation-group
 new
+contains
+matches
+excludes
+template

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/PackageTreeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/PackageTreeNode.java	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/PackageTreeNode.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -118,6 +118,13 @@
         queries.add( node );
     }
 
+    public void addTemplate(String templateLabel, int offset, int length) {
+		TemplateTreeNode node = new TemplateTreeNode( this, templateLabel );
+		node.setOffset( offset );
+		node.setLength( length );
+		queries.add( node );
+	}
+
     /** 
      * This will return the child nodes, as they are to be displayed on screen (sorted an all !) 
      * Rules should appear at the top, sorted, as they are the most important assets.

Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -63,6 +63,9 @@
 	private static final Pattern FUNCTION_PATTERN = Pattern.compile(
 			"\\n\\s*function\\s+(\\S+)\\s+(\\S+)\\(.*\\)", Pattern.DOTALL);
 
+	private static final Pattern TEMPLATE_PATTERN = Pattern.compile(
+			"\\n\\s*template\\s+([^\\s;#\"]+)", Pattern.DOTALL);
+
 	private static final Pattern IMPORT_PATTERN = Pattern.compile(
 			"\\n\\s*import\\s+([^\\s;#]+);?", Pattern.DOTALL);
 
@@ -211,6 +214,12 @@
 			packageTreeNode.addQuery(queryName, 
 					matcher.start(1), matcher.end(1) - matcher.start(1));
 		}
+		matcher = TEMPLATE_PATTERN.matcher(ruleFileContents);
+		while (matcher.find()) {
+			String templateName = matcher.group(1);
+			packageTreeNode.addTemplate(templateName, 
+					matcher.start(1), matcher.end(1) - matcher.start(1));
+		}
     }
 
     public void initRules(String ruleFileContents) {

Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/TemplateTreeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/TemplateTreeNode.java	2006-08-06 21:52:32 UTC (rev 5522)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/TemplateTreeNode.java	2006-08-06 21:57:12 UTC (rev 5523)
@@ -0,0 +1,42 @@
+package org.drools.ide.editors.outline;
+
+import org.drools.ide.DroolsIDEPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+public class TemplateTreeNode extends OutlineNode implements Comparable {
+
+    private final PackageTreeNode packageTreeNode;
+    private final String          expanderLabel;
+
+    public TemplateTreeNode(PackageTreeNode parent,
+                            String importLabel) {
+        packageTreeNode = parent;
+        this.expanderLabel = importLabel;
+
+    }
+
+    public Object[] getChildren(Object o) {
+        return new Object[0];
+    }
+
+    public ImageDescriptor getImageDescriptor(Object object) {
+        return DroolsIDEPlugin.getImageDescriptor( "icons/class_obj.gif" );
+    }
+
+    public String getLabel(Object o) {
+        return expanderLabel;
+    }
+
+    public Object getParent(Object o) {
+        return packageTreeNode;
+    }
+
+    public int compareTo(Object obj) {
+        if ( obj instanceof TemplateTreeNode ) {
+            TemplateTreeNode other = (TemplateTreeNode) obj;
+            return this.expanderLabel.compareTo( other.expanderLabel );
+        } else {
+            return 0;
+        }
+    }
+}




More information about the jboss-svn-commits mailing list