@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; }