66
77import io .vavr .control .Try ;
88import java .io .BufferedReader ;
9- import java .io .IOException ;
10- import java .io .InputStream ;
119import java .io .InputStreamReader ;
1210import java .util .Iterator ;
1311import java .util .NoSuchElementException ;
@@ -36,14 +34,18 @@ class IterableStreamConverter<T> implements Iterator<T> {
3634 /** see DEFAULT_CHAR_BUFFER_SIZE in {@link BufferedReader} * */
3735 static final int BUFFER_SIZE = 8192 ;
3836
37+ private static final String ERR_CONTENT = "Failed to read response content." ;
38+ private static final String ERR_INTERRUPTED = "Parsing response content was interrupted" ;
39+ private static final String ERR_CLOSE = "Could not close input stream with error: {} (ignored)" ;
40+
3941 /** Read next entry for Stream or {@code null} when no further entry can be read. */
4042 private final Callable <T > readHandler ;
4143
4244 /** Close handler to be called when Stream terminated. */
4345 private final Runnable stopHandler ;
4446
4547 /** Error handler to be called when Stream is interrupted. */
46- private final Function <Exception , RuntimeException > errorHandler ;
48+ private final Function <Throwable , RuntimeException > errorHandler ;
4749
4850 private boolean isDone = false ;
4951 private boolean isNextFetched = false ;
@@ -85,8 +87,8 @@ public T next() {
8587
8688 /**
8789 * Create a sequential Stream of lines from an HTTP response string (UTF-8). The underlying {@link
88- * InputStream} is closed, when the resulting Stream is closed (e.g. via try-with-resources) or
89- * when an exception occurred.
90+ * java.io. InputStream} is closed, when the resulting Stream is closed (e.g. via
91+ * try-with-resources) or when an exception occurred.
9092 *
9193 * @param response The HTTP response object.
9294 * @param exceptionFactory The exception factory to use for creating exceptions.
@@ -103,29 +105,26 @@ static <R extends ClientError> Stream<String> lines(
103105 throw exceptionFactory .build ("The HTTP Response is empty" ).setHttpResponse (response );
104106 }
105107
106- final InputStream inputStream ;
107- try {
108- inputStream = response .getEntity ().getContent ();
109- } catch (final IOException e ) {
110- throw exceptionFactory .build ("Failed to read response content." , e ).setHttpResponse (response );
111- }
108+ // access input stream
109+ final var inputStream =
110+ Try .of (() -> response .getEntity ().getContent ())
111+ .getOrElseThrow (e -> exceptionFactory .build (ERR_CONTENT , e ).setHttpResponse (response ));
112112
113+ // initialize buffered reader
113114 final var reader = new BufferedReader (new InputStreamReader (inputStream , UTF_8 ), BUFFER_SIZE );
115+
116+ // define close handler
114117 final Runnable closeHandler =
115- () ->
116- Try .run (reader ::close )
117- .onFailure (
118- e ->
119- log .debug (
120- "Could not close input stream with error: {} (ignored)" ,
121- e .getClass ().getSimpleName ()));
122- final Function <Exception , RuntimeException > errHandler =
123- e ->
124- exceptionFactory
125- .build ("Parsing response content was interrupted" , e )
126- .setHttpResponse (response );
118+ () -> Try .run (reader ::close ).onFailure (e -> log .debug (ERR_CLOSE , e .getClass ()));
119+
120+ // define error handler
121+ final Function <Throwable , RuntimeException > errHandler =
122+ e -> exceptionFactory .build (ERR_INTERRUPTED , e ).setHttpResponse (response );
127123
124+ // initialize lazy stream iterator
128125 final var iterator = new IterableStreamConverter <>(reader ::readLine , closeHandler , errHandler );
126+
127+ // create lazy stream as output
129128 final var spliterator = Spliterators .spliteratorUnknownSize (iterator , ORDERED | NONNULL );
130129 return StreamSupport .stream (spliterator , /* NOT PARALLEL */ false ).onClose (closeHandler );
131130 }
0 commit comments