http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java index 00b9b8c..f0cb444 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumer.java @@ -255,9 +255,10 @@ public class XmlMetadataConsumer { function.setHttpMethod(reader.getAttributeValue(Edm.NAMESPACE_M_2007_08, XmlMetadataConstants.EDM_FUNCTION_IMPORT_HTTP_METHOD)); function.setEntitySet(reader.getAttributeValue(null, XmlMetadataConstants.EDM_ENTITY_SET)); - ReturnType returnType = new ReturnType(); + String returnTypeString = reader.getAttributeValue(null, XmlMetadataConstants.EDM_FUNCTION_IMPORT_RETURN); if (returnTypeString != null) { + ReturnType returnType = new ReturnType(); if (returnTypeString.startsWith("Collection") || returnTypeString.startsWith("collection")) { returnType.setMultiplicity(EdmMultiplicity.MANY); returnTypeString = returnTypeString.substring(returnTypeString.indexOf("(") + 1, returnTypeString.length() - 1); @@ -305,7 +306,7 @@ public class XmlMetadataConsumer { functionParameter.setAnnotationAttributes(readAnnotationAttribute(reader)); while (reader.hasNext() && !(reader.isEndElement() && edmNamespace.equals(reader.getNamespaceURI()) - && XmlMetadataConstants.EDM_FUNCTION_IMPORT.equals(reader.getLocalName()))) { + && XmlMetadataConstants.EDM_FUNCTION_PARAMETER.equals(reader.getLocalName()))) { reader.next(); if (reader.isStartElement()) { extractNamespaces(reader);
http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java index 6987eb1..d7522ee 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.apache.olingo.odata2.api.ODataCallback; import org.apache.olingo.odata2.api.edm.Edm; @@ -93,25 +94,36 @@ public class AtomEntryEntityProducer { writer.writeAttribute(Edm.NAMESPACE_M_2007_08, FormatXml.M_ETAG, etag); } - // write all atom infos (mandatory and optional) - String selfLink = createSelfLink(eia, data, null); - appendAtomMandatoryParts(writer, eia, data, selfLink); - appendAtomOptionalParts(writer, eia, data); - + String selfLink = null; + if (!properties.isContentOnly()) { + // write all atom infos (mandatory and optional) + selfLink = createSelfLink(eia, data, null); + appendAtomMandatoryParts(writer, eia, data, selfLink); + appendAtomOptionalParts(writer, eia, data); + } if (eia.getEntityType().hasStream()) { // write all links - appendAtomEditLink(writer, eia, data, selfLink); - // TODO: fix - appendAtomContentLink(writer, eia, data, selfLink); - appendAtomNavigationLinks(writer, eia, data); + if (!properties.isContentOnly()) { + appendAtomEditLink(writer, eia, data, selfLink); + appendAtomContentLink(writer, eia, data, selfLink); + appendAtomNavigationLinks(writer, eia, data); + } else { + appendAdditinalLinks(writer, eia, data); + } // write properties/content appendCustomProperties(writer, eia, data); - appendAtomContentPart(writer, eia, data, selfLink); + if (!properties.isContentOnly()) { + appendAtomContentPart(writer, eia, data, selfLink); + } appendProperties(writer, eia, data); } else { // write all links - appendAtomEditLink(writer, eia, data, selfLink); - appendAtomNavigationLinks(writer, eia, data); + if (!properties.isContentOnly()) { + appendAtomEditLink(writer, eia, data, selfLink); + appendAtomNavigationLinks(writer, eia, data); + } else { + appendAdditinalLinks(writer, eia, data); + } // write properties/content appendCustomProperties(writer, eia, data); writer.writeStartElement(FormatXml.ATOM_CONTENT); @@ -132,6 +144,24 @@ public class AtomEntryEntityProducer { } } + private void appendAdditinalLinks(final XMLStreamWriter writer, final EntityInfoAggregator eia, + final Map<String, Object> data) + throws EntityProviderException, EdmException, URISyntaxException { + final Map<String, Map<String, Object>> links = properties.getAdditionalLinks(); + if (links != null && !links.isEmpty()) { + for (Entry<String, Map<String, Object>> entry : links.entrySet()) { + Map<String, Object> navigationKeyMap = entry.getValue(); + if (navigationKeyMap != null && !navigationKeyMap.isEmpty()) { + final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create( + eia.getEntitySet().getRelatedEntitySet( + (EdmNavigationProperty) eia.getEntityType().getProperty(entry.getKey()))); + appendAtomNavigationLink(writer, createSelfLink(targetEntityInfo, navigationKeyMap, null), entry.getKey(), + null, eia, data); + } + } + } + } + private void appendCustomProperties(final XMLStreamWriter writer, final EntityInfoAggregator eia, final Map<String, Object> data) throws EntityProviderException { List<String> noneSyndicationTargetPaths = eia.getNoneSyndicationTargetPathNames(); @@ -320,19 +350,17 @@ public class AtomEntryEntityProducer { private void appendAtomContentLink(final XMLStreamWriter writer, final EntityInfoAggregator eia, final Map<String, Object> data, final String selfLink) throws EntityProviderException, EdmException { try { - String mediaResourceMimeType = properties.getMediaResourceMimeType(); - if (mediaResourceMimeType == null) { - EdmMapping entityTypeMapping = eia.getEntityType().getMapping(); - if (entityTypeMapping != null) { - String mediaResourceMimeTypeKey = entityTypeMapping.getMediaResourceMimeTypeKey(); - if (mediaResourceMimeTypeKey != null) { - mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey); - } - } - if (mediaResourceMimeType == null) { - mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); + String mediaResourceMimeType = null; + EdmMapping entityTypeMapping = eia.getEntityType().getMapping(); + if (entityTypeMapping != null) { + String mediaResourceMimeTypeKey = entityTypeMapping.getMediaResourceMimeTypeKey(); + if (mediaResourceMimeTypeKey != null) { + mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey); } } + if (mediaResourceMimeType == null) { + mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); + } writer.writeStartElement(FormatXml.ATOM_LINK); writer.writeAttribute(FormatXml.ATOM_HREF, selfLink + "/$value"); @@ -348,10 +376,9 @@ public class AtomEntryEntityProducer { final Map<String, Object> data, final String selfLink) throws EntityProviderException, EdmException { try { - // We have to support the media resource mime type at the properties till version 1.2 then this can be refactored - String mediaResourceMimeType = properties.getMediaResourceMimeType(); EdmMapping entityTypeMapping = eia.getEntityType().getMapping(); String self = null; + String mediaResourceMimeType = null; if (entityTypeMapping != null) { String mediaResourceSourceKey = entityTypeMapping.getMediaResourceSourceKey(); @@ -361,22 +388,16 @@ public class AtomEntryEntityProducer { if (self == null) { self = selfLink + "/$value"; } - if (mediaResourceMimeType == null) { - String mediaResourceMimeTypeKey = - entityTypeMapping.getMimeType() != null ? entityTypeMapping.getMimeType() - : entityTypeMapping.getMediaResourceMimeTypeKey(); - if (mediaResourceMimeTypeKey != null) { - mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey); - } - if (mediaResourceMimeType == null) { - mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); - } + String mediaResourceMimeTypeKey = entityTypeMapping.getMediaResourceMimeTypeKey(); + if (mediaResourceMimeTypeKey != null) { + mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey); } - } else { - self = selfLink + "/$value"; if (mediaResourceMimeType == null) { mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); } + } else { + self = selfLink + "/$value"; + mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); } writer.writeStartElement(FormatXml.ATOM_CONTENT); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java index 8ad5d42..ab2daf8 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/JsonEntryEntityProducer.java @@ -23,6 +23,7 @@ import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import org.apache.olingo.odata2.api.ODataCallback; import org.apache.olingo.odata2.api.edm.Edm; @@ -70,21 +71,27 @@ public class JsonEntryEntityProducer { try { jsonStreamWriter = new JsonStreamWriter(writer); - if (isRootElement) { + if (isRootElement && !properties.isOmitJsonWrapper()) { jsonStreamWriter.beginObject().name(FormatJson.D); } jsonStreamWriter.beginObject(); - writeMetadata(entityInfo, data, type); + if (!properties.isContentOnly()) { + writeMetadata(entityInfo, data, type); + } writeProperties(entityInfo, data, type); - writeNavigationProperties(writer, entityInfo, data, type); + if (!properties.isContentOnly()) { + writeNavigationProperties(writer, entityInfo, data, type); + } else { + writeAdditonalLinksInContentOnlyCase(entityInfo); + } jsonStreamWriter.endObject(); - if (isRootElement) { + if (isRootElement && !properties.isOmitJsonWrapper()) { jsonStreamWriter.endObject(); } @@ -173,9 +180,17 @@ public class JsonEntryEntityProducer { private void writeProperties(final EntityInfoAggregator entityInfo, final Map<String, Object> data, final EdmEntityType type) throws EdmException, EntityProviderException, IOException { + boolean omitComma = false; + if (properties.isContentOnly()) { + omitComma = true; + } for (final String propertyName : type.getPropertyNames()) { if (entityInfo.getSelectedPropertyNames().contains(propertyName)) { - jsonStreamWriter.separator(); + if (omitComma == true) { + omitComma = false; + } else { + jsonStreamWriter.separator(); + } jsonStreamWriter.name(propertyName); JsonPropertyEntityProducer.appendPropertyValue(jsonStreamWriter, entityInfo.getPropertyInfo(propertyName), data.get(propertyName)); @@ -202,9 +217,8 @@ public class JsonEntryEntityProducer { if (type.hasStream()) { jsonStreamWriter.separator(); - // We have to support the media resource mime type at the properties till version 1.2 then this can be refactored - String mediaResourceMimeType = properties.getMediaResourceMimeType(); EdmMapping entityTypeMapping = entityInfo.getEntityType().getMapping(); + String mediaResourceMimeType = null; String mediaSrc = null; if (entityTypeMapping != null) { @@ -215,19 +229,16 @@ public class JsonEntryEntityProducer { if (mediaSrc == null) { mediaSrc = self + "/$value"; } - if (mediaResourceMimeType == null) { - mediaResourceMimeType = - entityTypeMapping.getMimeType() != null ? (String) data.get(entityTypeMapping.getMimeType()) - : (String) data.get(entityTypeMapping.getMediaResourceMimeTypeKey()); - if (mediaResourceMimeType == null) { - mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); - } + String mediaResourceMimeTypeKey = entityTypeMapping.getMediaResourceMimeTypeKey(); + if (mediaResourceMimeTypeKey != null) { + mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey); } - } else { - mediaSrc = self + "/$value"; if (mediaResourceMimeType == null) { mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); } + } else { + mediaSrc = self + "/$value"; + mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString(); } jsonStreamWriter.namedStringValueRaw(FormatJson.CONTENT_TYPE, mediaResourceMimeType); @@ -250,16 +261,42 @@ public class JsonEntryEntityProducer { if (key == null || key.isEmpty()) { target = location + "/" + Encoder.encode(navigationPropertyName); } else { - final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create( - entityInfo.getEntitySet().getRelatedEntitySet( - (EdmNavigationProperty) entityInfo.getEntityType().getProperty(navigationPropertyName))); - target = (properties.getServiceRoot() == null ? "" : properties.getServiceRoot().toASCIIString()) - + AtomEntryEntityProducer.createSelfLink(targetEntityInfo, key, null); + target = createCustomTargetLink(entityInfo, navigationPropertyName, key); } JsonLinkEntityProducer.appendUri(jsonStreamWriter, target); jsonStreamWriter.endObject(); } + private String createCustomTargetLink(final EntityInfoAggregator entityInfo, final String navigationPropertyName, + final Map<String, Object> key) throws EntityProviderException, EdmException { + String target; + final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create( + entityInfo.getEntitySet().getRelatedEntitySet( + (EdmNavigationProperty) entityInfo.getEntityType().getProperty(navigationPropertyName))); + target = (properties.getServiceRoot() == null ? "" : properties.getServiceRoot().toASCIIString()) + + AtomEntryEntityProducer.createSelfLink(targetEntityInfo, key, null); + return target; + } + + private void writeAdditonalLinksInContentOnlyCase(final EntityInfoAggregator entityInfo) + throws IOException, EntityProviderException, EdmException { + final Map<String, Map<String, Object>> links = properties.getAdditionalLinks(); + if (links != null && !links.isEmpty()) { + for (Entry<String, Map<String, Object>> entry : links.entrySet()) { + Map<String, Object> navigationKeyMap = entry.getValue(); + if (navigationKeyMap != null && !navigationKeyMap.isEmpty()) { + String target = createCustomTargetLink(entityInfo, entry.getKey(), navigationKeyMap); + jsonStreamWriter.separator(); + jsonStreamWriter.name(entry.getKey()); + jsonStreamWriter.beginObject() + .name(FormatJson.DEFERRED); + JsonLinkEntityProducer.appendUri(jsonStreamWriter, target); + jsonStreamWriter.endObject(); + } + } + } + } + public String getETag() { return eTag; } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java index 7f05942..5439925 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/XmlPropertyEntityProducer.java @@ -182,8 +182,8 @@ public class XmlPropertyEntityProducer { String mimeType = null; if (prop.getMimeType() != null) { mimeType = prop.getMimeType(); - } else if (prop.getMapping() != null && prop.getMapping().getMimeType() != null) { - mimeType = (String) extractChildValue(value, prop.getMapping().getMimeType()); + } else if (prop.getMapping() != null && prop.getMapping().getMediaResourceMimeTypeKey() != null) { + mimeType = (String) extractChildValue(value, prop.getMapping().getMediaResourceMimeTypeKey()); contentValue = extractChildValue(value, prop.getName()); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java index 5f7d059..b5dd749 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/rest/ODataExceptionMapperImpl.java @@ -25,7 +25,6 @@ import java.util.Set; import javax.servlet.ServletConfig; import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.NotAllowedException; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Application; import javax.ws.rs.core.Context; @@ -93,8 +92,7 @@ public class ODataExceptionMapperImpl implements ExceptionMapper<Exception> { ODataExceptionWrapper exceptionWrapper = new ODataExceptionWrapper(uriInfo, httpHeaders, getErrorHandlerCallback()); - ODataResponse oDataResponse = exceptionWrapper.wrapInExceptionResponse(exception); - return oDataResponse; + return exceptionWrapper.wrapInExceptionResponse(exception); } private ODataResponse handleWebApplicationException(final Exception exception) throws ClassNotFoundException, @@ -132,8 +130,9 @@ public class ODataExceptionMapperImpl implements ExceptionMapper<Exception> { context.setErrorCode(null); context.setMessage(exception.getMessage()); context.setLocale(DEFAULT_RESPONSE_LOCALE); - context.setHttpStatus(HttpStatusCodes.fromStatusCode(exception.getResponse().getStatus())); - if (exception instanceof NotAllowedException) { + HttpStatusCodes statusCode = HttpStatusCodes.fromStatusCode(exception.getResponse().getStatus()); + context.setHttpStatus(statusCode); + if (statusCode == HttpStatusCodes.METHOD_NOT_ALLOWED) { // RFC 2616, 5.1.1: " An origin server SHOULD return the status code // 405 (Method Not Allowed) if the method is known by the origin server // but not allowed for the requested resource, and 501 (Not Implemented) @@ -194,10 +193,8 @@ public class ODataExceptionMapperImpl implements ExceptionMapper<Exception> { } private ODataErrorCallback getErrorHandlerCallback() { - ODataErrorCallback callback = null; final ODataServiceFactory serviceFactory = ODataRootLocator.createServiceFactoryFromContext(app, servletRequest, servletConfig); - callback = serviceFactory.getCallback(ODataErrorCallback.class); - return callback; + return serviceFactory.getCallback(ODataErrorCallback.class); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java index dbe2935..5078e4b 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/ODataServlet.java @@ -128,7 +128,7 @@ public class ODataServlet extends HttpServlet { } else if (HTTP_METHOD_HEAD.equals(method) || HTTP_METHOD_OPTIONS.equals(method)) { createNotImplementedResponse(req, ODataNotImplementedException.COMMON, resp); } else { - createMethodNotAllowedResponse(req, ODataHttpException.COMMON, resp); + createNotImplementedResponse(req, ODataHttpException.COMMON, resp); } } @@ -149,7 +149,7 @@ public class ODataServlet extends HttpServlet { } else if (HTTP_METHOD_HEAD.equals(xHttpMethod) || HTTP_METHOD_OPTIONS.equals(xHttpMethod)) { createNotImplementedResponse(req, ODataNotImplementedException.COMMON, resp); } else { - return false; + createNotImplementedResponse(req, ODataNotImplementedException.COMMON, resp); } return true; } @@ -197,15 +197,29 @@ public class ODataServlet extends HttpServlet { HTTP_METHOD_HEAD.equals(method) || HTTP_METHOD_OPTIONS.equals(method)) { ODataResponse odataResponse = ODataResponse.status(HttpStatusCodes.TEMPORARY_REDIRECT) - .header(HttpHeaders.LOCATION, "/") + .header(HttpHeaders.LOCATION, createLocation(req)) .build(); createResponse(resp, odataResponse); } else { - createMethodNotAllowedResponse(req, ODataHttpException.COMMON, resp); + createNotImplementedResponse(req, ODataHttpException.COMMON, resp); } } + private String createLocation(final HttpServletRequest req) { + StringBuilder location = new StringBuilder(); + String contextPath = req.getContextPath(); + if (contextPath != null) { + location.append(contextPath); + } + String servletPath = req.getServletPath(); + if (servletPath != null) { + location.append(servletPath); + } + location.append("/"); + return location.toString(); + } + private void createResponse(final HttpServletResponse resp, final ODataResponse response) throws IOException { resp.setStatus(response.getStatus().getStatusCode()); resp.setContentType(response.getContentHeader()); @@ -239,6 +253,7 @@ public class ODataServlet extends HttpServlet { ODataExceptionWrapper exceptionWrapper = new ODataExceptionWrapper(req); ODataResponse response = exceptionWrapper.wrapInExceptionResponse(new ODataNotImplementedException(messageReference)); +// resp.setStatus(HttpStatusCodes.NOT_IMPLEMENTED.getStatusCode()); createResponse(resp, response); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java index e5b5555..36a1f65 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/servlet/RestUtil.java @@ -269,6 +269,7 @@ public class RestUtil { if (index < 0) { odataSegments.add(new ODataPathSegmentImpl(segment, null)); } else { + // post condition: we do not allow matrix parameters in OData path segments String path = segment.substring(0, index); Map<String, List<String>> parameterMap = extractMatrixParameter(segment, index); throw new ODataNotFoundException(ODataNotFoundException.MATRIX.addContent(parameterMap.keySet(), path)); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/main/resources/i18n_en.properties ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/resources/i18n_en.properties b/odata2-lib/odata-core/src/main/resources/i18n_en.properties index d6d0654..564dfef 100644 --- a/odata2-lib/odata-core/src/main/resources/i18n_en.properties +++ b/odata2-lib/odata-core/src/main/resources/i18n_en.properties @@ -107,7 +107,7 @@ org.apache.olingo.odata2.api.exception.ODataBadRequestException.AMBIGUOUS_XMETHO org.apache.olingo.odata2.api.exception.ODataForbiddenException.COMMON=Forbidden -org.apache.olingo.odata2.api.exception.ODataNotFoundException.MATRIX=Matrix parameter '%1$s' with path segment '%2$s' not found! +org.apache.olingo.odata2.api.exception.ODataNotFoundException.MATRIX=Matrix parameter '%1$s' in path segment '%2$s' not supported! org.apache.olingo.odata2.api.exception.ODataNotFoundException.ENTITY=Requested entity could not be found. org.apache.olingo.odata2.api.exception.ODataMethodNotAllowedException.DISPATCH=The request dispatcher does not allow the HTTP method used for the request. http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java new file mode 100644 index 0000000..673641d --- /dev/null +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataRequestTest.java @@ -0,0 +1,77 @@ +/* + * 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.odata2.core; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.olingo.odata2.api.processor.ODataRequest; +import org.junit.Test; + +public class ODataRequestTest { + + @Test + public void testInsensitveHeaders() { + + Map<String, List<String>> headers = new HashMap<String, List<String>>(); + + headers.put("lower", Arrays.asList("lower")); + headers.put("UPPER", Arrays.asList("UPPER")); + headers.put("mIxEd", Arrays.asList("mIxEd")); + + ODataRequest r1 = ODataRequest.requestHeaders(headers).build(); + verifyHeader(r1); + + ODataRequest r2 = ODataRequest.fromRequest(r1).build(); + verifyHeader(r2); + + } + + void verifyHeader(final ODataRequest r) { + assertEquals("lower", r.getRequestHeaderValue("lower")); + assertEquals("lower", r.getRequestHeaderValue("LOWER")); + assertEquals("lower", r.getRequestHeaderValue("Lower")); + + assertEquals("UPPER", r.getRequestHeaderValue("upper")); + assertEquals("UPPER", r.getRequestHeaderValue("UPPER")); + assertEquals("UPPER", r.getRequestHeaderValue("Upper")); + + assertEquals("mIxEd", r.getRequestHeaderValue("mixed")); + assertEquals("mIxEd", r.getRequestHeaderValue("MIXED")); + assertEquals("mIxEd", r.getRequestHeaderValue("mIxEd")); + + Map<String, List<String>> map = r.getRequestHeaders(); + + assertEquals("lower", map.get("lower").get(0)); + assertEquals("lower", map.get("LOWER").get(0)); + assertEquals("lower", map.get("Lower").get(0)); + + assertEquals("UPPER", map.get("upper").get(0)); + assertEquals("UPPER", map.get("UPPER").get(0)); + assertEquals("UPPER", map.get("Upper").get(0)); + + assertEquals("mIxEd", map.get("mixed").get(0)); + assertEquals("mIxEd", map.get("MIXED").get(0)); + assertEquals("mIxEd", map.get("mIxEd").get(0)); + } +} http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java index fb20afc..19cd6ed 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ODataResponseTest.java @@ -20,15 +20,18 @@ package org.apache.olingo.odata2.core; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import java.io.ByteArrayInputStream; import java.util.Arrays; import java.util.HashSet; import org.apache.olingo.odata2.api.commons.HttpContentType; import org.apache.olingo.odata2.api.commons.HttpHeaders; import org.apache.olingo.odata2.api.commons.HttpStatusCodes; +import org.apache.olingo.odata2.api.exception.ODataException; import org.apache.olingo.odata2.api.processor.ODataResponse; import org.apache.olingo.odata2.testutil.fit.BaseTest; import org.junit.Test; @@ -52,6 +55,20 @@ public class ODataResponseTest extends BaseTest { } @Test + public void buildEntityAsStreamResponseTest() throws ODataException { + ODataResponse response = ODataResponse.entity(new ByteArrayInputStream("abc".getBytes())).build(); + assertNull(response.getStatus()); + assertNotNull(response.getEntityAsStream()); + } + + @Test(expected = ODataException.class) + public void buildEntityAsStreamResponseFailTest() throws ODataException { + ODataResponse response = ODataResponse.entity("abc").build(); + assertNull(response.getStatus()); + assertNotNull(response.getEntityAsStream()); + } + + @Test public void buildHeaderResponseTest() { ODataResponse response = ODataResponse .header("abc", "123") http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java index b3f41a0..ca6b655 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestTest.java @@ -18,16 +18,9 @@ ******************************************************************************/ package org.apache.olingo.odata2.core.batch; -import org.apache.olingo.odata2.api.batch.BatchException; -import org.apache.olingo.odata2.api.batch.BatchRequestPart; -import org.apache.olingo.odata2.api.client.batch.BatchChangeSet; -import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart; -import org.apache.olingo.odata2.api.client.batch.BatchPart; -import org.apache.olingo.odata2.api.client.batch.BatchQueryPart; -import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties; -import org.apache.olingo.odata2.core.PathInfoImpl; -import org.apache.olingo.odata2.testutil.helper.StringHelper; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; @@ -38,9 +31,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import org.apache.olingo.odata2.api.batch.BatchException; +import org.apache.olingo.odata2.api.batch.BatchRequestPart; +import org.apache.olingo.odata2.api.client.batch.BatchChangeSet; +import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart; +import org.apache.olingo.odata2.api.client.batch.BatchPart; +import org.apache.olingo.odata2.api.client.batch.BatchQueryPart; +import org.apache.olingo.odata2.api.ep.EntityProviderBatchProperties; +import org.apache.olingo.odata2.core.PathInfoImpl; +import org.apache.olingo.odata2.testutil.helper.StringHelper; +import org.junit.Test; /** * Test creation of a batch request with BatchRequestWriter and http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java index 89bdea3..051e1da 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchRequestWriterTest.java @@ -18,13 +18,9 @@ ******************************************************************************/ package org.apache.olingo.odata2.core.batch; -import org.apache.olingo.odata2.api.batch.BatchException; -import org.apache.olingo.odata2.api.client.batch.BatchChangeSet; -import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart; -import org.apache.olingo.odata2.api.client.batch.BatchPart; -import org.apache.olingo.odata2.api.client.batch.BatchQueryPart; -import org.apache.olingo.odata2.testutil.helper.StringHelper; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.InputStream; @@ -33,9 +29,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import org.apache.olingo.odata2.api.batch.BatchException; +import org.apache.olingo.odata2.api.client.batch.BatchChangeSet; +import org.apache.olingo.odata2.api.client.batch.BatchChangeSetPart; +import org.apache.olingo.odata2.api.client.batch.BatchPart; +import org.apache.olingo.odata2.api.client.batch.BatchQueryPart; +import org.apache.olingo.odata2.testutil.helper.StringHelper; +import org.junit.Test; public class BatchRequestWriterTest { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java index c438a0f..f5f05ff 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/batch/BatchResponseTest.java @@ -18,6 +18,16 @@ ******************************************************************************/ package org.apache.olingo.odata2.core.batch; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import org.apache.olingo.odata2.api.batch.BatchException; import org.apache.olingo.odata2.api.batch.BatchResponsePart; import org.apache.olingo.odata2.api.client.batch.BatchSingleResponse; @@ -26,13 +36,6 @@ import org.apache.olingo.odata2.api.processor.ODataResponse; import org.apache.olingo.odata2.testutil.helper.StringHelper; import org.junit.Test; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.*; - /** * Test creation of a batch response with BatchResponseWriter and * then parsing this response again with BatchResponseParser. http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java index 9a80bce..7ddb197 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/EdmSimpleTypeTest.java @@ -1042,6 +1042,10 @@ public class EdmSimpleTypeTest extends BaseTest { getMaxLengthFacets(2), byte[].class))); assertTrue(Arrays.equals(binary, instance.valueOfString("qrvM\r\n3e7/\r\n", EdmLiteralKind.DEFAULT, getMaxLengthFacets(6), byte[].class))); + assertTrue(Arrays.equals(binary, instance.valueOfString("\nqrvM3e7/", EdmLiteralKind.DEFAULT, + getMaxLengthFacets(6), byte[].class))); + assertTrue(Arrays.equals(binary, instance.valueOfString("qrvM\n3e7/", EdmLiteralKind.DEFAULT, + getMaxLengthFacets(6), byte[].class))); assertTrue(Arrays.equals(binary, instance.valueOfString("qrvM3e7/", EdmLiteralKind.DEFAULT, getMaxLengthFacets(Integer.MAX_VALUE), byte[].class))); assertTrue(Arrays.equals(binary, instance.valueOfString("X'AABBCCDDEEFF'", EdmLiteralKind.URI, @@ -1053,11 +1057,13 @@ public class EdmSimpleTypeTest extends BaseTest { assertTrue(Arrays.equals(binary, instance.valueOfString("X'AABBCCDDEEFF'", EdmLiteralKind.URI, getMaxLengthFacets(null), byte[].class))); - expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.DEFAULT, getMaxLengthFacets(3), + expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.DEFAULT, getMaxLengthFacets(5), + EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED); + expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.JSON, getMaxLengthFacets(5), EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED); - expectErrorInValueOfString(instance, "qrvM3e7/", EdmLiteralKind.JSON, getMaxLengthFacets(3), + expectErrorInValueOfString(instance, "binary'AABBCCDDEEFF'", EdmLiteralKind.URI, getMaxLengthFacets(5), EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED); - expectErrorInValueOfString(instance, "binary'AABBCCDDEEFF'", EdmLiteralKind.URI, getMaxLengthFacets(3), + expectErrorInValueOfString(instance, "qrvM3e7/\r", EdmLiteralKind.DEFAULT, getMaxLengthFacets(6), EdmSimpleTypeException.LITERAL_FACETS_NOT_MATCHED); expectErrorInValueOfString(instance, "@", EdmLiteralKind.DEFAULT, null, http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java index b1dc084..7cde2cb 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmAssociationImplProvTest.java @@ -100,9 +100,15 @@ public class EdmAssociationImplProvTest extends BaseTest { @Test public void testReferentialConstraint() throws EdmException { - EdmAssociation association = associationProv; - assertEquals("end1Role", association.getReferentialConstraint().getDependent().getRole()); - assertEquals("end2Role", association.getReferentialConstraint().getPrincipal().getRole()); + assertEquals("end1Role", associationProv.getReferentialConstraint().getDependent().getRole()); + assertEquals("end2Role", associationProv.getReferentialConstraint().getPrincipal().getRole()); + } + + @Test + public void testReferentialConstraintNull() throws EdmException { + Association association = new Association().setName("association"); + EdmAssociation edmAssociation = new EdmAssociationImplProv(null, association, "ns"); + assertNull(edmAssociation.getReferentialConstraint()); } @Test http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java index 69e1b11..84cab5e 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmFunctionImportImplProvTest.java @@ -91,7 +91,6 @@ public class EdmFunctionImportImplProvTest extends BaseTest { when(edmProvider.getFunctionImport("Container", "bar")).thenReturn(functionImportBar); edmFunctionImportWithoutParameters = new EdmFunctionImportImplProv(edmImplProv, functionImportBar, edmEntityContainer); - } @Test @@ -160,6 +159,11 @@ public class EdmFunctionImportImplProvTest extends BaseTest { } @Test + public void nulllReturnType() throws Exception { + assertNull(edmFunctionImportWithoutParameters.getReturnType()); + } + + @Test public void parameterAnnotations() throws Exception { EdmParameter parameter = edmFunctionImport.getParameter("fooParameter1"); assertNotNull(parameter); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java index 62da2e7..7f8757d 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmMappingTest.java @@ -47,8 +47,7 @@ public class EdmMappingTest extends BaseTest { mappedObject = new EdmMappingTest(); - Mapping propertySimpleMapping = - new Mapping().setMimeType("mimeType").setInternalName("value").setObject(mappedObject); + Mapping propertySimpleMapping = new Mapping().setInternalName("value").setObject(mappedObject); CustomizableFeedMappings propertySimpleFeedMappings = new CustomizableFeedMappings().setFcKeepInContent(true); SimpleProperty propertySimple = new SimpleProperty().setName("PropertyName").setType(EdmSimpleTypeKind.String) @@ -67,7 +66,6 @@ public class EdmMappingTest extends BaseTest { EdmMapping mapping = propertySimpleProvider.getMapping(); assertNotNull(mapping); assertEquals("value", mapping.getInternalName()); - assertEquals("mimeType", mapping.getMimeType()); assertEquals(mappedObject, mapping.getObject()); } @@ -76,7 +74,6 @@ public class EdmMappingTest extends BaseTest { EdmMapping mapping = navPropertyProvider.getMapping(); assertNotNull(mapping); assertEquals("value", mapping.getInternalName()); - assertEquals("mimeType", mapping.getMimeType()); assertEquals(mappedObject, mapping.getObject()); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java index 79ef3a6..c9348df 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmPropertyImplProvTest.java @@ -59,7 +59,7 @@ public class EdmPropertyImplProvTest extends BaseTest { edmProvider = mock(EdmProvider.class); EdmImplProv edmImplProv = new EdmImplProv(edmProvider); - Mapping propertySimpleMapping = new Mapping().setMimeType("mimeType2").setInternalName("value"); + Mapping propertySimpleMapping = new Mapping().setInternalName("value"); CustomizableFeedMappings propertySimpleFeedMappings = new CustomizableFeedMappings().setFcKeepInContent(true); SimpleProperty propertySimple = new SimpleProperty().setName("PropertyName").setType(EdmSimpleTypeKind.String) @@ -94,7 +94,6 @@ public class EdmPropertyImplProvTest extends BaseTest { assertEquals(EdmSimpleTypeFacadeImpl.getEdmSimpleType(EdmSimpleTypeKind.String), propertySimpleProvider.getType()); assertEquals("mimeType", propertySimpleProvider.getMimeType()); assertNotNull(propertySimpleProvider.getMapping()); - assertEquals("mimeType2", propertySimpleProvider.getMapping().getMimeType()); assertNotNull(propertySimpleProvider.getCustomizableFeedMappings()); assertEquals("value", propertySimpleProvider.getMapping().getInternalName()); assertNull(propertySimpleProvider.getFacets()); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java index 3845675..3c53540 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/AbstractProviderTest.java @@ -95,6 +95,7 @@ public abstract class AbstractProviderTest extends AbstractXmlProducerTestHelper employeeData.put("EntryDate", date); employeeData.put("TeamId", "42"); employeeData.put("EmployeeName", "Walter Winter"); + // employeeData.put("getImageType", "abc"); Map<String, Object> locationData = new HashMap<String, Object>(); Map<String, Object> cityData = new HashMap<String, Object>(); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java index 3b0d5ab..94f6650 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/ODataEntityProviderPropertiesTest.java @@ -69,34 +69,26 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { .expandSelectTree(expandSelectTree) .inlineCount(1) .inlineCountType(InlineCount.ALLPAGES) - .mediaResourceMimeType("image/png") .nextLink("http://localhost") .selfLink(selfLink) .includeSimplePropertyType(true) .additionalLinks(links) + .omitJsonWrapper(true) + .contentOnly(true) .build(); assertEquals("Wrong amount of callbacks.", 1, properties.getCallbacks().size()); assertTrue("No callback found.", properties.getCallbacks().containsKey("aCallback")); assertEquals("Wrong expand select tree.", expandSelectTree, properties.getExpandSelectTree()); assertEquals("Wrong self link.", selfLink, properties.getSelfLink()); - assertEquals("Wrong media resource mime type.", "image/png", properties.getMediaResourceMimeType()); assertEquals("Wrong base uri.", "http://localhost:80/", properties.getServiceRoot().toASCIIString()); assertEquals("Wrong inline count type.", InlineCount.ALLPAGES, properties.getInlineCountType()); assertEquals("Wrong inline count.", Integer.valueOf(1), properties.getInlineCount()); assertEquals("Wrong nextLink", "http://localhost", properties.getNextLink()); assertTrue("Simple property types should be true", properties.isIncludeSimplePropertyType()); assertEquals(Collections.emptyMap(), properties.getAdditionalLinks().get("aNavigationProperty")); - } - - @Test - public void buildEntryProperties() throws Exception { - final String mediaResourceMimeType = "text/html"; - final URI serviceRoot = new URI("http://localhost:80/"); - final EntityProviderWriteProperties properties = EntityProviderWriteProperties.serviceRoot(serviceRoot) - .mediaResourceMimeType(mediaResourceMimeType) - .build(); - assertEquals("Wrong mime type.", "text/html", properties.getMediaResourceMimeType()); + assertTrue("Json Wrapper should be omitted", properties.isOmitJsonWrapper()); + assertTrue("ContentOnlyFlag should be set", properties.isContentOnly()); } @Test @@ -113,11 +105,12 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { .expandSelectTree(expandSelectTree) .inlineCount(1) .inlineCountType(InlineCount.ALLPAGES) - .mediaResourceMimeType("image/png") .nextLink("http://localhost") .selfLink(selfLink) .includeSimplePropertyType(true) .additionalLinks(links) + .omitJsonWrapper(true) + .contentOnly(true) .build(); // @@ -129,12 +122,13 @@ public class ODataEntityProviderPropertiesTest extends BaseTest { assertTrue(fromProperties.getCallbacks().containsKey("aCallback")); assertEquals(expandSelectTree, fromProperties.getExpandSelectTree()); assertEquals(selfLink, fromProperties.getSelfLink()); - assertEquals("image/png", fromProperties.getMediaResourceMimeType()); assertEquals("Wrong base uri.", "http://localhost:80/", fromProperties.getServiceRoot().toASCIIString()); assertEquals("Wrong inline count type.", InlineCount.ALLPAGES, fromProperties.getInlineCountType()); assertEquals("Wrong inline count.", Integer.valueOf(1), fromProperties.getInlineCount()); assertEquals("Wrong nextLink", "http://localhost", fromProperties.getNextLink()); assertTrue("Simple property types should be true", fromProperties.isIncludeSimplePropertyType()); assertEquals(Collections.emptyMap(), fromProperties.getAdditionalLinks().get("aNavigationProperty")); + assertTrue("Json Wrapper should be omitted", properties.isOmitJsonWrapper()); + assertTrue("ContentOnlyFlag should be set", properties.isContentOnly()); } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java index 0d4a2f4..4836fd3 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryConsumerTest.java @@ -33,6 +33,7 @@ import java.util.TimeZone; import org.apache.olingo.odata2.api.edm.EdmEntitySet; import org.apache.olingo.odata2.api.ep.EntityProviderException; import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties; +import org.apache.olingo.odata2.api.ep.entry.EntryMetadata; import org.apache.olingo.odata2.api.ep.entry.MediaMetadata; import org.apache.olingo.odata2.api.ep.entry.ODataEntry; import org.apache.olingo.odata2.testutil.mock.MockFacade; @@ -44,6 +45,7 @@ import org.junit.Test; public class JsonEntryConsumerTest extends AbstractConsumerTest { private static final String SIMPLE_ENTRY_BUILDING = "JsonBuilding.json"; + private static final String SIMPLE_ENTRY_ROOM = "JsonRoom.json"; private static final String SIMPLE_ENTRY_EMPLOYEE = "JsonEmployee.json"; private static final String SIMPLE_ENTRY_TEAM = "JsonTeam.json"; private static final String INVALID_ENTRY_TEAM_DOUBLE_NAME_PROPERTY = "JsonInvalidTeamDoubleNameProperty.json"; @@ -53,6 +55,76 @@ public class JsonEntryConsumerTest extends AbstractConsumerTest { private static final String negativeJsonStart_1 = "{ \"abc\": {"; private static final String negativeJsonStart_2 = "{ \"d\": [a: 1, b: 2] }"; + @Test + public void readContentOnlyEmployee() throws Exception { + // prepare + String content = readFile("JsonEmployeeContentOnly.json"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + InputStream contentBody = createContentAsStream(content); + + // execute + JsonEntityConsumer xec = new JsonEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(9, result.getProperties().size()); + } + + @Test + public void readContentOnlyRoom() throws Exception { + // prepare + String content = readFile("JsonRoomContentOnly.json"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + InputStream contentBody = createContentAsStream(content); + + // execute + JsonEntityConsumer xec = new JsonEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(4, result.getProperties().size()); + } + + @Test + public void readContentOnlyEmployeeWithAdditionalLink() throws Exception { + // prepare + String content = readFile("JsonEmployeeContentOnlyWithAdditionalLink.json"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + InputStream contentBody = createContentAsStream(content); + + // execute + JsonEntityConsumer xec = new JsonEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(9, result.getProperties().size()); + List<String> associationUris = result.getMetadata().getAssociationUris("ne_Manager"); + assertEquals(1, associationUris.size()); + assertEquals("http://host:8080/ReferenceScenario.svc/Managers('1')", associationUris.get(0)); + } + + @Test + public void readContentOnlyRoomWithAdditionalLink() throws Exception { + // prepare + String content = readFile("JsonRoomContentOnlyWithAdditionalLink.json"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + InputStream contentBody = createContentAsStream(content); + + // execute + JsonEntityConsumer xec = new JsonEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(4, result.getProperties().size()); + List<String> associationUris = result.getMetadata().getAssociationUris("nr_Building"); + assertEquals(1, associationUris.size()); + assertEquals("http://host:8080/ReferenceScenario.svc/Buildings('1')", associationUris.get(0)); + } + @Test(expected = EntityProviderException.class) public void doubleClosingBracketsAtTheEnd() throws Exception { String invalidJson = "{ \"Id\" : \"1\", \"Seats\" : 1, \"Version\" : 1}}"; @@ -64,6 +136,31 @@ public class JsonEntryConsumerTest extends AbstractConsumerTest { xec.readEntry(entitySet, contentBody, DEFAULT_PROPERTIES); } + @Test + public void readSimpleRoomEntry() throws Exception { + ODataEntry roomEntry = prepareAndExecuteEntry(SIMPLE_ENTRY_ROOM, "Rooms", DEFAULT_PROPERTIES); + + // verify + Map<String, Object> properties = roomEntry.getProperties(); + assertEquals(4, properties.size()); + + assertEquals("1", properties.get("Id")); + assertEquals("Room 1", properties.get("Name")); + assertEquals((short) 1, properties.get("Seats")); + assertEquals((short) 1, properties.get("Version")); + + List<String> associationUris = roomEntry.getMetadata().getAssociationUris("nr_Employees"); + assertEquals(1, associationUris.size()); + assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Employees", associationUris.get(0)); + + associationUris = roomEntry.getMetadata().getAssociationUris("nr_Building"); + assertEquals(1, associationUris.size()); + assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms('1')/nr_Building", associationUris.get(0)); + + EntryMetadata metadata = roomEntry.getMetadata(); + assertEquals("W/\"1\"", metadata.getEtag()); + } + @SuppressWarnings("unchecked") @Test public void readSimpleEmployeeEntry() throws Exception { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java index 1a057af..e12cb59 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonEntryDeepInsertEntryTest.java @@ -162,6 +162,8 @@ public class JsonEntryDeepInsertEntryTest extends AbstractConsumerTest { associationUris = innerRoom.getMetadata().getAssociationUris("nr_Building"); assertEquals(Collections.emptyList(), associationUris); + assertEquals("W/\"1\"", innerRoom.getMetadata().getEtag()); + ODataEntry innerBuilding = (ODataEntry) innerRoomProperties.get("nr_Building"); assertNotNull(innerBuilding); assertFalse(innerBuilding.containsInlineEntry()); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java index 3d9201c..6495b73 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonFeedConsumerTest.java @@ -507,6 +507,8 @@ public class JsonFeedConsumerTest extends AbstractConsumerTest { assertNotNull(feedMetadata); assertEquals("http://localhost:8080/ReferenceScenario.svc/Rooms?!deltatoken=4711", feedMetadata.getDeltaLink()); + assertEquals("W/\"2\"", entries.get(0).getMetadata().getEtag()); + List<DeletedEntryMetadata> deletedEntries = feed.getDeletedEntries(); assertEquals(2, deletedEntries.size()); for (DeletedEntryMetadata deletedEntry : deletedEntries) { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java index 7d51314..cc5ec25 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/JsonPropertyConsumerTest.java @@ -130,6 +130,12 @@ public class JsonPropertyConsumerTest extends BaseTest { when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Double.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Double.valueOf("123456789"), resultMap.get("Name")); + // Double without " + simplePropertyJson = "{\"d\":{\"Name\":123456789}}"; + reader = prepareReader(simplePropertyJson); + when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Double.getEdmSimpleTypeInstance()); + resultMap = execute(edmProperty, reader); + assertEquals(Double.valueOf("123456789"), resultMap.get("Name")); // Int64 simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}"; reader = prepareReader(simplePropertyJson); @@ -142,6 +148,12 @@ public class JsonPropertyConsumerTest extends BaseTest { when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Single.getEdmSimpleTypeInstance()); resultMap = execute(edmProperty, reader); assertEquals(Float.valueOf("123456"), resultMap.get("Name")); + // Single without " + simplePropertyJson = "{\"d\":{\"Name\":123456}}"; + reader = prepareReader(simplePropertyJson); + when(edmProperty.getType()).thenReturn(EdmSimpleTypeKind.Single.getEdmSimpleTypeInstance()); + resultMap = execute(edmProperty, reader); + assertEquals(Float.valueOf("123456"), resultMap.get("Name")); // String simplePropertyJson = "{\"d\":{\"Name\":\"123456789\"}}"; reader = prepareReader(simplePropertyJson); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java index 59df942..2194619 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlEntityConsumerTest.java @@ -433,6 +433,76 @@ public class XmlEntityConsumerTest extends AbstractXmlConsumerTest { } @Test + public void readContentOnlyEmployee() throws Exception { + // prepare + String content = readFile("EmployeeContentOnly.xml"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + InputStream contentBody = createContentAsStream(content); + + // execute + XmlEntityConsumer xec = new XmlEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(9, result.getProperties().size()); + } + + @Test + public void readContentOnlyRoom() throws Exception { + // prepare + String content = readFile("RoomContentOnly.xml"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + InputStream contentBody = createContentAsStream(content); + + // execute + XmlEntityConsumer xec = new XmlEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(4, result.getProperties().size()); + } + + @Test + public void readContentOnlyEmployeeWithAdditionalLink() throws Exception { + // prepare + String content = readFile("EmployeeContentOnlyWithAdditionalLink.xml"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Employees"); + InputStream contentBody = createContentAsStream(content); + + // execute + XmlEntityConsumer xec = new XmlEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(9, result.getProperties().size()); + List<String> associationUris = result.getMetadata().getAssociationUris("ne_Manager"); + assertEquals(1, associationUris.size()); + assertEquals("Managers('1')", associationUris.get(0)); + } + + @Test + public void readContentOnlyRoomWithAdditionalLink() throws Exception { + // prepare + String content = readFile("RoomContentOnlyWithAdditionalLink.xml"); + EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); + InputStream contentBody = createContentAsStream(content); + + // execute + XmlEntityConsumer xec = new XmlEntityConsumer(); + ODataEntry result = + xec.readEntry(entitySet, contentBody, EntityProviderReadProperties.init().mergeSemantic(true).build()); + + // verify + assertEquals(4, result.getProperties().size()); + List<String> associationUris = result.getMetadata().getAssociationUris("nr_Building"); + assertEquals(1, associationUris.size()); + assertEquals("Buildings('1')", associationUris.get(0)); + } + + @Test public void readDeltaLink() throws Exception { // prepare String content = readFile("feed_with_delta_link.xml"); @@ -804,14 +874,19 @@ public class XmlEntityConsumerTest extends AbstractXmlConsumerTest { // execute XmlEntityConsumer xec = new XmlEntityConsumer(); - ODataEntry entry = + ODataEntry employee = xec.readEntry(entitySet, reqContent, EntityProviderReadProperties.init().mergeSemantic(true).build()); // validate - assertNotNull(entry); - Map<String, Object> properties = entry.getProperties(); + assertNotNull(employee); + Map<String, Object> properties = employee.getProperties(); assertEquals("1", properties.get("EmployeeId")); assertEquals("Walter Winter", properties.get("EmployeeName")); + EntryMetadata employeeMetadata = employee.getMetadata(); + assertNotNull(employeeMetadata); + assertEquals("W/\"1\"", employeeMetadata.getEtag()); + + // Inline ODataEntry room = (ODataEntry) properties.get("ne_Room"); Map<String, Object> roomProperties = room.getProperties(); assertEquals(4, roomProperties.size()); @@ -819,6 +894,9 @@ public class XmlEntityConsumerTest extends AbstractXmlConsumerTest { assertEquals("Room 1", roomProperties.get("Name")); assertEquals(Short.valueOf("1"), roomProperties.get("Seats")); assertEquals(Short.valueOf("1"), roomProperties.get("Version")); + EntryMetadata roomMetadata = room.getMetadata(); + assertNotNull(roomMetadata); + assertEquals("W/1", roomMetadata.getEtag()); } /** http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java index 9301258..ec7ce71 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlFeedConsumerTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.InputStream; +import java.util.List; import junit.framework.Assert; @@ -29,6 +30,8 @@ import org.apache.olingo.odata2.api.edm.EdmEntitySet; import org.apache.olingo.odata2.api.ep.EntityProvider; import org.apache.olingo.odata2.api.ep.EntityProviderException; import org.apache.olingo.odata2.api.ep.EntityProviderReadProperties; +import org.apache.olingo.odata2.api.ep.entry.EntryMetadata; +import org.apache.olingo.odata2.api.ep.entry.ODataEntry; import org.apache.olingo.odata2.api.ep.feed.FeedMetadata; import org.apache.olingo.odata2.api.ep.feed.ODataDeltaFeed; import org.apache.olingo.odata2.api.ep.feed.ODataFeed; @@ -42,6 +45,30 @@ public class XmlFeedConsumerTest extends AbstractXmlConsumerTest { } @Test + public void roomsFeedWithEtagEntries() throws Exception { + InputStream stream = getFileAsStream("feed_rooms_small.xml"); + assertNotNull(stream); + + ODataFeed feed = + EntityProvider.readFeed("application/atom+xml", MockFacade.getMockEdm().getDefaultEntityContainer() + .getEntitySet( + "Rooms"), stream, DEFAULT_PROPERTIES); + assertNotNull(feed); + + FeedMetadata feedMetadata = feed.getFeedMetadata(); + assertNotNull(feedMetadata); + assertNotNull(feedMetadata.getNextLink()); + + List<ODataEntry> entries = feed.getEntries(); + assertEquals(3, entries.size()); + ODataEntry singleRoom = entries.get(0); + EntryMetadata roomMetadata = singleRoom.getMetadata(); + assertNotNull(roomMetadata); + + assertEquals("W/\"1\"", roomMetadata.getEtag()); + } + + @Test public void readLargeEmployeesFeed() throws Exception { InputStream file = getFileAsStream("LargeEmployeeFeed.xml"); assertNotNull(file); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/46d83c8e/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java index 2f303f5..78967af 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/consumer/XmlMetadataConsumerTest.java @@ -528,8 +528,20 @@ public class XmlMetadataConsumerTest extends AbstractXmlConsumerTest { + "<EntitySet Name=\"Employees\" EntityType=\"RefScenario.Employee\"/>" + "<FunctionImport Name=\"EmployeeSearch\" ReturnType=\"Collection(RefScenario.Employee)\" " + "EntitySet=\"Employees\" m:HttpMethod=\"GET\">" - + "<Parameter Name=\"q\" Type=\"Edm.String\" Nullable=\"true\" />" - + "</FunctionImport>" + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; + + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />" + + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />" + + "</FunctionImport>" + + "<FunctionImport Name=\"RoomSearch\" ReturnType=\"Collection(RefScenario.Room)\" " + + "EntitySet=\"Rooms\" m:HttpMethod=\"GET\">" + + "<Parameter Name=\"q1\" Type=\"Edm.String\" Nullable=\"true\" />" + + "<Parameter Name=\"q2\" Type=\"Edm.Int32\" Nullable=\"false\" />" + + "</FunctionImport>" + + "<FunctionImport Name=\"NoParamters\" ReturnType=\"Collection(RefScenario.Room)\" " + + "EntitySet=\"Rooms\" m:HttpMethod=\"GET\">" + + "</FunctionImport>" + + "<FunctionImport Name=\"NoReturn\" " + + "EntitySet=\"Rooms\" m:HttpMethod=\"GET\"/>" + + "</EntityContainer>" + "</Schema>" + "</edmx:DataServices>" + "</edmx:Edmx>"; XmlMetadataConsumer parser = new XmlMetadataConsumer(); XMLStreamReader reader = createStreamReader(xmWithEntityContainer); DataServices result = parser.readMetadata(reader, true); @@ -537,22 +549,59 @@ public class XmlMetadataConsumerTest extends AbstractXmlConsumerTest { for (EntityContainer container : schema.getEntityContainers()) { assertEquals("Container1", container.getName()); assertEquals(Boolean.TRUE, container.isDefaultEntityContainer()); - for (FunctionImport functionImport : container.getFunctionImports()) { - assertEquals("EmployeeSearch", functionImport.getName()); - assertEquals("Employees", functionImport.getEntitySet()); - assertEquals(NAMESPACE, functionImport.getReturnType().getTypeName().getNamespace()); - assertEquals("Employee", functionImport.getReturnType().getTypeName().getName()); - assertEquals(EdmMultiplicity.MANY, functionImport.getReturnType().getMultiplicity()); - assertEquals("GET", functionImport.getHttpMethod()); - for (FunctionImportParameter parameter : functionImport.getParameters()) { - assertEquals("q", parameter.getName()); - assertEquals(EdmSimpleTypeKind.String, parameter.getType()); - assertEquals(Boolean.TRUE, parameter.getFacets().isNullable()); - } - } + + assertEquals(4, container.getFunctionImports().size()); + FunctionImport functionImport1 = container.getFunctionImports().get(0); + + assertEquals("EmployeeSearch", functionImport1.getName()); + assertEquals("Employees", functionImport1.getEntitySet()); + assertEquals(NAMESPACE, functionImport1.getReturnType().getTypeName().getNamespace()); + assertEquals("Employee", functionImport1.getReturnType().getTypeName().getName()); + assertEquals(EdmMultiplicity.MANY, functionImport1.getReturnType().getMultiplicity()); + assertEquals("GET", functionImport1.getHttpMethod()); + assertEquals(2, functionImport1.getParameters().size()); + + assertEquals("q1", functionImport1.getParameters().get(0).getName()); + assertEquals(EdmSimpleTypeKind.String, functionImport1.getParameters().get(0).getType()); + assertEquals(Boolean.TRUE, functionImport1.getParameters().get(0).getFacets().isNullable()); + + assertEquals("q2", functionImport1.getParameters().get(1).getName()); + assertEquals(EdmSimpleTypeKind.Int32, functionImport1.getParameters().get(1).getType()); + assertEquals(Boolean.FALSE, functionImport1.getParameters().get(1).getFacets().isNullable()); + + FunctionImport functionImport2 = container.getFunctionImports().get(1); + + assertEquals("RoomSearch", functionImport2.getName()); + assertEquals("Rooms", functionImport2.getEntitySet()); + assertEquals(NAMESPACE, functionImport2.getReturnType().getTypeName().getNamespace()); + assertEquals("Room", functionImport2.getReturnType().getTypeName().getName()); + assertEquals(EdmMultiplicity.MANY, functionImport2.getReturnType().getMultiplicity()); + assertEquals("GET", functionImport2.getHttpMethod()); + assertEquals(2, functionImport2.getParameters().size()); + + assertEquals("q1", functionImport2.getParameters().get(0).getName()); + assertEquals(EdmSimpleTypeKind.String, functionImport2.getParameters().get(0).getType()); + assertEquals(Boolean.TRUE, functionImport2.getParameters().get(0).getFacets().isNullable()); + + assertEquals("q2", functionImport2.getParameters().get(1).getName()); + assertEquals(EdmSimpleTypeKind.Int32, functionImport2.getParameters().get(1).getType()); + assertEquals(Boolean.FALSE, functionImport2.getParameters().get(1).getFacets().isNullable()); + + FunctionImport functionImport3 = container.getFunctionImports().get(2); + + assertEquals("NoParamters", functionImport3.getName()); + List<FunctionImportParameter> parameters3 = functionImport3.getParameters(); + assertNotNull(parameters3); + assertEquals(0, parameters3.size()); + + FunctionImport functionImport4 = container.getFunctionImports().get(3); + assertEquals("NoReturn", functionImport4.getName()); + List<FunctionImportParameter> parameters4 = functionImport4.getParameters(); + assertNotNull(parameters4); + assertEquals(0, parameters4.size()); + assertNull(functionImport4.getReturnType()); } } - } @Test()
