1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.surefire.api.util.internal;
20
21 import java.io.IOException;
22 import java.nio.Buffer;
23 import java.nio.ByteBuffer;
24 import java.nio.channels.ClosedChannelException;
25 import java.nio.channels.NonWritableChannelException;
26
27
28
29
30
31
32
33 abstract class AbstractNoninterruptibleWritableChannel implements WritableBufferedByteChannel {
34 private volatile boolean open = true;
35
36 protected abstract void writeImpl(ByteBuffer src) throws IOException;
37
38 protected abstract void closeImpl() throws IOException;
39
40 protected abstract void flushImpl() throws IOException;
41
42 @Override
43 public final int write(ByteBuffer src) throws IOException {
44 return write(src, true);
45 }
46
47 @Override
48 public final void writeBuffered(ByteBuffer src) throws IOException {
49 write(src, false);
50 }
51
52 int write(ByteBuffer src, boolean flush) throws IOException {
53 if (!isOpen()) {
54 throw new ClosedChannelException();
55 }
56
57 if (!src.hasArray() || src.isReadOnly()) {
58 throw new NonWritableChannelException();
59 }
60
61 if (src.remaining() != src.capacity()) {
62 ((Buffer) src).flip();
63 }
64
65 int countWrittenBytes = src.remaining();
66 writeImpl(src);
67 ((Buffer) src).position(((Buffer) src).limit());
68 if (flush) {
69 flushImpl();
70 }
71 return countWrittenBytes;
72 }
73
74 @Override
75 public final boolean isOpen() {
76 return open;
77 }
78
79 @Override
80 public final void close() throws IOException {
81 open = false;
82 closeImpl();
83 }
84 }