diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirDao.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirDao.java index 1ef7af81085..202f17ca85e 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirDao.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/BaseHapiFhirDao.java @@ -1008,11 +1008,15 @@ public abstract class BaseHapiFhirDao implements IDao { } if (changed == false) { - ResourceHistoryTable currentHistoryVersion = myResourceHistoryTableDao.findForIdAndVersion(theEntity.getId(), theEntity.getVersion()); - if (currentHistoryVersion == null || currentHistoryVersion.getResource() == null) { + if (theEntity.getId() == null) { changed = true; } else { - changed = !Arrays.equals(currentHistoryVersion.getResource(), bytes); + ResourceHistoryTable currentHistoryVersion = myResourceHistoryTableDao.findForIdAndVersion(theEntity.getId(), theEntity.getVersion()); + if (currentHistoryVersion == null || currentHistoryVersion.getResource() == null) { + changed = true; + } else { + changed = !Arrays.equals(currentHistoryVersion.getResource(), bytes); + } } } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2InterceptorTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2InterceptorTest.java index a9270fdb273..e050911e0b0 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2InterceptorTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2InterceptorTest.java @@ -179,7 +179,8 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { p.addName().addFamily("PATIENT"); IIdType id = myPatientDao.create(p, mySrd).getId(); assertEquals(1L, id.getVersionIdPartAsLong().longValue()); - + + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -203,7 +204,9 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { IIdType newId = myPatientDao.delete(new IdDt("Patient/" + id), mySrd).getId(); assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); + verify(myRequestOperationCallback, times(1)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -236,7 +239,9 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { ourLog.info(oo); assertThat(oo, containsString("deleted 2 resource(s)")); + verify(myRequestOperationCallback, times(2)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(2)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -268,6 +273,7 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { IdDt newId = new IdDt(resp.getEntry().get(0).getResponse().getLocation()); assertEquals(1L, newId.getVersionIdPartAsLong().longValue()); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -299,7 +305,9 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { IdDt newId = new IdDt(resp.getEntry().get(0).getResponse().getLocation()); assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); + verify(myRequestOperationCallback, times(1)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -335,7 +343,9 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { Bundle resp = mySystemDao.transaction(mySrd, xactBundle); assertNotNull(resp); + verify(myRequestOperationCallback, times(2)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(2)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -372,7 +382,9 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreUpdate(any(IBaseResource.class), any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class), any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -398,7 +410,9 @@ public class FhirResourceDaoDstu2InterceptorTest extends BaseJpaDstu2Test { assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreUpdate(any(IBaseResource.class), any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class), any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3InterceptorTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3InterceptorTest.java index 3285422969e..9726fbd5bf8 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3InterceptorTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3InterceptorTest.java @@ -191,7 +191,8 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { p.addName().setFamily("PATIENT"); IIdType id = myPatientDao.create(p, mySrd).getId(); assertEquals(1L, id.getVersionIdPartAsLong().longValue()); - + + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -263,7 +264,9 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { IIdType newId = myPatientDao.delete(new IdType("Patient/" + id), mySrd).getId(); assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); + verify(myRequestOperationCallback, times(1)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -294,7 +297,9 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { ourLog.info(oo); assertThat(oo, containsString("deleted 2 resource(s)")); + verify(myRequestOperationCallback, times(2)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(2)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -325,7 +330,8 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { IdType newId = new IdType(resp.getEntry().get(0).getResponse().getLocation()); assertEquals(1L, newId.getVersionIdPartAsLong().longValue()); - + + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -357,7 +363,9 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { IdType newId = new IdType(resp.getEntry().get(0).getResponse().getLocation()); assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); + verify(myRequestOperationCallback, times(1)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -396,7 +404,9 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { ourLog.info(oo); assertThat(oo, containsString("deleted 2 resource(s)")); + verify(myRequestOperationCallback, times(2)).resourcePreDelete(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceDeleted(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(2)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(2)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -433,7 +443,9 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreUpdate(any(IBaseResource.class), any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class), any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } @@ -461,7 +473,9 @@ public class FhirResourceDaoDstu3InterceptorTest extends BaseJpaDstu3Test { assertEquals(2L, newId.getVersionIdPartAsLong().longValue()); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreUpdate(any(IBaseResource.class), any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceUpdated(any(IBaseResource.class), any(IBaseResource.class)); + verify(myRequestOperationCallback, times(1)).resourcePreCreate(any(IBaseResource.class)); verify(myRequestOperationCallback, times(1)).resourceCreated(any(IBaseResource.class)); verifyNoMoreInteractions(myRequestOperationCallback); } diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4Test.java index 0b6cf6335a5..2460f322289 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4Test.java @@ -1108,6 +1108,35 @@ public class FhirResourceDaoR4Test extends BaseJpaR4Test { } + @Test + public void testDeleteTwicePerformsNoOp() { + Patient patient = new Patient(); + patient.setActive(true); + + IIdType id = myPatientDao.create(patient, mySrd).getId(); + assertNotNull(id.getIdPartAsLong()); + assertEquals("1", id.getVersionIdPart()); + + IIdType id2 = myPatientDao.delete(id.toUnqualifiedVersionless()).getId(); + assertEquals(id.getIdPart(), id2.getIdPart()); + assertEquals("2", id2.getVersionIdPart()); + + IIdType id3 = myPatientDao.delete(id.toUnqualifiedVersionless()).getId(); + assertEquals(id.getIdPart(), id3.getIdPart()); + assertEquals("2", id3.getVersionIdPart()); + + IIdType id4 = myPatientDao.delete(id.toUnqualifiedVersionless()).getId(); + assertEquals(id.getIdPart(), id4.getIdPart()); + assertEquals("2", id4.getVersionIdPart()); + + patient = new Patient(); + patient.setId(id.getIdPart()); + patient.addName().setFamily(methodName); + IIdType id5 = myPatientDao.update(patient).getId(); + + aaaa + } + @Test public void testDeleteResource() { int initialHistory = myPatientDao.history((Date) null, null, mySrd).size();