Change visibility to private for net.sourceforge.phpeclipse.xdebug.php.model.XDebugEl...
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.core / src / net / sourceforge / phpeclipse / xdebug / php / model / XDebugThread.java
index 5c7b936..ed32941 100644 (file)
@@ -6,6 +6,12 @@
  */
 package net.sourceforge.phpeclipse.xdebug.php.model;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import net.sourceforge.phpeclipse.xdebug.core.PHPDebugUtils;
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.XDebugResponse;
+
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.DebugPlugin;
@@ -13,80 +19,134 @@ import org.eclipse.debug.core.IDebugEventSetListener;
 import org.eclipse.debug.core.model.IBreakpoint;
 import org.eclipse.debug.core.model.IStackFrame;
 import org.eclipse.debug.core.model.IThread;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * @author Axel
- * 
- * TODO To change the template for this generated type comment go to Window -
- * Preferences - Java - Code Style - Code Templates
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
  */
-public class XDebugThread extends XDebugElement implements IThread,
-               IDebugEventSetListener {
-
-       /**
-        * Breakpoints this thread is suspended at or <code>null</code> if none.
-        */
-
-       private IStackFrame[] fStackFrames = null;
-
+public class XDebugThread extends XDebugElement implements IThread, IDebugEventSetListener {
+       private XDebugStackFrame[]  fStackFrames;
+       
        private IBreakpoint[] fBreakpoints;
-
-       /**
-        * Whether this thread is stepping
-        */
+       
+       /* Whether this thread is stepping */
        private boolean fStepping = false;
-
+       private boolean fTerminated = false;
+       
+       private int fStepCount = 0;
+       private int fCurrentStepCount = 0;
+       
        /**
         * Constructs a new thread for the given target
         * 
-        * @param target
-        *            VM
+        * @param target VM
         */
        public XDebugThread(XDebugTarget target) {
                super(target);
                DebugPlugin.getDefault().addDebugEventListener(this);
+               fStackFrames = null;
+       }
+       
+       public void incrementStepCounter() {
+               fStepCount++;
        }
-
-       /*
-        * (non-Javadoc)
-        * 
-        * @see org.eclipse.debug.core.model.IThread#getStackFrames()
-        */
        public IStackFrame[] getStackFrames() throws DebugException {
-               if (isSuspended()) {
-                       if (fStackFrames == null) {
-                               // XDebugCorePlugin.log(IStatus.INFO,"vor getStackFrames");
-                               fStackFrames = ((XDebugTarget) getDebugTarget())
-                                               .getStackFrames();
-                               // XDebugCorePlugin.log(IStatus.INFO,"nach getStackFrames");
-                       }
-                       return fStackFrames;
-               } else {
+               if (!isSuspended()) {
                        return new IStackFrame[0];
                }
+               
+               if (fStepCount > fCurrentStepCount) {
+                       XDebugResponse dr = ((XDebugTarget) getDebugTarget()).getStackFrames();
+                       XDebugStackFrame[] newStackFrames = _getStackFrames(dr);
+
+                       /*if (fStackFrames != null) {
+                               if (newStackFrames.length >= fStackFrames.length) {
+                                       int delta = newStackFrames.length - fStackFrames.length + 1;
+                                       
+                                       for (int i = fStackFrames.length - 1; i >= 0; i--) {
+                                               if (fStackFrames[i].equals(newStackFrames[newStackFrames.length - delta])) {
+                                                       int b = 2; b++;
+                                                       //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]);                                                                
+                                               } else if (fStackFrames[i].isSameStackFrame(newStackFrames[newStackFrames.length - delta])) {
+                                                       int b = 2; b++;
+                                                       //((XDebugStackFrame) newStackFrames[newStackFrames.length - delta]).evaluateChange((XDebugStackFrame) fStackFrames[i]);                                                                
+                                               }
+                                               
+                                               delta ++;
+                                       }
+                               } else {
+                                       fStackFrames = newStackFrames;
+                               }
+                       } else {
+                               fStackFrames = newStackFrames;
+                       }*/
+
+                       fCurrentStepCount++;
+
+                       fStackFrames = newStackFrames;
+               }
+
+               return fStackFrames;
        }
+       
+       
+       private XDebugStackFrame[] _getStackFrames(XDebugResponse lastResponse) {
+               if (lastResponse.isError()) {
+                       return new XDebugStackFrame[0];
+               }
+               
+               Node response = lastResponse.getParentNode();
+               NodeList frames = response.getChildNodes();
+               XDebugStackFrame[] theFrames = new XDebugStackFrame[frames.getLength()];
+               for (int i = 0; i < frames.getLength(); i++) {
+                       Node stackNode = frames.item(i);
+                       XDebugStackFrame frame = new XDebugStackFrame(this/*fThread*/, i);
+                       String level =PHPDebugUtils.getAttributeValue(stackNode,"level");
+                       if (!"".equals(level))
+                               frame.setLevel(Integer.parseInt(level));
+       
+                       frame.setType(PHPDebugUtils.getAttributeValue(stackNode,"type"));
+                       String fileName=PHPDebugUtils.unescapeString(PHPDebugUtils.getAttributeValue(stackNode,"filename"));
+                       String lineNo=PHPDebugUtils.getAttributeValue(stackNode,"lineno");
+       
+                       if (!"".equals(lineNo))
+                               frame.setLineNumber(Integer.parseInt(lineNo));
+                       
+                       frame.setWhere(PHPDebugUtils.getAttributeValue(stackNode,"where"));
+                       
+                       try {
+                               frame.setFullName(new URL(fileName));
+                       } catch (MalformedURLException e) {
+                               e.printStackTrace();
+                       }
+               
+                       frame.incrementStepCounter();
+                       
+                       theFrames[i] = frame;
+               }
 
-       /*
-        * (non-Javadoc)
-        * 
+               return theFrames;
+       }
+                       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#hasStackFrames()
         */
        public boolean hasStackFrames() throws DebugException {
                return isSuspended();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getPriority()
         */
        public int getPriority() throws DebugException {
                return 0;
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
         */
        public IStackFrame getTopStackFrame() throws DebugException {
@@ -94,24 +154,18 @@ public class XDebugThread extends XDebugElement implements IThread,
                if (frames.length > 0) {
                        return frames[0];
                }
+               
                return null;
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getName()
         */
        public String getName() throws DebugException {
-               // if (fStackFrames!=null)
-               // return fStackFrames[0].getName();
-               // else
                return "Thread[1]";
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IThread#getBreakpoints()
         */
        public IBreakpoint[] getBreakpoints() {
@@ -120,171 +174,141 @@ public class XDebugThread extends XDebugElement implements IThread,
                }
                return fBreakpoints;
        }
-
+       
        /**
         * Sets the breakpoints this thread is suspended at, or <code>null</code>
         * if none.
         * 
-        * @param breakpoints
-        *            the breakpoints this thread is suspended at, or
-        *            <code>null</code> if none
+        * @param breakpoints the breakpoints this thread is suspended at, or <code>null</code>
+        * if none
         */
        protected void setBreakpoints(IBreakpoint[] breakpoints) {
                fBreakpoints = breakpoints;
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
         */
        public boolean canResume() {
                return isSuspended();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
         */
        public boolean canSuspend() {
-               return !isSuspended();
+               return !isTerminated() && !isSuspended();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
         */
        public boolean isSuspended() {
+//             return fTarget.isSuspended();
                return getDebugTarget().isSuspended();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#resume()
         */
        public void resume() throws DebugException {
-               fStackFrames = null;
-               fBreakpoints = null;
+               fBreakpoints=null;
                getDebugTarget().resume();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
         */
        public void suspend() throws DebugException {
                getDebugTarget().suspend();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#canStepInto()
         */
        public boolean canStepInto() {
                return isSuspended();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#canStepOver()
         */
        public boolean canStepOver() {
                return isSuspended();
        }
-
-       /*
-        * (non-Javadoc)
-        * 
+       
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#canStepReturn()
         */
        public boolean canStepReturn() {
-               if (fStackFrames != null)
+               if (fStackFrames != null) {
                        return (fStackFrames.length > 1);
-               else
+               } else {
                        return false;
+               }
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#isStepping()
         */
        public boolean isStepping() {
                return fStepping;
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#stepInto()
         */
        public void stepInto() throws DebugException {
-               fStackFrames = null;
-               fBreakpoints = null;
+               fBreakpoints=null;
                ((XDebugTarget) getDebugTarget()).step_into();
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#stepOver()
         */
        public void stepOver() throws DebugException {
-               fStackFrames = null;
-               fBreakpoints = null;
+               fBreakpoints=null;
                ((XDebugTarget) getDebugTarget()).step_over();
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IStep#stepReturn()
         */
        public void stepReturn() throws DebugException {
-               fStackFrames = null;
-               fBreakpoints = null;
+               fBreakpoints=null;
                ((XDebugTarget) getDebugTarget()).step_out();
-
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
         */
        public boolean canTerminate() {
                return !isTerminated();
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
         */
        public boolean isTerminated() {
-               return getDebugTarget().isTerminated();
+               return fTerminated;
        }
 
-       /*
-        * (non-Javadoc)
-        * 
+       /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ITerminate#terminate()
         */
        public void terminate() throws DebugException {
-               getDebugTarget().terminate();
+               ((XDebugTarget) getDebugTarget()).getDebugConnection().stop();
+               fTerminated = true;
+       }
+       
+       public void terminated() throws DebugException {
+               fTerminated = true;
        }
 
        /**
         * Sets whether this thread is stepping
         * 
-        * @param stepping
-        *            whether stepping
+        * @param stepping whether stepping
         */
        protected void setStepping(boolean stepping) {
                fStepping = stepping;
@@ -292,12 +316,53 @@ public class XDebugThread extends XDebugElement implements IThread,
 
        public void handleDebugEvents(DebugEvent[] events) {
                DebugEvent de = events[0];
-               System.out.println(de.toString());
-
+               System.out.println(de.toString());      
        }
 
        public void removeEventListeners() {
                DebugPlugin.getDefault().removeDebugEventListener(this);
+       }
+       
+       /**
+        * Fires a debug event
+        * 
+        * @param event the event to be fired
+        */
+       protected void fireEvent(DebugEvent event) {
+               DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event});
+       }
+       
+       /**
+        * Fires a <code>CREATE</code> event for this element.
+        */
+       public void fireCreationEvent() {
+               fireEvent(new DebugEvent(this, DebugEvent.CREATE));
+       }       
+       
+       /**
+        * Fires a <code>RESUME</code> event for this element with
+        * the given detail.
+        * 
+        * @param detail event detail code
+        */
+       public void fireResumeEvent(int detail) {
+               fireEvent(new DebugEvent(this, DebugEvent.RESUME, detail));
+       }
 
+       /**
+        * Fires a <code>SUSPEND</code> event for this element with
+        * the given detail.
+        * 
+        * @param detail event detail code
+        */
+       public void fireSuspendEvent(int detail) {
+               fireEvent(new DebugEvent(this, DebugEvent.SUSPEND, detail));
        }
-}
+       
+       /**
+        * Fires a <code>TERMINATE</code> event for this element.
+        */
+       protected void fireTerminateEvent() {
+               fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
+       }       
+}
\ No newline at end of file