[OLINGO-832] Added new SerializerStreamResult
This commit is contained in:
parent
31dea712ef
commit
dc2c972c46
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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)) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
// }
|
||||
|
||||
}
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue