This is an automated email from the ASF dual-hosted git repository. kdoran pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nifi-registry.git
The following commit(s) were added to refs/heads/master by this push: new fbf1744 NIFIREG-370 Ensuring update retrieves the latest revision from RevisionManager fbf1744 is described below commit fbf17445852f1bbfd498134cdb719f610138625e Author: Bryan Bende <bbe...@apache.org> AuthorDate: Wed Mar 11 15:51:21 2020 -0400 NIFIREG-370 Ensuring update retrieves the latest revision from RevisionManager This closes #266. Signed-off-by: Kevin Doran <kdo...@apache.org> --- .../entity/StandardRevisableEntityService.java | 53 +++++++++++++--------- .../entity/TestStandardRevisableEntityService.java | 28 ++++++++++++ 2 files changed, 60 insertions(+), 21 deletions(-) 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 @@ public class StandardRevisableEntityService implements RevisableEntityService { 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 @@ public class StandardRevisableEntityService implements RevisableEntityService { 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 @@ public class StandardRevisableEntityService implements RevisableEntityService { } } - 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 @@ public class TestStandardRevisableEntityService { 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);