private LockItem upsertAndMonitorNewLock()

in src/main/java/com/amazonaws/services/dynamodbv2/AmazonDynamoDBLockClient.java [707:748]


    private LockItem upsertAndMonitorNewLock(AcquireLockOptions options, String key, Optional<String> sortKey,
        boolean deleteLockOnRelease, Optional<SessionMonitor> sessionMonitor,
        Optional<ByteBuffer> newLockData, Map<String, AttributeValue> item, String recordVersionNumber) {

        final Map<String, String> expressionAttributeNames = new HashMap<>();
        expressionAttributeNames.put(PK_PATH_EXPRESSION_VARIABLE, this.partitionKeyName);

        final boolean updateExistingLockRecord = options.getUpdateExistingLockRecord();

        final String conditionalExpression;
        if (this.sortKeyName.isPresent()) {
            conditionalExpression = ACQUIRE_LOCK_THAT_DOESNT_EXIST_PK_SK_CONDITION;
            expressionAttributeNames.put(SK_PATH_EXPRESSION_VARIABLE, sortKeyName.get());
        } else {
            conditionalExpression = ACQUIRE_LOCK_THAT_DOESNT_EXIST_PK_CONDITION;
        }

        if (updateExistingLockRecord) {
            // Remove keys from item to create updateExpression
            item.remove(partitionKeyName);
            if (sortKeyName.isPresent()) {
                item.remove(sortKeyName.get());
            }
            final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>();
            final String updateExpression = getUpdateExpressionAndUpdateNameValueMaps(item, expressionAttributeNames, expressionAttributeValues);
            final UpdateItemRequest updateItemRequest = UpdateItemRequest.builder().tableName(tableName).key(getKeys(key, sortKey))
                    .updateExpression(updateExpression).expressionAttributeNames(expressionAttributeNames)
                    .expressionAttributeValues(expressionAttributeValues).conditionExpression(conditionalExpression).build();
            logger.trace("Acquiring a new lock on " + partitionKeyName + "=" + key + ", " + this.sortKeyName + "=" + sortKey);
            return updateItemAndStartSessionMonitor(options, key, sortKey, deleteLockOnRelease, sessionMonitor, newLockData, recordVersionNumber, updateItemRequest);
        } else {
            final PutItemRequest putItemRequest = PutItemRequest.builder().item(item).tableName(tableName)
                    .conditionExpression(conditionalExpression)
                    .expressionAttributeNames(expressionAttributeNames).build();
        /* No one has the lock, go ahead and acquire it.
         * The person storing the lock into DynamoDB should err on the side of thinking the lock will expire
         * sooner than it actually will, so they start counting towards its expiration before the Put succeeds
         */
            logger.trace("Acquiring a new lock on " + partitionKeyName + "=" + key + ", " + this.sortKeyName + "=" + sortKey);
            return putLockItemAndStartSessionMonitor(options, key, sortKey, deleteLockOnRelease, sessionMonitor, newLockData, recordVersionNumber, putItemRequest);
        }
    }