package org.nodeclipse.debug.model;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.chromium.debug.core.model.ChromiumLineBreakpoint;
import org.chromium.debug.core.model.VmResourceId;
import org.chromium.sdk.Script;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.nodeclipse.debug.util.NodeResourceUtil;
import org.nodeclipse.ui.Activator;
import org.osgi.framework.Bundle;
public class ResourceManager extends
org.chromium.debug.core.model.ResourceManager {
private IProject debugProject = null;
public ResourceManager(IProject debugProject) {
super(debugProject);
this.debugProject = debugProject;
}
public synchronized void addScript(Script newScript) {
VmResourceId id = VmResourceId.forScript(newScript);
try {
VmResourceInfo info = resourceIdToInfo.get(id);
ScriptSet scriptSet;
if (info == null) {
scriptSet = new ScriptSet();
info = createAndRegisterResourceFile(id, scriptSet);
} else {
// TODO(peter.rybin): support adding scripts to one resource at
// once not to rewrite file
// every time.
scriptSet = (ScriptSet) info.getMetadata();
;
}
scriptSet.add(newScript);
writeScriptSource(scriptSet.asCollection(), info.getFile());
addCromiumBreakpointFromJs(id.getName(), info.getFile());
} catch (RuntimeException e) {
throw new RuntimeException("Failed to add script " + id, e);
}
}
private void addCromiumBreakpointFromJs(String jsFilename,
IResource cromiumFile) {
NodeResourceUtil.register(jsFilename, cromiumFile);
IBreakpoint[] breakpoins = DebugPlugin.getDefault()
.getBreakpointManager()
.getBreakpoints(VProjectWorkspaceBridge.DEBUG_MODEL_ID);
for (IBreakpoint b : breakpoins) {
try {
if (machFile(jsFilename, b.getMarker().getResource())) {
addChromiumBreakpoint(cromiumFile.getName(), ((ILineBreakpoint)b).getLineNumber());
}
} catch(Exception ex) {
new RuntimeException("Failed to add script " + jsFilename, ex);
}
}
}
private boolean machFile(String jsFilename, IResource breakpointResource) throws CoreException {
if (jsFilename == null || breakpointResource == null) {
return false;
}
if (jsFilename.equals(breakpointResource.getName())) {
return true;
}
String path = breakpointResource.getFullPath().toOSString();
if (jsFilename.equals(path)) {
return true;
}
path = breakpointResource.getLocationURI().getPath();
if(jsFilename.equals(path)) {
return true;
}
path = path.replace('/', '\\');
if(path.startsWith("\\")) {
path = path.substring(1);
}
if(jsFilename.equals(path)) {
return true;
}
return false;
}
private void addChromiumBreakpoint(String filename, int lineNumber) throws CoreException {
IResource resource = debugProject.getFile(filename);
ChromiumLineBreakpoint lineBreakpoint =
new ChromiumLineBreakpoint(resource, lineNumber, VProjectWorkspaceBridge.DEBUG_MODEL_ID);
DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);
}
}