[jboss-svn-commits] JBL Code SVN: r26463 - labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/core.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon May 11 15:54:59 EDT 2009


Author: ahtik
Date: 2009-05-11 15:54:59 -0400 (Mon, 11 May 2009)
New Revision: 26463

Modified:
   labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/core/MVELStackFrame.java
Log:
Intermediate commit for fixing MVEL debugger.

Modified: labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/core/MVELStackFrame.java
===================================================================
--- labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/core/MVELStackFrame.java	2009-05-11 19:24:18 UTC (rev 26462)
+++ labs/jbossrules/trunk/drools-eclipse/org.drools.eclipse/src/main/java/org/drools/eclipse/debug/core/MVELStackFrame.java	2009-05-11 19:54:59 UTC (rev 26463)
@@ -5,6 +5,8 @@
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.drools.eclipse.DroolsEclipsePlugin;
 import org.drools.eclipse.DRLInfo.RuleInfo;
@@ -52,91 +54,112 @@
  */
 public class MVELStackFrame extends DroolsStackFrame {
 
-    private int                             cacheLineNumber           = -1;
-    private int                             cacheBreakpointLineNumber = -1;
-    private String                          cacheMVELName             = null;
-    private IVariable[]                     cacheVariables            = null;
+    MVELStackFrameContext local = new MVELStackFrameContext();
 
-    private boolean                         evaluating                = false;
+    public static class MVELStackFrameContext {
+        public int         cacheLineNumber           = -1;
+        public int         cacheBreakpointLineNumber = -1;
+        public String      cacheMVELName             = null;
+        public IVariable[] cacheVariables            = null;
 
+        public void clear() {
+            cacheLineNumber = -1;
+            cacheBreakpointLineNumber = -1;
+            cacheMVELName = null;
+            cacheVariables = null;
+        }
+
+        MVELStackFrameContext get() {
+            return this;
+        }
+
+    }
+
+    private AtomicInteger                   evaluating  = new AtomicInteger( 0 );
+
+    private final Object                    varLock     = new Object();
+
+    private final Object                    genericLock = new Object();
+
     /**
      * Dummy type with changed stratum to force debugger's LaunchView to show proper stackframe name
      */
-    private static final IJavaReferenceType REF_TYPE                  = new IJavaReferenceType() {
+    private static final IJavaReferenceType REF_TYPE    = new IJavaReferenceType() {
 
-    	public IJavaFieldVariable getField(String name) throws DebugException {
-    		return null;
-    	}
-    	public IJavaClassObject getClassObject() throws DebugException {
-    		return null;
-    	}
-    	
-    	public String[] getAvailableStrata() throws DebugException {
-    		return null;
-    	}
-    	
-    	public String getDefaultStratum() throws DebugException {
-    		return "MVEL";
-    	}
-    	
-    	public String[] getDeclaredFieldNames() throws DebugException {
-    		return null;
-    	}
-    	
-    	public String[] getAllFieldNames() throws DebugException {
-    		return null;
-    	}
-        
-        public IJavaObject getClassLoaderObject() throws DebugException {
-    		return null;
-    	}
-        
-        public String getGenericSignature() throws DebugException {
-    		return null;
-    	}
-        
-        public String getSourceName() throws DebugException {
-    		return null;
-    	}
-        
-        public String[] getSourceNames(String stratum) throws DebugException {
-    		return null;
-    	}
-        
-        public String[] getSourcePaths(String stratum) throws DebugException {
-    		return null;
-    	}
-        
-        public IJavaObject[] getInstances(long max) throws DebugException {
-    		return null;
-    	}
-        
-		public String getName() throws DebugException {
-			return null;
-		}
-		
-		public String getSignature() throws DebugException {
-			return null;
-		}
-		
-		public IDebugTarget getDebugTarget() {
-			return null;
-		}
-		
-		public ILaunch getLaunch() {
-			return null;
-		}
-		
-		public String getModelIdentifier() {
-			return null;
-		}
-		
-		public Object getAdapter(Class adapter) {
-			return null;
-		}
+                                                            public IJavaFieldVariable getField(String name) throws DebugException {
+                                                                return null;
+                                                            }
 
-                                                                      };
+                                                            public IJavaClassObject getClassObject() throws DebugException {
+                                                                return null;
+                                                            }
 
+                                                            public String[] getAvailableStrata() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String getDefaultStratum() throws DebugException {
+                                                                return "MVEL";
+                                                            }
+
+                                                            public String[] getDeclaredFieldNames() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String[] getAllFieldNames() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public IJavaObject getClassLoaderObject() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String getGenericSignature() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String getSourceName() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String[] getSourceNames(String stratum) throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String[] getSourcePaths(String stratum) throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public IJavaObject[] getInstances(long max) throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String getName() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public String getSignature() throws DebugException {
+                                                                return null;
+                                                            }
+
+                                                            public IDebugTarget getDebugTarget() {
+                                                                return null;
+                                                            }
+
+                                                            public ILaunch getLaunch() {
+                                                                return null;
+                                                            }
+
+                                                            public String getModelIdentifier() {
+                                                                return null;
+                                                            }
+
+                                                            public Object getAdapter(Class adapter) {
+                                                                return null;
+                                                            }
+
+                                                        };
+
     public MVELStackFrame(DroolsThread thread,
                           StackFrame frame,
                           int depth) {
@@ -147,86 +170,92 @@
     }
 
     public IVariable[] getVariables() throws DebugException {
-
         if ( !isSuspended() ) {
             return new IVariable[0];
         }
 
-        if ( cacheVariables != null ) {
-            return cacheVariables;
+        MVELStackFrameContext ctx = local.get();
+
+        if ( ctx.cacheVariables != null ) {
+            return ctx.cacheVariables;
         }
 
-        evaluating = true;
-        try {
-            List result = new ArrayList( 0 );
+        synchronized ( varLock ) {
+            evaluating.incrementAndGet();
 
-            Method method = getUnderlyingMethod(); // onBreak
-            ReferenceType declaringType = method.declaringType(); // org.drools.base.mvel.MVELDebugHandler
-
             try {
+                List result = new ArrayList( 0 );
 
-                Object var = method.variables().get( 0 );
-                LocalVariable v2 = (LocalVariable) var;
-                DroolsLocalVariable frameLocal = new DroolsLocalVariable( this,
-                                                                          v2 );
+                Method method = getUnderlyingMethod(); // onBreak
+                ReferenceType declaringType = method.declaringType(); // org.drools.base.mvel.MVELDebugHandler
 
-                IValue knownVars = DebugUtil.getValueByExpression( "return getFactory().getKnownVariables().toArray(new String[0]);",
-                                                                   frameLocal.getValue() );
+                try {
 
-                JDIObjectValue vvv = (JDIObjectValue) knownVars;
+                    Object var = method.variables().get( 0 );
+                    LocalVariable v2 = (LocalVariable) var;
+                    DroolsLocalVariable frameLocal = new DroolsLocalVariable( this,
+                                                                              v2 );
 
-                if ( vvv != null && ((ArrayReference) vvv.getUnderlyingObject()).length() > 0 ) {
-                    ArrayReference arr = (ArrayReference) vvv.getUnderlyingObject();
+                    IValue knownVars = DebugUtil.getValueByExpression( "return getFactory().getKnownVariables().toArray(new String[0]);",
+                                                                       frameLocal.getValue() );
 
-                    Iterator varIter = arr.getValues().iterator();
+                    //if (true) return new IVariable[0];
 
-                    while ( varIter.hasNext() ) {
-                        final String varName = ((StringReference) varIter.next()).value();
+                    JDIObjectValue vvv = (JDIObjectValue) knownVars;
 
-                        IJavaValue val = (IJavaValue) DebugUtil.getValueByExpression( "return getFactory().getVariableResolver(\"" + varName + "\").getValue();",
-                        															  frameLocal.getValue() );
-                        if ( val != null ) {
-                            final ObjectReference valRef = ((JDIObjectValue) val).getUnderlyingObject();
-                            VariableWrapper local = new VariableWrapper( varName,
-                                                                         val );
+                    if ( vvv != null && ((ArrayReference) vvv.getUnderlyingObject()).length() > 0 ) {
+                        ArrayReference arr = (ArrayReference) vvv.getUnderlyingObject();
 
-                            local.setPublic( true );
-                            result.add( local );
-                        } else {
-                            DroolsEclipsePlugin.log( new Exception( "Unable to get value for variable named '" + varName + "' suspend=" + isSuspended() ) );
+                        Iterator varIter = arr.getValues().iterator();
+
+                        while ( varIter.hasNext() ) {
+                            final String varName = ((StringReference) varIter.next()).value();
+
+                            IJavaValue val = (IJavaValue) DebugUtil.getValueByExpression( "return getFactory().getVariableResolver(\"" + varName + "\").getValue();",
+                                                                                          frameLocal.getValue() );
+                            if ( val != null ) {
+                                final ObjectReference valRef = ((JDIObjectValue) val).getUnderlyingObject();
+                                VariableWrapper local = new VariableWrapper( varName,
+                                                                             val );
+
+                                local.setPublic( true );
+                                result.add( local );
+                            } else {
+                                DroolsEclipsePlugin.log( new Exception( "Unable to get value for variable named '" + varName + "' suspend=" + isSuspended() ) );
+                            }
                         }
+
                     }
 
+                    IVariable[] vararr = (IVariable[]) result.toArray( new IVariable[result.size()] );
+                    ctx.cacheVariables = vararr;
+                    return vararr;
+
+                } catch ( Throwable t ) {
+                    DroolsEclipsePlugin.log( t );
                 }
 
                 IVariable[] vararr = (IVariable[]) result.toArray( new IVariable[result.size()] );
-                cacheVariables = vararr;
-                return vararr;
 
-            } catch ( Throwable t ) {
-                DroolsEclipsePlugin.log( t );
-            }
+                Arrays.sort( vararr,
+                             new Comparator() {
 
-            IVariable[] vararr = (IVariable[]) result.toArray( new IVariable[result.size()] );
-
-            Arrays.sort( vararr,
-                         new Comparator() {
-
-                             public int compare(Object var1,
-                                                Object var2) {
-                                 try {
-                                     return ((IVariable) var1).getName().compareTo( ((IVariable) var2).getName() );
-                                 } catch ( DebugException e ) {
-                                     return 0;
+                                 public int compare(Object var1,
+                                                    Object var2) {
+                                     try {
+                                         return ((IVariable) var1).getName().compareTo( ((IVariable) var2).getName() );
+                                     } catch ( DebugException e ) {
+                                         return 0;
+                                     }
                                  }
-                             }
 
-                         } );
-            cacheVariables = vararr;
-            return vararr;
-        } finally {
-            evaluating = false;
-            evalEnd();
+                             } );
+                ctx.cacheVariables = vararr;
+                return vararr;
+            } finally {
+                evaluating.decrementAndGet();
+                evalEnd();
+            }
         }
     }
 
@@ -293,60 +322,56 @@
 
     public int getLineNumber() throws DebugException {
 
-        if ( cacheLineNumber != -1 ) {
-            return cacheLineNumber;
+        //if (true) return 9;
+
+        MVELStackFrameContext ctx = local.get();
+
+        if ( ctx.cacheLineNumber != -1 ) {
+            return ctx.cacheLineNumber;
         }
 
         if ( !isSuspended() ) {
-            return -1;
+            // return -1;
         }
 
-        evaluating = true;
-        try {
-            DroolsDebugTarget t = (DroolsDebugTarget) getDebugTarget();
+        synchronized ( genericLock ) {
+            evaluating.incrementAndGet();
+            try {
+                DroolsDebugTarget t = (DroolsDebugTarget) getDebugTarget();
 
-            //int lineNr = getBreakpointLineNumber();
-            String sourceName = getMVELName();
+                //int lineNr = getBreakpointLineNumber();
+                String sourceName = getMVELName();
 
-            DroolsLineBreakpoint bpoint = (DroolsLineBreakpoint) t.getDroolsBreakpoint( sourceName );
+                DroolsLineBreakpoint bpoint = (DroolsLineBreakpoint) t.getDroolsBreakpoint( sourceName );
+                if ( bpoint == null ) {
+                    return -1;
+                }
 
-            if ( bpoint == null ) {
-                return -1;
-            }
+                int line;
 
-            int line;
+                try {
+                    line = Integer.parseInt( bpoint.getFileRuleMappings().get( sourceName ).toString() );
+                } catch ( Throwable t2 ) {
+                    DroolsEclipsePlugin.log( t2 );
+                    return -1;
+                }
 
-            try {
-                line = Integer.parseInt( bpoint.getFileRuleMappings().get( sourceName ).toString() );
-            } catch ( Throwable t2 ) {
-                DroolsEclipsePlugin.log( t2 );
-                return -1;
-            }
+                int fragmentLine = getBreakpointLineNumber(); // 4->5 for step over
 
-            int fragmentLine = getBreakpointLineNumber(); // 4->5 for step over
+                int res = line + fragmentLine;
 
-            int retryCount=0;
-            while (fragmentLine==-1 && retryCount<10) {
-                try {
-                    Thread.currentThread().sleep( 100 );
-                } catch ( InterruptedException e ) {
-                    break;
+                // System.out.println("Resolved line to line:"+line+"; fragment:"+fragmentLine);
+
+                if ( fragmentLine == -1 ) {
+                    System.err.println( "Unable to retrieve fragment line!" );
+                    return -1;
                 }
-                fragmentLine = getBreakpointLineNumber();
-                retryCount++;
+                ctx.cacheLineNumber = res;
+                return res;
+            } finally {
+                evaluating.decrementAndGet();
+                evalEnd();
             }
-                
-            int res = line + fragmentLine;
-
-            if (fragmentLine==-1) {
-                System.err.println("Unable to retrieve fragment line!");
-            }
-            cacheLineNumber = res;
-            //System.out.println("Returning RES="+res+" line:"+line+"; fragmentLine="+fragmentLine);
-            return res;
-        } finally {
-            evaluating = false;
-            evalEnd();
         }
     }
 
@@ -363,122 +388,129 @@
     }
 
     public int getBreakpointLineNumber() {
+        MVELStackFrameContext ctx = local.get();
 
-        if ( cacheBreakpointLineNumber != -1 ) {
-            return cacheBreakpointLineNumber;
+        if ( ctx.cacheBreakpointLineNumber != -1 ) {
+            return ctx.cacheBreakpointLineNumber;
         }
 
         if ( !isSuspended() ) {
+            System.out.println( "Not suspended!" );
             return -1;
         }
 
-        evaluating = true;
-        try {
-        	
-        	// Drools 4
+        synchronized ( getThread() ) {
+            evaluating.incrementAndGet();
             try {
-                Object o = getRemoteVar( "lineNumber" );
-                if ( o == null ) {
-                    return -1;
+
+                // Drools 4
+                try {
+                    Object o = getRemoteVar( "lineNumber" );
+                    if ( o == null ) {
+                        return -1;
+                    }
+                    IntegerValue val = (IntegerValue) o;
+                    int realval = val.value();
+                    /*                if (realval==-1) {
+                                        System.out.println("-1!!");
+                                    }
+                    */
+                    ctx.cacheBreakpointLineNumber = realval;
+                    return realval;
+                } catch ( NullPointerException e ) {
+                    // Drools 5+
+                } catch ( Throwable e ) {
+                    DroolsEclipsePlugin.log( e );
                 }
-                IntegerValue val = (IntegerValue) o;
-                int realval = val.value();
-/*                if (realval==-1) {
-                    System.out.println("-1!!");
+
+                // Drools 5
+                try {
+                    Object o = getRemoteVar( "label" );
+                    if ( o == null ) {
+                        return -1;
+                    }
+                    ObjectReference obj = (ObjectReference) o;
+                    ClassType frameType = (ClassType) obj.type();
+                    Field field = frameType.fieldByName( "lineNumber" );
+                    o = obj.getValue( field );
+                    if ( o == null ) {
+                        return -1;
+                    }
+                    IntegerValue val = (IntegerValue) o;
+                    int realval = val.value();
+                    ctx.cacheBreakpointLineNumber = realval;
+                    return realval;
+                } catch ( NullPointerException e ) {
+                    // Drools 5+
+                } catch ( Throwable e ) {
+                    DroolsEclipsePlugin.log( e );
                 }
-*/
-                cacheBreakpointLineNumber = realval;
-                return realval;
-            } catch ( NullPointerException e ) {
-                // Drools 5+
-            } catch (Throwable e) {
-            	DroolsEclipsePlugin.log( e );
+
+                return -1;
+            } finally {
+                evaluating.decrementAndGet();
+                evalEnd();
             }
-            
-        	// Drools 5
-            try {
-                Object o = getRemoteVar( "label" );
-                if ( o == null ) {
-                    return -1;
-                }
-                ObjectReference obj = (ObjectReference) o;
-                ClassType frameType = (ClassType) obj.type();
-                Field field = frameType.fieldByName( "lineNumber" );
-                o = obj.getValue( field );
-                if ( o == null ) {
-                    return -1;
-                }
-                IntegerValue val = (IntegerValue) o;
-                int realval = val.value();
-                cacheBreakpointLineNumber = realval;
-                return realval;
-            } catch ( NullPointerException e ) {
-                // Drools 5+
-            } catch (Throwable e) {
-            	DroolsEclipsePlugin.log( e );
-            }
-            
-            return -1;
-        } finally {
-            evaluating = false;
-            evalEnd();
         }
     }
 
     public String getMVELName() {
-
-        if ( cacheMVELName != null ) {
-            return cacheMVELName;
-        }
-
         if ( !isSuspended() ) {
             return null;
         }
 
-        evaluating = true;
-        try {
-        	
-        	// Drools 4
+        MVELStackFrameContext ctx = local.get();
+
+        if ( ctx.cacheMVELName != null ) {
+            return ctx.cacheMVELName;
+        }
+
+        synchronized ( genericLock ) {
+            evaluating.incrementAndGet();
             try {
-                Object rem = getRemoteVar( "sourceName" );
-                if ( rem == null ) {
-                    return null;
+
+                // Drools 4
+                try {
+                    Object rem = getRemoteVar( "sourceName" );
+                    if ( rem == null ) {
+                        return null;
+                    }
+                    StringReference res = (StringReference) rem;
+                    String realres = res.value();
+                    ctx.cacheMVELName = realres;
+                    return realres;
+                } catch ( NullPointerException e ) {
+                    // Drools 5
+                } catch ( Throwable e ) {
+                    DroolsEclipsePlugin.log( e );
                 }
-                StringReference res = (StringReference) rem;
-                String realres = res.value();
-                cacheMVELName = realres;
-                return realres;
-            } catch ( NullPointerException e) {
-            	// Drools 5
-            } catch ( Throwable e ) {
-                DroolsEclipsePlugin.log( e );
-            }
-            
-        	// Drools 5
-            try {
-                Object rem = getRemoteVar( "label" );
-                if ( rem == null ) {
-                    return null;
+
+                // Drools 5
+                try {
+                    Object rem = getRemoteVar( "label" );
+                    if ( rem == null ) {
+                        return null;
+                    }
+                    ObjectReference obj = (ObjectReference) rem;
+                    ClassType frameType = (ClassType) obj.type();
+                    Field field = frameType.fieldByName( "sourceFile" );
+                    rem = obj.getValue( field );
+                    if ( rem == null ) {
+                        return null;
+                    }
+                    StringReference res = (StringReference) rem;
+                    String realres = res.value();
+                    ctx.cacheMVELName = realres;
+                    return realres;
+                } catch ( Throwable e ) {
+                    DroolsEclipsePlugin.log( e );
                 }
-                ObjectReference obj = (ObjectReference) rem;
-                ClassType frameType = (ClassType) obj.type();
-                Field field = frameType.fieldByName( "sourceFile" );
-                rem = obj.getValue( field );
-                if ( rem == null ) {
-                    return null;
-                }
-                StringReference res = (StringReference) rem;
-                String realres = res.value();
-                cacheMVELName = realres;
-                return realres;
-            } catch ( Throwable e ) {
-                DroolsEclipsePlugin.log( e );
+
+                return "Unavailable";
+            } finally {
+                evaluating.decrementAndGet();
+                evalEnd();
             }
-
-            return "Unavailable";
-        } finally {
-            evaluating = false;
-            evalEnd();
         }
     }
 
@@ -509,10 +541,9 @@
         //IValue value = jdivar.getValue();
         ObjectReferenceImpl o = (ObjectReferenceImpl) value;
 
-        /*        if ( value instanceof JDINullValue ) {
-         return null;
-         }
-         */
+        //if ( value instanceof JDINullValue ) {
+        // return null;
+        // }
 
         //ObjectReference o = (ObjectReference) ((JDIObjectValue) value).getUnderlyingObject();
         if ( o == null ) {
@@ -533,7 +564,8 @@
     }
 
     public boolean canStepOver() {
-        return exists() && !isObsolete() && !evaluating;
+        // while not synchronised, this is thread safe due to the atomic evaluating.
+        return exists() && !isObsolete() && evaluating.get() == 0;
     }
 
     public boolean canDropToFrame() {
@@ -559,38 +591,25 @@
     protected JDIStackFrame bind(StackFrame frame,
                                  int depth) {
         clearCachedData();
-        return super.bind( frame,
-                           depth );
+        JDIStackFrame res = super.bind( frame,
+                                        depth );
+        return res;
     }
 
     protected void clearCachedData() {
         super.clearCachedData();
-        clearFrameCache();
-        if ( !isSuspended() ) {
-            initMVELinfo();
+        if ( local != null ) {
+            local.get().clear();
         }
     }
 
-    private void initMVELinfo() {
-        try {
-            getLineNumber();
-        } catch ( DebugException e ) {
-            // no luck this time. will be initialized later
+    @Override
+    public boolean isSuspended() {
+        boolean suspended = getThread().isSuspended();
+        if ( !suspended ) {
+            System.err.println( "NOT SUSPENDED!" );
         }
-        getBreakpointLineNumber();
-        getMVELName();
-        try {
-            getVariables();
-        } catch ( DebugException e1 ) {
-            // no luck this time. will be initialized later
-        }
+        return suspended;
     }
 
-    private void clearFrameCache() {
-        cacheLineNumber = -1;
-        cacheBreakpointLineNumber = -1;
-        cacheMVELName = null;
-        cacheVariables = null;
-    }
-
-}
+}
\ No newline at end of file




More information about the jboss-svn-commits mailing list