You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ra...@apache.org on 2020/04/03 06:42:20 UTC

[olingo-odata4] branch master updated: [OLINGO-1443]Streaming support for Media types

This is an automated email from the ASF dual-hosted git repository.

ramyav pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/olingo-odata4.git


The following commit(s) were added to refs/heads/master by this push:
     new 1c8e5ce  [OLINGO-1443]Streaming support for Media types
1c8e5ce is described below

commit 1c8e5ce60bf7c3f8ea4074f191b5c64eaf51b45d
Author: ramya vasanth <ra...@sap.com>
AuthorDate: Fri Apr 3 12:12:08 2020 +0530

    [OLINGO-1443]Streaming support for Media types
---
 .../olingo/fit/tecsvc/client/MediaITCase.java      | 17 ++++++
 .../olingo/commons/api/data/EntityMediaObject.java | 32 +++++++++++
 .../api/serializer/FixedFormatSerializer.java      | 11 +++-
 .../olingo/server/core/ODataWritableContent.java   | 63 +++++++++++++++++++++-
 .../core/serializer/FixedFormatSerializerImpl.java | 24 +++++++++
 .../core/serializer/FixedFormatSerializerTest.java | 23 +++++++-
 .../olingo/server/tecsvc/data/DataCreator.java     | 43 ++++++++++++++-
 .../tecsvc/processor/TechnicalEntityProcessor.java | 15 +++++-
 .../server/tecsvc/provider/ContainerProvider.java  | 19 ++++++-
 9 files changed, 240 insertions(+), 7 deletions(-)

diff --git a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
index 66a8094..d97bc48 100644
--- a/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/tecsvc/client/MediaITCase.java
@@ -64,6 +64,23 @@ public class MediaITCase extends AbstractParamTecSvcITCase {
     assertNotNull(media);
     assertThat(IOUtils.toString(media), startsWith("<?xml"));
   }
