plugins/org.symbian.tools.tmw.debug/src/org/symbian/tools/tmw/debug/internal/model/WorkspaceBreakpointHandler.java
changeset 471 06589bf52fa7
child 472 bd9f2d7c64a6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/org.symbian.tools.tmw.debug/src/org/symbian/tools/tmw/debug/internal/model/WorkspaceBreakpointHandler.java	Mon Aug 23 09:55:57 2010 -0700
@@ -0,0 +1,195 @@
+/**
+ * 
+ */
+package org.symbian.tools.tmw.debug.internal.model;
+
+import java.util.Collection;
+
+import org.chromium.debug.core.ChromiumDebugPlugin;
+import org.chromium.debug.core.model.BreakpointMap;
+import org.chromium.debug.core.model.BreakpointSynchronizer.BreakpointHelper.CreateCallback;
+import org.chromium.debug.core.model.ChromiumLineBreakpoint;
+import org.chromium.debug.core.model.DebugTargetImpl;
+import org.chromium.debug.core.model.VProjectWorkspaceBridge;
+import org.chromium.debug.core.model.VmResourceId;
+import org.chromium.debug.core.model.WorkspaceBridge.BreakpointHandler;
+import org.chromium.sdk.Breakpoint;
+import org.chromium.sdk.JavascriptVm;
+import org.chromium.sdk.SyncCallback;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.symbian.tools.tmw.debug.internal.launch.WRTProjectWorkspaceBridge;
+import org.symbian.tools.tmw.previewer.PreviewerPlugin;
+
+public final class WorkspaceBreakpointHandler implements BreakpointHandler {
+	private final BreakpointMap.InTargetMap breakpointInTargetMap = new BreakpointMap.InTargetMap();
+	private final DebugTargetImpl debugTarget;
+	private final ResourceManager resourceManager;
+	
+    public WorkspaceBreakpointHandler(DebugTargetImpl debugTarget, ResourceManager resourceManager) {
+		this.debugTarget = debugTarget;
+        //		this.vm = vm;
+		this.resourceManager = resourceManager;
+	}
+
+    public void breakpointAdded(IBreakpoint breakpoint) {
+        ChromiumLineBreakpoint lineBreakpoint = tryCastBreakpoint(breakpoint);
+        if (lineBreakpoint == null) {
+            return;
+        }
+        if (ChromiumLineBreakpoint.getIgnoreList().contains(breakpoint)) {
+            return;
+        }
+        if (!lineBreakpoint.isEnabled()) {
+            return;
+        }
+        IFile file = (IFile) lineBreakpoint.getMarker().getResource();
+        VmResourceId vmResourceId;
+        try {
+            vmResourceId = findVmResourceIdFromWorkspaceFile(file);
+        } catch (CoreException e) {
+            ChromiumDebugPlugin.log(new Exception("Failed to resolve script for the file " + file, e)); //$NON-NLS-1$
+            return;
+        }
+        if (vmResourceId == null) {
+            // Might be a script from a different debug target
+            return;
+        }
+        createBreakpointOnRemote(lineBreakpoint, vmResourceId, null, null);
+    }
+
+    public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
+        ChromiumLineBreakpoint lineBreakpoint = tryCastBreakpoint(breakpoint);
+        if (lineBreakpoint == null) {
+            return;
+        }
+        if (ChromiumLineBreakpoint.getIgnoreList().contains(lineBreakpoint)) {
+            return;
+        }
+        Breakpoint sdkBreakpoint = breakpointInTargetMap.getSdkBreakpoint(lineBreakpoint);
+        if (sdkBreakpoint == null) {
+            return;
+        }
+
+        try {
+            ChromiumLineBreakpoint.Helper.updateOnRemote(sdkBreakpoint, lineBreakpoint);
+        } catch (RuntimeException e) {
+            ChromiumDebugPlugin.log(new Exception("Failed to change breakpoint in " + //$NON-NLS-1$
+                    getTargetNameSafe(), e));
+        }
+
+    }
+
+    public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
+        ChromiumLineBreakpoint lineBreakpoint = tryCastBreakpoint(breakpoint);
+        if (lineBreakpoint == null) {
+            return;
+        }
+        if (ChromiumLineBreakpoint.getIgnoreList().contains(lineBreakpoint)) {
+            return;
+        }
+
+        Breakpoint sdkBreakpoint = breakpointInTargetMap.getSdkBreakpoint(lineBreakpoint);
+        if (sdkBreakpoint == null) {
+            return;
+        }
+
+        try {
+            if (!breakpoint.isEnabled()) {
+            return;
+            }
+        } catch (CoreException e) {
+            ChromiumDebugPlugin.log(e);
+            return;
+        }
+        JavascriptVm.BreakpointCallback callback = new JavascriptVm.BreakpointCallback() {
+            public void failure(String errorMessage) {
+                ChromiumDebugPlugin.log(new Exception("Failed to remove breakpoint in " + //$NON-NLS-1$
+                        getTargetNameSafe() + ": " + errorMessage)); //$NON-NLS-1$
+            }
+
+            public void success(Breakpoint breakpoint) {
+            }
+        };
+        try {
+            sdkBreakpoint.clear(callback, null);
+        } catch (RuntimeException e) {
+            ChromiumDebugPlugin.log(new Exception("Failed to remove breakpoint in " + //$NON-NLS-1$
+                    getTargetNameSafe(), e));
+        }
+        breakpointInTargetMap.remove(lineBreakpoint);
+    }
+
+    public void breakpointsHit(Collection<? extends Breakpoint> breakpointsHit) {
+        if (breakpointsHit.isEmpty()) {
+            return;
+        }
+
+        for (Breakpoint sdkBreakpoint : breakpointsHit) {
+            ChromiumLineBreakpoint uiBreakpoint = breakpointInTargetMap.getUiBreakpoint(sdkBreakpoint);
+            if (uiBreakpoint != null) {
+                uiBreakpoint.setIgnoreCount(-1); // reset ignore count as we've hit it
+            }
+        }
+    }
+
+    public void createBreakpointOnRemote(final ChromiumLineBreakpoint lineBreakpoint, final VmResourceId vmResourceId,
+            final CreateCallback createCallback, SyncCallback syncCallback) {
+        try {
+            ChromiumLineBreakpoint.Helper.CreateOnRemoveCallback callback = new ChromiumLineBreakpoint.Helper.CreateOnRemoveCallback() {
+                public void failure(String errorMessage) {
+                    if (createCallback == null) {
+                        ChromiumDebugPlugin.logError(errorMessage);
+                    } else {
+                        createCallback.failure(new Exception(errorMessage));
+                    }
+                }
+
+                public void success(Breakpoint breakpoint) {
+                    breakpointInTargetMap.add(breakpoint, lineBreakpoint);
+                    if (createCallback != null) {
+                        createCallback.success();
+                    }
+                }
+            };
+
+            ChromiumLineBreakpoint.Helper.createOnRemote(lineBreakpoint, vmResourceId, debugTarget, callback,
+                    syncCallback);
+        } catch (CoreException e) {
+            ChromiumDebugPlugin.log(new Exception("Failed to create breakpoint in " + //$NON-NLS-1$
+                    getTargetNameSafe(), e));
+        }
+    }
+
+    private VmResourceId findVmResourceIdFromWorkspaceFile(IFile resource) throws CoreException {
+        return VmResourceId.forName(PreviewerPlugin.getDefault().getHttpPreviewer().getHttpUrl(resource));
+    }
+
+    private String getTargetNameSafe() {
+        try {
+            return debugTarget.getLaunch().getLaunchConfiguration().getName();
+        } catch (RuntimeException e) {
+          return "<unknown>"; //$NON-NLS-1$
+        }
+    }
+
+    public boolean supportsBreakpoint(IBreakpoint breakpoint) {
+		return (WRTProjectWorkspaceBridge.DEBUG_MODEL_ID.equals(breakpoint
+				.getModelIdentifier()) || VProjectWorkspaceBridge.DEBUG_MODEL_ID
+				.equals(breakpoint.getModelIdentifier()))
+				&& !debugTarget.isDisconnected();
+	}
+
+    public ChromiumLineBreakpoint tryCastBreakpoint(IBreakpoint breakpoint) {
+        if (!supportsBreakpoint(breakpoint)) {
+            return null;
+        }
+        if (breakpoint instanceof ChromiumLineBreakpoint == false) {
+            return null;
+        }
+        return (ChromiumLineBreakpoint) breakpoint;
+    }
+
+}
\ No newline at end of file