3939import java .io .Serializable ;
4040import java .io .UnsupportedEncodingException ;
4141import java .util .ArrayList ;
42+ import java .util .Collections ;
4243import java .util .List ;
4344import java .util .Objects ;
4445import java .util .logging .Level ;
@@ -158,6 +159,7 @@ public static BuildListener apply(@Nonnull TaskListener listener, @Nonnull FlowE
158159 if (decorators .isEmpty ()) {
159160 return BuildListenerAdapter .wrap (listener );
160161 } else {
162+ Collections .reverse (decorators );
161163 return new DecoratedTaskListener (listener , decorators );
162164 }
163165 }
@@ -175,7 +177,12 @@ private static class MergedTaskListenerDecorator extends TaskListenerDecorator {
175177 }
176178
177179 @ Override public OutputStream decorate (OutputStream logger ) throws IOException , InterruptedException {
178- return subsequent .decorate (original .decorate (logger ));
180+ // TODO BodyInvoker.MergedFilter probably has these backwards
181+ return original .decorate (subsequent .decorate (logger ));
182+ }
183+
184+ @ Override public String toString () {
185+ return "MergedTaskListenerDecorator[" + subsequent + ", " + original + "]" ;
179186 }
180187
181188 }
@@ -197,6 +204,10 @@ private static class ConsoleLogFilterAdapter extends TaskListenerDecorator {
197204 return filter .decorateLogger ((AbstractBuild ) null , logger );
198205 }
199206
207+ @ Override public String toString () {
208+ return "ConsoleLogFilter[" + filter + "]" ;
209+ }
210+
200211 }
201212
202213 private static final class DecoratedTaskListener implements BuildListener {
@@ -211,7 +222,7 @@ private static final class DecoratedTaskListener implements BuildListener {
211222
212223 /**
213224 * A (nonempty) list of decorators we delegate to.
214- * They are applied in order, so the last one “wins” .
225+ * They are applied in reverse order, so the first one has the final say in what gets printed .
215226 */
216227 private final @ Nonnull List <TaskListenerDecorator > decorators ;
217228
@@ -243,6 +254,10 @@ private static final class DecoratedTaskListener implements BuildListener {
243254 return logger ;
244255 }
245256
257+ @ Override public String toString () {
258+ return "DecoratedTaskListener[" + delegate + decorators + "]" ;
259+ }
260+
246261 }
247262
248263}
0 commit comments