[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