| /* |
| * 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.google.common.collect.BiMap; |
| import com.google.common.collect.ImmutableBiMap; |
| import com.intellij.execution.process.ProcessHandler; |
| import org.jetbrains.idea.maven.execution.MavenExecutionOptions; |
| import org.jetbrains.idea.maven.execution.RunnerBundle; |
| import org.jetbrains.idea.maven.server.MavenServerConsole; |
| |
| import java.text.MessageFormat; |
| |
| public abstract class MavenConsole { |
| private static final String LINE_SEPARATOR = System.getProperty("line.separator"); |
| |
| public enum OutputType { |
| NORMAL, SYSTEM, ERROR |
| } |
| |
| private final int myOutputLevel; |
| private boolean isFinished; |
| |
| private static final BiMap<String, Integer> PREFIX_TO_LEVEL = ImmutableBiMap.of( |
| "DEBUG", MavenServerConsole.LEVEL_DEBUG, |
| "INFO", MavenServerConsole.LEVEL_INFO, |
| "WARNING", MavenServerConsole.LEVEL_WARN, |
| "ERROR", MavenServerConsole.LEVEL_ERROR, |
| "FATAL_ERROR", MavenServerConsole.LEVEL_FATAL |
| ); |
| |
| public MavenConsole(MavenExecutionOptions.LoggingLevel outputLevel, boolean printStrackTrace) { |
| myOutputLevel = outputLevel.getLevel(); |
| } |
| |
| public boolean isSuppressed(int level) { |
| return level < myOutputLevel; |
| } |
| |
| public boolean isSuppressed(String line) { |
| return isSuppressed(getLevel(line)); |
| } |
| |
| public abstract boolean canPause(); |
| |
| public abstract boolean isOutputPaused(); |
| |
| public abstract void setOutputPaused(boolean outputPaused); |
| |
| public boolean isFinished() { |
| return isFinished; |
| } |
| |
| public void finish() { |
| isFinished = true; |
| } |
| |
| public abstract void attachToProcess(ProcessHandler processHandler); |
| |
| public void printException(Throwable throwable) { |
| systemMessage(MavenServerConsole.LEVEL_ERROR, RunnerBundle.message("embedded.build.failed"), throwable); |
| } |
| |
| public void systemMessage(int level, String string, Throwable throwable) { |
| printMessage(level, string, throwable); |
| } |
| |
| public void printMessage(int level, String string, Throwable throwable) { |
| if (isSuppressed(level)) return; |
| |
| OutputType type = OutputType.NORMAL; |
| if (throwable != null |
| || level == MavenServerConsole.LEVEL_WARN |
| || level == MavenServerConsole.LEVEL_ERROR |
| || level == MavenServerConsole.LEVEL_FATAL) { |
| type = OutputType.ERROR; |
| } |
| |
| doPrint(composeLine(level, string), type); |
| |
| if (level == MavenServerConsole.LEVEL_FATAL) { |
| setOutputPaused(false); |
| } |
| |
| if (throwable != null) { |
| String message = throwable.getMessage(); |
| if (message != null) { |
| message += LINE_SEPARATOR; |
| doPrint(LINE_SEPARATOR + composeLine(MavenServerConsole.LEVEL_ERROR, message), type); |
| } |
| } |
| } |
| // todo |
| // if (throwable != null) { |
| // String message = null; |
| // |
| // Throwable temp = throwable; |
| // while (temp != null) { |
| // if (temp instanceof AbstractMojoExecutionException) { |
| // message = appendExecutionFailureMessage(message, temp.getMessage()); |
| // message = appendExecutionFailureMessage(message, ((AbstractMojoExecutionException)temp).getLongMessage()); |
| // |
| // if (temp.getCause() != null) { |
| // message = appendExecutionFailureMessage(message, temp.getCause().getMessage()); |
| // } |
| // break; |
| // } |
| // temp = temp.getCause(); |
| // } |
| // |
| // if (message == null) message = throwable.getMessage(); |
| // |
| // if (message != null) { |
| // message += LINE_SEPARATOR; |
| // doPrint(LINE_SEPARATOR + composeLine(LEVEL_ERROR, message), type); |
| // } |
| // |
| // if (myPrintStrackTrace) { |
| // doPrint(LINE_SEPARATOR + StringUtil.getThrowableText(throwable), OutputType.ERROR); |
| // } |
| // else { |
| // doPrint(LINE_SEPARATOR + |
| // "To view full stack traces, please go to the Settings->Maven and check the 'Print Exception Stack Traces' box." + |
| // LINE_SEPARATOR, |
| // type); |
| // } |
| //} |
| |
| private static String appendExecutionFailureMessage(String message, String newMessage) { |
| if (message == null) return newMessage; |
| if (newMessage == null) return message; |
| return message + LINE_SEPARATOR + LINE_SEPARATOR + newMessage; |
| } |
| |
| protected abstract void doPrint(String text, OutputType type); |
| |
| private static int getLevel(String line) { |
| return getLevelByPrefix(extractPrefix(line)); |
| } |
| |
| private static String extractPrefix(String line) { |
| if (line.startsWith("[")) { |
| int closing = line.indexOf("] ", 1); |
| if (closing > 1) { |
| return line.substring(1, closing); |
| } |
| } |
| return ""; |
| } |
| |
| private static int getLevelByPrefix(String prefix) { |
| Integer level = PREFIX_TO_LEVEL.get(prefix); |
| return level != null ? level : MavenServerConsole.LEVEL_WARN; |
| } |
| |
| private static String composeLine(int level, String message) { |
| return MessageFormat.format("[{0}] {1}", getPrefixByLevel(level), message); |
| } |
| |
| private static String getPrefixByLevel(int level) { |
| return PREFIX_TO_LEVEL.inverse().get(level); |
| } |
| } |