package org.bndtools.build.api; import java.io.File; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import aQute.bnd.build.Project; import aQute.bnd.build.Workspace; import aQute.bnd.osgi.Processor; import aQute.bnd.osgi.Processor.FileLine; import aQute.service.reporter.Report.Location; import bndtools.central.Central; public final class DefaultBuildErrorDetailsHandler extends AbstractBuildErrorDetailsHandler { static String HEADER_S = "\\s*(\\s|:|=)[^\\\\\n]*(\\\\\n[^\\\\\n]*)*"; public static final DefaultBuildErrorDetailsHandler INSTANCE = new DefaultBuildErrorDetailsHandler(); @Override public List<MarkerData> generateMarkerData(IProject project, Processor model, Location location) throws Exception { return Collections.singletonList(getMarkerData(project, model, location)); } /** * Use the location object to find the line number and text part. */ public static MarkerData getMarkerData(IProject p, Processor model, Location location) throws Exception { File file = model.getPropertiesFile(); if (file == null) { if (model instanceof Project) { file = model.getFile(Project.BNDFILE); } else if (model instanceof Workspace) { file = model.getFile(Workspace.BUILDFILE); } } if (location.file != null) file = new File(location.file); int start = -1, end = -1, line = location.line; if (location.header != null && location.line == 0) { Processor rover = model; if (location.file != null && !model.getPropertiesFile().equals(location.file)) { File props = new File(location.file); if (props.isFile()) { rover = new Processor(model); rover.setProperties(props); } } try { FileLine fl = rover.getHeader(location.header, location.context); if (fl != null) { file = fl.file; line = fl.line; start = fl.start; end = fl.end; } } catch (Exception e) { // ignore, this was a bug in bnd. It could not handle if certain // files were not there during starting } } IResource resource = Central.toResource(file); String extra = ""; if (resource == null) resource = AbstractBuildErrorDetailsHandler.getDefaultResource(p); else if (resource.getProject() != p) { // // Make sure we never escape our project // extra = ": see " + resource + "#" + line + 1; resource = p; line = 1; end = start = -1; } Map<String,Object> attribs = new HashMap<String,Object>(); attribs.put(IMarker.MESSAGE, location.message.trim() + extra); attribs.put(IMarker.LINE_NUMBER, line + 1); if (end != -1 && start != -1) { attribs.put(IMarker.CHAR_START, start); attribs.put(IMarker.CHAR_END, end); } return new MarkerData(resource, attribs, false); } }