blob: a6379460a234c4522076ab82f4b53e2bc627f10c [file] [log] [blame]
/*
* Copyright 2000-2009 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.idea.maven.project;
import com.intellij.execution.filters.HyperlinkInfo;
import com.intellij.execution.filters.RegexpFilter;
import com.intellij.execution.filters.TextConsoleBuilder;
import com.intellij.execution.filters.TextConsoleBuilderFactory;
import com.intellij.execution.process.ProcessAdapter;
import com.intellij.execution.process.ProcessEvent;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.execution.ui.ConsoleViewContentType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.wm.ToolWindow;
import com.intellij.openapi.wm.ToolWindowId;
import com.intellij.openapi.wm.ToolWindowManager;
import com.intellij.ui.content.Content;
import com.intellij.ui.content.ContentFactory;
import com.intellij.ui.content.MessageView;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.execution.MavenRunnerParameters;
import org.jetbrains.idea.maven.execution.MavenRunnerSettings;
import org.jetbrains.idea.maven.utils.MavenUtil;
import java.util.concurrent.atomic.AtomicBoolean;
public class MavenConsoleImpl extends MavenConsole {
private static final Key<MavenConsoleImpl> CONSOLE_KEY = Key.create("MAVEN_CONSOLE_KEY");
private static final String CONSOLE_FILTER_REGEXP =
"(?:^|(?:\\[\\w+\\]\\s*))" + RegexpFilter.FILE_PATH_MACROS + ":\\[" + RegexpFilter.LINE_MACROS + "," + RegexpFilter.COLUMN_MACROS + "]";
private final String myTitle;
private final Project myProject;
private final ConsoleView myConsoleView;
private final AtomicBoolean isOpen = new AtomicBoolean(false);
private final Pair<MavenRunnerParameters, MavenRunnerSettings> myParametersAndSettings;
public MavenConsoleImpl(String title, Project project) {
this(title, project, null);
}
public MavenConsoleImpl(String title,
Project project,
Pair<MavenRunnerParameters, MavenRunnerSettings> parametersAndSettings) {
super(getGeneralSettings(project).getLoggingLevel(), getGeneralSettings(project).isPrintErrorStackTraces());
myTitle = title;
myProject = project;
myConsoleView = createConsoleView();
myParametersAndSettings = parametersAndSettings;
}
private static MavenGeneralSettings getGeneralSettings(Project project) {
return MavenProjectsManager.getInstance(project).getGeneralSettings();
}
private ConsoleView createConsoleView() {
return createConsoleBuilder(myProject).getConsole();
}
public static TextConsoleBuilder createConsoleBuilder(final Project project) {
TextConsoleBuilder builder = TextConsoleBuilderFactory.getInstance().createBuilder(project);
builder.addFilter(new RegexpFilter(project, CONSOLE_FILTER_REGEXP) {
@Nullable
@Override
protected HyperlinkInfo createOpenFileHyperlink(String fileName, int line, int column) {
HyperlinkInfo res = super.createOpenFileHyperlink(fileName, line, column);
if (res == null && fileName.startsWith("\\") && SystemInfo.isWindows) {
// Maven cut prefix 'C:\' from paths on Windows
VirtualFile[] roots = ProjectRootManager.getInstance(project).getContentRoots();
if (roots.length > 0) {
String projectPath = roots[0].getPath();
if (projectPath.matches("[A-Z]:[\\\\/].+")) {
res = super.createOpenFileHyperlink(projectPath.charAt(0) + ":" + fileName, line, column);
}
}
}
return res;
}
});
builder.addFilter(new MavenGroovyConsoleFilter(project));
builder.addFilter(new MavenScalaConsoleFilter(project));
builder.addFilter(new MavenTestConsoleFilter(project));
return builder;
}
public boolean canPause() {
return myConsoleView.canPause();
}
public boolean isOutputPaused() {
return myConsoleView.isOutputPaused();
}
public void setOutputPaused(boolean outputPaused) {
myConsoleView.setOutputPaused(outputPaused);
}
public Pair<MavenRunnerParameters, MavenRunnerSettings> getParametersAndSettings() {
return myParametersAndSettings;
}
public void attachToProcess(ProcessHandler processHandler) {
myConsoleView.attachToProcess(processHandler);
processHandler.addProcessListener(new ProcessAdapter() {
@Override
public void onTextAvailable(ProcessEvent event, Key outputType) {
ensureAttachedToToolWindow();
}
});
}
protected void doPrint(String text, OutputType type) {
ensureAttachedToToolWindow();
ConsoleViewContentType contentType;
switch (type) {
case SYSTEM:
contentType = ConsoleViewContentType.SYSTEM_OUTPUT;
break;
case ERROR:
contentType = ConsoleViewContentType.ERROR_OUTPUT;
break;
case NORMAL:
default:
contentType = ConsoleViewContentType.NORMAL_OUTPUT;
}
myConsoleView.print(text, contentType);
}
private void ensureAttachedToToolWindow() {
if (!isOpen.compareAndSet(false, true)) return;
MavenUtil.invokeLater(myProject, new Runnable() {
public void run() {
MessageView messageView = MessageView.SERVICE.getInstance(myProject);
Content content = ContentFactory.SERVICE.getInstance().createContent(
myConsoleView.getComponent(), myTitle, true);
content.putUserData(CONSOLE_KEY, MavenConsoleImpl.this);
messageView.getContentManager().addContent(content);
messageView.getContentManager().setSelectedContent(content);
// remove unused tabs
for (Content each : messageView.getContentManager().getContents()) {
if (each.isPinned()) continue;
if (each == content) continue;
MavenConsoleImpl console = each.getUserData(CONSOLE_KEY);
if (console == null) continue;
if (!myTitle.equals(console.myTitle)) continue;
if (console.isFinished()) {
messageView.getContentManager().removeContent(each, false);
}
}
ToolWindow toolWindow = ToolWindowManager.getInstance(myProject).getToolWindow(ToolWindowId.MESSAGES_WINDOW);
if (!toolWindow.isActive()) {
toolWindow.activate(null, false);
}
}
});
}
public void close() {
MessageView messageView = MessageView.SERVICE.getInstance(myProject);
for (Content each : messageView.getContentManager().getContents()) {
MavenConsoleImpl console = each.getUserData(CONSOLE_KEY);
if (console != null) {
messageView.getContentManager().removeContent(each, true);
return;
}
}
}
}