[jboss-svn-commits] JBL Code SVN: r6305 - in labs/jbossrules/trunk/drools-ide: . src/main/java/org/drools/ide src/main/java/org/drools/ide/builder src/main/java/org/drools/ide/debug src/main/java/org/drools/ide/debug/core src/main/java/org/drools/ide/editors src/main/java/org/drools/ide/editors/outline src/main/java/org/drools/ide/launching
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Sep 19 17:31:47 EDT 2006
Author: KrisVerlaenen
Date: 2006-09-19 17:31:36 -0400 (Tue, 19 Sep 2006)
New Revision: 6305
Added:
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DRLInfo.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpointMarkerUpdater.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsApplicationLaunchShortcut.java
Removed:
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/RuleInfo.java
Modified:
labs/jbossrules/trunk/drools-ide/plugin.xml
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java
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/debug/DebugUtil.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DroolsDebugEventHandlerView.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpoint.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsStackFrame.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/IDroolsDebugConstants.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/DRLRuleEditor2.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsLineBreakpointAdapter.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/ReteViewer.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/launching/DroolsLaunchConfigurationDelegate.java
labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsSourceLookupParticipant.java
Log:
JBRULES-342: interactive rule debugger
- additional work to get debugger working
Modified: labs/jbossrules/trunk/drools-ide/plugin.xml
===================================================================
--- labs/jbossrules/trunk/drools-ide/plugin.xml 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/plugin.xml 2006-09-19 21:31:36 UTC (rev 6305)
@@ -52,7 +52,7 @@
contributorClass="org.drools.ide.editors.DRLRuleEditorActionContributor"
extensions="drl,jbrule,drools,rule"
icon="icons/drools.gif"
- id="org.eclipse.ui.editors.text.DRLEditor"
+ id="org.drools.ide.editors.DRLRuleEditor"
name="Rule Editor"/>
<editor
class="org.drools.ide.dsl.editor.DSLEditor"
@@ -187,7 +187,7 @@
name="Drools Application"
delegate="org.drools.ide.launching.DroolsLaunchConfigurationDelegate"
sourceLocatorId="org.drools.ide.launching.DroolsSourceLookupDirector"
- sourcePathComputerId="org.drools.ide.launching.DroolsSourcePathComputerDelegate"
+ sourcePathComputerId="org.eclipse.jdt.launching.sourceLookup.javaSourcePathComputer"
modes= "debug" />
</extension>
@@ -226,13 +226,21 @@
</sourceLocator>
</extension>
+ <extension point="org.eclipse.ui.editors.markerUpdaters">
+ <updater
+ markerType="org.drools.ide.droolsBreakpointMarker"
+ class="org.drools.ide.debug.core.DroolsLineBreakpointMarkerUpdater"
+ id="org.drools.ide.debug.core.DroolsLineBreakpointMarkerUpdater" />
+ </extension>
+
+ <!-- not used anymore
<extension
point="org.eclipse.debug.core.sourcePathComputers">
<sourcePathComputer
class="org.drools.ide.launching.DroolsSourcePathComputerDelegate"
id="org.drools.ide.launching.DroolsSourcePathComputerDelegate">
</sourcePathComputer>
- </extension>
+ </extension> -->
<extension
point="org.eclipse.debug.ui.debugModelPresentations">
@@ -242,6 +250,48 @@
</debugModelPresentation>
</extension>
+ <!-- not working
+ <extension point="org.eclipse.debug.ui.launchShortcuts">
+ <shortcut
+ label="JBoss Rules Application"
+ icon="icons/drools.gif"
+ class="org.drools.ide.launching.DroolsApplicationLaunchShortcut"
+ modes="debug"
+ id="org.drools.ide.launching.DroolsApplicationLaunchShortcut">
+ <perspective id="org.eclipse.jdt.ui.JavaPerspective" />
+ <perspective id="org.eclipse.jdt.ui.JavaHierarchyPerspective" />
+ <perspective id="org.eclipse.jdt.ui.JavaBrowsingPerspective" />
+ <perspective id="org.eclipse.debug.ui.DebugPerspective" />
+ </shortcut>
+ </extension> -->
+
+ <!-- not working if using multipage editor
+ <extension point="org.eclipse.ui.editorActions">
+ <editorContribution
+ targetID="org.drools.ide.editors.DRLRuleEditor"
+ id="org.drools.ide.editors.DRLRuleEditor.RulerActions">
+ <action
+ label="Not Used"
+ class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+ style="push"
+ actionID="RulerDoubleClick"
+ id="org.drools.ide.editors.DRLRuleEditor.ToggleBreakpointRulerAction" />
+ </editorContribution>
+ </extension>
+
+ <extension point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ targetID="#TextRulerContext"
+ id="org.drools.ide.editors.DRLRuleEditor.RulerPopupActions">
+ <action
+ label="Toggle Breakpoint"
+ class="org.eclipse.debug.ui.actions.RulerToggleBreakpointActionDelegate"
+ menubarPath="additions"
+ id="org.drools.ide.editors.DRLRuleEditor.rulerContextMenu.ToggleBreakpointRulerAction">
+ </action>
+ </viewerContribution>
+ </extension> -->
+
<extension point = "org.eclipse.ui.popupMenus">
<objectContribution
id="org.drools.ide.action.ConvertToDroolsProject"
Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DRLInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DRLInfo.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DRLInfo.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -0,0 +1,167 @@
+package org.drools.ide;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.drools.compiler.DroolsError;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.rule.Package;
+
+public class DRLInfo {
+
+ private static final DroolsError[] EMPTY_DROOLS_ERROR_ARRAY = new DroolsError[0];
+ private static final List EMPTY_LIST = Collections.unmodifiableList(Collections.EMPTY_LIST);
+
+ private String sourcePathName;
+ private PackageDescr packageDescr;
+ private List parserErrors;
+ private Package compiledPackage;
+ private DroolsError[] builderErrors;
+ // cached entry
+ private transient RuleInfo[] ruleInfos;
+
+ public DRLInfo(String sourcePathName, PackageDescr packageDescr, List parserErrors) {
+ if (sourcePathName == null || "".equals(sourcePathName)) {
+ throw new IllegalArgumentException("Invalid sourcePathName " + sourcePathName);
+ }
+ if (packageDescr == null) {
+ throw new IllegalArgumentException("Null packageDescr");
+ }
+ this.sourcePathName = sourcePathName;
+ this.packageDescr = packageDescr;
+ this.parserErrors =
+ parserErrors == null ? EMPTY_LIST : Collections.unmodifiableList(parserErrors);
+ }
+
+ public DRLInfo(String pathName, PackageDescr packageDescr, List parserErrors, Package compiledPackage, DroolsError[] builderErrors) {
+ this(pathName, packageDescr, parserErrors);
+ if (compiledPackage == null) {
+ throw new IllegalArgumentException("Null package");
+ }
+ this.compiledPackage = compiledPackage;
+ this.builderErrors =
+ builderErrors == null ? EMPTY_DROOLS_ERROR_ARRAY : builderErrors;
+ }
+
+ public String getSourcePathName() {
+ return sourcePathName;
+ }
+
+ public PackageDescr getPackageDescr() {
+ return packageDescr;
+ }
+
+ public List getParserErrors() {
+ return parserErrors;
+ }
+
+ public Package getPackage() {
+ return compiledPackage;
+ }
+
+ public DroolsError[] getBuilderErrors() {
+ return builderErrors;
+ }
+
+ public String getPackageName() {
+ return packageDescr.getName();
+ }
+
+ public boolean isCompiled() {
+ return compiledPackage != null;
+ }
+
+ public RuleInfo[] getRuleInfos() {
+ if (ruleInfos == null) {
+ List ruleInfosList = new ArrayList();
+ for ( Iterator rules = packageDescr.getRules().iterator(); rules.hasNext(); ) {
+ RuleDescr ruleDescr = (RuleDescr) rules.next();
+ RuleInfo ruleInfo = new RuleInfo(ruleDescr);
+ ruleInfosList.add(ruleInfo);
+ }
+ ruleInfos = (RuleInfo[]) ruleInfosList.toArray(new RuleInfo[0]);
+ }
+ return ruleInfos;
+ }
+
+ public RuleInfo getRuleInfo(int drlLineNumber) {
+ RuleInfo[] ruleInfos = getRuleInfos();
+ int ruleLine = -1;
+ RuleInfo result = null;
+ for (int i = 0; i < ruleInfos.length; i++) {
+ int ruleConsequenceDrlLineNumber = ruleInfos[i].getConsequenceDrlLineNumber();
+ if (ruleConsequenceDrlLineNumber > ruleLine
+ && ruleConsequenceDrlLineNumber < drlLineNumber) {
+ ruleLine = ruleConsequenceDrlLineNumber;
+ result = ruleInfos[i];
+ }
+ }
+ return result;
+ }
+
+ public class RuleInfo {
+
+ private RuleDescr ruleDescr;
+ // cached entries
+ private transient String className;
+ private transient int consequenceJavaLineNumber = -1;
+ private transient String fullRuleName;
+
+ public RuleInfo(RuleDescr ruleDescr) {
+ if (ruleDescr == null) {
+ throw new IllegalArgumentException("Null ruleDescr");
+ }
+ this.ruleDescr = ruleDescr;
+ }
+
+ public String getSourcePathName() {
+ return DRLInfo.this.getSourcePathName();
+ }
+
+ public String getClassName() {
+ // ruleDescr is only filled in during compilation
+ if (!isCompiled()) {
+ throw new IllegalArgumentException("Package has not been compiled");
+ }
+ if (className == null) {
+ className = getPackageName() + "." + ruleDescr.getClassName();
+ }
+ return className;
+ }
+
+ public int getConsequenceDrlLineNumber() {
+ return ruleDescr.getConsequenceLine();
+ }
+
+ public int getConsequenceJavaLineNumber() {
+ if (consequenceJavaLineNumber == -1) {
+ if (!isCompiled()) {
+ throw new IllegalArgumentException("Package has not been compiled");
+ }
+ consequenceJavaLineNumber = compiledPackage
+ .getPackageCompilationData().getLineMappings(className).getOffset();
+ }
+ return consequenceJavaLineNumber;
+ }
+
+ public String getPackageName() {
+ return packageDescr.getName();
+ }
+
+ public String getRuleName() {
+ return ruleDescr.getName();
+ }
+
+ public String getFullRuleName() {
+ if (fullRuleName == null) {
+ fullRuleName = getPackageName() + "." + ruleDescr.getName();
+ }
+ return fullRuleName;
+ }
+
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/DroolsIDEPlugin.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -23,17 +23,20 @@
import java.util.ResourceBundle;
import org.drools.compiler.DrlParser;
+import org.drools.compiler.DroolsParserException;
import org.drools.compiler.PackageBuilder;
import org.drools.compiler.PackageBuilderConfiguration;
+import org.drools.ide.DRLInfo.RuleInfo;
import org.drools.ide.builder.DroolsBuilder;
import org.drools.ide.builder.Util;
+import org.drools.ide.editors.DRLRuleEditor;
import org.drools.ide.editors.DSLAdapter;
import org.drools.ide.preferences.IDroolsConstants;
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.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
@@ -64,7 +67,7 @@
private ResourceBundle resourceBundle;
private Map colors = new HashMap();
private Map parsedRules = new HashMap();
- private Map ruleInfoByRuleNameMap = new HashMap();
+ private Map compiledRules = new HashMap();
private Map ruleInfoByClassNameMap = new HashMap();
/**
@@ -90,6 +93,7 @@
plugin = null;
resourceBundle = null;
parsedRules = null;
+ compiledRules = null;
Iterator iterator = colors.values().iterator();
while (iterator.hasNext()) {
((Color) iterator.next()).dispose();
@@ -186,71 +190,123 @@
store.setDefault(IDroolsConstants.EDITOR_FOLDING, true);
}
- public PackageDescr parseResource(IResource resource, boolean compile) {
- // TODO cache result and clear cache if necessary, taking properties into account
- PackageDescr result = (PackageDescr) parsedRules.get(resource);
+ public DRLInfo parseResource(IResource resource, boolean compile) throws DroolsParserException {
+ DRLInfo result = (DRLInfo) compiledRules.get(resource);
+ if (result == null && !compile) {
+ result = (DRLInfo) parsedRules.get(resource);
+ }
if (result != null) {
return result;
}
- result = generateParsedResource(resource, compile);
+ return generateParsedResource(resource, compile);
+ }
+
+ public DRLInfo parseResource(DRLRuleEditor editor, boolean useUnsavedContent, boolean compile) throws DroolsParserException {
+ IResource resource = editor.getResource();
+ DRLInfo result = (DRLInfo) compiledRules.get(resource);
+ if (result == null && !compile) {
+ result = (DRLInfo) parsedRules.get(resource);
+ }
if (result != null) {
- parsedRules.put(resource, result);
+ return result;
}
- return result;
+ // TODO: can we cache result when using unsaved content as well?
+ return generateParsedResource(editor.getContent(), resource, !useUnsavedContent, compile);
}
- private PackageDescr generateParsedResource(IResource resource, boolean compile) {
+ public void invalidateResource(IResource resource) {
+ DRLInfo cached = (DRLInfo) compiledRules.remove(resource);
+ if (cached != null) {
+ RuleInfo[] ruleInfos = cached.getRuleInfos();
+ for (int i = 0; i < ruleInfos.length; i++) {
+ ruleInfoByClassNameMap.remove(ruleInfos[i].getClassName());
+ }
+ }
+ parsedRules.remove(resource);
+ }
+
+ private DRLInfo generateParsedResource(IResource resource, boolean compile) throws DroolsParserException {
if (resource instanceof IFile) {
IFile file = (IFile) resource;
- DrlParser parser = new DrlParser();
try {
String content = new String(Util.getResourceContentsAsCharArray(file));
- Reader dslReader = DSLAdapter.getDSLContent(content, file);
- ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
- ClassLoader newLoader = DroolsBuilder.class.getClassLoader();
- PackageBuilderConfiguration builder_configuration = new PackageBuilderConfiguration();
- if (file.getProject().getNature("org.eclipse.jdt.core.javanature") != null) {
- IJavaProject project = JavaCore.create(file.getProject());
- newLoader = ProjectClassLoader.getProjectClassLoader(project);
- String level = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
- builder_configuration.setJavaLanguageLevel(level);
- }
- try {
- builder_configuration.setClassLoader(newLoader);
- Thread.currentThread().setContextClassLoader(newLoader);
-
- //First we parse the source
- PackageDescr packageDescr = null;
- if (dslReader != null) {
+ return generateParsedResource(content, file, true, compile);
+ } catch (CoreException e) {
+ log(e);
+ }
+ }
+ return null;
+ }
+
+ private DRLInfo generateParsedResource(String content, IResource resource, boolean useCache, boolean compile) throws DroolsParserException {
+ DrlParser parser = new DrlParser();
+ try {
+ Reader dslReader = DSLAdapter.getDSLContent(content, resource);
+ ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ ClassLoader newLoader = DroolsBuilder.class.getClassLoader();
+ PackageBuilderConfiguration builder_configuration = new PackageBuilderConfiguration();
+ if (resource.getProject().getNature("org.eclipse.jdt.core.javanature") != null) {
+ IJavaProject project = JavaCore.create(resource.getProject());
+ newLoader = ProjectClassLoader.getProjectClassLoader(project);
+ String level = project.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+ builder_configuration.setJavaLanguageLevel(level);
+ }
+ try {
+ builder_configuration.setClassLoader(newLoader);
+ Thread.currentThread().setContextClassLoader(newLoader);
+
+ // first parse the source
+ PackageDescr packageDescr = null;
+ if (useCache) {
+ DRLInfo cachedDrlInfo = (DRLInfo) parsedRules.get(resource);
+ if (cachedDrlInfo != null) {
+ packageDescr = cachedDrlInfo.getPackageDescr();
+ }
+ }
+ if (packageDescr == null) {
+ if (dslReader != null) {
packageDescr = parser.parse(content, dslReader);
} else {
packageDescr = parser.parse(content);
}
- if (compile && !parser.hasErrors()) {
- PackageBuilder builder = new PackageBuilder(builder_configuration);
- builder.addPackage(packageDescr);
- Iterator rules = packageDescr.getRules().iterator();
- while (rules.hasNext()) {
- RuleDescr descr = (RuleDescr) rules.next();
- String className = packageDescr.getName() + "." + descr.getClassName();
- RuleInfo ruleInfo = new RuleInfo(descr.getName(),
- packageDescr.getName(), resource.getName(),
- resource.getFullPath().toString(), className,
- descr.getConsequenceLine(),
- builder.getPackage().getPackageCompilationData()
- .getLineMappings(className).getOffset());
- ruleInfoByRuleNameMap.put(packageDescr.getName() + "." + descr.getName(), ruleInfo);
- ruleInfoByClassNameMap.put(className, ruleInfo);
- }
- }
- return packageDescr;
- } finally {
- Thread.currentThread().setContextClassLoader(oldLoader);
- }
- } catch (Throwable t) {
- log(t);
- }
- }
+ }
+ PackageBuilder builder = null;
+ // compile parsed rules if necessary
+ if (compile && !parser.hasErrors()) {
+ builder = new PackageBuilder(builder_configuration);
+ builder.addPackage(packageDescr);
+ }
+ DRLInfo result = null;
+ if (compile) {
+ result = new DRLInfo(
+ resource.getProjectRelativePath().toString(),
+ packageDescr, parser.getErrors(),
+ builder.getPackage(), builder.getErrors());
+ } else {
+ result = new DRLInfo(
+ resource.getProjectRelativePath().toString(),
+ packageDescr, parser.getErrors());
+ }
+
+ // cache result
+ if (useCache) {
+ if (compile) {
+ compiledRules.put(resource, result);
+ RuleInfo[] ruleInfos = result.getRuleInfos();
+ for (int i = 0; i < ruleInfos.length; i++) {
+ ruleInfoByClassNameMap.put(ruleInfos[i].getClassName(), ruleInfos[i]);
+ }
+ } else {
+ parsedRules.put(resource, result);
+ }
+ }
+ return result;
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ } catch (CoreException e) {
+ log(e);
+ }
return null;
}
@@ -258,8 +314,4 @@
return (RuleInfo) ruleInfoByClassNameMap.get(ruleClassName);
}
- public RuleInfo getRuleInfoByRule(String ruleName) {
- return (RuleInfo) ruleInfoByClassNameMap.get(ruleName);
- }
-
}
Deleted: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/RuleInfo.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/RuleInfo.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/RuleInfo.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -1,52 +0,0 @@
-package org.drools.ide;
-
-public class RuleInfo {
-
- private String ruleName;
- private String packageName;
- private String drlName;
- private String pathName;
- private String className;
- private int consequenceDrlLineNumber;
- private int consequenceJavaLineNumber;
-
- public RuleInfo(String ruleName, String packageName, String drlName,
- String pathName, String className,
- int consequenceDrlLineNumber, int consequenceJavaLineNumber) {
- this.ruleName = ruleName;
- this.packageName = packageName;
- this.drlName = drlName;
- this.pathName = pathName;
- this.className = className;
- this.consequenceDrlLineNumber = consequenceDrlLineNumber;
- this.consequenceJavaLineNumber = consequenceJavaLineNumber;
- }
-
- public String getClassName() {
- return className;
- }
-
- public int getConsequenceDrlLineNumber() {
- return consequenceDrlLineNumber;
- }
-
- public int getConsequenceJavaLineNumber() {
- return consequenceJavaLineNumber;
- }
-
- public String getDrlName() {
- return drlName;
- }
-
- public String getPackageName() {
- return packageName;
- }
-
- public String getPathName() {
- return pathName;
- }
-
- public String getRuleName() {
- return ruleName;
- }
-}
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-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/builder/DroolsBuilder.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -1,6 +1,5 @@
package org.drools.ide.builder;
-import java.io.Reader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -8,22 +7,18 @@
import org.antlr.runtime.RecognitionException;
import org.apache.commons.jci.problems.CompilationProblem;
-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;
import org.drools.compiler.PackageBuilderConfiguration;
import org.drools.compiler.ParserError;
import org.drools.compiler.RuleError;
+import org.drools.ide.DRLInfo;
import org.drools.ide.DroolsIDEPlugin;
-import org.drools.ide.editors.DSLAdapter;
import org.drools.ide.preferences.IDroolsConstants;
-import org.drools.ide.util.ProjectClassLoader;
-import org.drools.lang.descr.PackageDescr;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
@@ -145,52 +140,22 @@
public static DroolsBuildMarker[] parseFile(IFile file, String content) {
List markers = new ArrayList();
- DrlParser parser = new DrlParser();
- try {
- Reader dslReader = DSLAdapter.getDSLContent(content, file);
- ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
- ClassLoader newLoader = DroolsBuilder.class.getClassLoader();
- if (file.getProject().getNature("org.eclipse.jdt.core.javanature") != null) {
- IJavaProject project = JavaCore.create(file.getProject());
- newLoader = ProjectClassLoader.getProjectClassLoader(project);
- setupPackageBuilder(project);
+ try {
+ DRLInfo drlInfo =
+ DroolsIDEPlugin.getDefault().parseResource(file, true);
+ //parser errors
+ markParseErrors(markers, drlInfo.getParserErrors());
+ markOtherErrors(markers, drlInfo.getBuilderErrors());
+
+ } catch (DroolsParserException e) {
+ //we have an error thrown from DrlParser
+ Throwable cause = e.getCause();
+ if (cause instanceof RecognitionException ) {
+ RecognitionException recogErr = (RecognitionException) cause;
+ markers.add(new DroolsBuildMarker(recogErr.getMessage(), recogErr.line)); //flick back the line number
}
- try {
- builder_configuration.setClassLoader(newLoader);
- Thread.currentThread().setContextClassLoader(newLoader);
-
- //First we parse the source
- PackageDescr packageDescr = parsePackage( content, parser, dslReader );
- //parser errors
- markParseErrors( markers,
- parser );
-
- if (!parser.hasErrors()) {
- //now we compile the AST to binary, and process any downstream errors.
- PackageBuilder builder = new PackageBuilder(builder_configuration);
- builder.addPackage(packageDescr);
- //downstream errors
- markOtherErrors( markers,
- builder );
- }
-
- } catch (DroolsParserException e) {
- //we have an error thrown from DrlParser
- Throwable cause = e.getCause();
- if (cause instanceof RecognitionException ) {
- RecognitionException recogErr = (RecognitionException) cause;
- 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);
- }
- } catch (Throwable t) {
- // t.printStackTrace();
- // TODO create markers for exceptions containing line number etc.
- String message = t.getMessage();
+ } catch (Exception t) {
+ String message = t.getMessage();
if (message == null || message.trim().equals( "" )) {
message = "Error: " + t.getClass().getName();
}
@@ -200,15 +165,24 @@
}
/**
- * This will create markers for ALL errors that happen AFTER parsing.
- * In some cases, these may be bogus if parse errors exist.
+ * This will create markers for parse errors.
+ * Parse errors mean that antlr has picked up some major typos in the input source.
*/
+ private static void markParseErrors(List markers, List parserErrors) {
+ for ( Iterator iter = parserErrors.iterator(); iter.hasNext(); ) {
+ ParserError err = (ParserError) iter.next();
+ markers.add(new DroolsBuildMarker(err.getMessage(), err.getRow()));
+ }
+ }
+
+ /**
+ * This will create markers for build errors that happen AFTER parsing.
+ */
private static void markOtherErrors(List markers,
- PackageBuilder builder) {
- DroolsError[] errors = builder.getErrors();
+ DroolsError[] buildErrors) {
// TODO are there warnings too?
- for (int i = 0; i < errors.length; i++ ) {
- DroolsError error = errors[i];
+ for (int i = 0; i < buildErrors.length; i++ ) {
+ DroolsError error = buildErrors[i];
if (error instanceof GlobalError) {
GlobalError globalError = (GlobalError) error;
markers.add(new DroolsBuildMarker(globalError.getGlobal(), -1));
@@ -251,30 +225,6 @@
}
}
- /**
- * This will create markers for parse errors.
- * Parse errors mean that antlr has picked up some major typos in the input source.
- */
- private static void markParseErrors(List markers,
- DrlParser parser) {
- if (parser.hasErrors()) {
- for ( Iterator iter = parser.getErrors().iterator(); iter.hasNext(); ) {
- ParserError err = (ParserError) iter.next();
- markers.add(new DroolsBuildMarker(err.getMessage(), err.getRow()));
- }
- }
- }
-
- /** Actually parse the rules into the AST */
- public static PackageDescr parsePackage(String content,
- DrlParser parser,
- Reader dslReader) throws DroolsParserException {
- if (dslReader != null)
- return parser.parse(content, dslReader);
- else
- return parser.parse( content );
- }
-
private void createMarker(final IResource res, final String message, final int lineNumber) {
try {
IWorkspaceRunnable r= new IWorkspaceRunnable() {
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DebugUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DebugUtil.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DebugUtil.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -31,7 +31,6 @@
import org.eclipse.jdt.debug.eval.IEvaluationListener;
import org.eclipse.jdt.debug.eval.IEvaluationResult;
import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
-import org.eclipse.jdt.internal.debug.core.model.JDIReferenceType;
public class DebugUtil {
@@ -56,42 +55,37 @@
return null;
}
- // find the project the snippets will be compiled in.
- ISourceLocator locator = javaValue.getLaunch().getSourceLocator();
- Object sourceElement = null;
- if (locator instanceof ISourceLookupDirector) {
- if (type instanceof JDIReferenceType) {
- String[] sourcePaths = ((JDIReferenceType) type)
- .getSourcePaths(null);
- if (sourcePaths != null && sourcePaths.length > 0) {
- sourceElement = ((ISourceLookupDirector) locator)
- .getSourceElement(sourcePaths[0]);
- }
- }
- if (!(sourceElement instanceof IJavaElement)
- && sourceElement instanceof IAdaptable) {
- sourceElement = ((IAdaptable) sourceElement)
- .getAdapter(IJavaElement.class);
- }
- }
- if (sourceElement == null) {
- sourceElement = locator.getSourceElement(stackFrame);
- if (!(sourceElement instanceof IJavaElement)
- && sourceElement instanceof IAdaptable) {
- sourceElement = ((IAdaptable) sourceElement)
- .getAdapter(IJavaElement.class);
- }
- }
- IJavaProject project = null;
- if (sourceElement instanceof IJavaElement) {
- project = ((IJavaElement) sourceElement).getJavaProject();
- } else if (sourceElement instanceof IResource) {
- IJavaProject resourceProject = JavaCore
- .create(((IResource) sourceElement).getProject());
- if (resourceProject.exists()) {
- project = resourceProject;
- }
- }
+ // find the project the snippets will be compiled in.
+ ISourceLocator locator= javaValue.getLaunch().getSourceLocator();
+ Object sourceElement= null;
+ if (locator instanceof ISourceLookupDirector) {
+ String[] sourcePaths = ((IJavaClassType) type).getSourcePaths(null);
+ if (sourcePaths != null && sourcePaths.length > 0) {
+ sourceElement = ((ISourceLookupDirector) locator).getSourceElement(sourcePaths[0]);
+ }
+ if (!(sourceElement instanceof IJavaElement) && sourceElement instanceof IAdaptable) {
+ sourceElement = ((IAdaptable) sourceElement).getAdapter(IJavaElement.class);
+ }
+ }
+ if (sourceElement == null) {
+ sourceElement = locator.getSourceElement(stackFrame);
+ if (!(sourceElement instanceof IJavaElement) && sourceElement instanceof IAdaptable) {
+ Object newSourceElement = ((IAdaptable) sourceElement).getAdapter(IJavaElement.class);
+ // if the source is a drl during the execution of the rule
+ if (newSourceElement != null) {
+ sourceElement = newSourceElement;
+ }
+ }
+ }
+ IJavaProject project = null;
+ if (sourceElement instanceof IJavaElement) {
+ project = ((IJavaElement) sourceElement).getJavaProject();
+ } else if (sourceElement instanceof IResource) {
+ IJavaProject resourceProject = JavaCore.create(((IResource) sourceElement).getProject());
+ if (resourceProject.exists()) {
+ project = resourceProject;
+ }
+ }
if (project == null) {
return null;
}
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DroolsDebugEventHandlerView.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DroolsDebugEventHandlerView.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/DroolsDebugEventHandlerView.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -3,6 +3,7 @@
import org.drools.ide.DroolsIDEPlugin;
import org.drools.ide.debug.actions.ShowLogicalStructureAction;
import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.debug.core.model.IVariable;
import org.eclipse.debug.internal.ui.VariablesViewModelPresentation;
@@ -13,6 +14,7 @@
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
+import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jface.action.GroupMarker;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
@@ -59,54 +61,48 @@
protected void setViewerInput(Object context) {
Object input = null;
- if (context instanceof IJavaStackFrame) {
+
+ // if a working memory has been expressively selected as variable, use this
+ if (context instanceof IVariable) {
+ IVariable variable = (IVariable) context;
try {
- IJavaObject stackObj = ((IJavaStackFrame) context).getThis();
- if ((stackObj != null)
- && (stackObj.getJavaType() != null)
- && ("org.drools.reteoo.ReteooWorkingMemory".equals(
- stackObj.getJavaType().getName()))) {
- input = stackObj;
+ IValue value = ((IVariable) context).getValue();
+ if (value != null && value instanceof IJavaObject
+ && "org.drools.reteoo.ReteooWorkingMemory".equals(
+ variable.getValue().getReferenceTypeName())) {
+ input = value;
}
} catch (Throwable t) {
DroolsIDEPlugin.log(t);
}
- } else if (context instanceof IVariable) {
- IVariable variable = (IVariable) context;
-
- // find out if stackFrame is inside a WorkingMemoryImpl
- // if so, use that, no matter what variable is selected
- ISelection stackSelection = DebugContextManager.getDefault().getActiveContext(getSite().getWorkbenchWindow());
- if (stackSelection instanceof IStructuredSelection) {
- Object stack = ((IStructuredSelection) stackSelection).getFirstElement();
- if (stack instanceof IJavaStackFrame) {
- try {
- IJavaObject stackObj = ((IJavaStackFrame) stack).getThis();
- if ((stackObj != null)
- && (stackObj.getJavaType() != null)
- && ("org.drools.reteoo.ReteooWorkingMemory".equals(
- stackObj.getJavaType().getName()))) {
- input = stackObj;
- }
+ }
+ // else get selected thread and determine if any of the stack frames
+ // is executing in a working memory, if so, use that one
+ if (input == null) {
+ ISelection stackSelection = DebugContextManager.getDefault().getActiveContext(getSite().getWorkbenchWindow());
+ if (stackSelection instanceof IStructuredSelection) {
+ Object selection = ((IStructuredSelection) stackSelection).getFirstElement();
+ if (selection instanceof IJavaStackFrame) {
+ try {
+ IJavaThread thread = (IJavaThread) ((IJavaStackFrame) selection).getThread();
+ IStackFrame[] frames = thread.getStackFrames();
+ for (int i = 0; i < frames.length; i++) {
+ IJavaObject stackObj = ((IJavaStackFrame) frames[i]).getThis();
+ if ((stackObj != null)
+ && (stackObj.getJavaType() != null)
+ && ("org.drools.reteoo.ReteooWorkingMemory".equals(
+ stackObj.getJavaType().getName()))) {
+ input = stackObj;
+ break;
+ }
+ }
} catch (Throwable t) {
- // do nothing
+ DroolsIDEPlugin.log(t);
}
}
- }
- if (input == null) {
- try {
- IValue value = ((IVariable) context).getValue();
- if (value != null && value instanceof IJavaObject
- && "org.drools.reteoo.ReteooWorkingMemory".equals(
- variable.getValue().getReferenceTypeName())) {
- input = value;
- }
- } catch (Throwable t) {
- DroolsIDEPlugin.log(t);
- }
- }
- }
-
+ }
+ }
+
Object current = getViewer().getInput();
if (current == null && input == null) {
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpoint.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpoint.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpoint.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -1,13 +1,11 @@
package org.drools.ide.debug.core;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
+import org.drools.ide.DRLInfo;
import org.drools.ide.DroolsIDEPlugin;
-import org.drools.ide.RuleInfo;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.RuleDescr;
+import org.drools.ide.DRLInfo.RuleInfo;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
@@ -56,52 +54,31 @@
private static String getRuleClassName(IResource resource, int lineNumber) throws CoreException {
try {
- PackageDescr packageDescr = DroolsIDEPlugin.getDefault().parseResource(resource, true);
- if (packageDescr != null) {
- Iterator rules = packageDescr.getRules().iterator();
- int ruleLine = -1;
- RuleDescr resultRule = null;
- while (rules.hasNext()) {
- RuleDescr rule = (RuleDescr) rules.next();
- if (rule.getConsequenceLine() > ruleLine && rule.getConsequenceLine() < lineNumber) {
- ruleLine = rule.getConsequenceLine();
- resultRule = rule;
- }
+ DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(resource, true);
+ if (drlInfo != null) {
+ RuleInfo ruleInfo = drlInfo.getRuleInfo(lineNumber);
+ if (ruleInfo != null) {
+ return ruleInfo.getClassName();
}
- if (resultRule != null && resultRule.getClassName() != null) {
- return packageDescr.getName() + "." + resultRule.getClassName();
- }
}
throw new CoreException(new Status(IStatus.ERROR, DroolsIDEPlugin.getUniqueIdentifier(), 0,
"Cannot determine ruleClassName for " + resource + " " + lineNumber, null));
- } catch(Throwable t) {
+ } catch (Throwable t) {
throw new CoreException(new Status(IStatus.ERROR, DroolsIDEPlugin.getUniqueIdentifier(), 0,
"Cannot determine ruleClassName for " + resource + " " + lineNumber, t));
}
}
- private static int getRuleLineNumber(IResource resource, int lineNumber) throws CoreException {
+ public static int getRuleLineNumber(IResource resource, int lineNumber) throws CoreException {
// TODO remove duplicated code
try {
- PackageDescr packageDescr = DroolsIDEPlugin.getDefault().parseResource(resource, true);
- if (packageDescr != null) {
- Iterator rules = packageDescr.getRules().iterator();
- int ruleLine = -1;
- RuleDescr resultRule = null;
- while (rules.hasNext()) {
- RuleDescr rule = (RuleDescr) rules.next();
- if (rule.getConsequenceLine() > ruleLine && rule.getConsequenceLine() < lineNumber) {
- ruleLine = rule.getConsequenceLine();
- resultRule = rule;
- }
+ DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(resource, true);
+ if (drlInfo != null) {
+ RuleInfo ruleInfo = drlInfo.getRuleInfo(lineNumber);
+ if (ruleInfo != null) {
+ return ruleInfo.getConsequenceJavaLineNumber()
+ + (lineNumber - ruleInfo.getConsequenceDrlLineNumber());
}
- if (resultRule != null && resultRule.getClassName() != null) {
- String ruleClassName = packageDescr.getName() + "." + resultRule.getClassName();
- RuleInfo ruleInfo = DroolsIDEPlugin.getDefault().getRuleInfoByClass(ruleClassName);
- if (ruleInfo != null) {
- return ruleInfo.getConsequenceJavaLineNumber() + lineNumber - ruleLine;
- }
- }
}
throw new CoreException(new Status(IStatus.ERROR, DroolsIDEPlugin.getUniqueIdentifier(), 0,
"Cannot determine ruleLineNumber for " + resource + " " + lineNumber, null));
Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpointMarkerUpdater.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpointMarkerUpdater.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsLineBreakpointMarkerUpdater.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -0,0 +1,62 @@
+package org.drools.ide.debug.core;
+
+import org.drools.ide.DroolsIDEPlugin;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.ui.texteditor.IMarkerUpdater;
+import org.eclipse.ui.texteditor.MarkerUtilities;
+
+public class DroolsLineBreakpointMarkerUpdater implements IMarkerUpdater {
+
+ private static final String[] ATTRIBUTES = {
+ IMarker.LINE_NUMBER,
+ IDroolsDebugConstants.DRL_LINE_NUMBER
+ };
+
+ public String getMarkerType() {
+ // responsible for only Drools line breakpoint markers
+ return IDroolsDebugConstants.DROOLS_MARKER_TYPE;
+ }
+
+ public String[] getAttribute() {
+ return ATTRIBUTES;
+ }
+
+ public boolean updateMarker(IMarker marker, IDocument document, Position position) {
+ if (position == null) {
+ return true;
+ }
+ if (position.isDeleted()) {
+ return false;
+ }
+ boolean offsetsInitialized = false;
+ boolean offsetsChanged = false;
+ int markerStart = MarkerUtilities.getCharStart(marker);
+ int markerEnd = MarkerUtilities.getCharEnd(marker);
+ if (markerStart != -1 && markerEnd != -1) {
+ offsetsInitialized = true;
+ int offset = position.getOffset();
+ if (markerStart != offset) {
+ MarkerUtilities.setCharStart(marker, offset);
+ offsetsChanged= true;
+ }
+ offset += position.getLength();
+ if (markerEnd != offset) {
+ MarkerUtilities.setCharEnd(marker, offset);
+ offsetsChanged= true;
+ }
+ }
+ if (!offsetsInitialized || (offsetsChanged && MarkerUtilities.getLineNumber(marker) != -1)) {
+ try {
+ int drlLineNumber = document.getLineOfOffset(position.getOffset()) + 1;
+ MarkerUtilities.setLineNumber(marker, DroolsLineBreakpoint.getRuleLineNumber(marker.getResource(), drlLineNumber));
+ marker.setAttribute(IDroolsDebugConstants.DRL_LINE_NUMBER, drlLineNumber);
+ } catch (Throwable t) {
+ DroolsIDEPlugin.log(t);
+ }
+ }
+ return true;
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsStackFrame.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsStackFrame.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/DroolsStackFrame.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -7,7 +7,7 @@
import java.util.List;
import org.drools.ide.DroolsIDEPlugin;
-import org.drools.ide.RuleInfo;
+import org.drools.ide.DRLInfo.RuleInfo;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugEvent;
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/IDroolsDebugConstants.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/IDroolsDebugConstants.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/debug/core/IDroolsDebugConstants.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -5,5 +5,6 @@
String ID_DROOLS_DEBUG_MODEL = "org.drools.ide.debug";
String DROOLS_MARKER_TYPE = "org.drools.ide.droolsBreakpointMarker";
String DRL_LINE_NUMBER = "Drools_DRL_LineNumber";
+ String LAUNCH_CONFIGURATION_TYPE = "org.drools.ide.launching.DroolsLaunchConfigurationDelegate";
}
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-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -1,6 +1,5 @@
package org.drools.ide.editors;
-import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
@@ -8,10 +7,9 @@
import java.util.Map;
import java.util.Set;
-import org.drools.compiler.DrlParser;
import org.drools.compiler.DroolsParserException;
+import org.drools.ide.DRLInfo;
import org.drools.ide.DroolsIDEPlugin;
-import org.drools.ide.builder.DroolsBuilder;
import org.drools.ide.debug.core.IDroolsDebugConstants;
import org.drools.ide.editors.outline.RuleContentOutlinePage;
import org.drools.ide.editors.scanners.RuleEditorMessages;
@@ -20,6 +18,7 @@
import org.drools.lang.descr.PackageDescr;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
@@ -40,7 +39,7 @@
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.eclipse.ui.texteditor.TextOperationAction;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
@@ -120,6 +119,11 @@
a
.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
setAction("ContentAssistTip", a);
+
+ a = getAction("org.eclipse.debug.ui.commands.ToggleBreakpoint");
+ setAction(ITextEditorActionConstants.RULER_DOUBLE_CLICK,
+ a);
+
}
/** Return the DSL adapter if one is present */
@@ -139,14 +143,23 @@
return imports;
}
+ public String getContent() {
+ return getSourceViewer().getDocument().get();
+ }
+
+ public IResource getResource() {
+ if (getEditorInput() instanceof IFileEditorInput) {
+ return ((IFileEditorInput) getEditorInput()).getFile();
+ }
+ return null;
+ }
+
private void loadImportsAndFunctions() {
try {
- String content = getSourceViewer().getDocument().get();
- Reader dslReader = DSLAdapter.getDSLContent(content, ((FileEditorInput) getEditorInput()).getFile());
- DrlParser parser = new DrlParser();
- PackageDescr descr = DroolsBuilder.parsePackage(content, parser, dslReader);
+ DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(this, true, false);
+ PackageDescr descr = drlInfo.getPackageDescr();
// package
- this.packageName = descr.getName();
+ this.packageName = drlInfo.getPackageName();
// imports
List allImports = descr.getImports();
this.imports = new ArrayList();
@@ -189,10 +202,8 @@
FactTemplateDescr template = (FactTemplateDescr) iterator.next();
templates.put(template.getName(), template);
}
- } catch (CoreException exc) {
- DroolsIDEPlugin.log(exc);
- } catch (DroolsParserException exc) {
- // do nothing
+ } catch (DroolsParserException e) {
+ DroolsIDEPlugin.log(e);
}
}
@@ -309,10 +320,15 @@
}
public void doSave(IProgressMonitor monitor) {
+ // invalidate cached parsed rules
+ DroolsIDEPlugin.getDefault().invalidateResource(getResource());
+ // save
super.doSave(monitor);
+ // update outline view
if (ruleContentOutline != null) {
ruleContentOutline.update();
}
+ // remove cached content
dslAdapter = null;
imports = null;
functions = null;
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DRLRuleEditor2.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -6,6 +6,8 @@
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
+//import org.eclipse.ui.texteditor.IDocumentProvider;
+//import org.eclipse.ui.texteditor.IDocumentProviderExtension;
/**
* This is a multi table editor wrapper for both the text editor and the RETE
@@ -35,7 +37,12 @@
DRLRuleEditor2.this.setPartName(partName);
}
};
- reteViewer = new ReteViewer(this, textEditor.getDocumentProvider());
+ //IDocumentProvider provider = textEditor.getDocumentProvider();
+ //if (provider instanceof IDocumentProviderExtension) {
+ // IDocumentProviderExtension extension = (IDocumentProviderExtension) provider;
+ // extension.isModifiable(getEditorInput());
+ //}
+ reteViewer = new ReteViewer(textEditor, textEditor.getDocumentProvider());
int text = addPage(textEditor, getEditorInput());
int rete = addPage(reteViewer, getEditorInput());
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DSLAdapter.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -54,7 +54,7 @@
}
/** Get a reader to the DSL contents */
- public static Reader getDSLContent(String ruleSource, IFile input) throws CoreException {
+ public static Reader getDSLContent(String ruleSource, IResource input) throws CoreException {
String dslFileName = findDSLConfigName( ruleSource );
if (dslFileName == null) return null;
IResource res = findDSLResource( input, dslFileName );
@@ -90,7 +90,7 @@
}
}
- private static IResource findDSLResource(IFile input, String dslFileName) {
+ private static IResource findDSLResource(IResource input, String dslFileName) {
IResource res = input.getParent().findMember( dslFileName );
if (res == null) res = input.getParent().getParent().findMember( dslFileName ); //try parent directory
if (res == null) res = input.getProject().findMember( dslFileName ); //try root of project.
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsLineBreakpointAdapter.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsLineBreakpointAdapter.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/DroolsLineBreakpointAdapter.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -28,7 +28,7 @@
}
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
- if (part instanceof DRLRuleEditor2) {
+ if (part instanceof IEditorPart) {
IEditorPart editor = (IEditorPart) part;
IResource resource = (IResource) editor.getEditorInput().getAdapter(IResource.class);
ITextSelection textSelection = (ITextSelection) selection;
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/ReteViewer.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/ReteViewer.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/ReteViewer.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -2,23 +2,14 @@
import java.awt.BorderLayout;
import java.awt.Frame;
-import java.io.Reader;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
-import org.drools.compiler.DrlParser;
-import org.drools.compiler.PackageBuilder;
+import org.drools.ide.DRLInfo;
import org.drools.ide.DroolsIDEPlugin;
-import org.drools.ide.builder.DroolsBuilder;
-import org.drools.ide.util.ProjectClassLoader;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.reteoo.ReteooRuleBase;
import org.drools.rule.Package;
import org.drools.visualize.ReteooJungViewerPanel;
-import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.awt.SWT_AWT;
@@ -30,25 +21,20 @@
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.texteditor.IDocumentProvider;
public class ReteViewer extends EditorPart {
- private DRLRuleEditor2 drlEditor;
+ private DRLRuleEditor drlEditor;
- private IDocumentProvider documentProvider;
-
private Frame frame;
private Composite parent;
- public ReteViewer(DRLRuleEditor2 drlEditor,
- IDocumentProvider documentProvider) {
+ public ReteViewer(DRLRuleEditor drlEditor, IDocumentProvider documentProvider) {
this.drlEditor = drlEditor;
- this.documentProvider = documentProvider;
}
public void createPartControl(Composite parent) {
@@ -81,50 +67,17 @@
}
private RuleBase getRuleBase() {
- if (getEditorInput() instanceof IFileEditorInput) {
- try {
- String contents = documentProvider.getDocument(getEditorInput()).get();
-
- ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
- ClassLoader newLoader = DroolsBuilder.class.getClassLoader();
- IFile file = ((IFileEditorInput) 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(contents, file);
-
- try {
- Thread.currentThread().setContextClassLoader(newLoader);
-
- DrlParser parser = new DrlParser();
-
- PackageDescr packageDescr = null;
- if (dslReader == null) {
- packageDescr = parser.parse(contents);
- } else {
- packageDescr = parser.parse(contents, dslReader);
- }
-
- //pre build the package
- PackageBuilder builder = new PackageBuilder();
- builder.addPackage(packageDescr);
- Package pkg = builder.getPackage();
-
- //add the package to a rulebase
- RuleBase ruleBase = RuleBaseFactory.newRuleBase();
- ruleBase.addPackage(pkg);
- return ruleBase;
-
- } catch (Exception t) {
- throw t;
- } finally {
- Thread.currentThread().setContextClassLoader(oldLoader);
- }
- } catch (Throwable t) {
- t.printStackTrace();
+ try {
+ DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(drlEditor, true, true);
+ if (drlInfo != null) {
+ Package pkg = drlInfo.getPackage();
+ // add the package to a rulebase
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+ ruleBase.addPackage(pkg);
+ return ruleBase;
}
+ } catch (Throwable t) {
+ DroolsIDEPlugin.log(t);
}
return null;
}
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-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/editors/outline/RuleContentOutlinePage.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -1,34 +1,25 @@
package org.drools.ide.editors.outline;
-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.compiler.DroolsParserException;
+import org.drools.ide.DRLInfo;
+import org.drools.ide.DroolsIDEPlugin;
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;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
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;
import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
/**
@@ -137,9 +128,8 @@
*/
private PackageTreeNode createPackageTreeNode() {
PackageTreeNode packageTreeNode = new PackageTreeNode();
- String ruleFileContents = getRuleFileContents();
- initRules(ruleFileContents);
- populatePackageTreeNode(packageTreeNode, ruleFileContents);
+ initRules();
+ populatePackageTreeNode(packageTreeNode);
return packageTreeNode;
}
@@ -148,7 +138,8 @@
*
* @param packageTreeNode the node to populate
*/
- public void populatePackageTreeNode(PackageTreeNode packageTreeNode, String ruleFileContents) {
+ public void populatePackageTreeNode(PackageTreeNode packageTreeNode) {
+ String ruleFileContents = editor.getContent();
Matcher matcher = RULE_PATTERN1.matcher(ruleFileContents);
while (matcher.find()) {
String ruleName = matcher.group(1);
@@ -222,65 +213,20 @@
}
}
- public void initRules(String ruleFileContents) {
+ public void initRules() {
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);
+ try {
+ DRLInfo drlInfo = DroolsIDEPlugin.getDefault().parseResource(editor, true, false);
+ if (drlInfo != null) {
+ PackageDescr packageDescr = drlInfo.getPackageDescr();
+ for (Iterator iterator = packageDescr.getRules().iterator(); iterator.hasNext(); ) {
+ RuleDescr ruleDescr = (RuleDescr) iterator.next();
+ rules.put(ruleDescr.getName(), ruleDescr);
+ }
}
+ } catch (DroolsParserException e) {
+ DroolsIDEPlugin.log(e);
}
}
- 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
- */
- private String getRuleFileContents() {
- IDocumentProvider documentProvider = editor.getDocumentProvider();
- IEditorInput editorInput = editor.getEditorInput();
- IDocument document = documentProvider.getDocument( editorInput );
- String ruleFileContents = document.get();
- return ruleFileContents;
- }
}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsApplicationLaunchShortcut.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsApplicationLaunchShortcut.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsApplicationLaunchShortcut.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -0,0 +1,17 @@
+package org.drools.ide.launching;
+
+import org.drools.ide.debug.core.IDroolsDebugConstants;
+import org.eclipse.debug.core.ILaunchConfigurationType;
+import org.eclipse.jdt.internal.debug.ui.launcher.JavaApplicationLaunchShortcut;
+
+public class DroolsApplicationLaunchShortcut extends JavaApplicationLaunchShortcut {
+
+ protected ILaunchConfigurationType getConfigurationType() {
+ return getLaunchManager().getLaunchConfigurationType(IDroolsDebugConstants.LAUNCH_CONFIGURATION_TYPE);
+ }
+
+ protected String getTypeSelectionTitle() {
+ return "Select JBoss Rules Application";
+ }
+
+}
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsLaunchConfigurationDelegate.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsLaunchConfigurationDelegate.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsLaunchConfigurationDelegate.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -26,6 +26,7 @@
if (monitor.isCanceled()) {
return;
}
+ // TODO make sure that all DRLs needed during execution are built and cached
super.launch(configuration, mode, launch, monitor);
if (mode.equals(ILaunchManager.DEBUG_MODE)) {
IBreakpoint[] breakpoints = getDroolsBreakpoints();
Modified: labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsSourceLookupParticipant.java
===================================================================
--- labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsSourceLookupParticipant.java 2006-09-19 21:12:15 UTC (rev 6304)
+++ labs/jbossrules/trunk/drools-ide/src/main/java/org/drools/ide/launching/DroolsSourceLookupParticipant.java 2006-09-19 21:31:36 UTC (rev 6305)
@@ -1,6 +1,6 @@
package org.drools.ide.launching;
-import org.drools.ide.RuleInfo;
+import org.drools.ide.DRLInfo.RuleInfo;
import org.drools.ide.debug.core.DroolsStackFrame;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.launching.sourcelookup.containers.JavaSourceLookupParticipant;
@@ -11,7 +11,7 @@
if (object instanceof DroolsStackFrame) {
RuleInfo ruleInfo = ((DroolsStackFrame) object).getExecutingRuleInfo();
if (ruleInfo != null) {
- return ruleInfo.getDrlName();
+ return ruleInfo.getSourcePathName();
}
}
return super.getSourceName(object);
More information about the jboss-svn-commits
mailing list