private ContentType getResourceContentType(UriInfoWithType uriInfo) { ContentType resourceContentType; switch (uriInfo.getUriType()) { case URI0: // service document resourceContentType = SERVICE_DOCUMENT_CONTENT_TYPE; break; case URI8: // metadata resourceContentType = METADATA_CONTENT_TYPE; break; case URI4: case URI5: // is it a $value URI?? if (uriInfo.isValue()) { // property value and $count resourceContentType = TEXT_PLAIN_WITH_CS_UTF_8; } else { resourceContentType = contentType; } break; case URI15: case URI16: case URI50A: case URI50B: // $count resourceContentType = TEXT_PLAIN_WITH_CS_UTF_8; break; default: resourceContentType = contentType; } return resourceContentType; }
private ODataResponse writeContent(Edm edm, UriInfoWithType uriInfo, Object content) throws ODataApplicationException, EdmException, EntityProviderException, URISyntaxException, IOException { String responseContentType = getContentType(); ODataResponse response; switch (uriInfo.getUriType()) { case URI4: case URI5: // simple property final List<EdmProperty> simplePropertyPath = uriInfo.getPropertyPath(); final EdmProperty simpleProperty = simplePropertyPath.get(simplePropertyPath.size() - 1); responseContentType = simpleProperty.getMimeType(); if (uriInfo.isValue()) { response = EntityProvider.writePropertyValue(simpleProperty, content); responseContentType = TEXT_PLAIN_WITH_CS_UTF_8.toString(); } else { response = EntityProvider.writeProperty(getContentType(), simpleProperty, content); } break; case URI3: // complex property final List<EdmProperty> complexPropertyPath = uriInfo.getPropertyPath(); final EdmProperty complexProperty = complexPropertyPath.get(complexPropertyPath.size() - 1); response = EntityProvider.writeProperty(responseContentType, complexProperty, content); break; case URI7A: // $links with 0..1 cardinality property final EdmEntitySet targetLinkEntitySet = uriInfo.getTargetEntitySet(); EntityProviderWriteProperties linkProperties = EntityProviderWriteProperties.serviceRoot(new URI(serviceUri + SEPARATOR)).build(); @SuppressWarnings("unchecked") final Map<String, Object> linkMap = (Map<String, Object>) content; response = EntityProvider.writeLink( responseContentType, targetLinkEntitySet, linkMap, linkProperties); break; case URI7B: // $links with * cardinality property final EdmEntitySet targetLinksEntitySet = uriInfo.getTargetEntitySet(); EntityProviderWriteProperties linksProperties = EntityProviderWriteProperties.serviceRoot(new URI(serviceUri + SEPARATOR)).build(); @SuppressWarnings("unchecked") final List<Map<String, Object>> linksMap = (List<Map<String, Object>>) content; response = EntityProvider.writeLinks( responseContentType, targetLinksEntitySet, linksMap, linksProperties); break; case URI1: case URI2: case URI6A: case URI6B: // Entity final EdmEntitySet targetEntitySet = uriInfo.getTargetEntitySet(); EntityProviderWriteProperties properties = EntityProviderWriteProperties.serviceRoot(new URI(serviceUri + SEPARATOR)).build(); @SuppressWarnings("unchecked") final Map<String, Object> objectMap = (Map<String, Object>) content; response = EntityProvider.writeEntry(responseContentType, targetEntitySet, objectMap, properties); break; case URI9: // $batch @SuppressWarnings("unchecked") final List<Olingo2BatchRequest> batchParts = (List<Olingo2BatchRequest>) content; response = parseBatchRequest(edm, batchParts); break; default: // notify exception and return!!! throw new ODataApplicationException( "Unsupported resource type " + uriInfo.getTargetType(), Locale.ENGLISH); } return response.getContentHeader() != null ? response : ODataResponse.fromResponse(response).contentHeader(responseContentType).build(); }
@SuppressWarnings("unchecked") private <T> T readContent(UriInfoWithType uriInfo, InputStream content) throws EntityProviderException, ODataApplicationException { T response; switch (uriInfo.getUriType()) { case URI0: // service document response = (T) EntityProvider.readServiceDocument( content, SERVICE_DOCUMENT_CONTENT_TYPE.toString()); break; case URI8: // $metadata response = (T) EntityProvider.readMetadata(content, false); break; case URI7A: // link response = (T) EntityProvider.readLink(getContentType(), uriInfo.getTargetEntitySet(), content); break; case URI7B: // links response = (T) EntityProvider.readLinks(getContentType(), uriInfo.getTargetEntitySet(), content); break; case URI3: // complex property final List<EdmProperty> complexPropertyPath = uriInfo.getPropertyPath(); final EdmProperty complexProperty = complexPropertyPath.get(complexPropertyPath.size() - 1); response = (T) EntityProvider.readProperty( getContentType(), complexProperty, content, EntityProviderReadProperties.init().build()); break; case URI4: case URI5: // simple property final List<EdmProperty> simplePropertyPath = uriInfo.getPropertyPath(); final EdmProperty simpleProperty = simplePropertyPath.get(simplePropertyPath.size() - 1); if (uriInfo.isValue()) { response = (T) EntityProvider.readPropertyValue(simpleProperty, content); } else { response = (T) EntityProvider.readProperty( getContentType(), simpleProperty, content, EntityProviderReadProperties.init().build()); } break; case URI15: case URI16: case URI50A: case URI50B: // $count final String stringCount = new String(EntityProvider.readBinary(content), Consts.UTF_8); response = (T) Long.valueOf(stringCount); break; case URI1: case URI6B: if (uriInfo.getCustomQueryOptions().containsKey("!deltatoken")) { // ODataDeltaFeed response = (T) EntityProvider.readDeltaFeed( getContentType(), uriInfo.getTargetEntitySet(), content, EntityProviderReadProperties.init().build()); } else { // ODataFeed response = (T) EntityProvider.readFeed( getContentType(), uriInfo.getTargetEntitySet(), content, EntityProviderReadProperties.init().build()); } break; case URI2: case URI6A: response = (T) EntityProvider.readEntry( getContentType(), uriInfo.getTargetEntitySet(), content, EntityProviderReadProperties.init().build()); break; default: throw new ODataApplicationException( "Unsupported resource type " + uriInfo.getTargetType(), Locale.ENGLISH); } return response; }