@Test public void errorWithContinueOnErrorPreferHeader() throws Exception { ODataClient client = getClient(); client.getConfiguration().setContinueOnError(true); final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager payload = request.payloadManager(); appendGetRequest(payload, "ESAllPrim", 32767, false); // Without error appendGetRequest(payload, "ESAllPrim", 42, false); // Error ( Key does not exist ) appendGetRequest(payload, "ESAllPrim", 0, false); // Without error // Fetch result final ODataBatchResponse response = payload.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); assertEquals( PreferenceName.CONTINUE_ON_ERROR.getName(), response.getHeader(HttpHeader.PREFERENCE_APPLIED).iterator().next()); final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody(); // Check first get request assertTrue(bodyIterator.hasNext()); ODataBatchResponseItem item = bodyIterator.next(); assertFalse(item.isChangeset()); ODataResponse oDataResponse = item.next(); assertNotNull(oDataResponse); assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode()); assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size()); assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).toArray()[0]); assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size()); assertEquals("605", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).toArray()[0]); assertEquals(ContentType.JSON.toContentTypeString(), oDataResponse.getContentType()); // Check second get request assertTrue(bodyIterator.hasNext()); item = bodyIterator.next(); assertFalse(item.isChangeset()); oDataResponse = item.next(); assertNotNull(oDataResponse); assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), oDataResponse.getStatusCode()); // Check if third request is available assertTrue(bodyIterator.hasNext()); item = bodyIterator.next(); assertFalse(item.isChangeset()); oDataResponse = item.next(); assertNotNull(oDataResponse); assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode()); assertEquals(1, oDataResponse.getHeader(HttpHeader.ODATA_VERSION).size()); assertEquals("4.0", oDataResponse.getHeader(HttpHeader.ODATA_VERSION).iterator().next()); assertEquals(1, oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).size()); assertEquals("517", oDataResponse.getHeader(HttpHeader.CONTENT_LENGTH).iterator().next()); assertEquals(ContentType.JSON.toContentTypeString(), oDataResponse.getContentType()); }
@Test public void getBatchRequest() throws URISyntaxException { final ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager payload = request.payloadManager(); // create new request appendGetRequest(payload, "ESAllPrim", 32767, false); // Fetch result final ODataBatchResponse response = payload.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); assertEquals("Accepted", response.getStatusMessage()); final Iterator<ODataBatchResponseItem> iter = response.getBody(); assertTrue(iter.hasNext()); ODataBatchResponseItem item = iter.next(); assertFalse(item.isChangeset()); ODataResponse oDataResponse = item.next(); assertNotNull(oDataResponse); assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode()); assertEquals(1, oDataResponse.getHeader("OData-Version").size()); assertEquals("4.0", oDataResponse.getHeader("OData-Version").toArray()[0]); assertEquals(1, oDataResponse.getHeader("Content-Length").size()); assertEquals("605", oDataResponse.getHeader("Content-Length").toArray()[0]); assertEquals(ContentType.JSON.toContentTypeString(), oDataResponse.getContentType()); }
@Override public void readEntity( final ODataRequest request, ODataResponse response, final UriInfo uriInfo, final ContentType requestedContentType) throws ODataApplicationException, SerializerException { // First we have to figure out which entity set the requested entity is in final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource()); // Next we fetch the requested entity from the database Entity entity; try { entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet); } catch (DataProviderException e) { throw new ODataApplicationException(e.getMessage(), 500, Locale.ENGLISH); } if (entity == null) { // If no entity was found for the given key we throw an exception. throw new ODataApplicationException( "No entity found for this key", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH); } else { // If an entity was found we proceed by serializing it and sending it to the client. ODataSerializer serializer = odata.createSerializer(requestedContentType); final ExpandOption expand = uriInfo.getExpandOption(); final SelectOption select = uriInfo.getSelectOption(); InputStream serializedContent = serializer .entity( edm, edmEntitySet.getEntityType(), entity, EntitySerializerOptions.with() .contextURL( isODataMetadataNone(requestedContentType) ? null : getContextUrl(edmEntitySet, true, expand, select, null)) .expand(expand) .select(select) .build()) .getContent(); response.setContent(serializedContent); response.setStatusCode(HttpStatusCode.OK.getStatusCode()); response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString()); } }
@Override public void readEntityCollection( final ODataRequest request, ODataResponse response, final UriInfo uriInfo, final ContentType requestedContentType) throws ODataApplicationException, SerializerException { // First we have to figure out which entity set to use final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource()); // Second we fetch the data for this specific entity set from the mock database and transform it // into an EntitySet // object which is understood by our serialization EntityCollection entitySet = dataProvider.readAll(edmEntitySet); // Next we create a serializer based on the requested format. This could also be a custom format // but we do not // support them in this example ODataSerializer serializer = odata.createSerializer(requestedContentType); // Now the content is serialized using the serializer. final ExpandOption expand = uriInfo.getExpandOption(); final SelectOption select = uriInfo.getSelectOption(); InputStream serializedContent = serializer .entityCollection( edm, edmEntitySet.getEntityType(), entitySet, EntityCollectionSerializerOptions.with() .contextURL( isODataMetadataNone(requestedContentType) ? null : getContextUrl(edmEntitySet, false, expand, select, null)) .count(uriInfo.getCountOption()) .expand(expand) .select(select) .build()) .getContent(); // Finally we set the response data, headers and status code response.setContent(serializedContent); response.setStatusCode(HttpStatusCode.OK.getStatusCode()); response.setHeader(HttpHeader.CONTENT_TYPE, requestedContentType.toContentTypeString()); }
@Test public void errorWithoutContinueOnErrorPreferHeader() throws URISyntaxException { final ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager payload = request.payloadManager(); appendGetRequest(payload, "ESAllPrim", 32767, false); // Without error appendGetRequest(payload, "ESAllPrim", 42, false); // Error ( Key does not exist ) appendGetRequest(payload, "ESAllPrim", 0, false); // Without error // Fetch result final ODataBatchResponse response = payload.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); final Iterator<ODataBatchResponseItem> iter = response.getBody(); // Check first get request assertTrue(iter.hasNext()); ODataBatchResponseItem item = iter.next(); assertFalse(item.isChangeset()); ODataResponse oDataResponse = item.next(); assertNotNull(oDataResponse); assertEquals(HttpStatusCode.OK.getStatusCode(), oDataResponse.getStatusCode()); assertEquals(1, oDataResponse.getHeader("OData-Version").size()); assertEquals("4.0", oDataResponse.getHeader("OData-Version").toArray()[0]); assertEquals(1, oDataResponse.getHeader("Content-Length").size()); assertEquals("605", oDataResponse.getHeader("Content-Length").toArray()[0]); assertEquals(ContentType.JSON.toContentTypeString(), oDataResponse.getContentType()); // Check second get request assertTrue(iter.hasNext()); item = iter.next(); assertFalse(item.isChangeset()); oDataResponse = item.next(); assertNotNull(oDataResponse); assertEquals(HttpStatusCode.NOT_FOUND.getStatusCode(), oDataResponse.getStatusCode()); // Check if third request is available assertFalse(iter.hasNext()); }
@Override public void readPrimitiveValue( ODataRequest request, ODataResponse response, UriInfo uriInfo, ContentType format) throws ODataApplicationException, SerializerException { // First we have to figure out which entity set the requested entity is in final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource()); // Next we fetch the requested entity from the database final Entity entity; try { entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet); } catch (DataProviderException e) { throw new ODataApplicationException(e.getMessage(), 500, Locale.ENGLISH); } if (entity == null) { // If no entity was found for the given key we throw an exception. throw new ODataApplicationException( "No entity found for this key", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH); } else { // Next we get the property value from the entity and pass the value to serialization UriResourceProperty uriProperty = (UriResourceProperty) uriInfo.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 1); EdmProperty edmProperty = uriProperty.getProperty(); Property property = entity.getProperty(edmProperty.getName()); if (property == null) { throw new ODataApplicationException( "No property found", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH); } else { if (property.getValue() == null) { response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); } else { String value = String.valueOf(property.getValue()); ByteArrayInputStream serializerContent = new ByteArrayInputStream(value.getBytes(Charset.forName("UTF-8"))); response.setContent(serializerContent); response.setStatusCode(HttpStatusCode.OK.getStatusCode()); response.setHeader(HttpHeader.CONTENT_TYPE, ContentType.TEXT_PLAIN.toContentTypeString()); } } } }
private void readProperty( ODataResponse response, UriInfo uriInfo, ContentType contentType, boolean complex) throws ODataApplicationException, SerializerException { // To read a property we have to first get the entity out of the entity set final EdmEntitySet edmEntitySet = getEdmEntitySet(uriInfo.asUriInfoResource()); Entity entity; try { entity = readEntityInternal(uriInfo.asUriInfoResource(), edmEntitySet); } catch (DataProviderException e) { throw new ODataApplicationException( e.getMessage(), HttpStatusCode.INTERNAL_SERVER_ERROR.getStatusCode(), Locale.ENGLISH); } if (entity == null) { // If no entity was found for the given key we throw an exception. throw new ODataApplicationException( "No entity found for this key", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH); } else { // Next we get the property value from the entity and pass the value to serialization UriResourceProperty uriProperty = (UriResourceProperty) uriInfo.getUriResourceParts().get(uriInfo.getUriResourceParts().size() - 1); EdmProperty edmProperty = uriProperty.getProperty(); Property property = entity.getProperty(edmProperty.getName()); if (property == null) { throw new ODataApplicationException( "No property found", HttpStatusCode.NOT_FOUND.getStatusCode(), Locale.ENGLISH); } else { if (property.getValue() == null) { response.setStatusCode(HttpStatusCode.NO_CONTENT.getStatusCode()); } else { ODataSerializer serializer = odata.createSerializer(contentType); final ContextURL contextURL = isODataMetadataNone(contentType) ? null : getContextUrl(edmEntitySet, true, null, null, edmProperty.getName()); InputStream serializerContent = complex ? serializer .complex( edm, (EdmComplexType) edmProperty.getType(), property, ComplexSerializerOptions.with().contextURL(contextURL).build()) .getContent() : serializer .primitive( edm, (EdmPrimitiveType) edmProperty.getType(), property, PrimitiveSerializerOptions.with() .contextURL(contextURL) .scale(edmProperty.getScale()) .nullable(edmProperty.isNullable()) .precision(edmProperty.getPrecision()) .maxLength(edmProperty.getMaxLength()) .unicode(edmProperty.isUnicode()) .build()) .getContent(); response.setContent(serializerContent); response.setStatusCode(HttpStatusCode.OK.getStatusCode()); response.setHeader(HttpHeader.CONTENT_TYPE, contentType.toContentTypeString()); } } } }
@Test public void changesetBatchRequest() throws URISyntaxException { final ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager payload = request.payloadManager(); // ----------------------------- // - Append get request // ----------------------------- appendGetRequest(payload, "ESAllPrim", 32767, false); // Without error // ----------------------------- // - Append change set // ----------------------------- final ODataChangeset changeset = payload.addChangeset(); // ------------------------ // POST request (Insert) URIBuilder targetURI = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim"); URI editLink = targetURI.build(); ClientObjectFactory factory = getFactory(); ClientEntity postEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); postEntity.addLink( factory.newEntityNavigationLink( "NavPropertyETTwoPrimOne", getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESTwoPrim") .appendKeySegment(32766) .build())); postEntity .getProperties() .add( factory.newPrimitiveProperty( "PropertyDouble", factory.newPrimitiveValueBuilder().buildDouble(3.1415))); final ODataEntityCreateRequest<ClientEntity> createRequest = getClient().getCUDRequestFactory().getEntityCreateRequest(editLink, postEntity); createRequest.setFormat(ContentType.JSON); changeset.addRequest(createRequest); // ------------------------ // Patch request (Update) targetURI = getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESAllPrim") .appendKeySegment(0); editLink = targetURI.build(); ClientEntity patchEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); patchEntity.setEditLink(editLink); patchEntity .getProperties() .add( factory.newPrimitiveProperty( "PropertyDouble", factory.newPrimitiveValueBuilder().buildDouble(3.1415))); ODataEntityUpdateRequest<ClientEntity> changeReq = getClient().getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity); changeReq.setFormat(ContentType.JSON); changeset.addRequest(changeReq); // ------------------------ // Patch request (Upsert) targetURI = getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESAllPrim") .appendKeySegment(15); editLink = targetURI.build(); patchEntity = factory.newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); patchEntity.setEditLink(editLink); patchEntity .getProperties() .add( factory.newPrimitiveProperty( "PropertyDouble", factory.newPrimitiveValueBuilder().buildDouble(3.1415))); patchEntity.addLink( factory.newEntityNavigationLink( "NavPropertyETTwoPrimOne", getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESTwoPrim") .appendKeySegment(32766) .build())); changeReq = getClient().getCUDRequestFactory().getEntityUpdateRequest(UpdateType.PATCH, patchEntity); changeReq.setFormat(ContentType.JSON); changeset.addRequest(changeReq); // ----------------------------- // - Append get request // ----------------------------- appendGetRequest(payload, "ESAllPrim", 0, false); // Without error // ----------------------------- // - Fetch result // ----------------------------- final ODataBatchResponse response = payload.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody(); // Check first get request assertTrue(bodyIterator.hasNext()); ODataBatchResponseItem item = bodyIterator.next(); assertFalse(item.isChangeset()); assertTrue(item.hasNext()); final ODataResponse response0 = item.next(); assertTrue(response0 instanceof ODataRetrieveResponse); @SuppressWarnings("unchecked") ODataRetrieveResponse<ClientEntity> retrieveResponse = (ODataRetrieveResponse<ClientEntity>) response0; assertEquals( 34, retrieveResponse.getBody().getProperty("PropertyDecimal").getPrimitiveValue().toValue()); // Check change set assertTrue(bodyIterator.hasNext()); item = bodyIterator.next(); assertTrue(item.isChangeset()); // Insert assertTrue(item.hasNext()); final ODataResponse response1 = item.next(); assertEquals(HttpStatusCode.CREATED.getStatusCode(), response1.getStatusCode()); assertTrue(response1 instanceof ODataEntityCreateResponse); assertEquals( 3.1415, ((ODataEntityCreateResponse<?>) response1) .getBody() .getProperty("PropertyDouble") .getPrimitiveValue() .toValue()); // Update assertTrue(item.hasNext()); final ODataResponse response2 = item.next(); assertEquals(HttpStatusCode.OK.getStatusCode(), response2.getStatusCode()); assertTrue(response2 instanceof ODataEntityUpdateResponse); // Upsert assertTrue(item.hasNext()); final ODataResponse response3 = item.next(); assertEquals(HttpStatusCode.CREATED.getStatusCode(), response3.getStatusCode()); assertTrue(response3 instanceof ODataEntityUpdateResponse); assertEquals( 3.1415, ((ODataEntityUpdateResponse<?>) response3) .getBody() .getProperty("PropertyDouble") .getPrimitiveValue() .toValue()); // Check second get request assertTrue(bodyIterator.hasNext()); item = bodyIterator.next(); assertFalse(item.isChangeset()); assertTrue(item.hasNext()); final ODataResponse response4 = item.next(); assertTrue(response4 instanceof ODataRetrieveResponse); @SuppressWarnings("unchecked") final ODataRetrieveResponse<ClientEntity> retrieveResponse2 = (ODataRetrieveResponse<ClientEntity>) response4; assertEquals( 3.1415, retrieveResponse2.getBody().getProperty("PropertyDouble").getPrimitiveValue().toValue()); }
@Test public void changesetWithReferences() throws EdmPrimitiveTypeException, URISyntaxException { // create your request final ODataBatchRequest request = getClient().getBatchRequestFactory().getBatchRequest(SERVICE_URI); final BatchManager streamManager = request.payloadManager(); final ODataChangeset changeset = streamManager.addChangeset(); final ClientEntity entityESAllPrim = getFactory().newEntity(new FullQualifiedName(SERVICE_NAMESPACE, "ESAllPrim")); entityESAllPrim .getProperties() .add( getFactory() .newPrimitiveProperty( "PropertyDouble", getFactory().newPrimitiveValueBuilder().buildDouble(3.1415))); entityESAllPrim.addLink( getFactory() .newEntityNavigationLink( "NavPropertyETTwoPrimOne", getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESTwoPrim") .appendKeySegment(-365) .build())); final URIBuilder uriBuilder = getClient().newURIBuilder(SERVICE_URI).appendEntitySetSegment("ESAllPrim"); // add create request final ODataEntityCreateRequest<ClientEntity> createReq = getClient() .getCUDRequestFactory() .getEntityCreateRequest(uriBuilder.build(), entityESAllPrim); createReq.setFormat(ContentType.JSON); changeset.addRequest(createReq); // retrieve request reference int createRequestRef = changeset.getLastContentId(); // add update request final ClientEntity entityUpdate = getFactory().newEntity(entityESAllPrim.getTypeName()); entityUpdate.addLink( getFactory() .newEntitySetNavigationLink( "NavPropertyETTwoPrimMany", getClient() .newURIBuilder(SERVICE_URI) .appendEntitySetSegment("ESTwoPrim") .appendKeySegment(32767) .build())); final ODataEntityUpdateRequest<ClientEntity> updateReq = getClient() .getCUDRequestFactory() .getEntityUpdateRequest( URI.create("$" + createRequestRef), UpdateType.PATCH, entityUpdate); updateReq.setFormat(ContentType.JSON); changeset.addRequest(updateReq); final ODataBatchResponse response = streamManager.getResponse(); assertEquals(HttpStatusCode.ACCEPTED.getStatusCode(), response.getStatusCode()); final String cookie = response.getHeader(HttpHeader.SET_COOKIE).iterator().next(); // verify response payload ... final Iterator<ODataBatchResponseItem> bodyIterator = response.getBody(); final ODataBatchResponseItem item = bodyIterator.next(); assertTrue(item instanceof ODataChangesetResponseItem); final ODataChangesetResponseItem chgitem = (ODataChangesetResponseItem) item; assertTrue(chgitem.hasNext()); ODataResponse res = chgitem.next(); assertEquals(HttpStatusCode.CREATED.getStatusCode(), res.getStatusCode()); assertTrue(res instanceof ODataEntityCreateResponse); final ODataEntityCreateResponse<?> createResponse = ((ODataEntityCreateResponse<?>) res); res = chgitem.next(); assertEquals(HttpStatusCode.OK.getStatusCode(), res.getStatusCode()); assertTrue(res instanceof ODataEntityUpdateResponse); final ODataEntitySetRequest<ClientEntitySet> req = getClient() .getRetrieveRequestFactory() .getEntitySetRequest( new URI( createResponse.getHeader(HttpHeader.LOCATION).iterator().next() + "/NavPropertyETTwoPrimMany")); req.setFormat(ContentType.JSON); req.addCustomHeader(HttpHeader.COOKIE, cookie); final ODataRetrieveResponse<ClientEntitySet> getResponse = req.execute(); assertEquals( 32767, getResponse .getBody() .getEntities() .get(0) .getProperty("PropertyInt16") .getPrimitiveValue() .toValue()); }