9
9
* contextual objects that need to be passed by the factory to
10
10
* readers and writers are combined under this object. One instance
11
11
* is created for each reader and writer.
12
+ *<p>
13
+ * NOTE: non-final since 2.4, to allow sub-classing.
12
14
*/
13
- public final class IOContext
15
+ public class IOContext
14
16
{
15
17
/*
16
18
/**********************************************************
@@ -132,41 +134,51 @@ public TextBuffer constructTextBuffer() {
132
134
* Note: the method can only be called once during its life cycle.
133
135
* This is to protect against accidental sharing.
134
136
*/
135
- public byte [] allocReadIOBuffer ()
136
- {
137
+ public byte [] allocReadIOBuffer () {
137
138
_verifyAlloc (_readIOBuffer );
138
139
return (_readIOBuffer = _bufferRecycler .allocByteBuffer (BufferRecycler .ByteBufferType .READ_IO_BUFFER ));
139
140
}
140
141
141
- public byte [] allocWriteEncodingBuffer ()
142
- {
142
+ /**
143
+ * @since 2.3.2
144
+ */
145
+ public byte [] allocReadIOBuffer (int minSize ) {
146
+ _verifyAlloc (_readIOBuffer );
147
+ return (_readIOBuffer = _bufferRecycler .allocByteBuffer (BufferRecycler .ByteBufferType .READ_IO_BUFFER , minSize ));
148
+ }
149
+
150
+ public byte [] allocWriteEncodingBuffer () {
143
151
_verifyAlloc (_writeEncodingBuffer );
144
152
return (_writeEncodingBuffer = _bufferRecycler .allocByteBuffer (BufferRecycler .ByteBufferType .WRITE_ENCODING_BUFFER ));
145
153
}
146
154
155
+ /**
156
+ * @since 2.3.2
157
+ */
158
+ public byte [] allocWriteEncodingBuffer (int minSize ) {
159
+ _verifyAlloc (_writeEncodingBuffer );
160
+ return (_writeEncodingBuffer = _bufferRecycler .allocByteBuffer (BufferRecycler .ByteBufferType .WRITE_ENCODING_BUFFER , minSize ));
161
+ }
162
+
147
163
/**
148
164
* @since 2.1
149
165
*/
150
- public byte [] allocBase64Buffer ()
151
- {
166
+ public byte [] allocBase64Buffer () {
152
167
_verifyAlloc (_base64Buffer );
153
168
return (_base64Buffer = _bufferRecycler .allocByteBuffer (BufferRecycler .ByteBufferType .BASE64_CODEC_BUFFER ));
154
169
}
155
170
156
- public char [] allocTokenBuffer ()
157
- {
171
+ public char [] allocTokenBuffer () {
158
172
_verifyAlloc (_tokenCBuffer );
159
173
return (_tokenCBuffer = _bufferRecycler .allocCharBuffer (BufferRecycler .CharBufferType .TOKEN_BUFFER ));
160
174
}
161
175
162
- public char [] allocConcatBuffer ()
163
- {
176
+ public char [] allocConcatBuffer () {
164
177
_verifyAlloc (_concatCBuffer );
165
178
return (_concatCBuffer = _bufferRecycler .allocCharBuffer (BufferRecycler .CharBufferType .CONCAT_BUFFER ));
166
179
}
167
180
168
- public char [] allocNameCopyBuffer (int minSize )
169
- {
181
+ public char [] allocNameCopyBuffer (int minSize ) {
170
182
_verifyAlloc (_nameCopyBuffer );
171
183
return (_nameCopyBuffer = _bufferRecycler .allocCharBuffer (BufferRecycler .CharBufferType .NAME_COPY_BUFFER , minSize ));
172
184
}
@@ -175,8 +187,7 @@ public char[] allocNameCopyBuffer(int minSize)
175
187
* Method to call when all the processing buffers can be safely
176
188
* recycled.
177
189
*/
178
- public void releaseReadIOBuffer (byte [] buf )
179
- {
190
+ public void releaseReadIOBuffer (byte [] buf ) {
180
191
if (buf != null ) {
181
192
/* Let's do sanity checks to ensure once-and-only-once release,
182
193
* as well as avoiding trying to release buffers not owned
@@ -187,8 +198,7 @@ public void releaseReadIOBuffer(byte[] buf)
187
198
}
188
199
}
189
200
190
- public void releaseWriteEncodingBuffer (byte [] buf )
191
- {
201
+ public void releaseWriteEncodingBuffer (byte [] buf ) {
192
202
if (buf != null ) {
193
203
/* Let's do sanity checks to ensure once-and-only-once release,
194
204
* as well as avoiding trying to release buffers not owned
@@ -199,36 +209,34 @@ public void releaseWriteEncodingBuffer(byte[] buf)
199
209
}
200
210
}
201
211
202
- public void releaseBase64Buffer (byte [] buf )
203
- {
212
+ public void releaseBase64Buffer (byte [] buf ) {
204
213
if (buf != null ) { // sanity checks, release once-and-only-once, must be one owned
205
214
_verifyRelease (buf , _base64Buffer );
206
215
_base64Buffer = null ;
207
216
_bufferRecycler .releaseByteBuffer (BufferRecycler .ByteBufferType .BASE64_CODEC_BUFFER , buf );
208
217
}
209
218
}
210
219
211
- public void releaseTokenBuffer (char [] buf )
212
- {
220
+ public void releaseTokenBuffer (char [] buf ) {
213
221
if (buf != null ) {
214
222
_verifyRelease (buf , _tokenCBuffer );
215
223
_tokenCBuffer = null ;
216
224
_bufferRecycler .releaseCharBuffer (BufferRecycler .CharBufferType .TOKEN_BUFFER , buf );
217
225
}
218
226
}
219
227
220
- public void releaseConcatBuffer (char [] buf )
221
- {
228
+ public void releaseConcatBuffer (char [] buf ) {
222
229
if (buf != null ) {
230
+ // 14-Jan-2014, tatu: Let's actually allow upgrade of the original buffer.
223
231
_verifyRelease (buf , _concatCBuffer );
224
232
_concatCBuffer = null ;
225
233
_bufferRecycler .releaseCharBuffer (BufferRecycler .CharBufferType .CONCAT_BUFFER , buf );
226
234
}
227
235
}
228
236
229
- public void releaseNameCopyBuffer (char [] buf )
230
- {
237
+ public void releaseNameCopyBuffer (char [] buf ) {
231
238
if (buf != null ) {
239
+ // 14-Jan-2014, tatu: Let's actually allow upgrade of the original buffer.
232
240
_verifyRelease (buf , _nameCopyBuffer );
233
241
_nameCopyBuffer = null ;
234
242
_bufferRecycler .releaseCharBuffer (BufferRecycler .CharBufferType .NAME_COPY_BUFFER , buf );
@@ -241,17 +249,17 @@ public void releaseNameCopyBuffer(char[] buf)
241
249
/**********************************************************
242
250
*/
243
251
244
- private final void _verifyAlloc (Object buffer )
245
- {
246
- if (buffer != null ) {
247
- throw new IllegalStateException ("Trying to call same allocXxx() method second time" );
248
- }
252
+ protected void _verifyAlloc (Object buffer ) {
253
+ if (buffer != null ) { throw new IllegalStateException ("Trying to call same allocXxx() method second time" ); }
249
254
}
250
-
251
- private final void _verifyRelease (Object toRelease , Object src )
252
- {
253
- if (toRelease != src ) {
254
- throw new IllegalArgumentException ("Trying to release buffer not owned by the context" );
255
- }
255
+
256
+ protected void _verifyRelease (byte [] toRelease , byte [] src ) {
257
+ if ((toRelease != src ) && (toRelease .length <= src .length )) { throw wrongBuf (); }
256
258
}
259
+
260
+ protected void _verifyRelease (char [] toRelease , char [] src ) {
261
+ if ((toRelease != src ) && (toRelease .length <= src .length )) { throw wrongBuf (); }
262
+ }
263
+
264
+ private IllegalArgumentException wrongBuf () { return new IllegalArgumentException ("Trying to release buffer not owned by the context" ); }
257
265
}
0 commit comments