/*******************************************************************************
* Copyright (c) 2008 QNX Software Systems 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:
* QNX Software Systems - Initial API and implementation
* QNX Software Systems - catchpoints - bug 226689
*******************************************************************************/
package org.eclipse.cdt.debug.ui.breakpoints;
import java.util.ArrayList;
import java.util.Map;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.internal.resources.Workspace;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
public class CBreakpointUIContributionFactory {
private static final String EXTENSION_POINT_NAME = "breakpointContribution"; //$NON-NLS-1$
private static final String MAIN_ELEMENT = "breakpointLabels"; //$NON-NLS-1$
private static CBreakpointUIContributionFactory instance;
protected ArrayList<ICBreakpointsUIContribution> contributions;
private CBreakpointUIContributionFactory() {
contributions = new ArrayList<ICBreakpointsUIContribution>();
loadSubtypeContributions();
}
/**
*
* @param breakpoint
* @return non-null array of ICBreakpointsUIContribution
* @throws CoreException
* @throws CoreException if cannot get marker attributes from berakpoint
*/
public ICBreakpointsUIContribution[] getBreakpointUIContributions(IBreakpoint breakpoint) throws CoreException {
String debugModelId = breakpoint.getModelIdentifier();
IMarker bmarker = breakpoint.getMarker();
Map attributes = bmarker.getAttributes();
String markerType = bmarker.getType();
return getBreakpointUIContributions(debugModelId, markerType, attributes);
}
public ICBreakpointsUIContribution[] getBreakpointUIContributions(String debugModelId, String markerType,
Map attributes) {
ArrayList<ICBreakpointsUIContribution> list = new ArrayList<ICBreakpointsUIContribution>();
for (ICBreakpointsUIContribution con : contributions) {
try {
if (debugModelId == null || con.getDebugModelId() == null || debugModelId.equals(con.getDebugModelId())) {
String contributedMarkerType = con.getMarkerType();
if (isMarkerSubtypeOf(markerType, contributedMarkerType)) {
if (attributes == null || con.isApplicable(attributes)) {
list.add(con);
}
}
}
} catch (Exception e) {
CDebugUIPlugin.log(e);
}
}
return list.toArray(new ICBreakpointsUIContribution[list.size()]);
}
public boolean isMarkerSubtypeOf(String currentType, String type) throws CoreException {
return getWorkspace().getMarkerManager().isSubtype(currentType, type);
}
private Workspace getWorkspace() {
return (Workspace) CDebugUIPlugin.getWorkspace();
}
private void loadSubtypeContributions() {
IExtensionPoint ep = Platform.getExtensionRegistry().getExtensionPoint(CDebugUIPlugin.getUniqueIdentifier(),
EXTENSION_POINT_NAME);
if (ep == null)
return;
IConfigurationElement[] elements = ep.getConfigurationElements();
for (int i = 0; i < elements.length; i++) {
IConfigurationElement configurationElement = elements[i];
if (configurationElement.getName().equals(MAIN_ELEMENT)) {
String modelId = configurationElement.getAttribute("debugModelId"); //$NON-NLS-1$
String markerType = getRequired(configurationElement, "markerType"); //$NON-NLS-1$
if (markerType == null)
continue;
IConfigurationElement[] children = configurationElement.getChildren("attribute"); //$NON-NLS-1$
for (IConfigurationElement att : children) {
DefaultCBreakpointUIContribution adapter = new DefaultCBreakpointUIContribution();
adapter.setMarkerType(markerType);
adapter.setDebugModelId(modelId);
if (processAttribute(att, adapter) == false)
continue;
}
}
}
}
private boolean processAttribute(IConfigurationElement attrElement, DefaultCBreakpointUIContribution adapter) {
String attrId = getRequired(attrElement, "name"); //$NON-NLS-1$
String attrLabel = getRequired(attrElement, "label"); //$NON-NLS-1$
String className = attrElement.getAttribute("fieldEditor"); //$NON-NLS-1$
String type = attrElement.getAttribute("type"); //$NON-NLS-1$
String svisible = attrElement.getAttribute("visible"); //$NON-NLS-1$
if (attrId == null) {
return false;
}
if (attrLabel == null) {
return false;
}
if (type == null) {
type = "string"; //$NON-NLS-1$
}
boolean visible = true;
if (svisible != null && svisible.equalsIgnoreCase("false")) { //$NON-NLS-1$
visible = false;
}
adapter.setId(attrId);
adapter.setLabel(attrLabel);
adapter.setControlClass(className);
adapter.setType(type);
adapter.setVisible(visible);
addContribution(adapter);
IConfigurationElement[] children = attrElement.getChildren("value"); //$NON-NLS-1$
for (IConfigurationElement value : children) {
processValue(value, adapter);
}
return true;
}
private void processValue(IConfigurationElement valueElement, DefaultCBreakpointUIContribution adapter) {
String valueId = getRequired(valueElement, "value"); //$NON-NLS-1$
String valueLabel = getRequired(valueElement, "label"); //$NON-NLS-1$
if (valueId == null)
return;
if (valueLabel == null)
return;
adapter.addValue(valueId, valueLabel);
IConfigurationElement[] children = valueElement.getChildren("attribute"); //$NON-NLS-1$
for (IConfigurationElement att : children) {
DefaultCBreakpointUIContribution adapter2 = new DefaultCBreakpointUIContribution();
// inherit values
adapter2.setMarkerType(adapter.getMarkerType());
adapter2.setDebugModelId(adapter.getDebugModelId());
adapter2.addContionsAll(adapter.getConditions());
// add value condition
adapter2.addContionEquals(adapter.getId(), valueId);
if (processAttribute(att, adapter2) == false)
continue;
}
}
public void addContribution(ICBreakpointsUIContribution contribution) {
contributions.add(contribution);
}
public static CBreakpointUIContributionFactory getInstance() {
if (instance == null) {
instance = new CBreakpointUIContributionFactory();
}
return instance;
}
private static String getRequired(IConfigurationElement configurationElement, String name) {
String elementValue = configurationElement.getAttribute(name);
if (elementValue == null)
CDebugUIPlugin.log(new Status(IStatus.ERROR, CDebugUIPlugin.getUniqueIdentifier(),
DebugPlugin.INTERNAL_ERROR, "Extension "
+ configurationElement.getDeclaringExtension().getUniqueIdentifier()
+ " missing required attribute: " + name, null));
return elementValue;
}
}