[OLINGO-444] Merge into master
This commit is contained in:
commit
6fbdb78345
|
@ -31,7 +31,7 @@ import org.apache.olingo.server.api.uri.UriInfo;
|
|||
public interface EntityProcessor extends Processor {
|
||||
|
||||
/**
|
||||
* Reads entity data from persistency and puts serialized content and status into the response.
|
||||
* Reads entity data from persistence and puts serialized content and status into the response.
|
||||
* @param request - OData request object containing raw HTTP information
|
||||
* @param response - OData response object for collecting response data
|
||||
* @param uriInfo - information of a parsed OData URI
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* 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.processor;
|
||||
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
import org.apache.olingo.server.api.ODataApplicationException;
|
||||
import org.apache.olingo.server.api.ODataRequest;
|
||||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
import org.apache.olingo.server.api.uri.UriInfo;
|
||||
|
||||
/**
|
||||
* Processor interface for handling a property of an entity.
|
||||
*/
|
||||
public interface PropertyProcessor extends Processor {
|
||||
|
||||
/**
|
||||
* Reads primitive or complex property from entity.
|
||||
* If the property is single-valued and has the null value, the service responds with 204 No Content.
|
||||
* If the property is not available, for example due to permissions, the service responds with 404 Not Found
|
||||
*
|
||||
* @param request - OData request object containing raw HTTP information
|
||||
* @param response - OData response object for collecting response data
|
||||
* @param uriInfo - information of a parsed OData URI
|
||||
* @param format - requested content type after content negotiation
|
||||
* @throws ODataApplicationException if service implementation encounters a failure
|
||||
* @throws SerializerException if serialization failed
|
||||
*/
|
||||
void readProperty(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType format)
|
||||
throws ODataApplicationException, SerializerException;
|
||||
|
||||
/**
|
||||
* Reads value for primitive property from entity.
|
||||
* If the property is single-valued and has the null value, the service responds with 204 No Content.
|
||||
* If the property is not available, for example due to permissions, the service responds with 404 Not Found
|
||||
*
|
||||
* @param request - OData request object containing raw HTTP information
|
||||
* @param response - OData response object for collecting response data
|
||||
* @param uriInfo - information of a parsed OData URI
|
||||
* @param format - requested content type after content negotiation
|
||||
* @throws ODataApplicationException if service implementation encounters a failure
|
||||
* @throws SerializerException if serialization failed
|
||||
*/
|
||||
void readPropertyValue(ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType format)
|
||||
throws ODataApplicationException, SerializerException;
|
||||
}
|
|
@ -22,8 +22,10 @@ import java.io.InputStream;
|
|||
|
||||
import org.apache.olingo.commons.api.data.Entity;
|
||||
import org.apache.olingo.commons.api.data.EntitySet;
|
||||
import org.apache.olingo.commons.api.data.Property;
|
||||
import org.apache.olingo.commons.api.edm.Edm;
|
||||
import org.apache.olingo.commons.api.edm.EdmEntitySet;
|
||||
import org.apache.olingo.commons.api.edm.EdmProperty;
|
||||
import org.apache.olingo.server.api.ODataServerError;
|
||||
import org.apache.olingo.server.api.uri.queryoption.ExpandOption;
|
||||
import org.apache.olingo.server.api.uri.queryoption.SelectOption;
|
||||
|
@ -56,6 +58,15 @@ public interface ODataSerializer {
|
|||
InputStream entity(EdmEntitySet edmEntitySet, Entity entity, ODataSerializerOptions options)
|
||||
throws SerializerException;
|
||||
|
||||
/**
|
||||
* Writes entity data into an InputStream.
|
||||
* @param edmProperty property definition
|
||||
* @param property property value
|
||||
* @param options options for the serializer
|
||||
*/
|
||||
InputStream entityProperty(EdmProperty edmProperty, Property property, ODataSerializerOptions options)
|
||||
throws SerializerException;
|
||||
|
||||
/**
|
||||
* Writes entity-set data into an InputStream.
|
||||
* @param edmEntitySet the {@link EdmEntitySet}
|
||||
|
|
|
@ -39,6 +39,7 @@ import org.apache.olingo.server.api.processor.EntityProcessor;
|
|||
import org.apache.olingo.server.api.processor.ExceptionProcessor;
|
||||
import org.apache.olingo.server.api.processor.MetadataProcessor;
|
||||
import org.apache.olingo.server.api.processor.Processor;
|
||||
import org.apache.olingo.server.api.processor.PropertyProcessor;
|
||||
import org.apache.olingo.server.api.processor.ServiceDocumentProcessor;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
import org.apache.olingo.server.api.uri.UriInfo;
|
||||
|
@ -177,7 +178,6 @@ public class ODataHandler {
|
|||
SerializerException {
|
||||
int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
|
||||
UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
|
||||
ContentType requestedContentType = null;
|
||||
|
||||
switch (lastPathSegment.getKind()) {
|
||||
case entitySet:
|
||||
|
@ -245,6 +245,31 @@ public class ODataHandler {
|
|||
ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||
}
|
||||
break;
|
||||
case primitiveProperty:
|
||||
case complexProperty:
|
||||
if (request.getMethod().equals(HttpMethod.GET)) {
|
||||
PropertyProcessor ep = selectProcessor(PropertyProcessor.class);
|
||||
|
||||
requestedContentType =
|
||||
ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, ep, PropertyProcessor.class);
|
||||
|
||||
ep.readProperty(request, response, uriInfo, requestedContentType);
|
||||
} else {
|
||||
throw new ODataHandlerException("not implemented",
|
||||
ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||
}
|
||||
break;
|
||||
case value:
|
||||
if (request.getMethod().equals(HttpMethod.GET)) {
|
||||
PropertyProcessor ep = selectProcessor(PropertyProcessor.class);
|
||||
requestedContentType =
|
||||
ContentNegotiator.doContentNegotiation(uriInfo.getFormatOption(), request, ep, PropertyProcessor.class);
|
||||
ep.readPropertyValue(request, response, uriInfo, requestedContentType);
|
||||
} else {
|
||||
throw new ODataHandlerException("not implemented",
|
||||
ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ODataHandlerException("not implemented",
|
||||
ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
|
||||
|
|
|
@ -26,8 +26,10 @@ import javax.xml.stream.XMLStreamWriter;
|
|||
|
||||
import org.apache.olingo.commons.api.data.Entity;
|
||||
import org.apache.olingo.commons.api.data.EntitySet;
|
||||
import org.apache.olingo.commons.api.data.Property;
|
||||
import org.apache.olingo.commons.api.edm.Edm;
|
||||
import org.apache.olingo.commons.api.edm.EdmEntitySet;
|
||||
import org.apache.olingo.commons.api.edm.EdmProperty;
|
||||
import org.apache.olingo.server.api.ODataServerError;
|
||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
|
@ -106,4 +108,11 @@ public class ODataXmlSerializerImpl implements ODataSerializer {
|
|||
final ExpandOption expand, final SelectOption select) throws SerializerException {
|
||||
return ContextURLHelper.buildSelectList(edmEntitySet.getEntityType(), expand, select);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream entityProperty(EdmProperty edmProperty, Property property,
|
||||
ODataSerializerOptions options) throws SerializerException{
|
||||
throw new SerializerException("error serialization not implemented for XML format",
|
||||
SerializerException.MessageKeys.NOT_IMPLEMENTED);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -133,15 +133,13 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
try {
|
||||
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
|
||||
json.writeStartObject();
|
||||
if (format != ODataFormat.JSON_NO_METADATA) {
|
||||
if (options == null || options.getContextURL() == null) {
|
||||
throw new SerializerException("ContextURL null!",
|
||||
SerializerException.MessageKeys.NO_CONTEXT_URL);
|
||||
} else {
|
||||
json.writeStringField(Constants.JSON_CONTEXT,
|
||||
ContextURLBuilder.create(options.getContextURL()).toASCIIString());
|
||||
}
|
||||
|
||||
final ContextURL contextURL = checkContextURL(options);
|
||||
if (contextURL != null) {
|
||||
json.writeStringField(Constants.JSON_CONTEXT,
|
||||
ContextURLBuilder.create(contextURL).toASCIIString());
|
||||
}
|
||||
|
||||
if (options != null && options.getCount() != null && options.getCount().getValue()
|
||||
&& entitySet.getCount() != null) {
|
||||
json.writeNumberField(Constants.JSON_COUNT, entitySet.getCount());
|
||||
|
@ -163,11 +161,7 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
@Override
|
||||
public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity,
|
||||
final ODataSerializerOptions options) throws SerializerException {
|
||||
final ContextURL contextURL = options == null ? null : options.getContextURL();
|
||||
if (format != ODataFormat.JSON_NO_METADATA && contextURL == null) {
|
||||
throw new SerializerException("ContextURL null!",
|
||||
SerializerException.MessageKeys.NO_CONTEXT_URL);
|
||||
}
|
||||
final ContextURL contextURL = checkContextURL(options);
|
||||
CircleStreamBuffer buffer = new CircleStreamBuffer();
|
||||
try {
|
||||
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
|
||||
|
@ -181,6 +175,19 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
return buffer.getInputStream();
|
||||
}
|
||||
|
||||
private ContextURL checkContextURL(final ODataSerializerOptions options)
|
||||
throws SerializerException {
|
||||
ContextURL contextURL = options == null ? null : options.getContextURL();
|
||||
if (format != ODataFormat.JSON_NO_METADATA && contextURL == null) {
|
||||
throw new SerializerException("ContextURL null!",
|
||||
SerializerException.MessageKeys.NO_CONTEXT_URL);
|
||||
}
|
||||
if (format == ODataFormat.JSON_NO_METADATA) {
|
||||
contextURL = null;
|
||||
}
|
||||
return contextURL;
|
||||
}
|
||||
|
||||
protected void writeEntitySet(final EdmEntityType entityType, final EntitySet entitySet,
|
||||
final ExpandOption expand, final SelectOption select, final JsonGenerator json)
|
||||
throws IOException, SerializerException {
|
||||
|
@ -288,24 +295,30 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
json.writeNull();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
if (edmProperty.isCollection()) {
|
||||
writeCollection(edmProperty, property, selectedPaths, json);
|
||||
} else if (edmProperty.isPrimitive()) {
|
||||
writePrimitive(edmProperty, property, json);
|
||||
} else if (property.isLinkedComplex()) {
|
||||
writeComplexValue(edmProperty, property.asLinkedComplex().getValue(), selectedPaths, json);
|
||||
} else if (property.isComplex()) {
|
||||
writeComplexValue(edmProperty, property.asComplex(), selectedPaths, json);
|
||||
} else {
|
||||
throw new SerializerException("Property type not yet supported!",
|
||||
SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
||||
}
|
||||
} catch (final EdmPrimitiveTypeException e) {
|
||||
throw new SerializerException("Wrong value for property!", e,
|
||||
SerializerException.MessageKeys.WRONG_PROPERTY_VALUE,
|
||||
edmProperty.getName(), property.getValue().toString());
|
||||
writePropertyValue(edmProperty, property, selectedPaths, json);
|
||||
}
|
||||
}
|
||||
|
||||
private void writePropertyValue(final EdmProperty edmProperty,
|
||||
final Property property, final Set<List<String>> selectedPaths,
|
||||
final JsonGenerator json) throws IOException, SerializerException {
|
||||
try {
|
||||
if (edmProperty.isCollection()) {
|
||||
writeCollection(edmProperty, property, selectedPaths, json);
|
||||
} else if (edmProperty.isPrimitive()) {
|
||||
writePrimitive(edmProperty, property, json);
|
||||
} else if (property.isLinkedComplex()) {
|
||||
writeComplexValue(edmProperty, property.asLinkedComplex().getValue(), selectedPaths, json);
|
||||
} else if (property.isComplex()) {
|
||||
writeComplexValue(edmProperty, property.asComplex(), selectedPaths, json);
|
||||
} else {
|
||||
throw new SerializerException("Property type not yet supported!",
|
||||
SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName());
|
||||
}
|
||||
} catch (final EdmPrimitiveTypeException e) {
|
||||
throw new SerializerException("Wrong value for property!", e,
|
||||
SerializerException.MessageKeys.WRONG_PROPERTY_VALUE,
|
||||
edmProperty.getName(), property.getValue().toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,8 +391,15 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
protected void writeComplexValue(final EdmProperty edmProperty, final List<Property> properties,
|
||||
final Set<List<String>> selectedPaths, JsonGenerator json)
|
||||
throws IOException, EdmPrimitiveTypeException, SerializerException {
|
||||
final EdmComplexType type = (EdmComplexType) edmProperty.getType();
|
||||
json.writeStartObject();
|
||||
writePropertyValues(edmProperty, properties, selectedPaths, json);
|
||||
json.writeEndObject();
|
||||
}
|
||||
|
||||
private void writePropertyValues(final EdmProperty edmProperty,
|
||||
final List<Property> properties, final Set<List<String>> selectedPaths,
|
||||
JsonGenerator json) throws IOException, SerializerException {
|
||||
final EdmComplexType type = (EdmComplexType) edmProperty.getType();
|
||||
for (final String propertyName : type.getPropertyNames()) {
|
||||
final Property property = findProperty(propertyName, properties);
|
||||
if (selectedPaths == null || ExpandSelectHelper.isSelected(selectedPaths, propertyName)) {
|
||||
|
@ -388,7 +408,6 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
json);
|
||||
}
|
||||
}
|
||||
json.writeEndObject();
|
||||
}
|
||||
|
||||
private Property findProperty(final String propertyName, final List<Property> properties) {
|
||||
|
@ -405,4 +424,38 @@ public class ODataJsonSerializer implements ODataSerializer {
|
|||
final ExpandOption expand, final SelectOption select) throws SerializerException {
|
||||
return ContextURLHelper.buildSelectList(edmEntitySet.getEntityType(), expand, select);
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream entityProperty(EdmProperty edmProperty,
|
||||
Property property, ODataSerializerOptions options)
|
||||
throws SerializerException {
|
||||
final ContextURL contextURL = checkContextURL(options);
|
||||
CircleStreamBuffer buffer = new CircleStreamBuffer();
|
||||
try {
|
||||
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
|
||||
json.writeStartObject();
|
||||
if (format != ODataFormat.JSON_NO_METADATA) {
|
||||
if (contextURL != null) {
|
||||
json.writeStringField(Constants.JSON_CONTEXT, ContextURLBuilder.create(contextURL).toASCIIString());
|
||||
}
|
||||
}
|
||||
if (property.isPrimitive() && property.isNull()) {
|
||||
throw new SerializerException("Property value can not be null",
|
||||
SerializerException.MessageKeys.NULL_INPUT);
|
||||
} else if (property.isComplex() && !property.isNull()) {
|
||||
writePropertyValues(edmProperty, property.asComplex(), null, json);
|
||||
} else if (property.isLinkedComplex() && !property.isNull()) {
|
||||
writePropertyValues(edmProperty, property.asLinkedComplex().getValue(), null, json);
|
||||
} else {
|
||||
json.writeFieldName(Constants.VALUE);
|
||||
writePropertyValue(edmProperty, property, null, json);
|
||||
}
|
||||
json.writeEndObject();
|
||||
json.close();
|
||||
} catch (final IOException e) {
|
||||
throw new SerializerException("An I/O exception occurred.", e,
|
||||
SerializerException.MessageKeys.IO_EXCEPTION);
|
||||
}
|
||||
return buffer.getInputStream();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,13 +19,19 @@
|
|||
package org.apache.olingo.server.core.serializer.utils;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.apache.olingo.commons.api.Constants;
|
||||
import org.apache.olingo.commons.api.data.ContextURL;
|
||||
import org.apache.olingo.commons.core.Encoder;
|
||||
|
||||
/**
|
||||
* Builder to build a context URL (as defined in the <a
|
||||
* href="http://docs.oasis-open.org/odata/odata/v4.0/os/part1-protocol/odata-v4.0-os-part1-protocol.html#_Toc372793655">
|
||||
* protocol specification</a>).
|
||||
*/
|
||||
public final class ContextURLBuilder {
|
||||
|
||||
public static final URI create(final ContextURL contextURL) {
|
||||
public static URI create(final ContextURL contextURL) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
if (contextURL.getServiceRoot() != null) {
|
||||
result.append(contextURL.getServiceRoot());
|
||||
|
@ -43,6 +49,9 @@ public final class ContextURLBuilder {
|
|||
if (contextURL.getSelectList() != null) {
|
||||
result.append('(').append(contextURL.getSelectList()).append(')');
|
||||
}
|
||||
if (contextURL.getNavOrPropertyPath() != null) {
|
||||
result.append('/').append(contextURL.getNavOrPropertyPath());
|
||||
}
|
||||
if (contextURL.isReference()) {
|
||||
if (contextURL.getEntitySetOrSingletonOrType() != null) {
|
||||
throw new IllegalArgumentException("ContextURL: $ref with Entity Set");
|
||||
|
|
|
@ -22,8 +22,12 @@ import org.apache.olingo.commons.api.data.ContextURL;
|
|||
import org.apache.olingo.commons.api.data.Entity;
|
||||
import org.apache.olingo.commons.api.data.EntitySet;
|
||||
import org.apache.olingo.commons.api.data.ContextURL.Suffix;
|
||||
import org.apache.olingo.commons.api.data.Property;
|
||||
import org.apache.olingo.commons.api.edm.Edm;
|
||||
import org.apache.olingo.commons.api.edm.EdmEntitySet;
|
||||
import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
|
||||
import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
|
||||
import org.apache.olingo.commons.api.edm.EdmProperty;
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||
|
@ -34,6 +38,7 @@ import org.apache.olingo.server.api.ODataRequest;
|
|||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.processor.EntitySetProcessor;
|
||||
import org.apache.olingo.server.api.processor.EntityProcessor;
|
||||
import org.apache.olingo.server.api.processor.PropertyProcessor;
|
||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
import org.apache.olingo.server.api.serializer.ODataSerializerOptions;
|
||||
|
@ -41,16 +46,22 @@ import org.apache.olingo.server.api.uri.UriInfo;
|
|||
import org.apache.olingo.server.api.uri.UriInfoResource;
|
||||
import org.apache.olingo.server.api.uri.UriResource;
|
||||
import org.apache.olingo.server.api.uri.UriResourceEntitySet;
|
||||
import org.apache.olingo.server.api.uri.UriResourceKind;
|
||||
import org.apache.olingo.server.api.uri.UriResourceProperty;
|
||||
import org.apache.olingo.server.api.uri.queryoption.ExpandOption;
|
||||
import org.apache.olingo.server.api.uri.queryoption.SelectOption;
|
||||
import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
|
||||
import org.apache.olingo.server.tecsvc.data.DataProvider;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
||||
/**
|
||||
* Technical Processor which provides current implemented processor functionality.
|
||||
*/
|
||||
public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor, PropertyProcessor {
|
||||
|
||||
private OData odata;
|
||||
private DataProvider dataProvider;
|
||||
|
@ -84,7 +95,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
response.setContent(serializer.entitySet(edmEntitySet, entitySet,
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
|
||||
getContextUrl(serializer, edmEntitySet, false, expand, select))
|
||||
getContextUrl(serializer, edmEntitySet, false, expand, select, null))
|
||||
.count(uriInfo.getCountOption())
|
||||
.expand(expand).select(select)
|
||||
.build()));
|
||||
|
@ -120,7 +131,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
response.setContent(serializer.entity(edmEntitySet, entity,
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
|
||||
getContextUrl(serializer, edmEntitySet, true, expand, select))
|
||||
getContextUrl(serializer, edmEntitySet, true, expand, select, null))
|
||||
.count(uriInfo.getCountOption())
|
||||
.expand(expand).select(select)
|
||||
.build()));
|
||||
|
@ -142,9 +153,9 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
EntitySet entitySet = null;
|
||||
final UriInfoResource uriResource = uriInfo.asUriInfoResource();
|
||||
final List<UriResource> resourceParts = uriResource.getUriResourceParts();
|
||||
if(isCount(resourceParts)) {
|
||||
if (isCount(resourceParts)) {
|
||||
int pos = resourceParts.size() - 2;
|
||||
if(pos >= 0) {
|
||||
if (pos >= 0) {
|
||||
final UriResourceEntitySet ur =
|
||||
(UriResourceEntitySet) uriResource.getUriResourceParts().get(pos);
|
||||
entitySet = readEntitySetInternal(ur.getEntitySet(), true);
|
||||
|
@ -165,7 +176,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
}
|
||||
|
||||
private boolean isCount(List<UriResource> resourceParts) {
|
||||
if(resourceParts.isEmpty()) {
|
||||
if (resourceParts.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
UriResource part = resourceParts.get(resourceParts.size() - 1);
|
||||
|
@ -180,7 +191,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
boolean withCount) throws DataProvider.DataProviderException {
|
||||
EntitySet entitySet = dataProvider.readAll(edmEntitySet);
|
||||
// TODO: set count (correctly) and next link
|
||||
if(withCount && entitySet.getCount() == null) {
|
||||
if (withCount && entitySet.getCount() == null) {
|
||||
entitySet.setCount(entitySet.getEntities().size());
|
||||
}
|
||||
//
|
||||
|
@ -207,14 +218,25 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
|
||||
private EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) throws ODataApplicationException {
|
||||
final List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
|
||||
if (resourcePaths.size() != 1) {
|
||||
throw new ODataApplicationException("Invalid resource path.",
|
||||
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
|
||||
}
|
||||
// first must be entity set
|
||||
if (!(resourcePaths.get(0) instanceof UriResourceEntitySet)) {
|
||||
throw new ODataApplicationException("Invalid resource type.",
|
||||
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
|
||||
}
|
||||
|
||||
List<UriResource> subResPaths = resourcePaths.subList(1, resourcePaths.size());
|
||||
for (UriResource subResPath : subResPaths) {
|
||||
UriResourceKind kind = subResPath.getKind();
|
||||
if(kind != UriResourceKind.primitiveProperty
|
||||
&& kind != UriResourceKind.complexProperty
|
||||
&& kind != UriResourceKind.count
|
||||
&& kind != UriResourceKind.value) {
|
||||
throw new ODataApplicationException("Invalid resource type.",
|
||||
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
final UriResourceEntitySet uriResource = (UriResourceEntitySet) resourcePaths.get(0);
|
||||
if (uriResource.getTypeFilterOnCollection() != null || uriResource.getTypeFilterOnEntry() != null) {
|
||||
throw new ODataApplicationException("Type filters are not supported.",
|
||||
|
@ -224,10 +246,100 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
|
|||
}
|
||||
|
||||
private ContextURL getContextUrl(final ODataSerializer serializer,
|
||||
final EdmEntitySet entitySet, final boolean isSingleEntity,
|
||||
final ExpandOption expand, final SelectOption select) throws SerializerException {
|
||||
final EdmEntitySet entitySet, final boolean isSingleEntity,
|
||||
final ExpandOption expand, final SelectOption select, final String navOrPropertyPath)
|
||||
throws SerializerException {
|
||||
|
||||
return ContextURL.with().entitySet(entitySet)
|
||||
.selectList(serializer.buildContextURLSelectList(entitySet, expand, select))
|
||||
.suffix(isSingleEntity ? Suffix.ENTITY : null).build();
|
||||
.suffix(isSingleEntity ? Suffix.ENTITY : null)
|
||||
.navOrPropertyPath(navOrPropertyPath)
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readProperty(ODataRequest request,
|
||||
ODataResponse response, UriInfo uriInfo, ContentType contentType) {
|
||||
|
||||
if (!validateOptions(uriInfo.asUriInfoResource())) {
|
||||
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
||||
return;
|
||||
}
|
||||
try {
|
||||
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
|
||||
final Entity entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
|
||||
if (entity == null) {
|
||||
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
||||
} else {
|
||||
UriResourceProperty uriProperty = (UriResourceProperty) uriInfo
|
||||
.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 1);
|
||||
EdmProperty edmProperty = uriProperty.getProperty();
|
||||
Property property = entity.getProperty(edmProperty.getName());
|
||||
if (property == null) {
|
||||
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
||||
} else {
|
||||
if (property.getValue() == null) {
|
||||
response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
|
||||
} else {
|
||||
final ODataFormat format = ODataFormat.fromContentType(contentType);
|
||||
ODataSerializer serializer = odata.createSerializer(format);
|
||||
response.setContent(serializer.entityProperty(edmProperty, property,
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
|
||||
getContextUrl(serializer, edmEntitySet, true, null, null, edmProperty.getName()))
|
||||
.build()));
|
||||
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
||||
response.setHeader(HttpHeader.CONTENT_TYPE, contentType.toContentTypeString());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (final DataProvider.DataProviderException e) {
|
||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||
} catch (final SerializerException e) {
|
||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||
} catch (final ODataApplicationException e) {
|
||||
response.setStatusCode(e.getStatusCode());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void readPropertyValue(ODataRequest request, ODataResponse response,
|
||||
UriInfo uriInfo, ContentType contentType) {
|
||||
|
||||
if (!validateOptions(uriInfo.asUriInfoResource())) {
|
||||
response.setStatusCode(HttpStatusCode.NOT_IMPLEMENTED.getStatusCode());
|
||||
return;
|
||||
}
|
||||
try {
|
||||
final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource());
|
||||
final Entity entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet);
|
||||
if (entity == null) {
|
||||
response.setStatusCode(HttpStatusCode.NOT_FOUND.getStatusCode());
|
||||
} else {
|
||||
UriResourceProperty uriProperty = (UriResourceProperty) uriInfo
|
||||
.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 2);
|
||||
EdmProperty edmProperty = uriProperty.getProperty();
|
||||
Property property = entity.getProperty(edmProperty.getName());
|
||||
if (property == null || property.getValue() == null) {
|
||||
response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode());
|
||||
} else {
|
||||
final EdmPrimitiveType type = (EdmPrimitiveType) edmProperty.getType();
|
||||
final String value = type.valueToString(property.getValue(),
|
||||
edmProperty.isNullable(), edmProperty.getMaxLength(),
|
||||
edmProperty.getPrecision(), edmProperty.getScale(), edmProperty.isUnicode());
|
||||
response.setContent(new ByteArrayInputStream(value.getBytes("UTF-8")));
|
||||
response.setStatusCode(HttpStatusCode.OK.getStatusCode());
|
||||
response.setHeader(HttpHeader.CONTENT_TYPE, ContentType.TEXT_PLAIN.toContentTypeString());
|
||||
}
|
||||
}
|
||||
} catch (final DataProvider.DataProviderException e) {
|
||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||
} catch (final EdmPrimitiveTypeException e) {
|
||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||
} catch (final UnsupportedEncodingException e) {
|
||||
response.setStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode());
|
||||
} catch (final ODataApplicationException e) {
|
||||
response.setStatusCode(e.getStatusCode());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Arrays;
|
|||
import org.apache.commons.io.IOUtils;
|
||||
import org.apache.olingo.commons.api.edm.Edm;
|
||||
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion;
|
||||
import org.apache.olingo.commons.api.format.ContentType;
|
||||
import org.apache.olingo.commons.api.http.HttpContentType;
|
||||
import org.apache.olingo.commons.api.http.HttpHeader;
|
||||
import org.apache.olingo.commons.api.http.HttpMethod;
|
||||
|
@ -35,9 +36,7 @@ import org.apache.olingo.commons.api.http.HttpStatusCode;
|
|||
import org.apache.olingo.server.api.OData;
|
||||
import org.apache.olingo.server.api.ODataRequest;
|
||||
import org.apache.olingo.server.api.ODataResponse;
|
||||
import org.apache.olingo.server.api.processor.EntitySetProcessor;
|
||||
import org.apache.olingo.server.api.processor.MetadataProcessor;
|
||||
import org.apache.olingo.server.api.processor.ServiceDocumentProcessor;
|
||||
import org.apache.olingo.server.api.processor.*;
|
||||
import org.apache.olingo.server.api.uri.UriInfo;
|
||||
import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
|
||||
import org.junit.Before;
|
||||
|
@ -252,7 +251,6 @@ public class ODataHandlerTest {
|
|||
handler.register(processor);
|
||||
|
||||
ODataResponse response = handler.process(request);
|
||||
|
||||
assertNotNull(response);
|
||||
Mockito.verify(processor).countEntitySet(
|
||||
Mockito.eq(request),
|
||||
|
@ -261,7 +259,7 @@ public class ODataHandlerTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testCountWithNavigation() throws Exception {
|
||||
public void dispatchCountWithNavigation() throws Exception {
|
||||
ODataRequest request = new ODataRequest();
|
||||
|
||||
request.setMethod(HttpMethod.GET);
|
||||
|
@ -271,11 +269,70 @@ public class ODataHandlerTest {
|
|||
handler.register(processor);
|
||||
|
||||
ODataResponse response = handler.process(request);
|
||||
|
||||
assertNotNull(response);
|
||||
Mockito.verify(processor).countEntitySet(
|
||||
Mockito.eq(request),
|
||||
Mockito.any(ODataResponse.class),
|
||||
Mockito.any(UriInfo.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dispatchAddressPrimitiveProperty() throws Exception {
|
||||
ODataRequest request = new ODataRequest();
|
||||
|
||||
request.setMethod(HttpMethod.GET);
|
||||
request.setRawODataPath("ESAllPrim/PropertyInt16");
|
||||
|
||||
PropertyProcessor processor = mock(PropertyProcessor.class);
|
||||
handler.register(processor);
|
||||
|
||||
ODataResponse response = handler.process(request);
|
||||
assertNotNull(response);
|
||||
|
||||
Mockito.verify(processor).readProperty(
|
||||
Mockito.any(ODataRequest.class),
|
||||
Mockito.any(ODataResponse.class),
|
||||
Mockito.any(UriInfo.class),
|
||||
Mockito.any(ContentType.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dispatchAddressPrimitivePropertyValue() throws Exception {
|
||||
ODataRequest request = new ODataRequest();
|
||||
|
||||
request.setMethod(HttpMethod.GET);
|
||||
request.setRawODataPath("ESAllPrim/PropertyInt16/$value");
|
||||
|
||||
PropertyProcessor processor = mock(PropertyProcessor.class);
|
||||
handler.register(processor);
|
||||
|
||||
ODataResponse response = handler.process(request);
|
||||
assertNotNull(response);
|
||||
|
||||
Mockito.verify(processor).readPropertyValue(
|
||||
Mockito.any(ODataRequest.class),
|
||||
Mockito.any(ODataResponse.class),
|
||||
Mockito.any(UriInfo.class),
|
||||
Mockito.any(ContentType.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dispatchAddressComplexProperty() throws Exception {
|
||||
ODataRequest request = new ODataRequest();
|
||||
|
||||
request.setMethod(HttpMethod.GET);
|
||||
request.setRawODataPath("ESMixPrimCollComp/PropertyComp");
|
||||
|
||||
PropertyProcessor processor = mock(PropertyProcessor.class);
|
||||
handler.register(processor);
|
||||
|
||||
ODataResponse response = handler.process(request);
|
||||
assertNotNull(response);
|
||||
|
||||
Mockito.verify(processor).readProperty(
|
||||
Mockito.any(ODataRequest.class),
|
||||
Mockito.any(ODataResponse.class),
|
||||
Mockito.any(UriInfo.class),
|
||||
Mockito.any(ContentType.class));
|
||||
}
|
||||
}
|
|
@ -29,10 +29,13 @@ import org.apache.olingo.commons.api.data.Entity;
|
|||
import org.apache.olingo.commons.api.data.EntitySet;
|
||||
import org.apache.olingo.commons.api.data.ValueType;
|
||||
import org.apache.olingo.commons.api.edm.Edm;
|
||||
import org.apache.olingo.commons.api.edm.EdmElement;
|
||||
import org.apache.olingo.commons.api.edm.EdmEntityContainer;
|
||||
import org.apache.olingo.commons.api.edm.EdmEntitySet;
|
||||
import org.apache.olingo.commons.api.edm.EdmProperty;
|
||||
import org.apache.olingo.commons.api.edm.FullQualifiedName;
|
||||
import org.apache.olingo.commons.api.format.ODataFormat;
|
||||
import org.apache.olingo.commons.core.data.PropertyImpl;
|
||||
import org.apache.olingo.server.api.OData;
|
||||
import org.apache.olingo.server.api.serializer.ODataSerializer;
|
||||
import org.apache.olingo.server.api.serializer.SerializerException;
|
||||
|
@ -47,6 +50,7 @@ import org.apache.olingo.server.tecsvc.data.DataProvider;
|
|||
import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
|
||||
import org.hamcrest.CoreMatchers;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
|
@ -391,10 +395,10 @@ public class ODataJsonSerializerTest {
|
|||
.build());
|
||||
final String resultString = IOUtils.toString(result);
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp/PropertyString)\","
|
||||
+ "\"value\":["
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 1\"}}},"
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 2\"}}}]}",
|
||||
+ "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp/PropertyString)\","
|
||||
+ "\"value\":["
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 1\"}}},"
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 2\"}}}]}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
|
@ -414,10 +418,10 @@ public class ODataJsonSerializerTest {
|
|||
.select(select)
|
||||
.build()));
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp)\","
|
||||
+ "\"value\":["
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":123,\"PropertyString\":\"String 1\"}}},"
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":987,\"PropertyString\":\"String 2\"}}}]}",
|
||||
+ "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp)\","
|
||||
+ "\"value\":["
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":123,\"PropertyString\":\"String 1\"}}},"
|
||||
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":987,\"PropertyString\":\"String 2\"}}}]}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
|
@ -434,24 +438,24 @@ public class ODataJsonSerializerTest {
|
|||
.build());
|
||||
final String resultString = IOUtils.toString(result);
|
||||
Assert.assertEquals("{\"@odata.context\":\"$metadata#ESTwoPrim/$entity\","
|
||||
+ "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\","
|
||||
+ "\"NavPropertyETAllPrimOne\":{"
|
||||
+ "\"PropertyInt16\":32767,"
|
||||
+ "\"PropertyString\":\"First Resource - positive values\","
|
||||
+ "\"PropertyBoolean\":true,"
|
||||
+ "\"PropertyByte\":255,"
|
||||
+ "\"PropertySByte\":127,"
|
||||
+ "\"PropertyInt32\":2147483647,"
|
||||
+ "\"PropertyInt64\":9223372036854775807,"
|
||||
+ "\"PropertySingle\":1.79E20,"
|
||||
+ "\"PropertyDouble\":-1.79E19,"
|
||||
+ "\"PropertyDecimal\":34,"
|
||||
+ "\"PropertyBinary\":\"ASNFZ4mrze8=\","
|
||||
+ "\"PropertyDate\":\"2012-12-03\","
|
||||
+ "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\","
|
||||
+ "\"PropertyDuration\":\"PT6S\","
|
||||
+ "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\","
|
||||
+ "\"PropertyTimeOfDay\":\"03:26:05\"}}",
|
||||
+ "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\","
|
||||
+ "\"NavPropertyETAllPrimOne\":{"
|
||||
+ "\"PropertyInt16\":32767,"
|
||||
+ "\"PropertyString\":\"First Resource - positive values\","
|
||||
+ "\"PropertyBoolean\":true,"
|
||||
+ "\"PropertyByte\":255,"
|
||||
+ "\"PropertySByte\":127,"
|
||||
+ "\"PropertyInt32\":2147483647,"
|
||||
+ "\"PropertyInt64\":9223372036854775807,"
|
||||
+ "\"PropertySingle\":1.79E20,"
|
||||
+ "\"PropertyDouble\":-1.79E19,"
|
||||
+ "\"PropertyDecimal\":34,"
|
||||
+ "\"PropertyBinary\":\"ASNFZ4mrze8=\","
|
||||
+ "\"PropertyDate\":\"2012-12-03\","
|
||||
+ "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\","
|
||||
+ "\"PropertyDuration\":\"PT6S\","
|
||||
+ "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\","
|
||||
+ "\"PropertyTimeOfDay\":\"03:26:05\"}}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
|
@ -473,9 +477,9 @@ public class ODataJsonSerializerTest {
|
|||
.expand(expand)
|
||||
.build()));
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimOne(PropertyDate))/$entity\","
|
||||
+ "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\","
|
||||
+ "\"NavPropertyETAllPrimOne\":{\"PropertyDate\":\"2012-12-03\"}}",
|
||||
+ "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimOne(PropertyDate))/$entity\","
|
||||
+ "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\","
|
||||
+ "\"NavPropertyETAllPrimOne\":{\"PropertyDate\":\"2012-12-03\"}}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
|
@ -500,10 +504,10 @@ public class ODataJsonSerializerTest {
|
|||
.select(select)
|
||||
.build()));
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim(PropertySByte)/$entity\","
|
||||
+ "\"PropertySByte\":127,"
|
||||
+ "\"NavPropertyETTwoPrimOne\":{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"},"
|
||||
+ "\"NavPropertyETTwoPrimMany\":[{\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\"}]}",
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim(PropertySByte)/$entity\","
|
||||
+ "\"PropertySByte\":127,"
|
||||
+ "\"NavPropertyETTwoPrimOne\":{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"},"
|
||||
+ "\"NavPropertyETTwoPrimMany\":[{\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\"}]}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
|
@ -526,9 +530,9 @@ public class ODataJsonSerializerTest {
|
|||
.select(select)
|
||||
.build()));
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim(PropertyTimeOfDay)/$entity\","
|
||||
+ "\"PropertyTimeOfDay\":\"23:49:14\","
|
||||
+ "\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]}",
|
||||
+ "\"@odata.context\":\"$metadata#ESAllPrim(PropertyTimeOfDay)/$entity\","
|
||||
+ "\"PropertyTimeOfDay\":\"23:49:14\","
|
||||
+ "\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
|
@ -555,15 +559,110 @@ public class ODataJsonSerializerTest {
|
|||
.expand(expand)
|
||||
.build()));
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimMany(PropertyInt32))/$entity\","
|
||||
+ "\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\","
|
||||
+ "\"NavPropertyETAllPrimMany\":["
|
||||
+ "{\"PropertyInt32\":-2147483648,\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]},"
|
||||
+ "{\"PropertyInt32\":0,\"NavPropertyETTwoPrimOne\":null,"
|
||||
+ "\"NavPropertyETTwoPrimMany\":["
|
||||
+ "{\"PropertyInt16\":32766,\"PropertyString\":\"Test String1\"},"
|
||||
+ "{\"PropertyInt16\":-32766,\"PropertyString\":\"Test String3\"},"
|
||||
+ "{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"}]}]}",
|
||||
+ "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimMany(PropertyInt32))/$entity\","
|
||||
+ "\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\","
|
||||
+ "\"NavPropertyETAllPrimMany\":["
|
||||
+ "{\"PropertyInt32\":-2147483648,\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]},"
|
||||
+ "{\"PropertyInt32\":0,\"NavPropertyETTwoPrimOne\":null,"
|
||||
+ "\"NavPropertyETTwoPrimMany\":["
|
||||
+ "{\"PropertyInt16\":32766,\"PropertyString\":\"Test String1\"},"
|
||||
+ "{\"PropertyInt16\":-32766,\"PropertyString\":\"Test String3\"},"
|
||||
+ "{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"}]}]}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void individualPrimitiveProperty() throws Exception {
|
||||
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
|
||||
final EntitySet entitySet = data.readAll(edmEntitySet);
|
||||
|
||||
EdmElement edmElement = edmEntitySet.getEntityType().getProperty("PropertyString");
|
||||
Entity entity = entitySet.getEntities().get(0);
|
||||
|
||||
InputStream result = serializer
|
||||
.entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyString"),
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(ContextURL.with().entitySetOrSingletonOrType("Edm.String")
|
||||
.build())
|
||||
.build());
|
||||
final String resultString = IOUtils.toString(result);
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#Edm.String\","
|
||||
+ "\"value\":\"First Resource - positive values\"}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
@Test(expected = SerializerException.class)
|
||||
public void individualPrimitivePropertyNull() throws Exception {
|
||||
PropertyImpl property = new PropertyImpl("Edm.String", "PropertyString", ValueType.PRIMITIVE, null);
|
||||
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
|
||||
EdmElement edmElement = edmEntitySet.getEntityType().getProperty("PropertyString");
|
||||
serializer.entityProperty((EdmProperty) edmElement, property,
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(ContextURL.with().entitySetOrSingletonOrType("Edm.String")
|
||||
.build())
|
||||
.build());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void individualPrimitivePropertyArray() throws Exception {
|
||||
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESCollAllPrim");
|
||||
final EntitySet entitySet = data.readAll(edmEntitySet);
|
||||
|
||||
EdmElement edmElement = edmEntitySet.getEntityType().getProperty("CollPropertyString");
|
||||
Entity entity = entitySet.getEntities().get(0);
|
||||
|
||||
InputStream result = serializer
|
||||
.entityProperty((EdmProperty) edmElement, entity.getProperty("CollPropertyString"),
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(ContextURL.with().entitySetOrSingletonOrType("Collection(Edm.String)")
|
||||
.build())
|
||||
.build());
|
||||
final String resultString = IOUtils.toString(result);
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#Collection%28Edm.String%29\","
|
||||
+ "\"value\":[\"Employee1@company.example\",\"Employee2@company.example\",\"Employee3@company.example\"]}",
|
||||
resultString);
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore("Serialization of value of primitive property is not done by json serializer")
|
||||
public void individualPrimitivePropertyValue() throws Exception {
|
||||
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESAllPrim");
|
||||
final EntitySet entitySet = data.readAll(edmEntitySet);
|
||||
|
||||
EdmElement edmElement = edmEntitySet.getEntityType().getProperty("PropertyString");
|
||||
Entity entity = entitySet.getEntities().get(0);
|
||||
|
||||
InputStream result = serializer
|
||||
.entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyString"),
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(ContextURL.with().entitySetOrSingletonOrType("ESAllPrim(0)")
|
||||
.navOrPropertyPath("PropertyString")
|
||||
.build())
|
||||
.build());
|
||||
final String resultString = IOUtils.toString(result);
|
||||
Assert.assertEquals("\"First Resource - positive values\"", resultString);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void individualComplexProperty() throws Exception {
|
||||
final EdmEntitySet edmEntitySet = entityContainer.getEntitySet("ESMixPrimCollComp");
|
||||
final EntitySet entitySet = data.readAll(edmEntitySet);
|
||||
|
||||
EdmElement edmElement = edmEntitySet.getEntityType().getProperty("PropertyComp");
|
||||
Entity entity = entitySet.getEntities().get(0);
|
||||
|
||||
InputStream result = serializer
|
||||
.entityProperty((EdmProperty) edmElement, entity.getProperty("PropertyComp"),
|
||||
ODataSerializerOptions.with()
|
||||
.contextURL(ContextURL.with().entitySetOrSingletonOrType("ESMixPrimCollComp.PropertyComp")
|
||||
.build())
|
||||
.build());
|
||||
final String resultString = IOUtils.toString(result);
|
||||
Assert.assertEquals("{"
|
||||
+ "\"@odata.context\":\"$metadata#ESMixPrimCollComp.PropertyComp\","
|
||||
+ "\"PropertyInt16\":111,\"PropertyString\":\"TEST A\"}",
|
||||
resultString);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue