[OLINGO-444] Merge into master

This commit is contained in:
mibo 2014-10-06 10:15:44 +02:00
commit 6fbdb78345
10 changed files with 542 additions and 105 deletions

View File

@ -31,7 +31,7 @@ import org.apache.olingo.server.api.uri.UriInfo;
public interface EntityProcessor extends Processor { 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 request - OData request object containing raw HTTP information
* @param response - OData response object for collecting response data * @param response - OData response object for collecting response data
* @param uriInfo - information of a parsed OData URI * @param uriInfo - information of a parsed OData URI

View File

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

View File

@ -22,8 +22,10 @@ import java.io.InputStream;
import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntitySet; 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.Edm;
import org.apache.olingo.commons.api.edm.EdmEntitySet; 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.ODataServerError;
import org.apache.olingo.server.api.uri.queryoption.ExpandOption; 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.SelectOption;
@ -56,6 +58,15 @@ public interface ODataSerializer {
InputStream entity(EdmEntitySet edmEntitySet, Entity entity, ODataSerializerOptions options) InputStream entity(EdmEntitySet edmEntitySet, Entity entity, ODataSerializerOptions options)
throws SerializerException; 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. * Writes entity-set data into an InputStream.
* @param edmEntitySet the {@link EdmEntitySet} * @param edmEntitySet the {@link EdmEntitySet}

View File

@ -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.ExceptionProcessor;
import org.apache.olingo.server.api.processor.MetadataProcessor; import org.apache.olingo.server.api.processor.MetadataProcessor;
import org.apache.olingo.server.api.processor.Processor; 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.processor.ServiceDocumentProcessor;
import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.serializer.SerializerException;
import org.apache.olingo.server.api.uri.UriInfo; import org.apache.olingo.server.api.uri.UriInfo;
@ -177,7 +178,6 @@ public class ODataHandler {
SerializerException { SerializerException {
int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1; int lastPathSegmentIndex = uriInfo.getUriResourceParts().size() - 1;
UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex); UriResource lastPathSegment = uriInfo.getUriResourceParts().get(lastPathSegmentIndex);
ContentType requestedContentType = null;
switch (lastPathSegment.getKind()) { switch (lastPathSegment.getKind()) {
case entitySet: case entitySet:
@ -245,6 +245,31 @@ public class ODataHandler {
ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED); ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);
} }
break; 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: default:
throw new ODataHandlerException("not implemented", throw new ODataHandlerException("not implemented",
ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED); ODataHandlerException.MessageKeys.FUNCTIONALITY_NOT_IMPLEMENTED);

View File

@ -26,8 +26,10 @@ import javax.xml.stream.XMLStreamWriter;
import org.apache.olingo.commons.api.data.Entity; import org.apache.olingo.commons.api.data.Entity;
import org.apache.olingo.commons.api.data.EntitySet; 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.Edm;
import org.apache.olingo.commons.api.edm.EdmEntitySet; 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.ODataServerError;
import org.apache.olingo.server.api.serializer.ODataSerializer; import org.apache.olingo.server.api.serializer.ODataSerializer;
import org.apache.olingo.server.api.serializer.SerializerException; 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 { final ExpandOption expand, final SelectOption select) throws SerializerException {
return ContextURLHelper.buildSelectList(edmEntitySet.getEntityType(), expand, select); 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);
}
} }

View File

