package com.mongodb.operation;
import com.mongodb.MongoWriteConcernException;
import com.mongodb.ServerAddress;
import com.mongodb.WriteConcernResult;
import com.mongodb.connection.AsyncConnection;
import com.mongodb.connection.Connection;
import com.mongodb.operation.CommandOperationHelper.CommandWriteTransformer;
import com.mongodb.operation.CommandOperationHelper.CommandWriteTransformerAsync;
import org.bson.BsonBoolean;
import org.bson.BsonDocument;
import org.bson.BsonInt32;
import static com.mongodb.internal.operation.WriteConcernHelper.createWriteConcernError;
import static com.mongodb.internal.operation.WriteConcernHelper.hasWriteConcernError;
final class FindAndModifyHelper {
static <T> CommandWriteTransformer<BsonDocument, T> transformer() {
return new CommandWriteTransformer<BsonDocument, T>() {
@SuppressWarnings("unchecked")
@Override
public T apply(final BsonDocument result, final Connection connection) {
return transformDocument(result, connection.getDescription().getServerAddress());
}
};
}
static <T> CommandWriteTransformerAsync<BsonDocument, T> asyncTransformer() {
return new CommandWriteTransformerAsync<BsonDocument, T>() {
@SuppressWarnings("unchecked")
@Override
public T apply(final BsonDocument result, final AsyncConnection connection) {
return transformDocument(result, connection.getDescription().getServerAddress());
}
};
}
private static <T> T transformDocument(final BsonDocument result, final ServerAddress serverAddress) {
if (hasWriteConcernError(result)) {
throw new MongoWriteConcernException(createWriteConcernError(result.getDocument("writeConcernError")),
createWriteConcernResult(result.getDocument("lastErrorObject", new BsonDocument())), serverAddress);
}
if (!result.isDocument("value")) {
return null;
}
return BsonDocumentWrapperHelper.toDocument(result.getDocument("value", null));
}
private static WriteConcernResult createWriteConcernResult(final BsonDocument result) {
BsonBoolean updatedExisting = result.getBoolean("updatedExisting", BsonBoolean.FALSE);
return WriteConcernResult.acknowledged(result.getNumber("n", new BsonInt32(0)).intValue(),
updatedExisting.getValue(), result.get("upserted"));
}
private FindAndModifyHelper() {
}
}