+  
+  @Test
+  public void readMediaStream() throws Exception {
+    final ODataMediaRequest request = getClient().getRetrieveRequestFactory().getMediaRequest(
+        getClient().newURIBuilder(TecSvcConst.BASE_URI)
+        .appendEntitySetSegment("ESMediaStream").appendKeySegment(1).appendValueSegment().build());
+    assertNotNull(request);
+
+    final ODataRetrieveResponse<InputStream> response = request.execute();
+    assertEquals(HttpStatusCode.OK.getStatusCode(), response.getStatusCode());
+    assertEquals("image/svg+xml", response.getContentType());
+    assertEquals("W/\"1\"", response.getETag());
+
+    InputStream media = response.getBody();
+    assertNotNull(media);
+    assertThat(IOUtils.toString(media), startsWith("<?xml"));
+  }
 
   @Test
   public void delete() {
diff --git a/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityMediaObject.java b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityMediaObject.java
new file mode 100644
index 0000000..35fe1e0
--- /dev/null
+++ b/lib/commons-api/src/main/java/org/apache/olingo/commons/api/data/EntityMediaObject.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.commons.api.data;
+
+public class EntityMediaObject {
+	
+	private byte[] bytes;
+	
+	public void setBytes(byte[] bytes) {
+		this.bytes = bytes;
+	}
+	
+	public byte[] getBytes() {
+		return bytes;
+	}
+}
diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/FixedFormatSerializer.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/FixedFormatSerializer.java
index 0e6a440..1a492ff 100644
--- a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/FixedFormatSerializer.java
+++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/FixedFormatSerializer.java
@@ -21,6 +21,7 @@ package org.apache.olingo.server.api.serializer;
 import java.io.InputStream;
 import java.util.List;
 
+import org.apache.olingo.commons.api.data.EntityMediaObject;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.server.api.ODataResponse;
 import org.apache.olingo.server.api.deserializer.batch.ODataResponsePart;
@@ -33,7 +34,15 @@ public interface FixedFormatSerializer {
    * @param binary the binary data
    */
   InputStream binary(byte[] binary) throws SerializerException;
-
+  
+  /**
+   * Writes bytes to an Input stream
+   * @param mediaEntity bytes
+   * @return
+   * @throws SerializerException
+   */
+  SerializerStreamResult mediaEntityStreamed(EntityMediaObject mediaEntity) throws SerializerException;
+  
   /**
    * Writes a count into an InputStream as plain text.
    * @param count the count
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java
index 9cc6e81..8afbab4 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java
@@ -24,6 +24,7 @@ import java.nio.channels.Channels;
 import java.nio.channels.WritableByteChannel;
 
 import org.apache.olingo.commons.api.data.EntityIterator;
+import org.apache.olingo.commons.api.data.EntityMediaObject;
 import org.apache.olingo.commons.api.edm.EdmEntityType;
 import org.apache.olingo.commons.api.ex.ODataRuntimeException;
 import org.apache.olingo.server.api.ODataContent;
@@ -36,6 +37,7 @@ import org.apache.olingo.server.api.serializer.ODataSerializer;
 import org.apache.olingo.server.api.serializer.SerializerException;
 import org.apache.olingo.server.api.serializer.SerializerStreamResult;
 import org.apache.olingo.server.core.serializer.SerializerStreamResultImpl;
+import org.apache.olingo.server.core.serializer.FixedFormatSerializerImpl;
 import org.apache.olingo.server.core.serializer.json.ODataJsonSerializer;
 import org.apache.olingo.server.core.serializer.xml.ODataXmlSerializer;
 
@@ -55,6 +57,7 @@ public class ODataWritableContent implements ODataContent {
     protected ServiceMetadata metadata;
     protected EdmEntityType entityType;
     protected EntityCollectionSerializerOptions options;
+    protected EntityMediaObject mediaEntity;
 
     public StreamContent(EntityIterator iterator, EdmEntityType entityType, ServiceMetadata metadata,
         EntityCollectionSerializerOptions options) {
@@ -64,11 +67,22 @@ public class ODataWritableContent implements ODataContent {
       this.options = options;
     }
 
+    public StreamContent(EntityMediaObject mediaEntity) {
+    	this.mediaEntity = mediaEntity;
+    }
+    
     protected abstract void writeEntity(EntityIterator entity, OutputStream outputStream) throws SerializerException;
 
+    protected abstract void writeBinary(EntityMediaObject mediaEntity, OutputStream outputStream)
+    		throws SerializerException;
+    
     public void write(OutputStream out) {
       try {
-        writeEntity(iterator, out);
+    	  if (mediaEntity == null) {
+    		  writeEntity(iterator, out);
+    	  } else {
+    		  writeBinary(mediaEntity, out);
+    	  }
       } catch (SerializerException e) {
         final ODataContentWriteErrorCallback errorCallback = options.getODataContentWriteErrorCallback();
         if (errorCallback != null) {
@@ -98,7 +112,34 @@ public class ODataWritableContent implements ODataContent {
         throw new ODataRuntimeException("Failed entity serialization", e);
       }
     }
+    @Override
+	protected void writeBinary(EntityMediaObject mediaEntity, 
+			OutputStream outputStream) throws SerializerException {
+		throw new ODataRuntimeException("Not Implemented in Entity Handling");
+	}
   }
+  
+  private static class StreamContentForMedia extends StreamContent {
+	    private FixedFormatSerializerImpl fixedFormatSerializer;
+
+	    public StreamContentForMedia(EntityMediaObject mediaEntity, 
+	    		FixedFormatSerializerImpl fixedFormatSerializer) {
+	      super(mediaEntity);
+
+	      this.fixedFormatSerializer = fixedFormatSerializer;
+	    }
+
+	    protected void writeEntity(EntityIterator entity, 
+	        OutputStream outputStream) throws SerializerException {
+	    	throw new ODataRuntimeException("Not Implemented in Entity Handling");
+	    }
+
+		@Override
+		protected void writeBinary(EntityMediaObject mediaEntity, 
+				OutputStream outputStream) throws SerializerException {
+			fixedFormatSerializer.binaryIntoStreamed(mediaEntity, outputStream);
+		}
+	  }
 
   private static class StreamContentForXml extends StreamContent {
     private ODataXmlSerializer xmlSerializer;
@@ -119,6 +160,11 @@ public class ODataWritableContent implements ODataContent {
         throw new ODataRuntimeException("Failed entity serialization", e);
       }
     }
+    
+	protected void writeBinary(EntityMediaObject mediaEntity, 
+			OutputStream outputStream) throws SerializerException {
+		throw new ODataRuntimeException("Not Implemented in XML Handling");
+	}
   }
 
   @Override
@@ -140,6 +186,11 @@ public class ODataWritableContent implements ODataContent {
       EntityCollectionSerializerOptions options) {
     return new ODataWritableContentBuilder(iterator, entityType, serializer, metadata, options);
   }
+  
+  public static ODataWritableContentBuilder with(EntityMediaObject mediaEntity, 
+		  FixedFormatSerializerImpl fixedFormatSerializer) {
+	  return new ODataWritableContentBuilder(mediaEntity, fixedFormatSerializer);
+  }
 
   public static class WriteErrorContext implements ODataContentWriteErrorContext {
     private ODataLibraryException exception;
@@ -165,6 +216,8 @@ public class ODataWritableContent implements ODataContent {
     private ServiceMetadata metadata;
     private EdmEntityType entityType;
     private EntityCollectionSerializerOptions options;
+    private FixedFormatSerializerImpl fixedFormatSerializer;
+    private EntityMediaObject mediaEntity;
 
     public ODataWritableContentBuilder(EntityIterator entities, EdmEntityType entityType,
         ODataSerializer serializer,
@@ -176,6 +229,11 @@ public class ODataWritableContent implements ODataContent {
       this.options = options;
     }
 
+    public ODataWritableContentBuilder(EntityMediaObject mediaEntity, FixedFormatSerializerImpl fixedFormatSerializer) {
+    	this.mediaEntity = mediaEntity;
+    	this.fixedFormatSerializer = fixedFormatSerializer;
+    }
+    
     public ODataContent buildContent() {
       if (serializer instanceof ODataJsonSerializer) {
         StreamContent input = new StreamContentForJson(entities, entityType,
@@ -185,6 +243,9 @@ public class ODataWritableContent implements ODataContent {
         StreamContentForXml input = new StreamContentForXml(entities, entityType,
             (ODataXmlSerializer) serializer, metadata, options);
         return new ODataWritableContent(input);
+      } else if (fixedFormatSerializer instanceof FixedFormatSerializerImpl) {
+    	  StreamContent input = new StreamContentForMedia(mediaEntity, fixedFormatSerializer);
+    	  return new ODataWritableContent(input);
       }
       throw new ODataRuntimeException("No suitable serializer found");
     }
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerImpl.java
index f21f064..aa1d2c3 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerImpl.java
@@ -19,10 +19,13 @@
 package org.apache.olingo.server.core.serializer;
 
 import java.io.ByteArrayInputStream;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 
+import org.apache.olingo.commons.api.data.EntityMediaObject;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
 import org.apache.olingo.server.api.ODataResponse;
@@ -31,6 +34,8 @@ import org.apache.olingo.server.api.serializer.BatchSerializerException;
 import org.apache.olingo.server.api.serializer.FixedFormatSerializer;
 import org.apache.olingo.server.api.serializer.PrimitiveValueSerializerOptions;
 import org.apache.olingo.server.api.serializer.SerializerException;
+import org.apache.olingo.server.api.serializer.SerializerStreamResult;
+import org.apache.olingo.server.core.ODataWritableContent;
 
 public class FixedFormatSerializerImpl implements FixedFormatSerializer {
 
@@ -38,6 +43,25 @@ public class FixedFormatSerializerImpl implements FixedFormatSerializer {
   public InputStream binary(final byte[] binary) throws SerializerException {
     return new ByteArrayInputStream(binary);
   }
+  
+  protected void binary(final EntityMediaObject mediaEntity, 
+		  OutputStream outputStream) throws SerializerException {
+	  try {
+		outputStream.write(mediaEntity.getBytes());
+	} catch (IOException e) {
+		throw new SerializerException("IO Exception occured ", e, SerializerException.MessageKeys.IO_EXCEPTION);
+	}
+  }
+  
+  public void binaryIntoStreamed(final EntityMediaObject mediaEntity, 
+		  final OutputStream outputStream) throws SerializerException {
+	binary(mediaEntity, outputStream);
+  }
+  
+  @Override
+  public SerializerStreamResult mediaEntityStreamed(EntityMediaObject mediaEntity) throws SerializerException {
+	  return ODataWritableContent.with(mediaEntity, this).build();
+  }
 
   @Override
   public InputStream count(final Integer count) throws SerializerException {
diff --git a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerTest.java b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerTest.java
index a0586e3..ef32884 100644
--- a/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerTest.java
+++ b/lib/server-core/src/test/java/org/apache/olingo/server/core/serializer/FixedFormatSerializerTest.java
@@ -18,15 +18,19 @@
  */
 package org.apache.olingo.server.core.serializer;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
+
+import java.io.ByteArrayOutputStream;
 
 import org.apache.commons.io.IOUtils;
+import org.apache.olingo.commons.api.data.EntityMediaObject;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
 import org.apache.olingo.server.api.OData;
 import org.apache.olingo.server.api.serializer.FixedFormatSerializer;
 import org.apache.olingo.server.api.serializer.PrimitiveValueSerializerOptions;
 import org.apache.olingo.server.api.serializer.SerializerException;
+import org.apache.olingo.server.api.serializer.SerializerStreamResult;
 import org.junit.Test;
 
 public class FixedFormatSerializerTest {
@@ -53,4 +57,21 @@ public class FixedFormatSerializerTest {
     assertEquals("42", IOUtils.toString(serializer.primitiveValue(type, 42,
         PrimitiveValueSerializerOptions.with().nullable(true).build())));
   }
+  
+  @Test
+  public void binaryIntoStreamed() throws Exception {
+	  EntityMediaObject mediaObject = new EntityMediaObject();
+	  mediaObject.setBytes(new byte[] { 0x41, 0x42, 0x43 });
+	  ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+    new FixedFormatSerializerImpl().binaryIntoStreamed(mediaObject, outputStream);
+    assertEquals(mediaObject.getBytes().length, outputStream.toByteArray().length);
+  }
+  
+  @Test
+  public void mediaEntityStreamed() throws Exception {
+	  EntityMediaObject mediaObject = new EntityMediaObject();
+	  mediaObject.setBytes(new byte[] { 0x41, 0x42, 0x43 });
+	  SerializerStreamResult result = serializer.mediaEntityStreamed(mediaObject);
+	  assertNotNull(result.getODataContent());
+  }
 }
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
index 7007b89..855d7ac 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/data/DataCreator.java
@@ -34,7 +34,6 @@ import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.TimeZone;
 import java.util.UUID;
 
 import org.apache.olingo.commons.api.Constants;
@@ -78,6 +77,7 @@ public class DataCreator {
     data.put("ESAllKey", createESAllKey(edm, odata));
     data.put("ESCompComp", createESCompComp(edm, odata));
     data.put("ESMedia", createESMedia(edm, odata));
+    data.put("ESMediaStream", createESMediaStream(edm, odata));
     data.put("ESKeyNav", createESKeyNav(edm, odata));
     data.put("ESTwoKeyNav", createESTwoKeyNav(edm, odata));
     data.put("ESCompCollComp", createESCompCollComp(edm, odata));
@@ -1786,6 +1786,47 @@ public class DataCreator {
     createOperations("ESMedia", entityCollection, EntityTypeProvider.nameETMedia);
     return entityCollection;
   }
+  
+  private EntityCollection createESMediaStream(final Edm edm, final OData odata) {
+	    EntityCollection entityCollection = new EntityCollection();
+
+	    Entity entity = new Entity()
+	        .addProperty(createPrimitive("PropertyInt16", (short) 1))
+	        .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("darkturquoise")));
+	    entity.setMediaContentType("image/svg+xml");
+	    entity.setMediaETag("W/\"1\"");
+	    entity.getMediaEditLinks().add(buildMediaLink("ESMediaStream", "ESMediaStream(1)/$value"));
+	    entityCollection.getEntities().add(entity);
+
+	    entity = new Entity()
+	        .addProperty(createPrimitive("PropertyInt16", (short) 2))
+	        .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("royalblue")));
+	    entity.setMediaContentType("image/svg+xml");
+	    entity.setMediaETag("W/\"2\"");
+	    entity.getMediaEditLinks().add(buildMediaLink("ESMediaStream", "ESMediaStream(2)/$value"));
+	    entityCollection.getEntities().add(entity);
+
+	    entity = new Entity()
+	        .addProperty(createPrimitive("PropertyInt16", (short) 3))
+	        .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("crimson")));
+	    entity.setMediaContentType("image/svg+xml");
+	    entity.setMediaETag("W/\"3\"");
+	    entity.getMediaEditLinks().add(buildMediaLink("ESMediaStream", "ESMediaStream(3)/$value"));
+	    entityCollection.getEntities().add(entity);
+
+	    entity = new Entity()
+	        .addProperty(createPrimitive("PropertyInt16", (short) 4))
+	        .addProperty(createPrimitive(DataProvider.MEDIA_PROPERTY_NAME, createImage("black")));
+	    entity.setMediaContentType("image/svg+xml");
+	    entity.setMediaETag("W/\"4\"");
+	    entity.getMediaEditLinks().add(buildMediaLink("ESMediaStream", "ESMediaStream(4)/$value"));
+	    entityCollection.getEntities().add(entity);
+
+	    setEntityType(entityCollection, edm.getEntityType(EntityTypeProvider.nameETMedia));
+	    createEntityId(edm, odata, "ESMediaStream", entityCollection);
+	    createOperations("ESMediaStream", entityCollection, EntityTypeProvider.nameETMedia);
+	    return entityCollection;
+	  }
 
   private byte[] createImage(final String color) {
     return ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
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 77a624e..d36880d 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
@@ -36,6 +36,7 @@ import org.apache.olingo.commons.api.data.DeltaLink;
 import org.apache.olingo.commons.api.data.Entity;
 import org.apache.olingo.commons.api.data.EntityCollection;
 import org.apache.olingo.commons.api.data.EntityIterator;
+import org.apache.olingo.commons.api.data.EntityMediaObject;
 import org.apache.olingo.commons.api.data.Operation;
 import org.apache.olingo.commons.api.data.Property;
 import org.apache.olingo.commons.api.data.ValueType;
@@ -156,7 +157,15 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
       final ContentType responseFormat) throws ODataApplicationException, ODataLibraryException {
     getEdmEntitySet(uriInfo); // including checks
     final Entity entity = readEntity(uriInfo);
-
+    final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
+    if (isMediaStreaming(edmEntitySet)) {
+		EntityMediaObject mediaEntity = new EntityMediaObject();
+		mediaEntity.setBytes(dataProvider.readMedia(entity));
+	    response.setODataContent(odata.createFixedFormatSerializer()
+	    		.mediaEntityStreamed(mediaEntity).getODataContent());
+    } else {
+    	response.setContent(odata.createFixedFormatSerializer().binary(dataProvider.readMedia(entity)));
+    }
     response.setContent(odata.createFixedFormatSerializer().binary(dataProvider.readMedia(entity)));
     response.setStatusCode(HttpStatusCode.OK.getStatusCode());
     response.setHeader(HttpHeader.CONTENT_TYPE, entity.getMediaContentType());
@@ -760,6 +769,10 @@ public class TechnicalEntityProcessor extends TechnicalProcessor
     return (ContainerProvider.ES_STREAM.equalsIgnoreCase(edmEntitySet.getName())||
         ContainerProvider.ES_STREAM_SERVER_PAGINATION.equalsIgnoreCase(edmEntitySet.getName()));
   }
