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 57370ba09..432e1de07 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; @@ -63,6 +64,16 @@ public interface ODataSerializer { SerializerResult entityCollection(ServiceMetadata metadata, EdmEntityType entityType, 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 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 000000000..c0dbafaf1 --- /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(); +} 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 000000000..03328f46f --- /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; + } +} 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 c056b45aa..4c2642cfd 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)) { 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/ODataWritableContent.java similarity index 82% rename from lib/server-core/src/main/java/org/apache/olingo/server/core/serializer/ChannelSerializerResult.java rename to lib/server-core/src/main/java/org/apache/olingo/server/core/ODataWritableContent.java index 1e97731e6..fc456392a 100644 --- 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/ODataWritableContent.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.olingo.server.core.serializer; +package org.apache.olingo.server.core; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; @@ -29,12 +29,12 @@ 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.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.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; @@ -42,21 +42,21 @@ import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; -public class ChannelSerializerResult implements ODataContent { +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 ODataJsonStreamSerializer jsonSerializer; + private ODataJsonSerializer 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, + ODataJsonSerializer jsonSerializer, ServiceMetadata metadata, EntitySerializerOptions options, String tail) { this.coll = coll; this.entityType = entityType; @@ -217,52 +217,51 @@ public class ChannelSerializerResult implements ODataContent { throw new ODataRuntimeException("error handling not yet supported"); } - private ChannelSerializerResult(StreamChannel channel) { + private ODataWritableContent(StreamChannel channel) { this.channel = channel; } - public static SerializerResultBuilder with(EntityIterator coll, EdmEntityType entityType, - ODataJsonStreamSerializer jsonSerializer, + public static ODataWritableContentBuilder with(EntityIterator coll, EdmEntityType entityType, + ODataJsonSerializer jsonSerializer, ServiceMetadata metadata, EntitySerializerOptions options) { - return new SerializerResultBuilder(coll, entityType, jsonSerializer, metadata, options); + return new ODataWritableContentBuilder(coll, entityType, jsonSerializer, metadata, options); } - public static class SerializerResultBuilder { - private ODataJsonStreamSerializer jsonSerializer; - private EntityIterator coll; + 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 SerializerResultBuilder(EntityIterator coll, EdmEntityType entityType, - ODataJsonStreamSerializer jsonSerializer, + public ODataWritableContentBuilder(EntityIterator entities, EdmEntityType entityType, + ODataJsonSerializer jsonSerializer, ServiceMetadata metadata, EntitySerializerOptions options) { - this.coll = coll; + this.entities = entities; this.entityType = entityType; this.jsonSerializer = jsonSerializer; this.metadata = metadata; this.options = options; } - public SerializerResultBuilder addHead(String head) { + public ODataWritableContentBuilder addHead(String head) { this.head = head; return this; } - public SerializerResultBuilder addTail(String tail) { + public ODataWritableContentBuilder 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); + StreamChannel input = new StreamChannel(entities, entityType, head, jsonSerializer, metadata, options, tail); + return new ODataWritableContent(input); } - public SerializerResult build() { - StreamChannel input = new StreamChannel(coll, entityType, head, jsonSerializer, metadata, options, tail); - return SerializerResultImpl.with().content(new ChannelSerializerResult(input)).build(); + public SerializerStreamResult build() { + return SerializerStreamResultImpl.with().content(buildContent()).build(); } } } 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 310cc5daf..8c69f1824 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; } 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 000000000..14fab9741 --- /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; + } + } +} 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 c38176086..42e0025cd 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; @@ -175,6 +180,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 { @@ -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) { 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 4cced29e1..000000000 --- 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(); -// } - -} 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 b3d9d5d44..545400715 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; @@ -278,6 +281,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 { 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 2c3c7669a..92418609b 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,