NIFIREG-370 Ensuring update retrieves the latest revision from RevisionManager
This closes #266.
Signed-off-by: Kevin Doran <kdoran@apache.org>
diff --git a/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/main/java/org/apache/nifi/registry/revision/entity/StandardRevisableEntityService.java b/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/main/java/org/apache/nifi/registry/revision/entity/StandardRevisableEntityService.java
index 541f31f..fa3d4f5 100644
--- a/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/main/java/org/apache/nifi/registry/revision/entity/StandardRevisableEntityService.java
+++ b/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/main/java/org/apache/nifi/registry/revision/entity/StandardRevisableEntityService.java
@@ -58,7 +58,22 @@
throw new IllegalArgumentException("Creator identity is required");
}
- return createOrUpdate(requestEntity, creatorIdentity, createEntity);
+ final Revision revision = createRevision(requestEntity.getIdentifier(), requestEntity.getRevision());
+ final RevisionClaim claim = new StandardRevisionClaim(revision);
+
+ final RevisionUpdate<T> revisionUpdate = revisionManager.updateRevision(claim, () -> {
+ final T updatedEntity = createEntity.get();
+
+ final Revision updatedRevision = revision.incrementRevision(revision.getClientId());
+ final EntityModification entityModification = new EntityModification(updatedRevision, creatorIdentity);
+
+ final RevisionInfo updatedRevisionInfo = createRevisionInfo(updatedRevision, entityModification);
+ updatedEntity.setRevision(updatedRevisionInfo);
+
+ return new StandardRevisionUpdate<>(updatedEntity, entityModification);
+ });
+
+ return revisionUpdate.getEntity();
}
@Override
@@ -91,7 +106,22 @@
throw new IllegalArgumentException("Updater identity is required");
}
- return createOrUpdate(requestEntity, updaterIdentity, updateEntity);
+ final Revision revision = createRevision(requestEntity.getIdentifier(), requestEntity.getRevision());
+ final RevisionClaim claim = new StandardRevisionClaim(revision);
+
+ final RevisionUpdate<T> revisionUpdate = revisionManager.updateRevision(claim, () -> {
+ final T updatedEntity = updateEntity.get();
+
+ final Revision updatedRevision = revisionManager.getRevision(requestEntity.getIdentifier()).incrementRevision(revision.getClientId());
+ final EntityModification entityModification = new EntityModification(updatedRevision, updaterIdentity);
+
+ final RevisionInfo updatedRevisionInfo = createRevisionInfo(updatedRevision, entityModification);
+ updatedEntity.setRevision(updatedRevisionInfo);
+
+ return new StandardRevisionUpdate<>(updatedEntity, entityModification);
+ });
+
+ return revisionUpdate.getEntity();
}
@Override
@@ -127,25 +157,6 @@
}
}
- private <T extends RevisableEntity> T createOrUpdate(final T requestEntity, final String userIdentity, final Supplier<T> updateOrCreateEntity) {
- final Revision revision = createRevision(requestEntity.getIdentifier(), requestEntity.getRevision());
- final RevisionClaim claim = new StandardRevisionClaim(revision);
-
- final RevisionUpdate<T> revisionUpdate = revisionManager.updateRevision(claim, () -> {
- final T updatedEntity = updateOrCreateEntity.get();
-
- final Revision updatedRevision = revision.incrementRevision(revision.getClientId());
- final EntityModification entityModification = new EntityModification(updatedRevision, userIdentity);
-
- final RevisionInfo updatedRevisionInfo = createRevisionInfo(updatedRevision, entityModification);
- updatedEntity.setRevision(updatedRevisionInfo);
-
- return new StandardRevisionUpdate<>(updatedEntity, entityModification);
- });
-
- return revisionUpdate.getEntity();
- }
-
private <T extends RevisableEntity> void populateRevisableEntityRevisions(final Collection<T> revisableEntities) {
if (revisableEntities == null) {
return;
diff --git a/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/test/java/org/apache/nifi/registry/revision/entity/TestStandardRevisableEntityService.java b/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/test/java/org/apache/nifi/registry/revision/entity/TestStandardRevisableEntityService.java
index 47b3d9c..0458d5c 100644
--- a/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/test/java/org/apache/nifi/registry/revision/entity/TestStandardRevisableEntityService.java
+++ b/nifi-registry-core/nifi-registry-revision/nifi-registry-revision-entity-service/src/test/java/org/apache/nifi/registry/revision/entity/TestStandardRevisableEntityService.java
@@ -133,6 +133,34 @@
assertEquals("user2", updatedEntity.getRevision().getLastModifier());
}
+ @Test
+ public void testUpdateWithClientId() {
+ final RevisionInfo revisionInfo = new RevisionInfo("client-1", 0L);
+ final TestEntity requestEntity = new TestEntity("1", revisionInfo);
+
+ final RevisableEntity createdEntity = entityService.create(
+ requestEntity, "user1", () -> requestEntity);
+ assertNotNull(createdEntity);
+ assertEquals(requestEntity.getIdentifier(), createdEntity.getIdentifier());
+ assertNotNull(createdEntity.getRevision());
+ assertEquals(1, createdEntity.getRevision().getVersion().longValue());
+
+ final RevisableEntity updatedEntity = entityService.update(
+ createdEntity, "user2", () -> createdEntity);
+ assertNotNull(updatedEntity.getRevision());
+ assertEquals(2, updatedEntity.getRevision().getVersion().longValue());
+ assertEquals("user2", updatedEntity.getRevision().getLastModifier());
+
+ // set the version back to 0 to prove that we can update based on client id being the same
+ updatedEntity.getRevision().setVersion(0L);
+
+ final RevisableEntity updatedEntity2 = entityService.update(
+ createdEntity, "user3", () -> updatedEntity);
+ assertNotNull(updatedEntity2.getRevision());
+ assertEquals(3, updatedEntity2.getRevision().getVersion().longValue());
+ assertEquals("user3", updatedEntity2.getRevision().getLastModifier());
+ }
+
@Test(expected = IllegalArgumentException.class)
public void testUpdateWhenMissingRevision() {
final RevisionInfo revisionInfo = new RevisionInfo(null, 0L);