+  
+  private boolean isMediaStreaming(EdmEntitySet edmEntitySet) {
+	return (ContainerProvider.ES_MEDIA_STREAM.equalsIgnoreCase(edmEntitySet.getName()));
+  }
 
   private SerializerResult serializeEntityCollection(final ODataRequest request, final EntityCollection
       entityCollection, final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType,
diff --git a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java
index 6244024..5841c80 100644
--- a/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java
+++ b/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/provider/ContainerProvider.java
@@ -54,6 +54,8 @@ public class ContainerProvider {
   public static final String AIRT_BYTE_NINE_PARAM = "AIRTByteNineParam";
   public static final String ES_STREAM = "ESStream";
   public static final String ES_STREAM_SERVER_PAGINATION = "ESStreamServerSidePaging";
+  public static final String ES_MEDIA = "ESMedia";
+  public static final String ES_MEDIA_STREAM = "ESMediaStream";
 
   private final CsdlEdmProvider prov;
 
@@ -89,7 +91,8 @@ public class ContainerProvider {
     entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompCollAllPrim"));
     entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompComp"));
     entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESCompCollComp"));
-    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESMedia"));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, ES_MEDIA));
+    entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, ES_MEDIA_STREAM));
     entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESInvisible"));
     entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, "ESServerSidePaging"));
     entitySets.add(prov.getEntitySet(ContainerProvider.nameContainer, ES_STREAM_SERVER_PAGINATION));
