[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