[OLINGO-832] Added new SerializerStreamResult
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/dc2c972c Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/dc2c972c Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/dc2c972c Branch: refs/heads/OLINGO-856_ODataHandlerInAPI Commit: dc2c972c464adb230c394d9529f2ce5d91f6fe21 Parents: 31dea71 Author: Michael Bolz <[email protected]> Authored: Tue Feb 9 11:00:34 2016 +0100 Committer: Michael Bolz <[email protected]> Committed: Tue Feb 9 11:00:34 2016 +0100 ---------------------------------------------------------------------- .../server/api/serializer/ODataSerializer.java | 11 + .../api/serializer/SerializerStreamResult.java | 32 +++ .../olingo/server/core/ODataBasicContent.java | 59 ++++ .../apache/olingo/server/core/ODataImpl.java | 11 +- .../server/core/ODataWritableContent.java | 267 ++++++++++++++++++ .../serializer/ChannelSerializerResult.java | 268 ------------------- .../core/serializer/SerializerResultImpl.java | 5 + .../serializer/SerializerStreamResultImpl.java | 67 +++++ .../serializer/json/ODataJsonSerializer.java | 58 +++- .../json/ODataJsonStreamSerializer.java | 150 ----------- .../core/serializer/xml/ODataXmlSerializer.java | 9 + .../processor/TechnicalEntityProcessor.java | 34 ++- 12 files changed, 526 insertions(+), 445 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java index 57370ba..432e1de 100644 --- a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/ODataSerializer.java @@ -20,6 +20,7 @@ package org.apache.olingo.server.api.serializer; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.AbstractEntityCollection; +import org.apache.olingo.commons.api.data.EntityIterator; import org.apache.olingo.commons.api.data.Property; import org.apache.olingo.commons.api.edm.EdmComplexType; import org.apache.olingo.commons.api.edm.EdmEntitySet; @@ -64,6 +65,16 @@ public interface ODataSerializer { AbstractEntityCollection entitySet, EntityCollectionSerializerOptions options) throws SerializerException; /** + * Writes entity-collection data into an InputStream. + * @param metadata metadata for the service + * @param entityType the {@link EdmEntityType} + * @param entities the data of the entity set + * @param options options for the serializer + */ + SerializerStreamResult entityCollectionStreamed(ServiceMetadata metadata, EdmEntityType entityType, + EntityIterator entities, EntityCollectionSerializerOptions options) throws SerializerException; + + /** * Writes entity data into an InputStream. * @param metadata metadata for the service * @param entityType the {@link EdmEntityType} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerStreamResult.java ---------------------------------------------------------------------- diff --git a/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerStreamResult.java b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerStreamResult.java new file mode 100644 index 0000000..c0dbafa --- /dev/null +++ b/lib/server-api/src/main/java/org/apache/olingo/server/api/serializer/SerializerStreamResult.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.server.api.serializer; + +import org.apache.olingo.server.api.ODataContent; + +/** + * Result type for {@link ODataSerializer} methods + */ +public interface SerializerStreamResult { + /** + * Returns the content as ODataContent + * @return content + */ + ODataContent getODataContent(); +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataBasicContent.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataBasicContent.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataBasicContent.java new file mode 100644 index 0000000..03328f4 --- /dev/null +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataBasicContent.java @@ -0,0 +1,59 @@ +/* + * 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.server.core; + +import org.apache.olingo.server.api.ODataContent; +import org.apache.olingo.server.api.WriteContentErrorCallback; + +import java.io.InputStream; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; + +public class ODataBasicContent implements ODataContent { + private final ReadableByteChannel channel; + + public ODataBasicContent(ReadableByteChannel channel) { + this.channel = channel; + } + + public ODataBasicContent(InputStream stream) { + this(Channels.newChannel(stream)); + } + + @Override + public ReadableByteChannel getChannel() { + return channel; + } + + @Override + public void write(WritableByteChannel channel) { + + } + + @Override + public void write(WritableByteChannel channel, WriteContentErrorCallback callback) { + + } + + @Override + public boolean isWriteSupported() { + return false; + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java index c056b45..4c2642c 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataImpl.java @@ -18,6 +18,9 @@ */ package org.apache.olingo.server.core; +import java.util.Collection; +import java.util.List; + import org.apache.olingo.commons.api.edm.EdmPrimitiveType; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.provider.CsdlEdmProvider; @@ -45,13 +48,10 @@ import org.apache.olingo.server.core.deserializer.xml.ODataXmlDeserializer; import org.apache.olingo.server.core.etag.ETagHelperImpl; import org.apache.olingo.server.core.prefer.PreferencesImpl; import org.apache.olingo.server.core.serializer.FixedFormatSerializerImpl; -import org.apache.olingo.server.core.serializer.json.ODataJsonStreamSerializer; +import org.apache.olingo.server.core.serializer.json.ODataJsonSerializer; import org.apache.olingo.server.core.serializer.xml.ODataXmlSerializer; import org.apache.olingo.server.core.uri.UriHelperImpl; -import java.util.Collection; -import java.util.List; - public class ODataImpl extends OData { @Override @@ -63,8 +63,7 @@ public class ODataImpl extends OData { if (metadata == null || ContentType.VALUE_ODATA_METADATA_MINIMAL.equals(metadata) || ContentType.VALUE_ODATA_METADATA_NONE.equals(metadata)) { -// serializer = new ODataJsonSerializer(contentType); - serializer = new ODataJsonStreamSerializer(contentType); + serializer = new ODataJsonSerializer(contentType); } } else if (contentType.isCompatible(ContentType.APPLICATION_XML) || contentType.isCompatible(ContentType.APPLICATION_ATOM_XML)) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..fc45639 --- /dev/null +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java @@ -0,0 +1,267 @@ +/* + * 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.server.core; + +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import org.apache.olingo.commons.api.data.Entity; +import org.apache.olingo.commons.api.data.EntityIterator; +import org.apache.olingo.commons.api.edm.EdmEntityType; +import org.apache.olingo.commons.api.ex.ODataRuntimeException; +import org.apache.olingo.server.api.ODataContent; +import org.apache.olingo.server.api.ServiceMetadata; +import org.apache.olingo.server.api.WriteContentErrorCallback; +import org.apache.olingo.server.api.serializer.EntitySerializerOptions; +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.json.ODataJsonSerializer; +import org.apache.olingo.server.core.serializer.utils.CircleStreamBuffer; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.charset.Charset; + +public class ODataWritableContent implements ODataContent { + private StreamChannel channel; + + private static class StreamChannel implements ReadableByteChannel { + private static final Charset DEFAULT = Charset.forName("UTF-8"); + private ByteBuffer head; + private ByteBuffer tail; + private ODataJsonSerializer jsonSerializer; + private EntityIterator coll; + private ServiceMetadata metadata; + private EdmEntityType entityType; + private EntitySerializerOptions options; + + public StreamChannel(EntityIterator coll, EdmEntityType entityType, String head, + ODataJsonSerializer jsonSerializer, ServiceMetadata metadata, + EntitySerializerOptions options, String tail) { + this.coll = coll; + this.entityType = entityType; + this.head = ByteBuffer.wrap(head.getBytes(DEFAULT)); + this.jsonSerializer = jsonSerializer; + this.metadata = metadata; + this.options = options; + this.tail = ByteBuffer.wrap(tail.getBytes(DEFAULT)); + } + + public boolean write(OutputStream out) throws IOException { + if(head.hasRemaining()) { + out.write(head.array()); + head.flip(); + return true; + } + if (coll.hasNext()) { + try { + writeEntity(coll.next(), out); + if(coll.hasNext()) { + out.write(",".getBytes(DEFAULT)); + } + return true; + } catch (SerializerException e) { + } + } else if(tail.hasRemaining()) { + out.write(tail.array()); + tail.flip(); + return true; + } + return false; + } + + + private void writeEntity(Entity entity, OutputStream outputStream) throws SerializerException { + try { + JsonGenerator json = new JsonFactory().createGenerator(outputStream); + jsonSerializer.writeEntity(metadata, entityType, entity, null, + options == null ? null : options.getExpand(), + options == null ? null : options.getSelect(), + options != null && options.getWriteOnlyReferences(), + json); + json.flush(); + } catch (final IOException e) { + throw new ODataRuntimeException("Failed entity serialization"); + } + } + + @Override + public int read(ByteBuffer dest) throws IOException { + ByteBuffer buffer = getCurrentBuffer(); + if (buffer != null && buffer.hasRemaining()) { + int r = buffer.remaining(); + if(r <= dest.remaining()) { + dest.put(buffer); + } else { + r = dest.remaining(); + byte[] buf = new byte[dest.remaining()]; + buffer.get(buf); + dest.put(buf); + } + return r; + } + return -1; + } + + ByteBuffer currentBuffer; + + private ByteBuffer getCurrentBuffer() { + if(currentBuffer == null) { + currentBuffer = head; + } + if(!currentBuffer.hasRemaining()) { + if (coll.hasNext()) { + try { + // FIXME: mibo_160108: Inefficient buffer handling, replace + currentBuffer = serEntity(coll.next()); + if(coll.hasNext()) { + ByteBuffer b = ByteBuffer.allocate(currentBuffer.position() + 1); + currentBuffer.flip(); + b.put(currentBuffer).put(",".getBytes(DEFAULT)); + currentBuffer = b; + } + currentBuffer.flip(); + } catch (SerializerException e) { + return getCurrentBuffer(); + } + } else if(tail.hasRemaining()) { + currentBuffer = tail; + } else { + return null; + } + } + return currentBuffer; + } + + private ByteBuffer serEntity(Entity entity) throws SerializerException { + try { + CircleStreamBuffer buffer = new CircleStreamBuffer(); + OutputStream outputStream = buffer.getOutputStream(); + JsonGenerator json = new JsonFactory().createGenerator(outputStream); + jsonSerializer.writeEntity(metadata, entityType, entity, null, + options == null ? null : options.getExpand(), + options == null ? null : options.getSelect(), + options != null && options.getWriteOnlyReferences(), + json); + + json.close(); + outputStream.close(); + return buffer.getBuffer(); + } catch (final IOException e) { + return ByteBuffer.wrap(("ERROR" + e.getMessage()).getBytes()); + } + } + + + @Override + public boolean isOpen() { + return false; + } + + @Override + public void close() throws IOException { + + } + } + +// @Override +// public InputStream getContent() { +// return Channels.newInputStream(this.channel); +// } + + @Override + public ReadableByteChannel getChannel() { + return this.channel; + } + + @Override + public boolean isWriteSupported() { + return true; + } + + @Override + public void write(WritableByteChannel writeChannel) { + try { + boolean contentAvailable = true; + while(contentAvailable) { + contentAvailable = this.channel.write(Channels.newOutputStream(writeChannel)); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void write(WritableByteChannel channel, WriteContentErrorCallback callback) { + // TODO: implement error handling + throw new ODataRuntimeException("error handling not yet supported"); + } + + private ODataWritableContent(StreamChannel channel) { + this.channel = channel; + } + + public static ODataWritableContentBuilder with(EntityIterator coll, EdmEntityType entityType, + ODataJsonSerializer jsonSerializer, + ServiceMetadata metadata, EntitySerializerOptions options) { + return new ODataWritableContentBuilder(coll, entityType, jsonSerializer, metadata, options); + } + + public static class ODataWritableContentBuilder { + private ODataJsonSerializer jsonSerializer; + private EntityIterator entities; + private ServiceMetadata metadata; + private EdmEntityType entityType; + private EntitySerializerOptions options; + private String head; + private String tail; + + public ODataWritableContentBuilder(EntityIterator entities, EdmEntityType entityType, + ODataJsonSerializer jsonSerializer, + ServiceMetadata metadata, EntitySerializerOptions options) { + this.entities = entities; + this.entityType = entityType; + this.jsonSerializer = jsonSerializer; + this.metadata = metadata; + this.options = options; + } + + public ODataWritableContentBuilder addHead(String head) { + this.head = head; + return this; + } + + public ODataWritableContentBuilder addTail(String tail) { + this.tail = tail; + return this; + } + + public ODataContent buildContent() { + StreamChannel input = new StreamChannel(entities, entityType, head, jsonSerializer, metadata, options, tail); + return new ODataWritableContent(input); + } + public SerializerStreamResult build() { + return SerializerStreamResultImpl.with().content(buildContent()).build(); + } + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ChannelSerializerResult.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ChannelSerializerResult.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ChannelSerializerResult.java deleted file mode 100644 index 1e97731..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ChannelSerializerResult.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * 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.server.core.serializer; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntityIterator; -import org.apache.olingo.commons.api.edm.EdmEntityType; -import org.apache.olingo.commons.api.ex.ODataRuntimeException; -import org.apache.olingo.server.api.ODataContent; -import org.apache.olingo.server.api.ServiceMetadata; -import org.apache.olingo.server.api.WriteContentErrorCallback; -import org.apache.olingo.server.api.serializer.EntitySerializerOptions; -import org.apache.olingo.server.api.serializer.SerializerException; -import org.apache.olingo.server.api.serializer.SerializerResult; -import org.apache.olingo.server.core.serializer.json.ODataJsonStreamSerializer; -import org.apache.olingo.server.core.serializer.utils.CircleStreamBuffer; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; -import java.nio.charset.Charset; - -public class ChannelSerializerResult implements ODataContent { - private StreamChannel channel; - - private static class StreamChannel implements ReadableByteChannel { - private static final Charset DEFAULT = Charset.forName("UTF-8"); - private ByteBuffer head; - private ByteBuffer tail; - private ODataJsonStreamSerializer jsonSerializer; - private EntityIterator coll; - private ServiceMetadata metadata; - private EdmEntityType entityType; - private EntitySerializerOptions options; - - public StreamChannel(EntityIterator coll, EdmEntityType entityType, String head, - ODataJsonStreamSerializer jsonSerializer, ServiceMetadata metadata, - EntitySerializerOptions options, String tail) { - this.coll = coll; - this.entityType = entityType; - this.head = ByteBuffer.wrap(head.getBytes(DEFAULT)); - this.jsonSerializer = jsonSerializer; - this.metadata = metadata; - this.options = options; - this.tail = ByteBuffer.wrap(tail.getBytes(DEFAULT)); - } - - public boolean write(OutputStream out) throws IOException { - if(head.hasRemaining()) { - out.write(head.array()); - head.flip(); - return true; - } - if (coll.hasNext()) { - try { - writeEntity(coll.next(), out); - if(coll.hasNext()) { - out.write(",".getBytes(DEFAULT)); - } - return true; - } catch (SerializerException e) { - } - } else if(tail.hasRemaining()) { - out.write(tail.array()); - tail.flip(); - return true; - } - return false; - } - - - private void writeEntity(Entity entity, OutputStream outputStream) throws SerializerException { - try { - JsonGenerator json = new JsonFactory().createGenerator(outputStream); - jsonSerializer.writeEntity(metadata, entityType, entity, null, - options == null ? null : options.getExpand(), - options == null ? null : options.getSelect(), - options != null && options.getWriteOnlyReferences(), - json); - json.flush(); - } catch (final IOException e) { - throw new ODataRuntimeException("Failed entity serialization"); - } - } - - @Override - public int read(ByteBuffer dest) throws IOException { - ByteBuffer buffer = getCurrentBuffer(); - if (buffer != null && buffer.hasRemaining()) { - int r = buffer.remaining(); - if(r <= dest.remaining()) { - dest.put(buffer); - } else { - r = dest.remaining(); - byte[] buf = new byte[dest.remaining()]; - buffer.get(buf); - dest.put(buf); - } - return r; - } - return -1; - } - - ByteBuffer currentBuffer; - - private ByteBuffer getCurrentBuffer() { - if(currentBuffer == null) { - currentBuffer = head; - } - if(!currentBuffer.hasRemaining()) { - if (coll.hasNext()) { - try { - // FIXME: mibo_160108: Inefficient buffer handling, replace - currentBuffer = serEntity(coll.next()); - if(coll.hasNext()) { - ByteBuffer b = ByteBuffer.allocate(currentBuffer.position() + 1); - currentBuffer.flip(); - b.put(currentBuffer).put(",".getBytes(DEFAULT)); - currentBuffer = b; - } - currentBuffer.flip(); - } catch (SerializerException e) { - return getCurrentBuffer(); - } - } else if(tail.hasRemaining()) { - currentBuffer = tail; - } else { - return null; - } - } - return currentBuffer; - } - - private ByteBuffer serEntity(Entity entity) throws SerializerException { - try { - CircleStreamBuffer buffer = new CircleStreamBuffer(); - OutputStream outputStream = buffer.getOutputStream(); - JsonGenerator json = new JsonFactory().createGenerator(outputStream); - jsonSerializer.writeEntity(metadata, entityType, entity, null, - options == null ? null : options.getExpand(), - options == null ? null : options.getSelect(), - options != null && options.getWriteOnlyReferences(), - json); - - json.close(); - outputStream.close(); - return buffer.getBuffer(); - } catch (final IOException e) { - return ByteBuffer.wrap(("ERROR" + e.getMessage()).getBytes()); - } - } - - - @Override - public boolean isOpen() { - return false; - } - - @Override - public void close() throws IOException { - - } - } - -// @Override -// public InputStream getContent() { -// return Channels.newInputStream(this.channel); -// } - - @Override - public ReadableByteChannel getChannel() { - return this.channel; - } - - @Override - public boolean isWriteSupported() { - return true; - } - - @Override - public void write(WritableByteChannel writeChannel) { - try { - boolean contentAvailable = true; - while(contentAvailable) { - contentAvailable = this.channel.write(Channels.newOutputStream(writeChannel)); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void write(WritableByteChannel channel, WriteContentErrorCallback callback) { - // TODO: implement error handling - throw new ODataRuntimeException("error handling not yet supported"); - } - - private ChannelSerializerResult(StreamChannel channel) { - this.channel = channel; - } - - public static SerializerResultBuilder with(EntityIterator coll, EdmEntityType entityType, - ODataJsonStreamSerializer jsonSerializer, - ServiceMetadata metadata, EntitySerializerOptions options) { - return new SerializerResultBuilder(coll, entityType, jsonSerializer, metadata, options); - } - - public static class SerializerResultBuilder { - private ODataJsonStreamSerializer jsonSerializer; - private EntityIterator coll; - private ServiceMetadata metadata; - private EdmEntityType entityType; - private EntitySerializerOptions options; - private String head; - private String tail; - - public SerializerResultBuilder(EntityIterator coll, EdmEntityType entityType, - ODataJsonStreamSerializer jsonSerializer, - ServiceMetadata metadata, EntitySerializerOptions options) { - this.coll = coll; - this.entityType = entityType; - this.jsonSerializer = jsonSerializer; - this.metadata = metadata; - this.options = options; - } - - public SerializerResultBuilder addHead(String head) { - this.head = head; - return this; - } - - public SerializerResultBuilder addTail(String tail) { - this.tail = tail; - return this; - } - - public ODataContent buildContent() { - StreamChannel input = new StreamChannel(coll, entityType, head, jsonSerializer, metadata, options, tail); - return new ChannelSerializerResult(input); - } - public SerializerResult build() { - StreamChannel input = new StreamChannel(coll, entityType, head, jsonSerializer, metadata, options, tail); - return SerializerResultImpl.with().content(new ChannelSerializerResult(input)).build(); - } - } -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerResultImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerResultImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerResultImpl.java index 310cc5d..8c69f18 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerResultImpl.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerResultImpl.java @@ -20,6 +20,8 @@ package org.apache.olingo.server.core.serializer; import org.apache.olingo.server.api.ODataContent; import org.apache.olingo.server.api.serializer.SerializerResult; +import org.apache.olingo.server.api.serializer.SerializerStreamResult; +import org.apache.olingo.server.core.ODataBasicContent; import org.apache.olingo.server.core.serializer.utils.ResultHelper; import java.io.InputStream; @@ -38,6 +40,9 @@ public class SerializerResultImpl implements SerializerResult { @Override public ODataContent getODataContent() { + if(oDataContent == null && content != null) { + return new ODataBasicContent(content); + } return oDataContent; } http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerStreamResultImpl.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerStreamResultImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerStreamResultImpl.java new file mode 100644 index 0000000..14fab97 --- /dev/null +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/SerializerStreamResultImpl.java @@ -0,0 +1,67 @@ +/* + * 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.server.core.serializer; + +import java.io.InputStream; + +import org.apache.olingo.server.api.ODataContent; +import org.apache.olingo.server.api.serializer.SerializerResult; +import org.apache.olingo.server.api.serializer.SerializerStreamResult; + +public class SerializerStreamResultImpl implements SerializerStreamResult { + private InputStream content; + private ODataContent oDataContent; + + @Override + public ODataContent getODataContent() { + return oDataContent; + } + + // @Override +// public ReadableByteChannel getChannel() { +// return Channels.newChannel(getContent()); +// } +// +// @Override +// public void write(WritableByteChannel channel) { +// ResultHelper.copy(Channels.newChannel(content), channel); +// } +// +// @Override +// public boolean isWriteSupported() { +// return false; +// } + + public static SerializerResultBuilder with() { + return new SerializerResultBuilder(); + } + + public static class SerializerResultBuilder { + private SerializerStreamResultImpl result = new SerializerStreamResultImpl(); + + public SerializerResultBuilder content(final ODataContent content) { + result.oDataContent = content; + return this; + } + + public SerializerStreamResult build() { + return result; + } + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java index c381760..42e0025 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonSerializer.java @@ -18,8 +18,10 @@ */ package org.apache.olingo.server.core.serializer.json; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.nio.charset.Charset; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -30,6 +32,7 @@ import org.apache.olingo.commons.api.data.ComplexValue; import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.AbstractEntityCollection; +import org.apache.olingo.commons.api.data.EntityIterator; import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Linked; import org.apache.olingo.commons.api.data.Property; @@ -57,11 +60,13 @@ import org.apache.olingo.server.api.serializer.ReferenceCollectionSerializerOpti import org.apache.olingo.server.api.serializer.ReferenceSerializerOptions; import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.serializer.SerializerResult; +import org.apache.olingo.server.api.serializer.SerializerStreamResult; import org.apache.olingo.server.api.uri.UriHelper; import org.apache.olingo.server.api.uri.queryoption.ExpandItem; import org.apache.olingo.server.api.uri.queryoption.ExpandOption; import org.apache.olingo.server.api.uri.queryoption.SelectOption; import org.apache.olingo.server.core.serializer.AbstractODataSerializer; +import org.apache.olingo.server.core.ODataWritableContent; import org.apache.olingo.server.core.serializer.SerializerResultImpl; import org.apache.olingo.server.core.serializer.utils.CircleStreamBuffer; import org.apache.olingo.server.core.serializer.utils.ContentTypeHelper; @@ -176,6 +181,53 @@ public class ODataJsonSerializer extends AbstractODataSerializer { } @Override + public SerializerStreamResult entityCollectionStreamed(ServiceMetadata metadata, EdmEntityType entityType, + EntityIterator entities, EntityCollectionSerializerOptions options) throws SerializerException { + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + SerializerException cachedException = null; + try { + JsonGenerator json = new JsonFactory().createGenerator(outputStream); + json.writeStartObject(); + + final ContextURL contextURL = checkContextURL(options == null ? null : options.getContextURL()); + writeContextURL(contextURL, json); + + writeMetadataETag(metadata, json); + + if (options != null && options.getCount() != null && options.getCount().getValue()) { + writeCount(entities, json); + } + json.writeFieldName(Constants.VALUE); + json.writeStartArray(); + json.close(); + outputStream.close(); + String temp = new String(outputStream.toByteArray(), Charset.forName("UTF-8")); + String head = temp.substring(0, temp.length()-2); + + outputStream = new ByteArrayOutputStream(); + outputStream.write(']'); + outputStream.write('}'); + outputStream.close(); + String tail = new String(outputStream.toByteArray(), Charset.forName("UTF-8")); + + EntitySerializerOptions.Builder opt = EntitySerializerOptions.with(); + if(options != null) { + opt.expand(options.getExpand()).select(options + .getSelect()).writeOnlyReferences(options.getWriteOnlyReferences()); + } + return ODataWritableContent.with(entities, entityType, this, metadata, opt.build()) + .addHead(head).addTail(tail).build(); + } catch (final IOException e) { + cachedException = + new SerializerException(IO_EXCEPTION_TEXT, e, SerializerException.MessageKeys.IO_EXCEPTION); + throw cachedException; + } finally { + closeCircleStreamBufferOutput(outputStream, cachedException); + } + } + + @Override public SerializerResult entity(final ServiceMetadata metadata, final EdmEntityType entityType, final Entity entity, final EntitySerializerOptions options) throws SerializerException { OutputStream outputStream = null; @@ -229,9 +281,9 @@ public class ODataJsonSerializer extends AbstractODataSerializer { json.writeEndArray(); } - protected void writeEntity(final ServiceMetadata metadata, final EdmEntityType entityType, - final Entity entity, final ContextURL contextURL, final ExpandOption expand, - final SelectOption select, final boolean onlyReference, final JsonGenerator json) + public void writeEntity(final ServiceMetadata metadata, final EdmEntityType entityType, final Entity entity, + final ContextURL contextURL, final ExpandOption expand, final SelectOption select, final boolean onlyReference, + final JsonGenerator json) throws IOException, SerializerException { json.writeStartObject(); if (!isODataMetadataNone) { http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonStreamSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonStreamSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonStreamSerializer.java deleted file mode 100644 index 4cced29..0000000 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/json/ODataJsonStreamSerializer.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * 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.server.core.serializer.json; - -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonGenerator; -import org.apache.olingo.commons.api.Constants; -import org.apache.olingo.commons.api.data.AbstractEntityCollection; -import org.apache.olingo.commons.api.data.ContextURL; -import org.apache.olingo.commons.api.data.Entity; -import org.apache.olingo.commons.api.data.EntityIterator; -import org.apache.olingo.commons.api.edm.EdmEntityType; -import org.apache.olingo.commons.api.format.ContentType; -import org.apache.olingo.server.api.ServiceMetadata; -import org.apache.olingo.server.api.serializer.EntityCollectionSerializerOptions; -import org.apache.olingo.server.api.serializer.EntitySerializerOptions; -import org.apache.olingo.server.api.serializer.SerializerException; -import org.apache.olingo.server.api.serializer.SerializerResult; -import org.apache.olingo.server.api.uri.queryoption.ExpandOption; -import org.apache.olingo.server.api.uri.queryoption.SelectOption; -import org.apache.olingo.server.core.serializer.ChannelSerializerResult; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.charset.Charset; - -public class ODataJsonStreamSerializer extends ODataJsonSerializer { - - private final ODataJsonSerializer serializer; - - public ODataJsonStreamSerializer(final ContentType contentType) { - super(contentType); - this.serializer = new ODataJsonSerializer(contentType); - } - - @Override - public SerializerResult entityCollection(final ServiceMetadata metadata, - final EdmEntityType entityType, final AbstractEntityCollection entitySet, - final EntityCollectionSerializerOptions options) throws SerializerException { - - EntityIterator coll; - if(entitySet instanceof EntityIterator) { - coll = (EntityIterator) entitySet; - } else { - return serializer.entityCollection(metadata, entityType, entitySet, options); - } - - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - SerializerException cachedException = null; - try { - JsonGenerator json = new JsonFactory().createGenerator(outputStream); - json.writeStartObject(); - - final ContextURL contextURL = serializer.checkContextURL(options == null ? null : options.getContextURL()); - serializer.writeContextURL(contextURL, json); - - serializer.writeMetadataETag(metadata, json); - - if (options != null && options.getCount() != null && options.getCount().getValue()) { - serializer.writeCount(entitySet, json); - } - json.writeFieldName(Constants.VALUE); - json.writeStartArray(); - json.close(); - outputStream.close(); - String temp = new String(outputStream.toByteArray(), Charset.forName("UTF-8")); - String head = temp.substring(0, temp.length()-2); - // if (options == null) { -// writeEntitySet(metadata, entityType, entitySet, null, null, false, json); -// } else { -// writeEntitySet(metadata, entityType, entitySet, -// options.getExpand(), options.getSelect(), options.getWriteOnlyReferences(), json); -// } - - outputStream = new ByteArrayOutputStream(); - outputStream.write(']'); - outputStream.write('}'); - outputStream.close(); - String tail = new String(outputStream.toByteArray(), Charset.forName("UTF-8")); - - EntitySerializerOptions.Builder opt = EntitySerializerOptions.with(); - if(options != null) { - opt.expand(options.getExpand()).select(options - .getSelect()).writeOnlyReferences(options.getWriteOnlyReferences()); - } -// return StreamSerializerResult.with(coll, entityType, this, metadata, opt.build()) -// .addHead(head).addTail(tail).build(); - return ChannelSerializerResult.with(coll, entityType, this, metadata, opt.build()) - .addHead(head).addTail(tail).build(); - } catch (final IOException e) { - cachedException = - new SerializerException(IO_EXCEPTION_TEXT, e, SerializerException.MessageKeys.IO_EXCEPTION); - throw cachedException; - } finally { - closeCircleStreamBufferOutput(outputStream, cachedException); - } - } - - @Override - public void writeEntity(final ServiceMetadata metadata, final EdmEntityType entityType, - final Entity entity, final ContextURL contextURL, final ExpandOption expand, - final SelectOption select, final boolean onlyReference, final JsonGenerator json) - throws IOException, SerializerException { - serializer.writeEntity(metadata, entityType, entity, contextURL, expand, select, onlyReference, json); - } - -// @Override -// public SerializerResult entity(final ServiceMetadata metadata, final EdmEntityType entityType, -// final Entity entity, final EntitySerializerOptions options) throws SerializerException { -// return serializer.entity(metadata, entityType, entity, options); -// } - -// protected void writeEntitySet(final ServiceMetadata metadata, final EdmEntityType entityType, -// final EntityCollection entitySet, final ExpandOption expand, final SelectOption select, -// final boolean onlyReference, final JsonGenerator json) throws IOException, -// SerializerException { -// -// json.writeStartArray(); -// json.writeEndArray(); -// - // json.writeStartArray(); -// for (final Entity entity : entitySet.getEntities()) { -// if (onlyReference) { -// json.writeStartObject(); -// json.writeStringField(Constants.JSON_ID, entity.getId().toASCIIString()); -// json.writeEndObject(); -// } else { -// serializer.writeEntity(metadata, entityType, entity, null, expand, select, false, json); -// } -// } -// json.writeEndArray(); -// } - -} http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java ---------------------------------------------------------------------- diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java index b3d9d5d..5454007 100644 --- a/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java +++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/xml/ODataXmlSerializer.java @@ -36,6 +36,7 @@ import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.EntityCollection; import org.apache.olingo.commons.api.data.AbstractEntityCollection; +import org.apache.olingo.commons.api.data.EntityIterator; import org.apache.olingo.commons.api.data.Link; import org.apache.olingo.commons.api.data.Linked; import org.apache.olingo.commons.api.data.Property; @@ -52,6 +53,7 @@ import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.commons.api.edm.FullQualifiedName; import org.apache.olingo.commons.api.edm.constants.EdmTypeKind; import org.apache.olingo.commons.api.ex.ODataErrorDetail; +import org.apache.olingo.commons.api.ex.ODataRuntimeException; import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory; import org.apache.olingo.server.api.ODataServerError; import org.apache.olingo.server.api.ServiceMetadata; @@ -63,6 +65,7 @@ import org.apache.olingo.server.api.serializer.ReferenceCollectionSerializerOpti import org.apache.olingo.server.api.serializer.ReferenceSerializerOptions; import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.serializer.SerializerResult; +import org.apache.olingo.server.api.serializer.SerializerStreamResult; import org.apache.olingo.server.api.uri.queryoption.ExpandItem; import org.apache.olingo.server.api.uri.queryoption.ExpandOption; import org.apache.olingo.server.api.uri.queryoption.SelectOption; @@ -279,6 +282,12 @@ public class ODataXmlSerializer extends AbstractODataSerializer { } @Override + public SerializerStreamResult entityCollectionStreamed(ServiceMetadata metadata, EdmEntityType entityType, + EntityIterator entities, EntityCollectionSerializerOptions options) throws SerializerException { + throw new ODataRuntimeException("entityCollectionStreamed for XML not supported (yet)"); + } + + @Override public SerializerResult entity(final ServiceMetadata metadata, final EdmEntityType entityType, final Entity entity, final EntitySerializerOptions options) throws SerializerException { final ContextURL contextURL = checkContextURL(options == null ? null : options.getContextURL()); http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/dc2c972c/lib/server-tecsvc/src/main/java/org/apache/olingo/server/tecsvc/processor/TechnicalEntityProcessor.java ---------------------------------------------------------------------- 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 2c3c766..9241860 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 @@ -39,6 +39,7 @@ import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpMethod; import org.apache.olingo.commons.api.http.HttpStatusCode; import org.apache.olingo.server.api.ODataApplicationException; +import org.apache.olingo.server.api.ODataContent; import org.apache.olingo.server.api.ODataLibraryException; import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataResponse; @@ -58,6 +59,7 @@ import org.apache.olingo.server.api.serializer.EntitySerializerOptions; import org.apache.olingo.server.api.serializer.ReferenceCollectionSerializerOptions; import org.apache.olingo.server.api.serializer.ReferenceSerializerOptions; import org.apache.olingo.server.api.serializer.SerializerResult; +import org.apache.olingo.server.api.serializer.SerializerStreamResult; import org.apache.olingo.server.api.uri.UriInfo; import org.apache.olingo.server.api.uri.UriResourceEntitySet; import org.apache.olingo.server.api.uri.UriResourceNavigation; @@ -526,22 +528,18 @@ public class TechnicalEntityProcessor extends TechnicalProcessor id = request.getRawBaseUri() + edmEntitySet.getName(); } - // Serialize -// final SerializerResult serializerResult = (isReference) ? -// serializeReferenceCollection(entitySetSerialization, edmEntitySet, requestedContentType, countOption) : -// serializeEntityCollection(request, entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType, -// expand, select, countOption, id); - final SerializerResult serializerResult = (isReference) ? - serializeReferenceCollection(entitySetSerialization, edmEntitySet, requestedContentType, countOption) : - serializeEntityStreamCollectionFixed(request, - entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType, - expand, select, countOption, id); -// if(serializerResult.isWriteSupported()) { -// response.setChannel(serializerResult.getChannel()); -// } else { -// response.setContent(serializerResult.getContent()); -// } - response.setODataContent(serializerResult.getODataContent()); + if(isReference) { + final SerializerResult serializerResult = + serializeReferenceCollection(entitySetSerialization, edmEntitySet, requestedContentType, countOption); + response.setODataContent(serializerResult.getODataContent()); + } else { + final SerializerStreamResult serializerResult = + serializeEntityStreamCollectionFixed(request, + entitySetSerialization, edmEntitySet, edmEntityType, requestedContentType, + expand, select, countOption, id); + + response.setODataContent(serializerResult.getODataContent()); + } // response.setStatusCode(HttpStatusCode.OK.getStatusCode()); response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString()); @@ -552,7 +550,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor } // just for demonstration - private SerializerResult serializeEntityStreamCollectionFixed(final ODataRequest request, + private SerializerStreamResult serializeEntityStreamCollectionFixed(final ODataRequest request, final EntityCollection entityCollection, final EdmEntitySet edmEntitySet, final EdmEntityType edmEntityType, final ContentType requestedFormat, final ExpandOption expand, final SelectOption select, @@ -630,7 +628,7 @@ public class TechnicalEntityProcessor extends TechnicalProcessor }; - return odata.createSerializer(requestedFormat).entityCollection( + return odata.createSerializer(requestedFormat).entityCollectionStreamed( serviceMetadata, edmEntityType, streamCollection,
