/** Transactional changes commit. */ @Override public void flush() { final ODataBatchRequest request = ODataBatchRequestFactory.getBatchRequest(factory.getServiceRoot()); final ODataBatchRequest.BatchStreamManager streamManager = request.execute(); final ODataChangeset changeset = streamManager.addChangeset(); final TransactionItems items = new TransactionItems(); final List<EntityLinkDesc> delayedUpdates = new ArrayList<EntityLinkDesc>(); int pos = 0; for (AttachedEntity attachedEntity : EntityContainerFactory.getContext().entityContext()) { final AttachedEntityStatus status = attachedEntity.getStatus(); if (((status != AttachedEntityStatus.ATTACHED && status != AttachedEntityStatus.LINKED) || attachedEntity.getEntity().isChanged()) && !items.contains(attachedEntity.getEntity())) { pos++; pos = processEntityContext(attachedEntity.getEntity(), pos, items, delayedUpdates, changeset); } } processDelayedUpdates(delayedUpdates, pos, items, changeset); final ODataBatchResponse response = streamManager.getResponse(); if (response.getStatusCode() != 202) { throw new IllegalStateException("Operation failed"); } final Iterator<ODataBatchResponseItem> iter = response.getBody(); if (!items.isEmpty()) { if (!iter.hasNext()) { throw new IllegalStateException("Unexpected operation result"); } final ODataBatchResponseItem item = iter.next(); if (!(item instanceof ODataChangesetResponseItem)) { throw new IllegalStateException( "Unexpected batch response item " + item.getClass().getSimpleName()); } final ODataChangesetResponseItem chgres = (ODataChangesetResponseItem) item; for (Integer changesetItemId : items.sortedValues()) { LOG.debug("Expected changeset item {}", changesetItemId); final ODataResponse res = chgres.next(); if (res.getStatusCode() >= 400) { throw new IllegalStateException("Transaction failed: " + res.getStatusMessage()); } final EntityTypeInvocationHandler handler = items.get(changesetItemId); if (handler != null) { if (res instanceof ODataEntityCreateResponse) { LOG.debug("Upgrade created object '{}'", handler); handler.setEntity(((ODataEntityCreateResponse) res).getBody()); } else if (res instanceof ODataEntityUpdateResponse) { LOG.debug("Upgrade updated object '{}'", handler); handler.setEntity(((ODataEntityUpdateResponse) res).getBody()); } } } } EntityContainerFactory.getContext().detachAll(); }