/******************************************************************************* * Copyright © 2005, 2013 IBM Corporation 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: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.ide.core.internal.builder; import java.util.ResourceBundle; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.edt.compiler.internal.core.builder.BuildException; import org.eclipse.edt.compiler.internal.core.builder.DefaultProblemRequestor; import org.eclipse.edt.ide.core.EDTCoreIDEPlugin; import org.eclipse.edt.ide.core.internal.lookup.FileInfoManager; import org.eclipse.edt.ide.core.internal.lookup.IFileInfo; import com.ibm.icu.text.NumberFormat; public abstract class AbstractMarkerProblemRequestor extends DefaultProblemRequestor { public static final String PROBLEM = EDTCoreIDEPlugin.PLUGIN_ID + ".problem"; //$NON-NLS-1$ public static final String BUILD_PROBLEM = EDTCoreIDEPlugin.PLUGIN_ID + ".buildProblem"; //$NON-NLS-1$ public static final String CONTEXT_SPECIFIC_PROBLEM = EDTCoreIDEPlugin.PLUGIN_ID + ".contextSpecificProblem"; //$NON-NLS-1$ public static final String FILE_PROBLEM = EDTCoreIDEPlugin.PLUGIN_ID + ".fileProblem"; //$NON-NLS-1$ public static final String PARSER_PROBLEM = EDTCoreIDEPlugin.PLUGIN_ID + ".syntaxProblem"; //$NON-NLS-1$ public static final String UNSUPPORTED_SYNTAX_PROBLEM = EDTCoreIDEPlugin.PLUGIN_ID + ".unsupportedSyntaxProblem"; //$NON-NLS-1$ public static final String PART_NAME = "partName"; //$NON-NLS-1$ public static final String EGL_PROBLEM = "eglProblem"; //$NON-NLS-1$ protected IFile file; private String errorMsgCode; public AbstractMarkerProblemRequestor(IFile file, String errorMsgCode) { super(); this.file = file; this.errorMsgCode = errorMsgCode; } @Override public void acceptProblem(int startOffset, int endOffset, int severity, int problemKind, String[] inserts, ResourceBundle bundle) { if (severity == IMarker.SEVERITY_ERROR) { setHasError(true); } try { createMarker(startOffset, endOffset, severity, problemKind, inserts, bundle); } catch (CoreException e) { throw new BuildException(e); } } protected IMarker createMarker(int startOffset, int endOffset, int severity, int problemKind, String[] inserts, ResourceBundle bundle) throws CoreException { return createMarker(startOffset, endOffset, getLineNumberOfOffset(startOffset), severity, problemKind, inserts, bundle); } protected IMarker createMarker(int startOffset, int endOffset, int lineNumber, int severity, int problemKind, String[] inserts, ResourceBundle bundle) throws CoreException { NumberFormat numberFormat = NumberFormat.getIntegerInstance(); numberFormat.setMaximumFractionDigits(0); numberFormat.setMinimumIntegerDigits(3); IMarker marker = file.createMarker(getMarkerType(problemKind)); if(problemKind != -1) { marker.setAttribute(IMarker.MESSAGE, getErrorMessageText(problemKind, startOffset, lineNumber, severity, getMessageFromBundle(problemKind, inserts, bundle))); } else { marker.setAttribute(IMarker.MESSAGE, getErrorMessageText(problemKind, startOffset, lineNumber, severity, inserts[0])); } marker.setAttribute(IMarker.SEVERITY, translateSeverity(severity)); marker.setAttribute(IMarker.CHAR_START, startOffset); marker.setAttribute(IMarker.CHAR_END, endOffset); marker.setAttribute(IMarker.LINE_NUMBER, lineNumber+1); marker.setAttribute(EGL_PROBLEM, problemKind); return marker; } private int translateSeverity(int severity) { switch(severity){ case org.eclipse.edt.compiler.internal.core.builder.IMarker.SEVERITY_ERROR: return IMarker.SEVERITY_ERROR; case org.eclipse.edt.compiler.internal.core.builder.IMarker.SEVERITY_WARNING: return IMarker.SEVERITY_WARNING; case org.eclipse.edt.compiler.internal.core.builder.IMarker.SEVERITY_INFO: return IMarker.SEVERITY_INFO; default: return IMarker.SEVERITY_ERROR; } } private String getErrorMessageText(int problemKind, int startOffset, int lineNumber, int severity, String msgText) { StringBuffer result = new StringBuffer(); result.append(getMessagePrefix(problemKind, startOffset, lineNumber, severity)); result.append(" "); result.append(msgText); return result.toString(); } private String getMessagePrefix(int problemKind, int startOffset, int lineNumber, int severity) { StringBuffer prefix = new StringBuffer(); prefix.append("IWN."); prefix.append(errorMsgCode); if(problemKind != -1) { prefix.append("."); prefix.append(Integer.toString(problemKind)); } if(IMarker.SEVERITY_ERROR == severity) { prefix.append(".e"); } else if(IMarker.SEVERITY_WARNING == severity) { prefix.append(".w"); } else if(IMarker.SEVERITY_INFO == severity) { prefix.append(".i"); } prefix.append(" "); prefix.append(Integer.toString(lineNumber+1)); prefix.append("/"); int offsetOnLine = startOffset - getLineOffset(lineNumber); prefix.append(Integer.toString(offsetOnLine+1)); return prefix.toString(); } protected int getLineOffset(int lineNumber){ IFileInfo fileInfo = FileInfoManager.getInstance().getFileInfo(file.getProject(), file.getProjectRelativePath()); return fileInfo.getOffsetForLine(lineNumber); } protected int getLineNumberOfOffset(int offset) { IFileInfo fileInfo = FileInfoManager.getInstance().getFileInfo(file.getProject(), file.getProjectRelativePath()); return fileInfo.getLineNumberForOffset(offset); } protected abstract String getMarkerType(int problemKind); /** * @return A list of all of the marker types that this class could concievably create. */ protected abstract String[] getMarkerTypes(); protected void removeMarkers(){ try{ String[] markerTypes = getMarkerTypes(); for(int i = 0; i < markerTypes.length; i++) { IMarker[] markers = file.findMarkers(markerTypes[i], false, IResource.DEPTH_INFINITE); for (int j = 0; j < markers.length; j++){ IMarker marker = markers[j]; if(shouldRemoveMarker(marker)){ marker.delete(); } } } }catch(CoreException e){ throw new BuildException(e); } } protected abstract boolean shouldRemoveMarker(IMarker marker); }