diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLock.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLock.java index 157b0dd7..752652bf 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLock.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLock.java @@ -51,8 +51,14 @@ public class ProcessLock extends QRecordEntity @QField(possibleValueSourceName = ProcessLockType.TABLE_NAME) private Integer processLockTypeId; - @QField(isRequired = true, maxLength = 250, valueTooLongBehavior = ValueTooLongBehavior.ERROR) - private String holder; + @QField(maxLength = 100, valueTooLongBehavior = ValueTooLongBehavior.ERROR) + private String userId; + + @QField(label = "Session UUID", maxLength = 36, valueTooLongBehavior = ValueTooLongBehavior.ERROR) + private String sessionUUID; + + @QField(maxLength = 250, valueTooLongBehavior = ValueTooLongBehavior.ERROR) + private String details; @QField() private Instant checkInTimestamp; @@ -205,37 +211,6 @@ public class ProcessLock extends QRecordEntity - /******************************************************************************* - ** Getter for holder - *******************************************************************************/ - public String getHolder() - { - return (this.holder); - } - - - - /******************************************************************************* - ** Setter for holder - *******************************************************************************/ - public void setHolder(String holder) - { - this.holder = holder; - } - - - - /******************************************************************************* - ** Fluent setter for holder - *******************************************************************************/ - public ProcessLock withHolder(String holder) - { - this.holder = holder; - return (this); - } - - - /******************************************************************************* ** Getter for checkInTimestamp *******************************************************************************/ @@ -327,4 +302,97 @@ public class ProcessLock extends QRecordEntity return (this); } + + + /******************************************************************************* + ** Getter for userId + *******************************************************************************/ + public String getUserId() + { + return (this.userId); + } + + + + /******************************************************************************* + ** Setter for userId + *******************************************************************************/ + public void setUserId(String userId) + { + this.userId = userId; + } + + + + /******************************************************************************* + ** Fluent setter for userId + *******************************************************************************/ + public ProcessLock withUserId(String userId) + { + this.userId = userId; + return (this); + } + + + + /******************************************************************************* + ** Getter for sessionUUID + *******************************************************************************/ + public String getSessionUUID() + { + return (this.sessionUUID); + } + + + + /******************************************************************************* + ** Setter for sessionUUID + *******************************************************************************/ + public void setSessionUUID(String sessionUUID) + { + this.sessionUUID = sessionUUID; + } + + + + /******************************************************************************* + ** Fluent setter for sessionUUID + *******************************************************************************/ + public ProcessLock withSessionUUID(String sessionUUID) + { + this.sessionUUID = sessionUUID; + return (this); + } + + + + /******************************************************************************* + ** Getter for details + *******************************************************************************/ + public String getDetails() + { + return (this.details); + } + + + + /******************************************************************************* + ** Setter for details + *******************************************************************************/ + public void setDetails(String details) + { + this.details = details; + } + + + + /******************************************************************************* + ** Fluent setter for details + *******************************************************************************/ + public ProcessLock withDetails(String details) + { + this.details = details; + return (this); + } + } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockMetaDataProducer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockMetaDataProducer.java index 3f10f86f..617bb6ee 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockMetaDataProducer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockMetaDataProducer.java @@ -63,7 +63,7 @@ public class ProcessLockMetaDataProducer implements MetaDataProducerInterface qSession.getUser().getIdReference(), "anonymous") - + "-" - + ObjectUtils.tryAndRequireNonNullElse(() -> qSession.getUuid(), "no-session") - + (StringUtils.hasContent(holder) ? ("-" + holder) : ""); Instant now = Instant.now(); ProcessLock processLock = new ProcessLock() .withKey(key) .withProcessLockTypeId(lockType.getId()) - .withHolder(holder) + .withSessionUUID(ObjectUtils.tryAndRequireNonNullElse(() -> qSession.getUuid(), null)) + .withUserId(ObjectUtils.tryAndRequireNonNullElse(() -> qSession.getUser().getIdReference(), null)) + .withDetails(details) .withCheckInTimestamp(now); Integer defaultExpirationSeconds = lockType.getDefaultExpirationSeconds(); @@ -126,7 +123,7 @@ public class ProcessLockUtils ///////////////////////////////////////////////////////////////////////////////// Serializable id = existingLockRecord.getValue("id"); LOG.info("Existing lock has expired - deleting it and trying again.", logPair("id", id), - logPair("key", key), logPair("type", typeName), logPair("holder", holder), logPair("expiresAtTimestamp", expiresAtTimestamp)); + logPair("key", key), logPair("type", typeName), logPair("details", details), logPair("expiresAtTimestamp", expiresAtTimestamp)); new DeleteAction().execute(new DeleteInput(ProcessLock.TABLE_NAME).withPrimaryKey(id)); insertOutputRecord = tryToInsert(processLock); } @@ -146,12 +143,12 @@ public class ProcessLockUtils // if at this point, we have errors on the last attempted insert, then give up // ///////////////////////////////////////////////////////////////////////////////// LOG.info("Errors in process lock record after attempted insert", logPair("errors", insertOutputRecord.getErrors()), - logPair("key", key), logPair("type", typeName), logPair("holder", holder)); + logPair("key", key), logPair("type", typeName), logPair("details", details)); throw (new UnableToObtainProcessLockException("A Process Lock already exists for key [" + key + "] of type [" + typeName + "], " + existingLockDetails)); } LOG.info("Created process lock", logPair("id", processLock.getId()), - logPair("key", key), logPair("type", typeName), logPair("holder", holder), logPair("expiresAtTimestamp", processLock.getExpiresAtTimestamp())); + logPair("key", key), logPair("type", typeName), logPair("details", details), logPair("expiresAtTimestamp", processLock.getExpiresAtTimestamp())); return new ProcessLock(insertOutputRecord); } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtilsTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtilsTest.java index 5c17420c..ae7f97ba 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtilsTest.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/processes/locks/ProcessLockUtilsTest.java @@ -42,6 +42,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; @@ -125,7 +126,7 @@ class ProcessLockUtilsTest extends BaseTest ////////////////////// processLock = ProcessLockUtils.create("1", "typeA", "you"); assertNotNull(processLock.getId()); - assertThat(processLock.getHolder()).endsWith("you"); + assertEquals("you", processLock.getDetails()); assertThatThrownBy(() -> ProcessLockUtils.create("1", "notAType", "you")) .isInstanceOf(QException.class) @@ -150,7 +151,7 @@ class ProcessLockUtilsTest extends BaseTest ///////////////////////////////////////////////////////////////////////// processLock = ProcessLockUtils.create("1", "typeB", "you", Duration.of(1, ChronoUnit.SECONDS), Duration.of(3, ChronoUnit.SECONDS)); assertNotNull(processLock.getId()); - assertThat(processLock.getHolder()).endsWith("you"); + assertThat(processLock.getDetails()).endsWith("you"); } @@ -220,26 +221,46 @@ class ProcessLockUtilsTest extends BaseTest ** *******************************************************************************/ @Test - void testHolders() throws QException + void testUserAndSessionNullness() throws QException { - QContext.getQSession().setUser(new QUser().withIdReference("me")); - assertThat(ProcessLockUtils.create("1", "typeA", null).getHolder()) - .isEqualTo("me-" + QContext.getQSession().getUuid()); + { + QContext.getQSession().setUser(new QUser().withIdReference("me")); + ProcessLock processLock = ProcessLockUtils.create("1", "typeA", null); + assertNull(processLock.getDetails()); + assertEquals("me", processLock.getUserId()); + assertEquals(QContext.getQSession().getUuid(), processLock.getSessionUUID()); + } - assertThat(ProcessLockUtils.create("2", "typeA", "foo").getHolder()) - .isEqualTo("me-" + QContext.getQSession().getUuid() + "-foo"); + { + ProcessLock processLock = ProcessLockUtils.create("2", "typeA", "foo"); + assertEquals("foo", processLock.getDetails()); + assertEquals("me", processLock.getUserId()); + assertEquals(QContext.getQSession().getUuid(), processLock.getSessionUUID()); + } - QContext.getQSession().setUser(null); - assertThat(ProcessLockUtils.create("3", "typeA", "bar").getHolder()) - .isEqualTo("anonymous-" + QContext.getQSession().getUuid() + "-bar"); + { + QContext.getQSession().setUser(null); + ProcessLock processLock = ProcessLockUtils.create("3", "typeA", "bar"); + assertEquals("bar", processLock.getDetails()); + assertNull(processLock.getUserId()); + assertEquals(QContext.getQSession().getUuid(), processLock.getSessionUUID()); + } - QContext.getQSession().setUuid(null); - assertThat(ProcessLockUtils.create("4", "typeA", "baz").getHolder()) - .isEqualTo("anonymous-no-session-baz"); + { + QContext.getQSession().setUuid(null); + ProcessLock processLock = ProcessLockUtils.create("4", "typeA", "baz"); + assertEquals("baz", processLock.getDetails()); + assertNull(processLock.getUserId()); + assertNull(processLock.getSessionUUID()); + } - QContext.getQSession().setUuid(null); - assertThat(ProcessLockUtils.create("5", "typeA", "").getHolder()) - .isEqualTo("anonymous-no-session"); + { + QContext.getQSession().setUuid(null); + ProcessLock processLock = ProcessLockUtils.create("5", "typeA", ""); + assertEquals("", processLock.getDetails()); + assertNull(processLock.getUserId()); + assertNull(processLock.getSessionUUID()); + } } } \ No newline at end of file