From 3aa78a1b4249ccddfa169e7cd2e5bfb975ae8359 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 26 Nov 2021 09:49:32 +0100 Subject: [PATCH] [jOOQ/jOOQ#12667] Add also Source.of(Reader, int) --- jOOQ/src/main/java/org/jooq/Source.java | 49 ++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Source.java b/jOOQ/src/main/java/org/jooq/Source.java index 20893c12d5..c0b481d786 100644 --- a/jOOQ/src/main/java/org/jooq/Source.java +++ b/jOOQ/src/main/java/org/jooq/Source.java @@ -158,35 +158,42 @@ public final class Source { * Create a source from a reader. */ public static final Source of(Reader reader) { - return new Source(null, null, null, null, null, reader, null, null, -1); + return of(reader, -1); + } + + /** + * Create a source from a reader. + */ + public static final Source of(Reader reader, int length) { + return new Source(null, null, null, null, null, reader, null, null, length); } /** * Create a source from an input stream. */ public static final Source of(InputStream inputStream) { - return new Source(null, null, null, null, null, null, inputStream, null, -1); + return of(inputStream, -1); } /** * Create a source from an input stream using a specific character set. */ public static final Source of(InputStream inputStream, String charsetName) { - return new Source(null, null, charsetName, null, null, null, inputStream, null, -1); + return of(inputStream, -1, charsetName); } /** * Create a source from an input stream using a specific character set. */ public static final Source of(InputStream inputStream, Charset charset) { - return new Source(null, null, null, charset, null, null, inputStream, null, -1); + return of(inputStream, -1, charset); } /** * Create a source from an input stream using a specific character set. */ public static final Source of(InputStream inputStream, CharsetDecoder charsetDecoder) { - return new Source(null, null, null, null, charsetDecoder, null, inputStream, null, -1); + return of(inputStream, -1, charsetDecoder); } /** @@ -233,7 +240,10 @@ public final class Source { else return inputStreamReader(new ByteArrayInputStream(bytes)); else if (reader != null) - return reader; + if (length > -1) + return new LengthLimitedReader(reader, length); + else + return reader; else if (inputStream != null) if (length > -1) return inputStreamReader(new LengthLimitedInputStream(inputStream, length)); @@ -262,6 +272,33 @@ public final class Source { public int read() throws java.io.IOException { return length --> 0 ? is.read() : -1; } + + @Override + public void close() throws java.io.IOException { + is.close(); + } + } + + static class LengthLimitedReader extends Reader { + final Reader reader; + int length; + + LengthLimitedReader(Reader reader, int length) { + this.length = length; + this.reader = reader; + } + + @Override + public int read(char[] cbuf, int off, int len) throws java.io.IOException { + int r = length > 0 ? reader.read(cbuf, off, Math.min(length, len)) : -1; + length -= len; + return r; + } + + @Override + public void close() throws java.io.IOException { + reader.close(); + } } /**