@@ -347,7 +350,19 @@ public class ContainerProvider {
                 new CsdlAnnotation().setTerm(TermProvider.TERM_DATA.getFullQualifiedNameAsString()).setExpression(
                     new CsdlConstantExpression(CsdlConstantExpression.ConstantExpressionType.Bool, "true"))));
 
-      } else if (name.equals("ESInvisible")) {
+      } else if (name.equals("ESMediaStream")) {
+        return new CsdlEntitySet()
+          .setName("ESMediaStream")
+          .setType(EntityTypeProvider.nameETMedia)
+          .setIncludeInServiceDocument(true)
+          .setAnnotations(Arrays.asList(
+              new CsdlAnnotation().setTerm("Core.Description")
+                  .setExpression(new CsdlConstantExpression(CsdlConstantExpression.ConstantExpressionType.String)
+                      .setValue("Contains media entities")),
+              new CsdlAnnotation().setTerm(TermProvider.TERM_DATA.getFullQualifiedNameAsString()).setExpression(
+                  new CsdlConstantExpression(CsdlConstantExpression.ConstantExpressionType.Bool, "true"))));
+
+       } else if (name.equals("ESInvisible")) {
         return new CsdlEntitySet()
             .setName("ESInvisible")
             .setIncludeInServiceDocument(false)