diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicStreamITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicStreamITCase.java index ce7753680..42ddb93ee 100644 --- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicStreamITCase.java +++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/http/BasicStreamITCase.java @@ -20,6 +20,7 @@ package org.apache.olingo.fit.tecsvc.http; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; import java.net.HttpURLConnection; import java.net.URL; @@ -154,6 +155,89 @@ public class BasicStreamITCase extends AbstractBaseTestITCase { assertTrue(content.contains("ESStreamServerSidePaging?$format=json&%24skiptoken=2%2A10")); } + + @Test + public void streamCountXml() throws Exception { + URL url = new URL(SERVICE_URI + "ESStreamServerSidePaging?$count=true&$format=xml"); + + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(HttpMethod.GET.name()); + connection.connect(); + + assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode()); + assertEquals(ContentType.APPLICATION_XML, ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE))); + + final String content = IOUtils.toString(connection.getInputStream()); + assertTrue(content.contains("")); + assertTrue(content.contains("ESStreamServerSidePaging(1)")); + assertTrue(content.contains("504")); + assertTrue(content.contains("1")); + assertTrue(content.contains("readLink")); + } + + + @Test + public void streamCountJson() throws Exception { + URL url = new URL(SERVICE_URI + "ESStreamServerSidePaging?$count=true&$format=json"); + + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(HttpMethod.GET.name()); + connection.connect(); + + assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode()); + assertEquals(ContentType.JSON, ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE))); + + final String content = IOUtils.toString(connection.getInputStream()); + + assertTrue(content.contains("{\"PropertyInt16\":2,"+ + "\"PropertyStream@odata.mediaEtag\":\"eTag\",\"PropertyStream@odata.mediaContentType\":\"image/jpeg\"}")); + assertTrue(content.contains("\"@odata.nextLink\"")); + assertTrue(content.contains("ESStreamServerSidePaging?$count=true&$format=json&%24skiptoken=1%2A10")); + assertTrue(content.contains("\"@odata.count\":504")); + } + + @Test + public void streamCountFalsetXml() throws Exception { + URL url = new URL(SERVICE_URI + "ESStreamServerSidePaging?$count=false&$format=xml"); + + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(HttpMethod.GET.name()); + connection.connect(); + + assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode()); + assertEquals(ContentType.APPLICATION_XML, ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE))); + + final String content = IOUtils.toString(connection.getInputStream()); + assertTrue(content.contains("")); + assertTrue(content.contains("ESStreamServerSidePaging(1)")); + assertTrue(content.contains("1")); + assertTrue(content.contains("readLink")); + assertFalse(content.contains("504")); + } + + + @Test + public void streamCountFalseJson() throws Exception { + URL url = new URL(SERVICE_URI + "ESStreamServerSidePaging?$count=false&$format=json"); + + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(HttpMethod.GET.name()); + connection.connect(); + + assertEquals(HttpStatusCode.OK.getStatusCode(), connection.getResponseCode()); + assertEquals(ContentType.JSON, ContentType.create(connection.getHeaderField(HttpHeader.CONTENT_TYPE))); + + final String content = IOUtils.toString(connection.getInputStream()); + + assertTrue(content.contains("{\"PropertyInt16\":2,"+ + "\"PropertyStream@odata.mediaEtag\":\"eTag\",\"PropertyStream@odata.mediaContentType\":\"image/jpeg\"}")); + assertTrue(content.contains("\"@odata.nextLink\"")); + assertTrue(content.contains("ESStreamServerSidePaging?$count=false&$format=json&%24skiptoken=1%2A10")); + assertFalse(content.contains("\"@odata.count\":504")); + } + @Override protected ODataClient getClient() { return null; diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityIterator.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityIterator.java index 145b2ac37..809a40ee5 100644 --- a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityIterator.java +++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityIterator.java @@ -30,6 +30,8 @@ import java.util.List; public abstract class EntityIterator extends AbstractEntityCollection implements Iterator { private URI next; + + private Integer count; /** * {@inheritDoc} */ @@ -72,18 +74,16 @@ public abstract class EntityIterator extends AbstractEntityCollection implements } /** - * {@inheritDoc} - *

- * ATTENTION: getCount is not supported by default. + * Gets count + * */ public Integer getCount() { - throw new ODataNotSupportedException("Entity Iterator does not support getCount()"); + return count; } /** * Gets next link. * - * @param next next link. */ public URI getNext() { return next; @@ -106,4 +106,13 @@ public abstract class EntityIterator extends AbstractEntityCollection implements public void setNext(final URI next) { this.next = next; } + + /** + * Sets count. + * + * @param count count value. + */ + public void setCount(final Integer count) { + this.count = count; + } } diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java index e21b6465e..d7830be96 100644 --- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java +++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java @@ -633,6 +633,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor EntityIterator streamCollection = new EntityIterator() { Iterator entityIterator = entityCollection.iterator(); private URI next = entityCollection.getNext(); + private Integer count = entityCollection.getCount(); @Override public List getOperations() { return entityCollection.getOperations(); @@ -642,6 +643,10 @@ public class TechnicalEntityProcessor extends TechnicalProcessor return next; } + public Integer getCount() { + return count; + } + @Override public boolean hasNext() { return entityIterator.hasNext();