This repository has been archived by the owner on Jun 29, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 102
/
OutputAccessor.java
155 lines (126 loc) · 3.9 KB
/
OutputAccessor.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package biz.paluch.logging.gelf.intern;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
/**
* @author Mark Paluch
*/
abstract class OutputAccessor {
private static final ThreadLocal<ByteBufferOutputAccessor> accessors = new ThreadLocal<ByteBufferOutputAccessor>() {
@Override
protected ByteBufferOutputAccessor initialValue() {
return new ByteBufferOutputAccessor();
}
};
private static final ThreadLocal<ByteBufferOutputStream> streams = new ThreadLocal<ByteBufferOutputStream>() {
@Override
protected ByteBufferOutputStream initialValue() {
return new ByteBufferOutputStream(null);
}
};
public abstract void write(int b);
public abstract void write(byte[] b);
public abstract void write(byte[] b, int off, int len);
/**
* Create an {@link OutputAccessor} for the given {@link OutputStream}.
*
* @param outputStream
* @return
*/
public static OutputAccessor from(OutputStream outputStream) {
return new OutputStreamAccessor(outputStream);
}
/**
* Create an {@link OutputAccessor} for the given {@link ByteBuffer}. Instances are pooled within the thread scope.
*
* @param byteBuffer
* @return
*/
public static OutputAccessor from(ByteBuffer byteBuffer) {
ByteBufferOutputAccessor accessor = accessors.get();
accessor.byteBuffer = byteBuffer;
return accessor;
}
/**
* Retrieve a pooled {@link OutputStream}.
*
* @return
*/
public static OutputStream pooledStream() {
return streams.get();
}
/**
* Retrieved a pooled an {@link OutputStream} for the given {@link ByteBuffer}. Instances are pooled within the thread scope.
*
* @param byteBuffer
* @return
*/
public static OutputStream asStream(ByteBuffer byteBuffer) {
ByteBufferOutputStream accessor = streams.get();
accessor.byteBuffer = byteBuffer;
return accessor;
}
static class ByteBufferOutputAccessor extends OutputAccessor {
private ByteBuffer byteBuffer;
@Override
public void write(byte[] b, int off, int len) {
byteBuffer.put(b, off, len);
}
@Override
public void write(byte[] b) {
byteBuffer.put(b);
}
@Override
public void write(int b) {
byteBuffer.put((byte) b);
}
}
static class ByteBufferOutputStream extends OutputStream {
private ByteBuffer byteBuffer;
public ByteBufferOutputStream(ByteBuffer byteBuffer) {
this.byteBuffer = byteBuffer;
}
@Override
public void write(byte[] b, int off, int len) {
byteBuffer.put(b, off, len);
}
@Override
public void write(byte[] b) {
byteBuffer.put(b);
}
@Override
public void write(int b) {
byteBuffer.put((byte) b);
}
}
static class OutputStreamAccessor extends OutputAccessor {
private final OutputStream delegate;
public OutputStreamAccessor(OutputStream delegate) {
this.delegate = delegate;
}
@Override
public void write(byte[] b, int off, int len) {
try {
delegate.write(b, off, len);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public void write(byte[] b) {
try {
delegate.write(b);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
@Override
public void write(int b) {
try {
delegate.write(b);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}
}