package com.intellij.flex.compiler; import flex2.tools.oem.Logger; import flex2.tools.oem.Message; import java.util.regex.Matcher; import java.util.regex.Pattern; public class OutputLogger extends LoggerAdapter implements Logger { public static final String ERROR_MARKER = "Error: "; //keep in sync with FlexCompilerHandler.errorPattern !!! private static final Pattern ERROR_PATTERN = Pattern.compile("(.*?)(\\(\\D.*\\))?(?:\\((-?\\d+)\\))?: ?(?:col: (-?\\d+):?)? (Warning|Error): (.*)"); /* // see SDKFilesResolver private static final String IGNORED_MESSAGE_START; private static final String IGNORED_MESSAGE_END = ".xml"; static { String tmp = System.getProperty("java.io.tmpdir"); try { tmp = new File(System.getProperty("java.io.tmpdir") + File.separator + "fake-config").getCanonicalPath(); } catch (IOException ignored) {} IGNORED_MESSAGE_START = "Loading configuration file " + tmp ; } */ private final MessageSender myMessageSender; private final String myLogMessagePrefix; private boolean myErrorsReported = false; public OutputLogger(final MessageSender messageSender, final String logMessagePrefix) { myMessageSender = messageSender; myLogMessagePrefix = logMessagePrefix; } public void log(final String message) { /* if (message.startsWith(IGNORED_MESSAGE_START) && message.endsWith(IGNORED_MESSAGE_END)) { // do not tell anything about our fake config file. See SdkFilesResolver class return; } */ if (!myErrorsReported) { if (message.startsWith("Error: ") || message.startsWith("Exception in thread \"main\" ")) { myErrorsReported = true; } else { final Matcher matcher = ERROR_PATTERN.matcher(message); if (matcher.matches()) { final String type = matcher.group(5); if ("Error".equals(type)) { myErrorsReported = true; } } } } myMessageSender.sendMessage(myLogMessagePrefix + message); } public void log(final Message msg, final int errorCode, final String source) { log(msg.getLevel(), msg.getPath(), msg.getLine(), msg.getColumn(), msg.toString()); } // path line col level message //Pattern ERROR_PATTERN = Pattern.compile("(.*?)(?:\\((-?\\d+)\\))?: ?(?:col: (-?\\d+))? (Warning|Error): (.*)"); public void log(final String level, final String path, final int line, final int column, final String message) { final StringBuilder builder = new StringBuilder(); if (!isEmpty(path)) builder.append(path); if (line >= 0) builder.append('(').append(line).append(')'); if (builder.length() > 0) builder.append(": "); if (column >= 0) builder.append("col: ").append(column).append(" "); if (WARNING_LEVEL.equalsIgnoreCase(level)) { builder.append(WARNING_LEVEL).append(": "); } else if (ERROR_LEVEL.equalsIgnoreCase(level)) { builder.append(ERROR_LEVEL).append(": "); } builder.append(isEmpty(message) ? "unknown error" : message); log(builder.toString()); } private static boolean isEmpty(final String s) { return s == null || s.trim().length() == 0; } public boolean wereErrorsReported() { return myErrorsReported; } }