/*******************************************************************************
* Copyright (c) 2000, 2015 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
*******************************************************************************/
package org.eclipse.cdt.internal.autotools.core;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.cdt.autotools.core.AutotoolsPlugin;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.ProblemMarkerInfo;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.runtime.CoreException;
public abstract class MarkerGenerator {
static final int SEVERITY_INFO = IMarkerGenerator.SEVERITY_INFO;
static final int SEVERITY_WARNING = IMarkerGenerator.SEVERITY_WARNING;
static final int SEVERITY_ERROR_RESOURCE = IMarkerGenerator.SEVERITY_ERROR_RESOURCE;
static final int SEVERITY_ERROR_BUILD = IMarkerGenerator.SEVERITY_ERROR_BUILD;
/**
* Constructor for MarkerGenerator
*/
public MarkerGenerator() {
}
/*
* callback from Output Parser
*/
public void addMarker(IResource file, int lineNumber, String errorDesc, int severity, String errorVar) {
try {
IMarker[] cur = file.findMarkers(IAutotoolsMarker.AUTOTOOLS_PROBLEM_MARKER, false, IResource.DEPTH_ONE);
/*
* Try to find matching markers and don't put in duplicates
*/
if ((cur != null) && (cur.length > 0)) {
for (int i = 0; i < cur.length; i++) {
int line = ((Integer) cur[i].getAttribute(IMarker.LOCATION)).intValue();
int sev = ((Integer) cur[i].getAttribute(IMarker.SEVERITY)).intValue();
String mesg = (String) cur[i].getAttribute(IMarker.MESSAGE);
if (line == lineNumber && sev == mapMarkerSeverity(severity) && mesg.equals(errorDesc)) {
return;
}
}
}
IMarker marker = file.createMarker(IAutotoolsMarker.AUTOTOOLS_PROBLEM_MARKER);
marker.setAttribute(IMarker.LOCATION, lineNumber);
marker.setAttribute(IMarker.MESSAGE, errorDesc);
marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(severity));
marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
marker.setAttribute(IMarker.CHAR_START, -1);
marker.setAttribute(IMarker.CHAR_END, -1);
if (errorVar != null) {
marker.setAttribute(IAutotoolsMarker.MARKER_VARIABLE, errorVar);
}
}
catch (CoreException e) {
AutotoolsPlugin.log(e.getStatus());
}
}
public abstract IProject getProject();
public boolean hasMarkers(IResource file) {
IMarker[] markers;
try {
markers = file.findMarkers(IAutotoolsMarker.AUTOTOOLS_PROBLEM_MARKER, false, IResource.DEPTH_ONE);
} catch (CoreException e) {
return false;
}
return markers.length > 0;
}
/*
* callback from Output Parser
*/
public void addMarker(AutotoolsProblemMarkerInfo autotoolsMarker) {
ProblemMarkerInfo info = autotoolsMarker.getMarker();
try {
IResource markerResource = info.file ;
if (markerResource==null) {
markerResource = getProject();
}
IMarker[] cur = markerResource.findMarkers(IAutotoolsMarker.AUTOTOOLS_PROBLEM_MARKER, true, IResource.DEPTH_ONE);
// IMarker[] cur = markerResource.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_ONE);
/*
* Try to find matching markers and don't put in duplicates
*/
if ((cur != null) && (cur.length > 0)) {
for (int i = 0; i < cur.length; i++) {
int line = ((Integer) cur[i].getAttribute(IMarker.LOCATION)).intValue();
int sev = ((Integer) cur[i].getAttribute(IMarker.SEVERITY)).intValue();
String mesg = (String) cur[i].getAttribute(IMarker.MESSAGE);
if (line == info.lineNumber && sev == mapMarkerSeverity(info.severity) && mesg.equals(info.description)) {
return;
}
}
}
IMarker marker = markerResource.createMarker(IAutotoolsMarker.AUTOTOOLS_PROBLEM_MARKER);
// IMarker marker = markerResource.createMarker(ICModelMarker.C_MODEL_PROBLEM_MARKER);
marker.setAttribute(IMarker.LOCATION, info.lineNumber);
marker.setAttribute(IMarker.MESSAGE, info.description);
marker.setAttribute(IMarker.SEVERITY, mapMarkerSeverity(info.severity));
marker.setAttribute(IMarker.LINE_NUMBER, info.lineNumber);
marker.setAttribute(IMarker.CHAR_START, -1);
marker.setAttribute(IMarker.CHAR_END, -1);
if (info.variableName != null) {
marker.setAttribute(IAutotoolsMarker.MARKER_VARIABLE, info.variableName);
}
if (info.externalPath != null) {
marker.setAttribute(IAutotoolsMarker.MARKER_EXTERNAL_LOCATION, info.externalPath.toOSString());
}
// Add all other client defined attributes.
Map<String, String> attributes = info.getAttributes();
if (attributes != null){
for (Entry<String, String> entry : attributes.entrySet()) {
marker.setAttribute(entry.getKey(), entry.getValue());
}
}
}
catch (CoreException e) {
AutotoolsPlugin.log(e.getStatus());
}
}
private int mapMarkerSeverity(int severity) {
switch (severity) {
case SEVERITY_ERROR_BUILD :
case SEVERITY_ERROR_RESOURCE :
return IMarker.SEVERITY_ERROR;
case SEVERITY_INFO :
return IMarker.SEVERITY_INFO;
case SEVERITY_WARNING :
return IMarker.SEVERITY_WARNING;
}
return IMarker.SEVERITY_ERROR;
}
/**
* Removes the IMarkers for the project specified in the argument if the
* project exists, and is open.
*
* @param project
*/
public void removeAllMarkers(IProject project) {
if (project == null || !project.isAccessible()) {
return;
}
// Clear out the problem markers
IWorkspace workspace = project.getWorkspace();
IMarker[] markers;
try {
markers = project.findMarkers(IAutotoolsMarker.AUTOTOOLS_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
// markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
// Handled just about every case in the sanity check
return;
}
if (markers != null) {
try {
workspace.deleteMarkers(markers);
} catch (CoreException e) {
// The only situation that might cause this is some sort of resource change event
return;
}
}
}
}