use of com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException in project spring-integration-aws by spring-projects.
the class DynamoDbMetaDataStore method putIfAbsent.
@Override
public String putIfAbsent(String key, String value) {
Assert.hasText(key, "'key' must not be empty.");
Assert.hasText(value, "'value' must not be empty.");
awaitForActive();
try {
this.table.updateItem(new UpdateItemSpec().withPrimaryKey(KEY, key).withAttributeUpdate(new AttributeUpdate(VALUE).put(value)).withExpected(new Expected(KEY).notExist()));
return null;
} catch (ConditionalCheckFailedException e) {
return get(key);
}
}
use of com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException in project spring-integration-aws by spring-projects.
the class DynamoDbMetaDataStore method replace.
@Override
public boolean replace(String key, String oldValue, String newValue) {
Assert.hasText(key, "'key' must not be empty.");
Assert.hasText(oldValue, "'value' must not be empty.");
Assert.hasText(newValue, "'newValue' must not be empty.");
awaitForActive();
try {
return this.table.updateItem(new UpdateItemSpec().withPrimaryKey(KEY, key).withAttributeUpdate(new AttributeUpdate(VALUE).put(newValue)).withExpected(new Expected(VALUE).eq(oldValue)).withReturnValues(ReturnValue.UPDATED_NEW)).getItem() != null;
} catch (ConditionalCheckFailedException e) {
return false;
}
}
use of com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException in project thunder by RohanNagar.
the class UsersDao method insert.
/**
* Insert a new PilotUser into the data store.
*
* @param user The object to insert.
* @return The PilotUser object that was created.
* @throws DatabaseException If the user already exists or if the database is down.
*/
public PilotUser insert(PilotUser user) {
checkNotNull(user);
long now = Instant.now().toEpochMilli();
Item item = new Item().withPrimaryKey("email", user.getEmail().getAddress()).withString("id", UUID.randomUUID().toString()).withString("version", UUID.randomUUID().toString()).withLong("creation_time", now).withLong("update_time", now).withJSON("document", toJson(mapper, user));
try {
table.putItem(item, new Expected("email").notExist());
} catch (ConditionalCheckFailedException e) {
LOG.error("The user {} already exists in the database. Throwing DatabaseException.", user.getEmail());
throw new DatabaseException("The user already exists.", DatabaseError.CONFLICT);
} catch (AmazonServiceException e) {
LOG.error("The database rejected the create request.", e);
throw new DatabaseException("The database rejected the create request.", DatabaseError.REQUEST_REJECTED);
} catch (AmazonClientException e) {
LOG.error("The database is currently unresponsive.", e);
throw new DatabaseException("The database is currently unavailable.", DatabaseError.DATABASE_DOWN);
}
return user;
}
use of com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException in project thunder by RohanNagar.
the class UsersDao method delete.
/**
* Delete a PilotUser in the data store.
*
* @param email The email of the user to delete.
* @return The PilotUser object that was deleted or {@code null} if the delete failed.
* @throws DatabaseException If the user is not found or if the database is down.
*/
public PilotUser delete(String email) {
checkNotNull(email);
// Get the item that will be deleted to return it
Item item;
try {
item = table.getItem("email", email);
} catch (AmazonClientException e) {
LOG.error("The database is currently unresponsive.", e);
throw new DatabaseException("The database is currently unavailable.", DatabaseError.DATABASE_DOWN);
}
DeleteItemSpec deleteItemSpec = new DeleteItemSpec().withPrimaryKey("email", email).withExpected(new Expected("email").exists());
try {
table.deleteItem(deleteItemSpec);
} catch (ConditionalCheckFailedException e) {
LOG.warn("The email {} was not found in the database.", email, e);
throw new DatabaseException("The user to delete was not found.", DatabaseError.USER_NOT_FOUND);
} catch (AmazonClientException e) {
LOG.error("The database is currently unresponsive.", e);
throw new DatabaseException("The database is currently unavailable.", DatabaseError.DATABASE_DOWN);
}
return fromJson(mapper, item.getJSON("document"));
}
use of com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException in project thunder by RohanNagar.
the class UsersDao method update.
/**
* Update a PilotUser in the data store.
*
* @param existingEmail The existing email of the user.
* This must not be {@code null} if the email is to be changed.
* @param user The user object to update. Must have the same email as the one to update.
* @return The PilotUser object that was updated or {@code null} if the updated failed.
* @throws DatabaseException If the user is not found, the database is down, or the update fails.
*/
public PilotUser update(@Nullable String existingEmail, PilotUser user) {
checkNotNull(user);
// Different emails means we need to delete and insert
if (existingEmail != null && !existingEmail.equals(user.getEmail().getAddress())) {
LOG.info("User to update has new email. The user will be deleted and then reinserted.");
delete(existingEmail);
return insert(user);
}
// Compute the new data
long now = Instant.now().toEpochMilli();
String newVersion = UUID.randomUUID().toString();
String document = toJson(mapper, user);
// Get the old version
Item item;
try {
item = table.getItem("email", user.getEmail().getAddress());
} catch (AmazonClientException e) {
LOG.error("The database is currently unresponsive.", e);
throw new DatabaseException("The database is currently unavailable.", DatabaseError.DATABASE_DOWN);
}
if (item == null) {
LOG.warn("The user {} was not found in the database.", user.getEmail().getAddress());
throw new DatabaseException("The user was not found.", DatabaseError.USER_NOT_FOUND);
}
String oldVersion = item.getString("version");
Item newItem = item.withString("version", newVersion).withLong("update_time", now).withJSON("document", document);
try {
table.putItem(newItem, new Expected("version").eq(oldVersion));
} catch (ConditionalCheckFailedException e) {
LOG.error("The user was updated while this update was in progress." + " Aborting to avoid race condition.", e);
throw new DatabaseException("The user to update is at an unexpected stage.", DatabaseError.CONFLICT);
} catch (AmazonServiceException e) {
LOG.error("The database rejected the update request.", e);
throw new DatabaseException("The database rejected the update request.", DatabaseError.REQUEST_REJECTED);
} catch (AmazonClientException e) {
LOG.error("The database is currently unresponsive.", e);
throw new DatabaseException("The database is currently unavailable.", DatabaseError.DATABASE_DOWN);
}
return user;
}
Aggregations