@SuppressWarnings("unchecked")
  @Override
  public Object invokeServer(
      IRestfulServer theServer, RequestDetails theRequest, Object[] theMethodParams)
      throws InvalidRequestException, InternalErrorException {

    /*
     * The design of HAPI's transaction method for DSTU1 support assumed that a transaction was just an update on a
     * bunch of resources (because that's what it was), but in DSTU2 transaction has become much more broad, so we
     * no longer hold the user's hand much here.
     */
    if (myTransactionParamStyle == ParamStyle.RESOURCE_BUNDLE) {
      // This is the DSTU2 style
      Object response = invokeServerMethod(theServer, theRequest, theMethodParams);
      return response;
    }

    // Grab the IDs of all of the resources in the transaction
    List<IResource> resources;
    if (theMethodParams[myTransactionParamIndex] instanceof Bundle) {
      resources = ((Bundle) theMethodParams[myTransactionParamIndex]).toListOfResources();
    } else {
      resources = (List<IResource>) theMethodParams[myTransactionParamIndex];
    }

    IdentityHashMap<IResource, IdDt> oldIds = new IdentityHashMap<IResource, IdDt>();
    for (IResource next : resources) {
      oldIds.put(next, next.getId());
    }

    // Call the server implementation method
    Object response = invokeServerMethod(theServer, theRequest, theMethodParams);
    IBundleProvider retVal = toResourceList(response);

    /*
     * int offset = 0; if (retVal.size() != resources.size()) { if (retVal.size() > 0 && retVal.getResources(0,
     * 1).get(0) instanceof OperationOutcome) { offset = 1; } else { throw new
     * InternalErrorException("Transaction bundle contained " + resources.size() +
     * " entries, but server method response contained " + retVal.size() + " entries (must be the same)"); } }
     */

    List<IBaseResource> retResources = retVal.getResources(0, retVal.size());
    for (int i = 0; i < retResources.size(); i++) {
      IdDt oldId = oldIds.get(retResources.get(i));
      IBaseResource newRes = retResources.get(i);
      if (newRes.getIdElement() == null || newRes.getIdElement().isEmpty()) {
        if (!(newRes instanceof BaseOperationOutcome)) {
          throw new InternalErrorException(
              "Transaction method returned resource at index "
                  + i
                  + " with no id specified - IResource#setId(IdDt)");
        }
      }

      if (oldId != null && !oldId.isEmpty()) {
        if (!oldId.equals(newRes.getIdElement()) && newRes instanceof IResource) {
          ((IResource) newRes)
              .getResourceMetadata()
              .put(ResourceMetadataKeyEnum.PREVIOUS_ID, oldId);
        }
      }
    }

    return retVal;
  }