use of io.atomix.core.tree.NoSuchDocumentPathException in project atomix by atomix.
the class DocumentTreeService method update.
protected DocumentTreeResult<Versioned<byte[]>> update(Commit<? extends Update> commit) {
DocumentTreeResult<Versioned<byte[]>> result = null;
DocumentPath path = commit.value().path();
// If the path is locked by a transaction, return a WRITE_LOCK error.
if (isLocked(path)) {
return DocumentTreeResult.writeLock();
}
Versioned<byte[]> currentValue = docTree.get(path);
try {
Match<Long> versionMatch = commit.value().versionMatch();
Match<byte[]> valueMatch = commit.value().valueMatch();
if (versionMatch.matches(currentValue == null ? null : currentValue.version()) && valueMatch.matches(currentValue == null ? null : currentValue.value())) {
if (commit.value().value() == null) {
Versioned<byte[]> oldValue = docTree.removeNode(path);
result = new DocumentTreeResult<>(Status.OK, oldValue);
if (oldValue != null) {
notifyListeners(new DocumentTreeEvent<>(path, Type.DELETED, Optional.empty(), Optional.of(oldValue)));
}
} else {
Versioned<byte[]> oldValue = docTree.set(path, commit.value().value().orElse(null));
Versioned<byte[]> newValue = docTree.get(path);
result = new DocumentTreeResult<>(Status.OK, newValue);
if (oldValue == null) {
notifyListeners(new DocumentTreeEvent<>(path, Type.CREATED, Optional.of(newValue), Optional.empty()));
} else {
notifyListeners(new DocumentTreeEvent<>(path, Type.UPDATED, Optional.of(newValue), Optional.of(oldValue)));
}
}
} else {
result = new DocumentTreeResult<>(commit.value().value() == null ? Status.INVALID_PATH : Status.NOOP, currentValue);
}
} catch (IllegalDocumentModificationException e) {
result = DocumentTreeResult.illegalModification();
} catch (NoSuchDocumentPathException e) {
result = DocumentTreeResult.invalidPath();
} catch (Exception e) {
getLogger().error("Failed to apply {} to state machine", commit.value(), e);
throw Throwables.propagate(e);
}
return result;
}
Aggregations