@ -133,15 +133,13 @@ public class ODataJsonSerializer implements ODataSerializer {
try { try {
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream()); JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
json.writeStartObject(); json.writeStartObject();
if (format != ODataFormat.JSON_NO_METADATA) {
if (options == null || options.getContextURL() == null) { final ContextURL contextURL = checkContextURL(options);
throw new SerializerException("ContextURL null!", if (contextURL != null) {
SerializerException.MessageKeys.NO_CONTEXT_URL); json.writeStringField(Constants.JSON_CONTEXT,
} else { ContextURLBuilder.create(contextURL).toASCIIString());
json.writeStringField(Constants.JSON_CONTEXT,
ContextURLBuilder.create(options.getContextURL()).toASCIIString());
}
} }
if (options != null && options.getCount() != null && options.getCount().getValue() if (options != null && options.getCount() != null && options.getCount().getValue()
&& entitySet.getCount() != null) { && entitySet.getCount() != null) {
json.writeNumberField(Constants.JSON_COUNT, entitySet.getCount()); json.writeNumberField(Constants.JSON_COUNT, entitySet.getCount());
@ -163,11 +161,7 @@ public class ODataJsonSerializer implements ODataSerializer {
@Override @Override
public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity, public InputStream entity(final EdmEntitySet edmEntitySet, final Entity entity,
final ODataSerializerOptions options) throws SerializerException { final ODataSerializerOptions options) throws SerializerException {
final ContextURL contextURL = options == null ? null : options.getContextURL(); final ContextURL contextURL = checkContextURL(options);
if (format != ODataFormat.JSON_NO_METADATA && contextURL == null) {
throw new SerializerException("ContextURL null!",
SerializerException.MessageKeys.NO_CONTEXT_URL);
}
CircleStreamBuffer buffer = new CircleStreamBuffer(); CircleStreamBuffer buffer = new CircleStreamBuffer();
try { try {
JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream()); JsonGenerator json = new JsonFactory().createGenerator(buffer.getOutputStream());
@ -181,6 +175,19 @@ public class ODataJsonSerializer implements ODataSerializer {
return buffer.getInputStream(); 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, protected void writeEntitySet(final EdmEntityType entityType, final EntitySet entitySet,
final ExpandOption expand, final SelectOption select, final JsonGenerator json) final ExpandOption expand, final SelectOption select, final JsonGenerator json)
throws IOException, SerializerException { throws IOException, SerializerException {
@ -288,24 +295,30 @@ public class ODataJsonSerializer implements ODataSerializer {
json.writeNull(); json.writeNull();
} }
} else { } else {
try { writePropertyValue(edmProperty, property, selectedPaths, json);
if (edmProperty.isCollection()) { }
writeCollection(edmProperty, property, selectedPaths, json); }
} else if (edmProperty.isPrimitive()) {
writePrimitive(edmProperty, property, json); private void writePropertyValue(final EdmProperty edmProperty,
} else if (property.isLinkedComplex()) { final Property property, final Set<List<String>> selectedPaths,
writeComplexValue(edmProperty, property.asLinkedComplex().getValue(), selectedPaths, json); final JsonGenerator json) throws IOException, SerializerException {
} else if (property.isComplex()) { try {
writeComplexValue(edmProperty, property.asComplex(), selectedPaths, json); if (edmProperty.isCollection()) {
} else { writeCollection(edmProperty, property, selectedPaths, json);
throw new SerializerException("Property type not yet supported!", } else if (edmProperty.isPrimitive()) {
SerializerException.MessageKeys.UNSUPPORTED_PROPERTY_TYPE, edmProperty.getName()); writePrimitive(edmProperty, property, json);
} } else if (property.isLinkedComplex()) {
} catch (final EdmPrimitiveTypeException e) { writeComplexValue(edmProperty, property.asLinkedComplex().getValue(), selectedPaths, json);
throw new SerializerException("Wrong value for property!", e, } else if (property.isComplex()) {
SerializerException.MessageKeys.WRONG_PROPERTY_VALUE, writeComplexValue(edmProperty, property.asComplex(), selectedPaths, json);
edmProperty.getName(), property.getValue().toString()); } 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, protected void writeComplexValue(final EdmProperty edmProperty, final List<Property> properties,
final Set<List<String>> selectedPaths, JsonGenerator json) final Set<List<String>> selectedPaths, JsonGenerator json)
throws IOException, EdmPrimitiveTypeException, SerializerException { throws IOException, EdmPrimitiveTypeException, SerializerException {
final EdmComplexType type = (EdmComplexType) edmProperty.getType();
json.writeStartObject(); 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()) { for (final String propertyName : type.getPropertyNames()) {
final Property property = findProperty(propertyName, properties); final Property property = findProperty(propertyName, properties);
if (selectedPaths == null || ExpandSelectHelper.isSelected(selectedPaths, propertyName)) { if (selectedPaths == null || ExpandSelectHelper.isSelected(selectedPaths, propertyName)) {
@ -388,7 +408,6 @@ public class ODataJsonSerializer implements ODataSerializer {
json); json);
} }
} }
json.writeEndObject();
} }
private Property findProperty(final String propertyName, final List<Property> properties) { 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 { final ExpandOption expand, final SelectOption select) throws SerializerException {
return ContextURLHelper.buildSelectList(edmEntitySet.getEntityType(), expand, select); 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();
}
} }

View File

@ -19,13 +19,19 @@
package org.apache.olingo.server.core.serializer.utils; package org.apache.olingo.server.core.serializer.utils;
import java.net.URI; import java.net.URI;
import org.apache.olingo.commons.api.Constants; import org.apache.olingo.commons.api.Constants;
import org.apache.olingo.commons.api.data.ContextURL; import org.apache.olingo.commons.api.data.ContextURL;
import org.apache.olingo.commons.core.Encoder; 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 final class ContextURLBuilder {
public static final URI create(final ContextURL contextURL) { public static URI create(final ContextURL contextURL) {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
if (contextURL.getServiceRoot() != null) { if (contextURL.getServiceRoot() != null) {
result.append(contextURL.getServiceRoot()); result.append(contextURL.getServiceRoot());
@ -43,6 +49,9 @@ public final class ContextURLBuilder {
if (contextURL.getSelectList() != null) { if (contextURL.getSelectList() != null) {
result.append('(').append(contextURL.getSelectList()).append(')'); result.append('(').append(contextURL.getSelectList()).append(')');
} }
if (contextURL.getNavOrPropertyPath() != null) {
result.append('/').append(contextURL.getNavOrPropertyPath());
}
if (contextURL.isReference()) { if (contextURL.isReference()) {
if (contextURL.getEntitySetOrSingletonOrType() != null) { if (contextURL.getEntitySetOrSingletonOrType() != null) {
throw new IllegalArgumentException("ContextURL: $ref with Entity Set"); throw new IllegalArgumentException("ContextURL: $ref with Entity Set");

View File

@ -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.Entity;
import org.apache.olingo.commons.api.data.EntitySet; import org.apache.olingo.commons.api.data.EntitySet;
import org.apache.olingo.commons.api.data.ContextURL.Suffix; 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.Edm;
import org.apache.olingo.commons.api.edm.EdmEntitySet; 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.ContentType;
import org.apache.olingo.commons.api.format.ODataFormat; import org.apache.olingo.commons.api.format.ODataFormat;
import org.apache.olingo.commons.api.http.HttpHeader; 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.ODataResponse;
import org.apache.olingo.server.api.processor.EntitySetProcessor; import org.apache.olingo.server.api.processor.EntitySetProcessor;
import org.apache.olingo.server.api.processor.EntityProcessor; 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.ODataSerializer;
import org.apache.olingo.server.api.serializer.SerializerException; import org.apache.olingo.server.api.serializer.SerializerException;
import org.apache.olingo.server.api.serializer.ODataSerializerOptions; 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.UriInfoResource;
import org.apache.olingo.server.api.uri.UriResource; import org.apache.olingo.server.api.uri.UriResource;
import org.apache.olingo.server.api.uri.UriResourceEntitySet; 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.ExpandOption;
import org.apache.olingo.server.api.uri.queryoption.SelectOption; import org.apache.olingo.server.api.uri.queryoption.SelectOption;
import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind; import org.apache.olingo.server.api.uri.queryoption.SystemQueryOptionKind;
import org.apache.olingo.server.tecsvc.data.DataProvider; import org.apache.olingo.server.tecsvc.data.DataProvider;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.util.List; import java.util.List;
import java.util.Locale; 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 OData odata;
private DataProvider dataProvider; private DataProvider dataProvider;
@ -84,7 +95,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
response.setContent(serializer.entitySet(edmEntitySet, entitySet, response.setContent(serializer.entitySet(edmEntitySet, entitySet,
ODataSerializerOptions.with() ODataSerializerOptions.with()
.contextURL(format == ODataFormat.JSON_NO_METADATA ? null : .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
getContextUrl(serializer, edmEntitySet, false, expand, select)) getContextUrl(serializer, edmEntitySet, false, expand, select, null))
.count(uriInfo.getCountOption()) .count(uriInfo.getCountOption())
.expand(expand).select(select) .expand(expand).select(select)
.build())); .build()));
@ -120,7 +131,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
response.setContent(serializer.entity(edmEntitySet, entity, response.setContent(serializer.entity(edmEntitySet, entity,
ODataSerializerOptions.with() ODataSerializerOptions.with()
.contextURL(format == ODataFormat.JSON_NO_METADATA ? null : .contextURL(format == ODataFormat.JSON_NO_METADATA ? null :
getContextUrl(serializer, edmEntitySet, true, expand, select)) getContextUrl(serializer, edmEntitySet, true, expand, select, null))
.count(uriInfo.getCountOption()) .count(uriInfo.getCountOption())
.expand(expand).select(select) .expand(expand).select(select)
.build())); .build()));
@ -142,9 +153,9 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
EntitySet entitySet = null; EntitySet entitySet = null;
final UriInfoResource uriResource = uriInfo.asUriInfoResource(); final UriInfoResource uriResource = uriInfo.asUriInfoResource();
final List<UriResource> resourceParts = uriResource.getUriResourceParts(); final List<UriResource> resourceParts = uriResource.getUriResourceParts();
if(isCount(resourceParts)) { if (isCount(resourceParts)) {
int pos = resourceParts.size() - 2; int pos = resourceParts.size() - 2;
if(pos >= 0) { if (pos >= 0) {
final UriResourceEntitySet ur = final UriResourceEntitySet ur =
(UriResourceEntitySet) uriResource.getUriResourceParts().get(pos); (UriResourceEntitySet) uriResource.getUriResourceParts().get(pos);
entitySet = readEntitySetInternal(ur.getEntitySet(), true); entitySet = readEntitySetInternal(ur.getEntitySet(), true);
@ -165,7 +176,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
} }
private boolean isCount(List<UriResource> resourceParts) { private boolean isCount(List<UriResource> resourceParts) {
if(resourceParts.isEmpty()) { if (resourceParts.isEmpty()) {
return false; return false;
} }
UriResource part = resourceParts.get(resourceParts.size() - 1); UriResource part = resourceParts.get(resourceParts.size() - 1);
@ -180,7 +191,7 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
boolean withCount) throws DataProvider.DataProviderException { boolean withCount) throws DataProvider.DataProviderException {
EntitySet entitySet = dataProvider.readAll(edmEntitySet); EntitySet entitySet = dataProvider.readAll(edmEntitySet);
// TODO: set count (correctly) and next link // TODO: set count (correctly) and next link
if(withCount && entitySet.getCount() == null) { if (withCount && entitySet.getCount() == null) {
entitySet.setCount(entitySet.getEntities().size()); entitySet.setCount(entitySet.getEntities().size());
} }
// //
@ -207,14 +218,25 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
private EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) throws ODataApplicationException { private EdmEntitySet getEdmEntitySet(final UriInfoResource uriInfo) throws ODataApplicationException {
final List<UriResource> resourcePaths = uriInfo.getUriResourceParts(); final List<UriResource> resourcePaths = uriInfo.getUriResourceParts();
if (resourcePaths.size() != 1) { // first must be entity set
throw new ODataApplicationException("Invalid resource path.",
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT);
}
if (!(resourcePaths.get(0) instanceof UriResourceEntitySet)) { if (!(resourcePaths.get(0) instanceof UriResourceEntitySet)) {
throw new ODataApplicationException("Invalid resource type.", throw new ODataApplicationException("Invalid resource type.",
HttpStatusCode.NOT_IMPLEMENTED.getStatusCode(), Locale.ROOT); 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); final UriResourceEntitySet uriResource = (UriResourceEntitySet) resourcePaths.get(0);
if (uriResource.getTypeFilterOnCollection() != null || uriResource.getTypeFilterOnEntry() != null) { if (uriResource.getTypeFilterOnCollection() != null || uriResource.getTypeFilterOnEntry() != null) {
throw new ODataApplicationException("Type filters are not supported.", throw new ODataApplicationException("Type filters are not supported.",
@ -224,10 +246,100 @@ public class TechnicalProcessor implements EntitySetProcessor, EntityProcessor {
} }
private ContextURL getContextUrl(final ODataSerializer serializer, private ContextURL getContextUrl(final ODataSerializer serializer,
final EdmEntitySet entitySet, final boolean isSingleEntity, final EdmEntitySet entitySet, final boolean isSingleEntity,
final ExpandOption expand, final SelectOption select) throws SerializerException { final ExpandOption expand, final SelectOption select, final String navOrPropertyPath)
throws SerializerException {
return ContextURL.with().entitySet(entitySet) return ContextURL.with().entitySet(entitySet)
.selectList(serializer.buildContextURLSelectList(entitySet, expand, select)) .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());
}
} }
} }

View File

@ -28,6 +28,7 @@ import java.util.Arrays;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.olingo.commons.api.edm.Edm; import org.apache.olingo.commons.api.edm.Edm;
import org.apache.olingo.commons.api.edm.constants.ODataServiceVersion; 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.HttpContentType;
import org.apache.olingo.commons.api.http.HttpHeader; import org.apache.olingo.commons.api.http.HttpHeader;
import org.apache.olingo.commons.api.http.HttpMethod; 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.OData;
import org.apache.olingo.server.api.ODataRequest; import org.apache.olingo.server.api.ODataRequest;
import org.apache.olingo.server.api.ODataResponse; import org.apache.olingo.server.api.ODataResponse;
import org.apache.olingo.server.api.processor.EntitySetProcessor; import org.apache.olingo.server.api.processor.*;
import org.apache.olingo.server.api.processor.MetadataProcessor;
import org.apache.olingo.server.api.processor.ServiceDocumentProcessor;
import org.apache.olingo.server.api.uri.UriInfo; import org.apache.olingo.server.api.uri.UriInfo;
import org.apache.olingo.server.tecsvc.provider.EdmTechProvider; import org.apache.olingo.server.tecsvc.provider.EdmTechProvider;
import org.junit.Before; import org.junit.Before;
@ -252,7 +251,6 @@ public class ODataHandlerTest {
handler.register(processor); handler.register(processor);
ODataResponse response = handler.process(request); ODataResponse response = handler.process(request);
assertNotNull(response); assertNotNull(response);
Mockito.verify(processor).countEntitySet( Mockito.verify(processor).countEntitySet(
Mockito.eq(request), Mockito.eq(request),
@ -261,7 +259,7 @@ public class ODataHandlerTest {
} }
@Test @Test
public void testCountWithNavigation() throws Exception { public void dispatchCountWithNavigation() throws Exception {
ODataRequest request = new ODataRequest(); ODataRequest request = new ODataRequest();
request.setMethod(HttpMethod.GET); request.setMethod(HttpMethod.GET);
@ -271,11 +269,70 @@ public class ODataHandlerTest {
handler.register(processor); handler.register(processor);
ODataResponse response = handler.process(request); ODataResponse response = handler.process(request);
assertNotNull(response); assertNotNull(response);
Mockito.verify(processor).countEntitySet( Mockito.verify(processor).countEntitySet(
Mockito.eq(request), Mockito.eq(request),
Mockito.any(ODataResponse.class), Mockito.any(ODataResponse.class),
Mockito.any(UriInfo.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));
}
} }

View File

@ -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.EntitySet;
import org.apache.olingo.commons.api.data.ValueType; import org.apache.olingo.commons.api.data.ValueType;
import org.apache.olingo.commons.api.edm.Edm; 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.EdmEntityContainer;
import org.apache.olingo.commons.api.edm.EdmEntitySet; 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.edm.FullQualifiedName;
import org.apache.olingo.commons.api.format.ODataFormat; 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.OData;
import org.apache.olingo.server.api.serializer.ODataSerializer; import org.apache.olingo.server.api.serializer.ODataSerializer;
import org.apache.olingo.server.api.serializer.SerializerException; 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.apache.olingo.server.tecsvc.provider.EdmTechProvider;
import org.hamcrest.CoreMatchers; import org.hamcrest.CoreMatchers;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
@ -391,10 +395,10 @@ public class ODataJsonSerializerTest {
.build()); .build());
final String resultString = IOUtils.toString(result); final String resultString = IOUtils.toString(result);
Assert.assertEquals("{" Assert.assertEquals("{"
+ "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp/PropertyString)\"," + "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp/PropertyString)\","
+ "\"value\":[" + "\"value\":["
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 1\"}}}," + "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 1\"}}},"
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 2\"}}}]}", + "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyString\":\"String 2\"}}}]}",
resultString); resultString);
} }
@ -414,10 +418,10 @@ public class ODataJsonSerializerTest {
.select(select) .select(select)
.build())); .build()));
Assert.assertEquals("{" Assert.assertEquals("{"
+ "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp)\"," + "\"@odata.context\":\"$metadata#ESCompComp(PropertyComp/PropertyComp)\","
+ "\"value\":[" + "\"value\":["
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":123,\"PropertyString\":\"String 1\"}}}," + "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":123,\"PropertyString\":\"String 1\"}}},"
+ "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":987,\"PropertyString\":\"String 2\"}}}]}", + "{\"PropertyComp\":{\"PropertyComp\":{\"PropertyInt16\":987,\"PropertyString\":\"String 2\"}}}]}",
resultString); resultString);
} }
@ -434,24 +438,24 @@ public class ODataJsonSerializerTest {
.build()); .build());
final String resultString = IOUtils.toString(result); final String resultString = IOUtils.toString(result);
Assert.assertEquals("{\"@odata.context\":\"$metadata#ESTwoPrim/$entity\"," Assert.assertEquals("{\"@odata.context\":\"$metadata#ESTwoPrim/$entity\","
+ "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"," + "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\","
+ "\"NavPropertyETAllPrimOne\":{" + "\"NavPropertyETAllPrimOne\":{"
+ "\"PropertyInt16\":32767," + "\"PropertyInt16\":32767,"
+ "\"PropertyString\":\"First Resource - positive values\"," + "\"PropertyString\":\"First Resource - positive values\","
+ "\"PropertyBoolean\":true," + "\"PropertyBoolean\":true,"
+ "\"PropertyByte\":255," + "\"PropertyByte\":255,"
+ "\"PropertySByte\":127," + "\"PropertySByte\":127,"
+ "\"PropertyInt32\":2147483647," + "\"PropertyInt32\":2147483647,"
+ "\"PropertyInt64\":9223372036854775807," + "\"PropertyInt64\":9223372036854775807,"
+ "\"PropertySingle\":1.79E20," + "\"PropertySingle\":1.79E20,"
+ "\"PropertyDouble\":-1.79E19," + "\"PropertyDouble\":-1.79E19,"
+ "\"PropertyDecimal\":34," + "\"PropertyDecimal\":34,"
+ "\"PropertyBinary\":\"ASNFZ4mrze8=\"," + "\"PropertyBinary\":\"ASNFZ4mrze8=\","
+ "\"PropertyDate\":\"2012-12-03\"," + "\"PropertyDate\":\"2012-12-03\","
+ "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\"," + "\"PropertyDateTimeOffset\":\"2012-12-03T07:16:23Z\","
+ "\"PropertyDuration\":\"PT6S\"," + "\"PropertyDuration\":\"PT6S\","
+ "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\"," + "\"PropertyGuid\":\"01234567-89ab-cdef-0123-456789abcdef\","
+ "\"PropertyTimeOfDay\":\"03:26:05\"}}", + "\"PropertyTimeOfDay\":\"03:26:05\"}}",
resultString); resultString);
} }
@ -473,9 +477,9 @@ public class ODataJsonSerializerTest {
.expand(expand) .expand(expand)
.build())); .build()));
Assert.assertEquals("{" Assert.assertEquals("{"
+ "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimOne(PropertyDate))/$entity\"," + "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimOne(PropertyDate))/$entity\","
+ "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"," + "\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\","
+ "\"NavPropertyETAllPrimOne\":{\"PropertyDate\":\"2012-12-03\"}}", + "\"NavPropertyETAllPrimOne\":{\"PropertyDate\":\"2012-12-03\"}}",
resultString); resultString);
} }
@ -500,10 +504,10 @@ public class ODataJsonSerializerTest {
.select(select) .select(select)
.build())); .build()));
Assert.assertEquals("{" Assert.assertEquals("{"
+ "\"@odata.context\":\"$metadata#ESAllPrim(PropertySByte)/$entity\"," + "\"@odata.context\":\"$metadata#ESAllPrim(PropertySByte)/$entity\","
+ "\"PropertySByte\":127," + "\"PropertySByte\":127,"
+ "\"NavPropertyETTwoPrimOne\":{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"}," + "\"NavPropertyETTwoPrimOne\":{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"},"
+ "\"NavPropertyETTwoPrimMany\":[{\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\"}]}", + "\"NavPropertyETTwoPrimMany\":[{\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\"}]}",
resultString); resultString);
} }
@ -526,9 +530,9 @@ public class ODataJsonSerializerTest {
.select(select) .select(select)
.build())); .build()));
Assert.assertEquals("{" Assert.assertEquals("{"
+ "\"@odata.context\":\"$metadata#ESAllPrim(PropertyTimeOfDay)/$entity\"," + "\"@odata.context\":\"$metadata#ESAllPrim(PropertyTimeOfDay)/$entity\","
+ "\"PropertyTimeOfDay\":\"23:49:14\"," + "\"PropertyTimeOfDay\":\"23:49:14\","
+ "\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]}", + "\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]}",
resultString); resultString);
} }
@ -555,15 +559,110 @@ public class ODataJsonSerializerTest {
.expand(expand) .expand(expand)
.build())); .build()));
Assert.assertEquals("{" Assert.assertEquals("{"
+ "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimMany(PropertyInt32))/$entity\"," + "\"@odata.context\":\"$metadata#ESTwoPrim(NavPropertyETAllPrimMany(PropertyInt32))/$entity\","
+ "\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\"," + "\"PropertyInt16\":-365,\"PropertyString\":\"Test String2\","
+ "\"NavPropertyETAllPrimMany\":[" + "\"NavPropertyETAllPrimMany\":["
+ "{\"PropertyInt32\":-2147483648,\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]}," + "{\"PropertyInt32\":-2147483648,\"NavPropertyETTwoPrimOne\":null,\"NavPropertyETTwoPrimMany\":[]},"
+ "{\"PropertyInt32\":0,\"NavPropertyETTwoPrimOne\":null," + "{\"PropertyInt32\":0,\"NavPropertyETTwoPrimOne\":null,"
+ "\"NavPropertyETTwoPrimMany\":[" + "\"NavPropertyETTwoPrimMany\":["
+ "{\"PropertyInt16\":32766,\"PropertyString\":\"Test String1\"}," + "{\"PropertyInt16\":32766,\"PropertyString\":\"Test String1\"},"
+ "{\"PropertyInt16\":-32766,\"PropertyString\":\"Test String3\"}," + "{\"PropertyInt16\":-32766,\"PropertyString\":\"Test String3\"},"
+ "{\"PropertyInt16\":32767,\"PropertyString\":\"Test String4\"}]}]}", + "{\"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); resultString);
} }
} }