[jboss-svn-commits] JBL Code SVN: r5481 - labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Aug 4 18:03:35 EDT 2006
Author: KrisVerlaenen
Date: 2006-08-04 18:03:32 -0400 (Fri, 04 Aug 2006)
New Revision: 5481
Added:
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleAttributeTreeNode.java
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/RuleContentOutlinePage.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleTreeNode.java
Log:
JBRULES-136: Show rule attributes in outline view
- outline view now uses parsed rule AST to determine rule attributes
JBRULES-282: Funny newlines break folding
- refactoring of folding should remove this issue for outline view
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-04 21:50:16 UTC (rev 5480)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/PackageTreeNode.java 2006-08-04 22:03:32 UTC (rev 5481)
@@ -1,10 +1,12 @@
package org.drools.ide.editors.outline;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.Collections;
import java.util.List;
import org.drools.ide.DroolsIDEPlugin;
+import org.drools.lang.descr.AttributeDescr;
import org.eclipse.jface.resource.ImageDescriptor;
/**
@@ -41,13 +43,30 @@
public void addRule(String ruleName,
int offset,
int length) {
+ addRule(ruleName, offset, length, null);
+ }
+
+ /** Add a rule node to the outline. Keeping track of where it was seen in the document (offset) */
+ public void addRule(String ruleName,
+ int offset,
+ int length,
+ List attributes) {
RuleTreeNode node = new RuleTreeNode( this,
ruleName );
node.setOffset( offset );
node.setLength( length );
+ if (attributes != null) {
+ Iterator iterator = attributes.iterator();
+ while (iterator.hasNext()) {
+ AttributeDescr descr = (AttributeDescr) iterator.next();
+ if (descr != null) { // this is possible when attributes contain errors
+ node.addAttribute(descr.getName(), descr.getValue(), offset, length);
+ }
+ }
+ }
rules.add( node );
}
-
+
/** Add a function node to the outline. Keeping track of where it was seen in the document (offset) */
public void addFunction(String functionLabel,
int offset,
Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleAttributeTreeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleAttributeTreeNode.java 2006-08-04 21:50:16 UTC (rev 5480)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleAttributeTreeNode.java 2006-08-04 22:03:32 UTC (rev 5481)
@@ -0,0 +1,44 @@
+package org.drools.ide.editors.outline;
+
+import org.drools.ide.DroolsIDEPlugin;
+import org.eclipse.jface.resource.ImageDescriptor;
+
+public class RuleAttributeTreeNode extends OutlineNode implements Comparable {
+
+ private final RuleTreeNode ruleTreeNode;
+ private final String attributeName;
+ private final Object attributeValue;
+
+ public RuleAttributeTreeNode(RuleTreeNode parent,
+ String name, Object value) {
+ ruleTreeNode = parent;
+ this.attributeName = name;
+ this.attributeValue = value;
+ }
+
+ public Object[] getChildren(Object o) {
+ return new Object[0];
+ }
+
+ public ImageDescriptor getImageDescriptor(Object object) {
+ return DroolsIDEPlugin.getImageDescriptor( "icons/drools.gif" );
+ }
+
+ public String getLabel(Object o) {
+ return attributeName + " = " + attributeValue;
+ }
+
+ public Object getParent(Object o) {
+ return ruleTreeNode;
+ }
+
+ public int compareTo(Object obj) {
+ if (obj instanceof RuleAttributeTreeNode) {
+ RuleAttributeTreeNode other = (RuleAttributeTreeNode) obj;
+ return this.attributeName.compareTo(other.attributeName);
+ } else {
+ return 0;
+ }
+ }
+
+}
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-04 21:50:16 UTC (rev 5480)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java 2006-08-04 22:03:32 UTC (rev 5481)
@@ -1,12 +1,22 @@
package org.drools.ide.editors.outline;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.drools.compiler.DrlParser;
+import org.drools.ide.builder.DroolsBuilder;
import org.drools.ide.editors.DRLRuleEditor;
+import org.drools.ide.editors.DSLAdapter;
+import org.drools.ide.util.ProjectClassLoader;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
@@ -15,6 +25,7 @@
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.model.WorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.texteditor.IDocumentProvider;
@@ -34,37 +45,39 @@
//the "root" node
private final RuleFileTreeNode ruleFileTreeNode = new RuleFileTreeNode();
+ private Map rules;
+// private Map lineToCharactersMapping;
///////////////////////////////////
// Patterns that the parser uses
///////////////////////////////////
- private static final Pattern rulePattern1 = Pattern.compile( "\\s*rule\\s+\"([^\"]+)\".*",
- Pattern.DOTALL );
+ private static final Pattern RULE_PATTERN1 = Pattern.compile(
+ "\\n\\s*rule\\s+\"([^\"]+)\"", Pattern.DOTALL);
- private static final Pattern rulePattern2 = Pattern.compile( "\\s*rule\\s+([^\\s;#\"]+).*",
- Pattern.DOTALL );
+ private static final Pattern RULE_PATTERN2 = Pattern.compile(
+ "\\n\\s*rule\\s+([^\\s;#\"]+)", Pattern.DOTALL);
- private static final Pattern packagePattern = Pattern.compile( "\\s*package\\s+([^\\s;#]+);?.*",
- Pattern.DOTALL );
+ private static final Pattern PACKAGE_PATTERN = Pattern.compile(
+ "\\s*package\\s+([^\\s;#]+);?", Pattern.DOTALL);
- private static final Pattern functionNamePattern = Pattern.compile( "\\s*function\\s+(\\S+)\\s+(\\S+)\\(.*\\).*",
- Pattern.DOTALL );
+ private static final Pattern FUNCTION_PATTERN = Pattern.compile(
+ "\\n\\s*function\\s+(\\S+)\\s+(\\S+)\\(.*\\)", Pattern.DOTALL);
- private static final Pattern importNamePattern = Pattern.compile( "\\s*import\\s+([^\\s;#]+);?.*",
- Pattern.DOTALL );
+ private static final Pattern IMPORT_PATTERN = Pattern.compile(
+ "\\n\\s*import\\s+([^\\s;#]+);?", Pattern.DOTALL);
- private static final Pattern expanderNamePattern = Pattern.compile( "\\s*expander\\s+([^\\s;#]+);?.*",
- Pattern.DOTALL );
+ private static final Pattern EXPANDER_PATTERN = Pattern.compile(
+ "\\n\\s*expander\\s+([^\\s;#]+);?", Pattern.DOTALL);
- private static final Pattern globalNamePattern = Pattern.compile( "\\s*global\\s+(\\S+)\\s+([^\\s;#]+);?.*",
- Pattern.DOTALL );
+ private static final Pattern GLOBAL_PATTERN = Pattern.compile(
+ "\\n\\s*global\\s+(\\S+)\\s+([^\\s;#]+);?", Pattern.DOTALL);
- private static final Pattern queryNamePattern1 = Pattern.compile( "\\s*query\\s+\"([^\"]+)\".*",
- Pattern.DOTALL );
-
- private static final Pattern queryNamePattern2 = Pattern.compile( "\\s*query\\s+([^\\s;#\"]+).*",
- Pattern.DOTALL );
+ private static final Pattern QUERY_PATTERN1 = Pattern.compile(
+ "\\n\\s*query\\s+\"([^\"]+)\"", Pattern.DOTALL);
+ private static final Pattern QUERY_PATTERN2 = Pattern.compile(
+ "\\n\\s*query\\s+([^\\s;#\"]+)", Pattern.DOTALL);
+
public RuleContentOutlinePage(DRLRuleEditor editor) {
super();
this.editor = editor;
@@ -79,7 +92,7 @@
viewer.setInput( ruleFileTreeNode );
update();
- //add the listener for navigation of the rule document.
+ // add the listener for navigation of the rule document.
super.addSelectionChangedListener( new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
Object selectionObj = event.getSelection();
@@ -108,7 +121,7 @@
ruleFileTreeNode.setPackageTreeNode( packageTreeNode );
viewer.refresh();
control.setRedraw( false );
- viewer.expandAll();
+ viewer.expandToLevel(2);
control.setRedraw( true );
}
}
@@ -121,7 +134,9 @@
*/
private PackageTreeNode createPackageTreeNode() {
PackageTreeNode packageTreeNode = new PackageTreeNode();
- populatePackageTreeNode( packageTreeNode, getRuleFileContents() );
+ String ruleFileContents = getRuleFileContents();
+ initRules(ruleFileContents);
+ populatePackageTreeNode(packageTreeNode, ruleFileContents);
return packageTreeNode;
}
@@ -131,86 +146,124 @@
* @param packageTreeNode the node to populate
*/
public void populatePackageTreeNode(PackageTreeNode packageTreeNode, String ruleFileContents) {
- StringReader stringReader = new StringReader( ruleFileContents );
- BufferedReader bufferedReader = new BufferedReader( stringReader );
- try {
- int offset = 0;
- String st;
- while ( (st = bufferedReader.readLine()) != null ) {
-
- Matcher matcher = rulePattern1.matcher( st );
- if ( matcher.matches() ) {
- String rule = matcher.group( 1 );
- packageTreeNode.addRule( rule,
- offset,
- st.length() );
- }
- matcher = rulePattern2.matcher( st );
- if ( matcher.matches() ) {
- String rule = matcher.group( 1 );
- packageTreeNode.addRule( rule,
- offset,
- st.length() );
- }
- matcher = packagePattern.matcher( st );
- if ( matcher.matches() ) {
- String packageName = matcher.group( 1 );
- packageTreeNode.setPackageName( packageName );
- packageTreeNode.setOffset( offset );
- packageTreeNode.setLength( st.length() );
- }
- matcher = functionNamePattern.matcher( st );
- if ( matcher.matches() ) {
- String functionName = matcher.group( 2 );
- packageTreeNode.addFunction( functionName + "()",
- offset,
- st.length() );
- }
- matcher = expanderNamePattern.matcher( st );
- if ( matcher.matches() ) {
- String expanderName = matcher.group( 1 );
- packageTreeNode.addExpander( expanderName,
- offset,
- st.length() );
- }
- matcher = importNamePattern.matcher( st );
- if ( matcher.matches() ) {
- String importName = matcher.group( 1 );
- packageTreeNode.addImport( importName,
- offset,
- st.length() );
- }
- matcher = globalNamePattern.matcher( st );
- if ( matcher.matches() ) {
- String globalType = matcher.group( 1 );
- String globalName = matcher.group( 2 );
- String name = globalName + " : " + globalType;
- packageTreeNode.addGlobal( name,
- offset,
- st.length() );
- }
- matcher = queryNamePattern1.matcher( st );
- if ( matcher.matches() ) {
- String queryName = matcher.group( 1 );
- packageTreeNode.addQuery( queryName,
- offset,
- st.length() );
- }
- matcher = queryNamePattern2.matcher( st );
- if ( matcher.matches() ) {
- String queryName = matcher.group( 1 );
- packageTreeNode.addQuery( queryName,
- offset,
- st.length() );
- }
-
- offset += st.length() + System.getProperty("line.separator").length(); // + for the newline
+ Matcher matcher = RULE_PATTERN1.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String ruleName = matcher.group(1);
+ RuleDescr ruleDescr = (RuleDescr) rules.get(ruleName);
+ if (ruleDescr == null) {
+ packageTreeNode.addRule(ruleName, matcher.start(1), matcher.end(1) - matcher.start(1));
+ } else {
+ packageTreeNode.addRule(ruleName, matcher.start(1), matcher.end(1) - matcher.start(1), ruleDescr.getAttributes());
}
- } catch ( IOException e ) {
}
+ matcher = RULE_PATTERN2.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String ruleName = matcher.group(1);
+ RuleDescr ruleDescr = (RuleDescr) rules.get(ruleName);
+ if (ruleDescr == null) {
+ packageTreeNode.addRule(ruleName, matcher.start(1), matcher.end(1) - matcher.start(1));
+ } else {
+ packageTreeNode.addRule(ruleName, matcher.start(1), matcher.end(1) - matcher.start(1), ruleDescr.getAttributes());
+ }
+ }
+ matcher = PACKAGE_PATTERN.matcher(ruleFileContents);
+ if (matcher.find()) {
+ String packageName = matcher.group(1);
+ packageTreeNode.setPackageName(packageName);
+ packageTreeNode.setOffset(matcher.start(1));
+ packageTreeNode.setLength(matcher.end(1) - matcher.start(1));
+ }
+ matcher = FUNCTION_PATTERN.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String functionName = matcher.group(2);
+ packageTreeNode.addFunction(functionName + "()",
+ matcher.start(2), matcher.end(2) - matcher.start(2));
+ }
+ matcher = EXPANDER_PATTERN.matcher(ruleFileContents);
+ if (matcher.find()) {
+ String expanderName = matcher.group(1);
+ packageTreeNode.addExpander(expanderName,
+ matcher.start(1), matcher.end(1) - matcher.start(1));
+ }
+ matcher = IMPORT_PATTERN.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String importName = matcher.group(1);
+ packageTreeNode.addImport(importName,
+ matcher.start(1), matcher.end(1) - matcher.start(1));
+ }
+ matcher = GLOBAL_PATTERN.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String globalType = matcher.group(1);
+ String globalName = matcher.group(2);
+ String name = globalName + " : " + globalType;
+ packageTreeNode.addGlobal(name,
+ matcher.start(2), matcher.end(2) - matcher.start(2));
+ }
+ matcher = QUERY_PATTERN1.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String queryName = matcher.group(1);
+ packageTreeNode.addQuery(queryName,
+ matcher.start(1), matcher.end(1) - matcher.start(1));
+ }
+ matcher = QUERY_PATTERN2.matcher(ruleFileContents);
+ while (matcher.find()) {
+ String queryName = matcher.group(1);
+ packageTreeNode.addQuery(queryName,
+ matcher.start(1), matcher.end(1) - matcher.start(1));
+ }
}
- /**
+ public void initRules(String ruleFileContents) {
+ rules = new HashMap();
+ PackageDescr packageDescr = getPackageDescr(ruleFileContents);
+ if (packageDescr != null) {
+ Iterator iterator = packageDescr.getRules().iterator();
+ while (iterator.hasNext()) {
+ RuleDescr ruleDescr = (RuleDescr) iterator.next();
+ rules.put(ruleDescr.getName(), ruleDescr);
+ }
+ }
+ }
+
+ private PackageDescr getPackageDescr(String ruleFileContents) {
+ if (editor.getEditorInput() instanceof IFileEditorInput) {
+ try {
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoader newLoader = DroolsBuilder.class.getClassLoader();
+ IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+ if (file.getProject().getNature("org.eclipse.jdt.core.javanature") != null) {
+ IJavaProject project = JavaCore.create(file.getProject());
+ newLoader = ProjectClassLoader.getProjectClassLoader(project);
+ }
+
+ Reader dslReader = DSLAdapter.getDSLContent(ruleFileContents, file);
+
+ try {
+ Thread.currentThread().setContextClassLoader(newLoader);
+
+ DrlParser parser = new DrlParser();
+
+ PackageDescr packageDescr = null;
+ if (dslReader == null) {
+ packageDescr = parser.parse(ruleFileContents);
+ } else {
+ packageDescr = parser.parse(ruleFileContents, dslReader);
+ }
+
+ return packageDescr;
+ } catch (Exception t) {
+ throw t;
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ /**
*
* @return the current contents of the document
*/
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleTreeNode.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleTreeNode.java 2006-08-04 21:50:16 UTC (rev 5480)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleTreeNode.java 2006-08-04 22:03:32 UTC (rev 5481)
@@ -1,12 +1,17 @@
package org.drools.ide.editors.outline;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
import org.drools.ide.DroolsIDEPlugin;
import org.eclipse.jface.resource.ImageDescriptor;
public class RuleTreeNode extends OutlineNode implements Comparable {
private final PackageTreeNode packageTreeNode;
- private final String ruleName;
+ private final String ruleName;
+ private List attributes = new ArrayList();
public RuleTreeNode(PackageTreeNode parent,
String ruleName) {
@@ -15,8 +20,16 @@
}
+ public void addAttribute(String name, Object value, int offset, int length) {
+ RuleAttributeTreeNode node = new RuleAttributeTreeNode(this, name, value);
+ node.setOffset(offset);
+ node.setLength(length);
+ attributes.add(node);
+ }
+
public Object[] getChildren(Object o) {
- return new Object[0];
+ Collections.sort( attributes );
+ return attributes.toArray();
}
public ImageDescriptor getImageDescriptor(Object object) {
More information about the jboss-svn-commits
mailing list