1) Fixed breakpoint with skip count (or hit count).
[phpeclipse.git] / net.sourceforge.phpeclipse.xdebug.core / src / net / sourceforge / phpeclipse / xdebug / php / model / XDebugTarget.java
index 0c9f1d3..ad0d7a6 100644 (file)
@@ -1,10 +1,16 @@
 /**
- * 
+ *
  */
 package net.sourceforge.phpeclipse.xdebug.php.model;
 
+//import java.io.IOException;
 import java.util.List;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
 import net.sourceforge.phpeclipse.xdebug.core.IPHPDebugEvent;
 import net.sourceforge.phpeclipse.xdebug.core.IProxyEventListener;
 import net.sourceforge.phpeclipse.xdebug.core.IXDebugPreferenceConstants;
@@ -18,6 +24,7 @@ import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IMarkerDelta;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.DebugEvent;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.DebugPlugin;
@@ -30,12 +37,16 @@ import org.eclipse.debug.core.model.ILineBreakpoint;
 import org.eclipse.debug.core.model.IMemoryBlock;
 import org.eclipse.debug.core.model.IProcess;
 import org.eclipse.debug.core.model.IThread;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
+//import org.xml.sax.SAXException;
 
 import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener;
 import net.sourceforge.phpeclipse.xdebug.core.xdebug.XDebugConnection;
