/*******************************************************************************
* Copyright (c) 2015 Freescale Semiconductors and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dan Ungureanu (Freescale Semiconductors) - Initial implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.core.breakpoints;
import java.util.Map;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.ICEventBreakpoint;
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IBreakpointImportParticipant;
/**
* Initial implementation covering matching breakpoints at import for all platform C/C++ breakpoints
*/
public class CBreakpointImportParticipant implements IBreakpointImportParticipant {
/*
* (non-Javadoc)
*
* @see
* org.eclipse.debug.core.model.IBreakpointImportParticipant#matches(java
* .util.Map, org.eclipse.debug.core.model.IBreakpoint)
*/
public boolean matches(Map<String, Object> attributes, IBreakpoint breakpoint)
throws CoreException {
if (attributes == null || breakpoint == null) {
return false;
}
String type = (String) attributes.get("type"); //$NON-NLS-1$
if (type == null) {
return false;
}
if (!breakpoint.getMarker().getType().equals(type)) {
return false;
}
if (breakpoint instanceof AbstractLineBreakpoint) {
return matchesLineBreakpoint(attributes,
(AbstractLineBreakpoint) breakpoint);
}
if (breakpoint instanceof AbstractTracepoint) {
return matchesTracepoint(attributes,
(AbstractTracepoint) breakpoint);
}
if (breakpoint instanceof CEventBreakpoint) {
return matchesEventBreakpoint(attributes, (CEventBreakpoint) breakpoint);
}
if (breakpoint instanceof CWatchpoint) {
return matchesWatchpoint(attributes, (CWatchpoint) breakpoint);
}
return false;
}
/*
* (non-Javadoc)
* @see org.eclipse.debug.core.model.IBreakpointImportParticipant#verify(org.eclipse.debug.core.model.IBreakpoint)
*/
@Override
public void verify(IBreakpoint breakpoint) throws CoreException {}
/**
* Compares two attributes in a <code>null</code> safe way
*
* @param attr1
* the first attribute
* @param attr2
* the second attribute
* @return true if the attributes are equal, false otherwise. If both
* attributes are <code>null</code> they are considered to be equal
*/
private boolean attributesEqual(Object attr1, Object attr2) {
if (attr1 == null) {
return attr2 == null;
}
return attr1.equals(attr2);
}
/**
* Returns if the given map of attributes matches the given breakpoint
* Works for any breakpoint class that extends AbstractLineBreakpoint
*
* @param attributes
* @param breakpoint
* @return true if the attributes match the breakpoint's attributes, false
* otherwise
* @throws CoreException
*/
private boolean matchesLineBreakpoint(Map<String, Object> attributes, AbstractLineBreakpoint breakpoint)
throws CoreException {
Integer line = (Integer) attributes.get(IMarker.LINE_NUMBER);
int lineNumber = (line == null ? -1 : line.intValue());
return breakpoint.getLineNumber() == lineNumber
&& attributesEqual(breakpoint.getType(), attributes.get(CBreakpoint.TYPE))
&& attributesEqual(breakpoint.getSourceHandle(), attributes.get(ICBreakpoint.SOURCE_HANDLE))
&& attributesEqual(breakpoint.getMarker().getAttribute(ICLineBreakpoint.ADDRESS), attributes.get(ICLineBreakpoint.ADDRESS))
&& attributesEqual(breakpoint.getMarker().getAttribute(ICLineBreakpoint.FUNCTION), attributes.get(ICLineBreakpoint.FUNCTION));
}
/**
* Returns if the given map of attributes matches the given tracepoint
* Works for any breakpoint class that extends AbstractTracepoint
*
* @param attributes
* @param tracepoint
* @return true if the attributes match the tracepoint's attributes, false
* otherwise
* @throws CoreException
*/
private boolean matchesTracepoint(Map<String, Object> attributes, AbstractTracepoint tracepoint)
throws CoreException {
Integer line = (Integer) attributes.get(IMarker.LINE_NUMBER);
int lineNumber = (line == null ? -1 : line.intValue());
return tracepoint.getLineNumber() == lineNumber
&& attributesEqual(tracepoint.getType(), attributes.get(CBreakpoint.TYPE))
&& attributesEqual(tracepoint.getSourceHandle(), attributes.get(ICBreakpoint.SOURCE_HANDLE))
&& attributesEqual(tracepoint.getMarker().getAttribute(ICLineBreakpoint.ADDRESS), attributes.get(ICLineBreakpoint.ADDRESS))
&& attributesEqual(tracepoint.getMarker().getAttribute(ICLineBreakpoint.FUNCTION), attributes.get(ICLineBreakpoint.FUNCTION));
}
/**
* Returns if the given map of attributes matches the given event breakpoint
*
* @param attributes
* @param breakpoint
* @return true if the attributes match the event breakpoint's attributes, false
* otherwise
* @throws CoreException
*/
private boolean matchesEventBreakpoint(Map<String, Object> attributes, CEventBreakpoint breakpoint)
throws CoreException {
return breakpoint.getEventArgument().equals(
attributes.get(ICEventBreakpoint.EVENT_ARG))
&& attributesEqual(breakpoint.getEventType(),
attributes.get(ICEventBreakpoint.EVENT_TYPE_ID));
}
/**
* Returns if the given map of attributes matches the given watchpoint
*
* @param attributes
* @param breakpoint
* @return true if the attributes match the watchpoint's attributes, false
* otherwise
* @throws CoreException
*/
private boolean matchesWatchpoint(Map<String, Object> attributes, CWatchpoint watchpoint)
throws CoreException {
return watchpoint.getExpression().equals(
attributes.get(CWatchpoint.EXPRESSION))
&& attributesEqual(watchpoint.getType(),
attributes.get(CBreakpoint.TYPE));
}
}