/* * Copyright 2007 Sascha Weinreuter * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.intellij.plugins.xsltDebugger.rt.engine; import gnu.trove.TIntObjectHashMap; import gnu.trove.TIntObjectProcedure; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.*; public class BreakpointManagerImpl implements BreakpointManager { private final TIntObjectHashMap<Map<String, Breakpoint>> myBreakpoints = new TIntObjectHashMap<Map<String, Breakpoint>>(); public Breakpoint setBreakpoint(File file, int line) { return setBreakpoint(file.toURI().toASCIIString(), line); } public synchronized void removeBreakpoint(String uri, int line) { final Map<String, Breakpoint> s = myBreakpoints.get(line); if (s != null) { s.remove(normalizeUri(uri)); } } public synchronized List<Breakpoint> getBreakpoints() { final ArrayList<Breakpoint> breakpoints = new ArrayList<Breakpoint>(); myBreakpoints.forEachEntry(new TIntObjectProcedure<Map<String, Breakpoint>>() { public boolean execute(int i, Map<String, Breakpoint> map) { breakpoints.addAll(map.values()); return true; } }); return breakpoints; } public void removeBreakpoint(Breakpoint bp) { removeBreakpoint(bp.getUri(), bp.getLine()); } public synchronized Breakpoint setBreakpoint(String uri, int line) { assert line > 0 : "No line number for breakpoint in file " + uri; uri = normalizeUri(uri); final Map<String, Breakpoint> s = myBreakpoints.get(line); final BreakpointImpl bp = new BreakpointImpl(uri, line); if (s == null) { final HashMap<String, Breakpoint> map = new HashMap<String, Breakpoint>(); map.put(uri, bp); myBreakpoints.put(line, map); } else { s.put(uri, bp); } return bp; } private static String normalizeUri(String uri) { // hmm, this code sucks, but seems to be a good guess to ensure the same format of // strings (file:/C:/... vs, file:///C:/...) on both sides... try { try { uri = uri.replaceAll(" ", "%20"); return new File(new URI(uri)).toURI().toASCIIString(); } catch (IllegalArgumentException e) { return new URI(uri).normalize().toASCIIString(); } } catch (URISyntaxException e) { System.err.println("Failed to parse <" + uri + ">: " + e); return uri; } } public synchronized boolean isBreakpoint(String uri, int lineNumber) { final Breakpoint breakpoint = getBreakpoint(uri, lineNumber); return breakpoint != null && breakpoint.isEnabled(); } public synchronized Breakpoint getBreakpoint(String uri, int lineNumber) { final Map<String, Breakpoint> s = myBreakpoints.get(lineNumber); if (s != null) { return s.get(normalizeUri(uri)); } return null; } }