1 package org.apache.maven.plugin.surefire.extensions;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
23 import org.apache.maven.surefire.api.booter.Command;
24 import org.apache.maven.surefire.extensions.CloseableDaemonThread;
25 import org.apache.maven.surefire.extensions.CommandReader;
26 import org.apache.maven.surefire.stream.CommandEncoder;
27
28 import javax.annotation.Nonnull;
29 import java.io.IOException;
30 import java.nio.channels.ClosedChannelException;
31 import java.nio.channels.NonWritableChannelException;
32 import java.nio.channels.WritableByteChannel;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class StreamFeeder extends CloseableDaemonThread
48 {
49 private final WritableByteChannel channel;
50 private final CommandReader commandReader;
51 private final ConsoleLogger logger;
52
53 private volatile boolean disabled;
54 private volatile Throwable exception;
55
56 public StreamFeeder( @Nonnull String threadName, @Nonnull WritableByteChannel channel,
57 @Nonnull CommandReader commandReader, @Nonnull ConsoleLogger logger )
58 {
59 super( threadName );
60 this.channel = channel;
61 this.commandReader = commandReader;
62 this.logger = logger;
63 }
64
65 @Override
66 @SuppressWarnings( "checkstyle:innerassignment" )
67 public void run()
68 {
69 try ( CommandEncoder encoder = new CommandEncoder( channel ) )
70 {
71 for ( Command cmd; ( cmd = commandReader.readNextCommand() ) != null; )
72 {
73 if ( !disabled )
74 {
75 switch ( cmd.getCommandType() )
76 {
77 case RUN_CLASS:
78 encoder.sendRunClass( cmd.getData() );
79 break;
80 case TEST_SET_FINISHED:
81 encoder.sendTestSetFinished();
82 break;
83 case SKIP_SINCE_NEXT_TEST:
84 encoder.sendSkipSinceNextTest();
85 break;
86 case SHUTDOWN:
87 encoder.sendShutdown( cmd.getData() );
88 break;
89 case NOOP:
90 encoder.sendNoop();
91 break;
92 case BYE_ACK:
93 encoder.sendByeAck();
94 break;
95 default:
96 logger.error( "Unknown enum " + cmd.getCommandType().name() );
97 }
98 }
99 }
100 }
101 catch ( ClosedChannelException e )
102 {
103
104 }
105 catch ( IOException | NonWritableChannelException e )
106 {
107 exception = e.getCause() == null ? e : e.getCause();
108 }
109 catch ( IllegalArgumentException e )
110 {
111 logger.error( e.getLocalizedMessage() );
112 }
113 }
114
115 public void disable()
116 {
117 disabled = true;
118 }
119
120 public Throwable getException()
121 {
122 return exception;
123 }
124
125 @Override
126 public void close() throws IOException
127 {
128 channel.close();
129 }
130 }