-import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.XDebugResponse;
+import net.sourceforge.phpeclipse.xdebug.core.xdebug.XDebugResponse;
 
 /**
  * @author Christian
@@ -43,18 +54,18 @@ import net.sourceforge.phpeclipse.xdebug.core.xdebug.ResponseListener.XDebugResp
  */
 public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugEventSetListener, IProxyEventListener {
        private IProcess fProcess;
-       
+
        private ILaunch fLaunch;
-       
+
        private int fDebugPort;
-       
+
        private boolean fSuspended = false;
-       
+
        private boolean fTerminated = false;
-       
+
        private XDebugThread fThread;
        private IThread[] fThreads;
-       
+
        private XDebugConnection fDebugConnection;
 
        private ResponseListener fResponseListener;
@@ -65,13 +76,13 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
        /**
         * Constructs a new debug target in the given launch and waits until
         * someone with the ideKey connects to the Debugproxy
-        *  
-        * 
+        *
+        *
         * @param launch containing launch
         * @param process process of the interpreter
-        * @param ideKey 
+        * @param ideKey
         * @exception CoreException if unable to connect to host
-        */     
+        */
        public XDebugTarget(ILaunch launch, IProcess process, String ideKey) throws CoreException {
                fLaunch = launch;
                fProcess = process;
@@ -79,16 +90,58 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                fThread = null;
                fThreads = new IThread[0];
                fIdeKey = ideKey;
-               
-               fDebugPort = XDebugCorePlugin.getDefault().getPreferenceStore().getInt(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE);                
+
+               fDebugPort = XDebugCorePlugin.getDefault().getPreferenceStore().getInt(IXDebugPreferenceConstants.DEBUGPORT_PREFERENCE);
                if (fDebugPort == 0) {
                        fDebugPort = IXDebugPreferenceConstants.DEFAULT_DEBUGPORT;
                }
-               
+
                DebugPlugin.getDefault().getBreakpointManager().addBreakpointListener(this);
                DebugPlugin.getDefault().addDebugEventListener(this);
        }
 
+       public Object getAdapter(Class arg0) {
+          if (IWorkbenchAdapter.class.equals(arg0)) {
+              return new IWorkbenchAdapter() {
+                       public Object[] getChildren(Object o) {
+                           Object[] children = null;
+                           IThread[] threads = getThreads();
+                           if (null != threads) {
+                               children = new Object[threads.length];
+                               for (int i = 0; i < threads.length; ++i)
+                                   children[i] = threads[i];
+                           }
+                           return children;
+                       }
+
+                       public ImageDescriptor getImageDescriptor(Object object) {
+                           return null;
+                       }
+
+                       public String getLabel(Object o) {
+                           String label = "(Unable to look up name... check error log)";
+                           try {
+                               label = getName();
+                           } catch (DebugException x) {
+                               PHPeclipsePlugin.log(label, x);
+                           }
+                           return label;
+                       }
+
+                       public Object getParent(Object o) {
+                           return XDebugTarget.this.getLaunch();
+                       }
+                   };
+               }
+               else {
+                   if (arg0 == XDebugElement.class) {
+                       return this;
+                   }
+
+                   return super.getAdapter(arg0);
+               }
+           }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IDebugTarget#getProcess()
         */
@@ -99,7 +152,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.IDebugTarget#getThreads()
         */
-       public IThread[] getThreads() throws DebugException {
+       public IThread[] getThreads() {
                return fThreads;
        }
 
@@ -121,7 +174,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
         * @see org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(org.eclipse.debug.core.model.IBreakpoint)
         */
        public boolean supportsBreakpoint(IBreakpoint breakpoint) {
-               if (breakpoint.getModelIdentifier().equals(IXDebugConstants.ID_PHP_DEBUG_MODEL)) {
+               if (breakpoint.getModelIdentifier().equals(IXDebugConstants.ID_PHP_BREAKPOINT_MODEL)) {
                        return true;
                }
                return false;
@@ -165,16 +218,16 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                if(fTerminated) {
                        return;
                }
-               
+
                if (XDebugCorePlugin.getDefault() != null) {
                        XDebugProxy proxy = XDebugCorePlugin.getDefault().getXDebugProxy();
                        proxy.removeProxyEventListener(this, fIdeKey);
-                       
+
                        System.out.println("XDebug.Target: ProxyEventlistener removed");
-                       
+
                        fTerminated = true;
                        fSuspended = false;
-                       
+
                        XDebugCorePlugin.getBreakpointManager().removeBreakpointListener(this);
                        fireEvent(new DebugEvent(this, DebugEvent.TERMINATE));
                        DebugPlugin.getDefault().removeDebugEventListener(this);
@@ -210,29 +263,29 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        fThread.setBreakpoints(null);
                        resumed(DebugEvent.RESUME);
                        fDebugConnection.run();
-               }               
+               }
        }
-       
+
        /**
         * Notification the target has resumed for the given reason
-        * 
+        *
         * @param detail reason for the resume
         */
        private void resumed(int detail) {
                fSuspended = false;
                fThread.fireResumeEvent(detail);
        }
-       
+
        /**
         * Notification the target has suspended for the given reason
-        * 
+        *
         * @param detail reason for the suspend
         */
        public void suspended(int detail) {
                fSuspended = true;
                fThread.fireSuspendEvent(detail);
-       }       
-       
+       }
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
         */
@@ -243,10 +296,11 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
         * @see org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint)
         */
        public void breakpointAdded(IBreakpoint breakpoint) {
-               IMarker marker = breakpoint.getMarker();
-               IPath path = marker.getResource().getLocation();
-               IPath cp = path.removeLastSegments(1);
-               List pathMap = null;
+               IMarker marker   = breakpoint.getMarker();                  // Get the breakpoints marker info (It's the local workspace path)
+               IPath   path     = marker.getResource().getLocation();      // Get the full path + file for the given breakpoint (It's the local real path)
+               IPath   cp       = path.removeLastSegments(1);              // Get the full path only (without the file name)
+               List    pathMap  = null;
+
                try {
                        pathMap = fLaunch.getLaunchConfiguration().getAttribute(IXDebugConstants.ATTR_PHP_PATHMAP,(List)null);
                } catch (CoreException e2) {
@@ -254,74 +308,62 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        e2.printStackTrace();
                }
 
-               if (fDebugConnection != null)
-               if (!fDebugConnection.isClosed()) {
-                       if (fProcess == null) {
-                               PathMapItem pmi = null;
-                               for (int i = 0; i < pathMap.size(); i++) {
-                                       pmi = new PathMapItem((String) pathMap.get(i));
-                                       IPath local = (IPath)pmi.getLocalPath().clone();
-                                       local = local.makeAbsolute();
-                                       int matchedSegments = local.segmentCount();
-                                       if (local.matchingFirstSegments(cp) == matchedSegments) {
-                                               IPath newPath = pmi.getRemotePath();
-                                               newPath = newPath.append(path.removeFirstSegments(matchedSegments));
-                                               newPath = newPath.makeAbsolute();
-                                               if (supportsBreakpoint(breakpoint)) {
-                                                       try {
-                                                               if (breakpoint.isEnabled()) {
-                                                                       if (marker != null) {
-                                                                               int id = fDebugConnection.breakpointSet(newPath.toString(), ((ILineBreakpoint)breakpoint).getLineNumber(), marker.getAttribute(XDebugBreakpoint.HIT_COUNT,-1));
-                                                                               XDebugResponse dr = getResponse(id);
-                                                                               
-                                                                               String bpid = dr.getAttributeValue("id");
-                                                                               
-                                                                               if (!"".equals(bpid))
-                                                                                       marker.setAttribute(XDebugLineBreakpoint.BREAKPOINT_ID,Integer.parseInt(bpid));
-                                                                       }
+               if ((fDebugConnection != null) &&                           // If there is a connection to XDebug
+                   (!fDebugConnection.isClosed ()) &&                      // and this connection is not closed
+                       (fProcess == null)) {                                   //
+                       PathMapItem pmi = null;
+
+                       for (int i = 0; i < pathMap.size(); i++) {              // For every path map pair the user have set
+                               pmi                 = new PathMapItem((String) pathMap.get(i));   // Get the path map pair
+                               IPath local         = (IPath)pmi.getLocalPath().clone();          // Get the local
+                               local               = local.makeAbsolute();
+                               int matchedSegments = local.segmentCount();
+
+                               if (local.matchingFirstSegments(cp) == matchedSegments) {
+                                       IPath newPath = pmi.getRemotePath();
+                                       newPath       = newPath.append(path.removeFirstSegments(matchedSegments));
+                                       newPath       = newPath.makeAbsolute();
+
+                                       if (supportsBreakpoint(breakpoint)) {
+                                               try {
+                                                       if (breakpoint.isEnabled()) {
+                                                               if (marker != null) {
+                                                                       int id = fDebugConnection.breakpointSet (newPath.toString(),
+                                                                                                                ((ILineBreakpoint)breakpoint).getLineNumber(),
+                                                                                                                marker.getAttribute (XDebugBreakpoint.HIT_COUNT, -1),
+                                                                             marker.getAttribute (XDebugBreakpoint.CONDITION_ENABLED, false),
+                                                                                                                marker.getAttribute (XDebugBreakpoint.CONDITION, ""));
+                                                                       XDebugResponse dr = getResponse(id);
+
+                                                                       String bpid = dr.getAttributeValue("id");
+
+                                                                       if (!"".equals(bpid))
+                                                                               marker.setAttribute(XDebugLineBreakpoint.BREAKPOINT_ID,Integer.parseInt(bpid));
                                                                }
-                                                       } catch (DebugException e) {
-                                                               e.printStackTrace();
-                                                       } catch (CoreException e) {
-                                                               e.printStackTrace();
-                                                       }
-                                               }
-                                       }
-                               }                       
-                       } else {
-                               if (supportsBreakpoint(breakpoint)) {
-                                       try {
-                                               if (breakpoint.isEnabled()) {
-                                                       if (marker != null) {
-                                                               int id = fDebugConnection.breakpointSet(path.toString(), ((ILineBreakpoint)breakpoint).getLineNumber(), marker.getAttribute(XDebugBreakpoint.HIT_COUNT,-1));
-                                                               XDebugResponse dr = getResponse(id);
-                                                               String bpid = dr.getAttributeValue("id");
-                                                               
-                                                               if (!"".equals(bpid))
-                                                                       marker.setAttribute(XDebugLineBreakpoint.BREAKPOINT_ID,Integer.parseInt(bpid));
                                                        }
+                                               } catch (DebugException e) {
+                                                       e.printStackTrace();
+                                               } catch (CoreException e) {
+                                                       e.printStackTrace();
                                                }
-                                       } catch (DebugException e) {
-                                               e.printStackTrace();
-                                       } catch (CoreException e) {
-                                               e.printStackTrace();
                                        }
                                }
                        }
                }
        }
-       
+
        /* (non-Javadoc)
         * @see org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
         */
        public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
+               IMarker marker   = breakpoint.getMarker();                  // Get the breakpoints marker info (It's the local workspace path)
+
                if (supportsBreakpoint(breakpoint)) {
-                       try {
-                               int id =((XDebugLineBreakpoint)breakpoint).getID();
-                               if (id >0)
-                                       fDebugConnection.breakpointRemove(id);
-                       } catch (CoreException e) {
-                       }
+                       int id = marker.getAttribute (XDebugLineBreakpoint.BREAKPOINT_ID, -1);
+
+            if (id > 0) {
+               fDebugConnection.breakpointRemove(id);
+            }
                }
        }
 
@@ -329,16 +371,32 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
         * @see org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
         */
        public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
-//             if (supportsBreakpoint(breakpoint)) {
-//                     try {
-//                             if (breakpoint.isEnabled()) {
-//                                     breakpointAdded(breakpoint);
-//                             } else {
-//                                     breakpointRemoved(breakpoint, null);
-//                             }
-//                     } catch (CoreException e) {
-//                     }
-//             }
+       IMarker oldmarker = breakpoint.getMarker ();
+
+       if (supportsBreakpoint(breakpoint)) {
+                       try {
+                               if (breakpoint.isEnabled ()     &&                                                                      // Check if breakpoint state changed from disabled to enabled
+                                       !delta.getAttribute ("org.eclipse.debug.core.enabled", false)) {
+                                       breakpointAdded (breakpoint);
+                               }
+                               else if (!breakpoint.isEnabled () &&                                                    // Check if breakpoint state changed from enabled to disabled
+                                   delta.getAttribute ("org.eclipse.debug.core.enabled", true)) {
+                                       breakpointRemoved (breakpoint, null);
+                               }
+                               else if (oldmarker.getAttribute (XDebugLineBreakpoint.CHANGE_ID, 1) !=
+                                        delta.getAttribute (XDebugLineBreakpoint.CHANGE_ID, 0)) {
+                                       if (breakpoint.isEnabled ()) {                                                          // If the breakpoint is already enabled
+                                               breakpointRemoved (breakpoint, null);                                   // we remove this breakpoint first
+                                               breakpointAdded (breakpoint);                                                   // and then we add again (else XDebug would have two breakpoints!).
+                                       }
+                                       else {
+                                               breakpointRemoved (breakpoint, null);
+                                       }
+                               }
+                       } catch (CoreException e) {
+                               // Do nothing
+                       }
+               }
        }
 
        /* (non-Javadoc)
@@ -402,7 +460,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                if (response2.getAttributeValue("success").equals("1") ) {
                        System.out.println("Set children to 1024 (hack)");
                }
-               
+
                installDeferredBreakpoints();
                try {
                        resume();
@@ -410,7 +468,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        e.printStackTrace();
                }
        }
-       
+
        /**
         * Install breakpoints that are already registered with the breakpoint
         * manager.
@@ -421,10 +479,10 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        breakpointAdded(breakpoints[i]);
                }
        }
-       
+
        /**
         * Returns the current stack frames in the target.
-        * 
+        *
         * @return the current stack frames in the target
         * @throws DebugException if unable to perform the request
         */
@@ -433,10 +491,10 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                XDebugResponse lastResponse = getResponse(id);
                return lastResponse;
        }
-       
+
        /**
         * Single step the interpreter.
-        * 
+        *
         * @throws DebugException if the request fails
         */
        protected void step_over() throws DebugException {
@@ -444,10 +502,10 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                resumed(DebugEvent.STEP_OVER);
                fDebugConnection.stepOver();
        }
-       
+
        /**
         * Single step the interpreter.
-        * 
+        *
         * @throws DebugException if the request fails
         */
        protected void step_into() throws DebugException {
@@ -455,10 +513,10 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                resumed(DebugEvent.STEP_INTO);
                fDebugConnection.stepInto();
        }
-       
+
        /**
         * Single step the interpreter.
-        * 
+        *
         * @throws DebugException if the request fails
         */
        protected void step_out() throws DebugException {
@@ -466,32 +524,58 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                resumed(DebugEvent.STEP_RETURN);
                fDebugConnection.stepOut();
        }
-       
+
        public boolean setVarValue(String name, String value) {
                int id = fDebugConnection.setVarValue(name,value);
                XDebugResponse response = getResponse(id);
-               
+
                if ((response.getAttributeValue("success")).equals("1")) {
                        return true;
                } else {
                        return false;
                }
        }
-       
-       public Node eval(String expression) {
-               int id = fDebugConnection.eval(expression);
-               XDebugResponse response = getResponse(id);
 
-               Node evalResponse = response.getParentNode();
-               Node evalProperty = evalResponse.getFirstChild();
-               
+       public Node eval(String expression) throws DebugException {
+               Node evalProperty = null;
+               if (fDebugConnection != null) {
+                       int id = fDebugConnection.eval(expression);
+                       //Node evalProperty = new Node("");
+                       //if (id > 0) {
+                               XDebugResponse response = getResponse(id);
+
+                               Node evalResponse = response.getParentNode();
+                               /*Node*/ evalProperty = evalResponse.getFirstChild();
+                       //} /*else {
+
+                       //}*/
+               } else {
+                       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+                       DocumentBuilder builder = null;
+                       Document doc = null;
+
+                       try {
+                               builder = factory.newDocumentBuilder();
+                       } catch (ParserConfigurationException e) {
+                               e.printStackTrace();
+                       }
+                       //try {
+                               doc =  builder.newDocument(); // .parse("");
+                               evalProperty = doc.createElement("value");
+                       /*} catch (SAXException e) {
+                               e.printStackTrace();
+                       } catch (IOException e) {
+                               e.printStackTrace();
+                       }*/
+               }
+
                return evalProperty;
        }
-       
+
        public void handleDebugEvents(DebugEvent[] events) {
                for (int i = 0; i < events.length; i++) {
                        DebugEvent event = events[i];
-                       
+
                        if (fResponseListener != null) {
                                Object s = null;
                                s = event.getSource();
@@ -503,7 +587,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        } else {
                                return;
                        }
-                       
+
                        if (event.getKind() == DebugEvent.MODEL_SPECIFIC) {
                                switch (event.getDetail()) {
                                        case IPHPDebugEvent.BREAKPOINT_HIT:
@@ -511,7 +595,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                                                XDebugResponse lastResponse = getResponse(id);
 
                                                IBreakpoint breakpoint = breakpointHit(lastResponse.getParentNode());
-                                               
+
                                                if (breakpoint != null) {
                                                        fThread.setBreakpoints(new IBreakpoint[]{breakpoint});
                                                        fThread.incrementStepCounter();
@@ -535,7 +619,7 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        }
                }
        }
-       
+
        public void stopped() {
                if(fDebugConnection == null) {
                        return;
@@ -559,41 +643,48 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                        fDebugConnection = null;
                        fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CONTENT));
                }
-               
+
                fThread.removeEventListeners();
                fThread = null;
                fThreads = new IThread[0];
        }
-       
+
        public void handleProxyEvent(XDebugConnection connection) {
-               setDebugConnection(connection);
                //System.out.println("* New Connection - XDebug.Target: " + fDebugConnection.getSessionID());
-               
-               fThread = new XDebugThread(this);
-               fThreads = new IThread[] {fThread};
-               fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CHANGE));
-               try {
-                       started();
-               } catch( DebugException e ){
-                       e.printStackTrace();            
-               }               
+
+               if (setDebugConnection(connection)) {
+                       fThread = new XDebugThread(this);
+                       fThreads = new IThread[] {fThread};
+                       fireEvent(new DebugEvent(this, DebugEvent.CHANGE, DebugEvent.CHANGE));
+                       try {
+                               started();
+                       } catch( DebugException e ){
+                               e.printStackTrace();
+                       }
+               }
        }
 
-       private void setDebugConnection(XDebugConnection connection) {
-               if (connection != null) {
+       private boolean setDebugConnection(XDebugConnection connection) {
+               if (connection != null && fDebugConnection == null) {
                        fDebugConnection = connection;
                        fResponseListener = new ResponseListener(connection);
                        startListener();
+
+                       return true;
+               } else {
+                       connection.close();
+
+                       return false;
                }
        }
-       
+
        /**
         * @return Returns the fDebugConnection.
         */
        public XDebugConnection getDebugConnection() {
                return fDebugConnection;
-       }       
-       
+       }
+
        public void addProcess(IProcess p) {
                fProcess = p;
 
@@ -601,47 +692,47 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
        public Node getLocalVariables(int level) throws DebugException {
                int id = fDebugConnection.contextGet(level, 0);
                XDebugResponse response = getResponse(id);
-               
+
                return response.getParentNode();
        }
-       
+
        public Node getGlobalVariables(int level) throws DebugException {
                int id = fDebugConnection.contextGet(level, 1);
                XDebugResponse response = getResponse(id);
-               
+
                return response.getParentNode();
        }
-       
+
        public void stop() {
                fDebugConnection.stop();
        }
-       
+
        protected IBreakpoint breakpointHit(Node node) {
                Node child = node.getFirstChild();
                if (child.getNodeName().equals("stack")) {
                        int lineNumber = Integer.parseInt(PHPDebugUtils.getAttributeValue(child, "lineno"));
-                       String filename = PHPDebugUtils.getAttributeValue(child, "filename");  
+                       String filename = PHPDebugUtils.getAttributeValue(child, "filename");
                        IBreakpoint[] breakpoints = XDebugCorePlugin.getBreakpoints();
                        for (int i = 0; i < breakpoints.length; i++) {
                                IBreakpoint breakpoint = breakpoints[i];
                                if (supportsBreakpoint(breakpoint)) {
                                        if (breakpoint instanceof ILineBreakpoint) {
                                                ILineBreakpoint lineBreakpoint = (ILineBreakpoint) breakpoint;
-                                               try {                                           
+                                               try {
                                                        if (breakpoint.isEnabled()) {
                                                                IMarker marker = breakpoint.getMarker();
                                                                if (marker != null) {
                                                                        String endfilename;
-                                                                       
+
                                                                        if (getProcess() == null) {
-                                                                               endfilename = marker.getResource().getLocation().lastSegment(); 
+                                                                               endfilename = marker.getResource().getLocation().lastSegment();
                                                                        } else {
                                                                                endfilename = marker.getResource().getLocation().toOSString();
                                                                        }
-                                                                       
+
                                                                        int id = fDebugConnection.breakpointGet(marker.getAttribute(XDebugLineBreakpoint.BREAKPOINT_ID,-1));
                                                                        XDebugResponse dr = getResponse(id);
-                                                                       
+
                                                                        Node hitCo = dr.getParentNode().getFirstChild();
                                                                        int hitCount = 0;
                                                                        if (hitCo.hasAttributes()) {
@@ -652,11 +743,16 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                                                                                }
                                                                        }
 
-                                                                       if(PHPDebugUtils.unescapeString(filename).endsWith(endfilename)
+                                                                       Path path1 = new Path (PHPDebugUtils.unescapeString (filename));
+                                                                       Path path2 = new Path (endfilename);
+
+                                                                       if (path1.toString ().endsWith (path2.toString ())
+//                                                                     if (strPath1.endsWith (strPath2)
+                                                                       //if(PHPDebugUtils.unescapeString(filename).endsWith(endfilename)
                                                                                        && (lineBreakpoint.getLineNumber() == lineNumber) ) {
                                                                                if (marker.getAttribute(XDebugLineBreakpoint.HIT_COUNT, 0) > 0) {
                                                                                        if (marker.getAttribute(XDebugLineBreakpoint.HIT_COUNT, 0) == hitCount) {
-                                                                                               return (breakpoint);                                                                                            
+                                                                                               return (breakpoint);
                                                                                        }
                                                                                } else {
                                                                                        return (breakpoint);
@@ -670,14 +766,14 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
                                }
                        }
                }
-               
+
                return null;
        }
-       
+
        public void startListener() {
                fResponseListener.schedule();
        }
-       
+
        public void stopListener() {
                fResponseListener.cancel();
        }
@@ -686,4 +782,4 @@ public class XDebugTarget extends XDebugElement implements IDebugTarget, IDebugE
 
                return response;
        }
-}
\ No newline at end of file
+}