예제 #1
0
  /** 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();
  }