[OLINGO-832] Added new SerializerStreamResult

This commit is contained in:
Michael Bolz 2016-02-09 11:00:34 +01:00
parent 31dea712ef
commit dc2c972c46
11 changed files with 282 additions and 201 deletions

View File

@ -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

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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)) {

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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;
}
}
}

View File

@ -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) {

View File

@ -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();
// }
}

View File

@ -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 {

View File

@ -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,