diff --git a/plugins/gradle/src/META-INF/plugin.xml b/plugins/gradle/src/META-INF/plugin.xml
index 0b9157afa8f2..2a5f1a245638 100644
--- a/plugins/gradle/src/META-INF/plugin.xml
+++ b/plugins/gradle/src/META-INF/plugin.xml
@@ -78,6 +78,7 @@
+
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java
new file mode 100644
index 000000000000..0bf9fb4bfdda
--- /dev/null
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilter.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.gradle.execution;
+
+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.TextAttributes;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.util.ui.UIUtil;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.*;
+import java.io.File;
+
+/**
+ * @author Vladislav.Soroka
+ * @since 9/29/2015
+ */
+public class GradleConsoleFilter implements Filter {
+ private final Project myProject;
+ private static final TextAttributes HYPERLINK_ATTRIBUTES =
+ EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES);
+ private String myFilteredFileName;
+ private int myFilteredLineNumber;
+
+ public GradleConsoleFilter(Project project) {
+ myProject = project;
+ }
+
+ @Nullable
+ @Override
+ public Result applyFilter(String line, int entireLength) {
+ final String filePrefix = "Build file '";
+ final String linePrefix = "' line: ";
+ int filePrefixIndex = StringUtil.indexOf(line, filePrefix);
+ if (filePrefixIndex == -1) {
+ return null;
+ }
+
+ final String fileAndLineNumber = line.substring(filePrefix.length() + filePrefixIndex);
+ int linePrefixIndex = StringUtil.indexOf(fileAndLineNumber, linePrefix);
+
+ if (linePrefixIndex == -1) {
+ return null;
+ }
+
+ final String fileName = fileAndLineNumber.substring(0, linePrefixIndex);
+ myFilteredFileName = fileName;
+ String lineNumberStr = fileAndLineNumber.substring(linePrefixIndex + linePrefix.length(), fileAndLineNumber.length()).trim();
+ int lineNumber;
+ try {
+ lineNumber = Integer.parseInt(lineNumberStr);
+ myFilteredLineNumber = lineNumber;
+ }
+ catch (NumberFormatException e) {
+ return null;
+ }
+
+ final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(fileName.replace(File.separatorChar, '/'));
+ if (file == null) {
+ return null;
+ }
+
+ int textStartOffset = entireLength - line.length() + filePrefix.length();
+ int highlightEndOffset = textStartOffset + fileName.length();
+
+ OpenFileHyperlinkInfo info = new OpenFileHyperlinkInfo(myProject, file, Math.max(lineNumber - 1, 0));
+
+ TextAttributes attributes = HYPERLINK_ATTRIBUTES.clone();
+ if (!ProjectRootManager.getInstance(myProject).getFileIndex().isInContent(file)) {
+ Color color = UIUtil.getInactiveTextColor();
+ attributes.setForegroundColor(color);
+ attributes.setEffectColor(color);
+ }
+ return new Result(textStartOffset, highlightEndOffset, info, attributes);
+ }
+
+ public String getFilteredFileName() {
+ return myFilteredFileName;
+ }
+
+ public int getFilteredLineNumber() {
+ return myFilteredLineNumber;
+ }
+}
diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java
new file mode 100644
index 000000000000..357999acf715
--- /dev/null
+++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterProvider.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.gradle.execution;
+
+import com.intellij.execution.filters.ConsoleFilterProvider;
+import com.intellij.execution.filters.Filter;
+import com.intellij.openapi.project.Project;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Vladislav.Soroka
+ * @since 9/29/2015
+ */
+public class GradleConsoleFilterProvider implements ConsoleFilterProvider {
+ @NotNull
+ @Override
+ public Filter[] getDefaultFilters(@NotNull final Project project) {
+ return new Filter[]{new GradleConsoleFilter(project)};
+ }
+}
diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java
new file mode 100644
index 000000000000..5d9e648f6b3a
--- /dev/null
+++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/execution/GradleConsoleFilterTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.plugins.gradle.execution;
+
+import com.intellij.testFramework.fixtures.CodeInsightFixtureTestCase;
+
+/**
+ * @author Vladislav.Soroka
+ * @since 9/29/2015
+ */
+public class GradleConsoleFilterTest extends CodeInsightFixtureTestCase {
+
+ public void testApplyFilter() throws Exception {
+ doTest("Build file 'C:\\project\\build.gradle' line: 7", "C:\\project\\build.gradle", 7);
+ doTest("Build file '/project/build.gradle' line: 7", "/project/build.gradle", 7);
+ }
+
+ private void doTest(String line, String expectedFileName, int expectedLineNumber) {
+ GradleConsoleFilter filter = new GradleConsoleFilter(myFixture.getProject());
+ filter.applyFilter(line, 0);
+ assertEquals(expectedFileName, filter.getFilteredFileName());
+ assertEquals(expectedLineNumber, filter.getFilteredLineNumber());
+ }
+}
\ No newline at end of file