package org.jetbrains.idea.maven.project; import com.intellij.execution.filters.Filter; import com.intellij.execution.filters.OpenFileHyperlinkInfo; import com.intellij.openapi.editor.colors.CodeInsightColors; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.JBColor; import org.jetbrains.annotations.Nullable; import java.awt.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @author Sergey Evdokimov */ public abstract class AbstractMavenConsoleFilter implements Filter { private final Pattern myPattern; private final Project myProject; public AbstractMavenConsoleFilter(Project project, Pattern pattern) { myProject = project; myPattern = pattern; } protected abstract boolean lightCheck(String line); @Nullable @Override public Result applyFilter(String line, int entireLength) { if (!lightCheck(line)) return null; Matcher matcher = myPattern.matcher(line); if (!matcher.matches()) return null; String path = matcher.group(1); VirtualFile file = LocalFileSystem.getInstance().findFileByPath(path); if (file == null) { if (SystemInfo.isWindows && path.matches("/[A-Z]:/.+")) { file = LocalFileSystem.getInstance().findFileByPath(path.substring(1)); } if (file == null) return null; } int lineNumber = Integer.parseInt(matcher.group(2)) - 1; if (lineNumber < 0) { lineNumber = -1; } TextAttributes attr = createCompilationErrorAttr(); return new Result(entireLength - line.length() + matcher.start(1), entireLength - line.length() + matcher.end(1), new OpenFileHyperlinkInfo(myProject, file, lineNumber), attr); } private static TextAttributes createCompilationErrorAttr() { TextAttributes attr = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES).clone(); attr.setForegroundColor(JBColor.RED); attr.setEffectColor(JBColor.RED); attr.setEffectType(EffectType.LINE_UNDERSCORE); attr.setFontType(Font.PLAIN); return attr; } }