From c331e2cde011974a5f9c8cc23b3f1e9bfd174a39 Mon Sep 17 00:00:00 2001 From: Andrew Rouse Date: Mon, 13 Feb 2017 14:30:29 +0000 Subject: [PATCH] Ensure AssetCursors are closed when written Make AssetCursor implement Closable, and then read the AssetCursor within a try-with-resources so that it gets closed. --- .../main/java/com/ibm/ws/lars/rest/AssetCursorWriter.java | 5 +++-- .../main/java/com/ibm/ws/lars/rest/model/AssetCursor.java | 3 ++- .../java/com/ibm/ws/lars/rest/mongo/MongoAssetCursor.java | 5 +++++ .../test/java/com/ibm/ws/lars/rest/BasicAssetCursor.java | 7 +++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/ibm/ws/lars/rest/AssetCursorWriter.java b/server/src/main/java/com/ibm/ws/lars/rest/AssetCursorWriter.java index 59d7a86..33d292f 100644 --- a/server/src/main/java/com/ibm/ws/lars/rest/AssetCursorWriter.java +++ b/server/src/main/java/com/ibm/ws/lars/rest/AssetCursorWriter.java @@ -52,7 +52,8 @@ public boolean isWriteable(Class type, Type genericType, Annotation[] annotat @Override public void writeTo(AssetCursor cursor, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException { - MAPPER.writeValue(entityStream, cursor); + try (AssetCursor cursorToBeClosed = cursor) { + MAPPER.writeValue(entityStream, cursorToBeClosed); + } } - } diff --git a/server/src/main/java/com/ibm/ws/lars/rest/model/AssetCursor.java b/server/src/main/java/com/ibm/ws/lars/rest/model/AssetCursor.java index 9037580..61beed4 100644 --- a/server/src/main/java/com/ibm/ws/lars/rest/model/AssetCursor.java +++ b/server/src/main/java/com/ibm/ws/lars/rest/model/AssetCursor.java @@ -15,6 +15,7 @@ *******************************************************************************/ package com.ibm.ws.lars.rest.model; +import java.io.Closeable; import java.util.Iterator; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -32,7 +33,7 @@ * returned. */ @JsonSerialize(as = Iterator.class) -public interface AssetCursor extends Iterator { +public interface AssetCursor extends Iterator, Closeable { /** * Get the total number of assets which will be returned from this cursor diff --git a/server/src/main/java/com/ibm/ws/lars/rest/mongo/MongoAssetCursor.java b/server/src/main/java/com/ibm/ws/lars/rest/mongo/MongoAssetCursor.java index 893369e..08ccfb3 100644 --- a/server/src/main/java/com/ibm/ws/lars/rest/mongo/MongoAssetCursor.java +++ b/server/src/main/java/com/ibm/ws/lars/rest/mongo/MongoAssetCursor.java @@ -65,4 +65,9 @@ public void addOperation(AssetOperation op) { operations.add(op); } + @Override + public void close() { + cursor.close(); + } + } diff --git a/server/src/test/java/com/ibm/ws/lars/rest/BasicAssetCursor.java b/server/src/test/java/com/ibm/ws/lars/rest/BasicAssetCursor.java index 1f16201..519e077 100644 --- a/server/src/test/java/com/ibm/ws/lars/rest/BasicAssetCursor.java +++ b/server/src/test/java/com/ibm/ws/lars/rest/BasicAssetCursor.java @@ -15,6 +15,7 @@ *******************************************************************************/ package com.ibm.ws.lars.rest; +import java.io.IOException; import java.util.Collection; import java.util.Iterator; import java.util.Map; @@ -61,4 +62,10 @@ public void addOperation(AssetOperation filter) { } + /** {@inheritDoc} */ + @Override + public void close() throws IOException { + // Do nothing + } + }