/******************************************************************************* * * Copyright (c) 2004-2010, Oracle Corporation. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * * * * *******************************************************************************/ package hudson.tasks._ant; import hudson.console.LineTransformationOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.charset.Charset; /** * Filter {@link OutputStream} that places an annotation that marks Ant target * execution. * * @author Kohsuke Kawaguchi * @sine 1.349 */ public class AntConsoleAnnotator extends LineTransformationOutputStream { private final OutputStream out; private final Charset charset; private boolean seenEmptyLine; public AntConsoleAnnotator(OutputStream out, Charset charset) { this.out = out; this.charset = charset; } @Override protected void eol(byte[] b, int len) throws IOException { String line = charset.decode(ByteBuffer.wrap(b, 0, len)).toString(); // trim off CR/LF from the end line = trimEOL(line); if (seenEmptyLine && endsWith(line, ':') && line.indexOf(' ') < 0) // put the annotation { new AntTargetNote().encodeTo(out); } if (line.equals("BUILD SUCCESSFUL") || line.equals("BUILD FAILED")) { new AntOutcomeNote().encodeTo(out); } seenEmptyLine = line.length() == 0; out.write(b, 0, len); } private boolean endsWith(String line, char c) { int len = line.length(); return len > 0 && line.charAt(len - 1) == c; } @Override public void close() throws IOException { super.close(); out.close(); } }