Skip to content
Snippets Groups Projects
Verified Commit ab08dc9b authored by Timm Fitschen's avatar Timm Fitschen
Browse files

BUG: correctly handle string ids

parent 6f5d3c94
No related branches found
No related tags found
3 merge requests!44Release 0.6,!43Merge f-GRPC-main to dev,!35F grpc f mixed write transactions
Pipeline #14152 passed
...@@ -15,6 +15,7 @@ import org.caosdb.api.entity.v1alpha1.DeleteRequest; ...@@ -15,6 +15,7 @@ import org.caosdb.api.entity.v1alpha1.DeleteRequest;
import org.caosdb.api.entity.v1alpha1.DeleteResponse; import org.caosdb.api.entity.v1alpha1.DeleteResponse;
import org.caosdb.api.entity.v1alpha1.Entity; import org.caosdb.api.entity.v1alpha1.Entity;
import org.caosdb.api.entity.v1alpha1.Entity.Builder; import org.caosdb.api.entity.v1alpha1.Entity.Builder;
import org.caosdb.api.entity.v1alpha1.EntityRequest;
import org.caosdb.api.entity.v1alpha1.EntityResponse; import org.caosdb.api.entity.v1alpha1.EntityResponse;
import org.caosdb.api.entity.v1alpha1.EntityRole; import org.caosdb.api.entity.v1alpha1.EntityRole;
import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase; import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase;
...@@ -590,37 +591,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -590,37 +591,26 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
final WritableContainer container = final WritableContainer container =
new WritableContainer( new WritableContainer(
SecurityUtils.getSubject(), getTimestamp(), getSRID(), new HashMap<String, String>()); SecurityUtils.getSubject(), getTimestamp(), getSRID(), new HashMap<String, String>());
for (final TransactionRequest request : requests.getRequestsList()) {
switch (request.getWrappedRequestsCase()) { // put entities into the transaction object
for (final TransactionRequest sub_request : requests.getRequestsList()) {
switch (sub_request.getWrappedRequestsCase()) {
case INSERT_REQUEST: case INSERT_REQUEST:
final InsertRequest insertRequest = request.getInsertRequest(); {
final Entity insertEntity = insertRequest.getEntityRequest().getEntity(); final InsertRequest insertRequest = sub_request.getInsertRequest();
final Entity insertEntity = insertRequest.getEntityRequest().getEntity();
try {
final InsertEntity entity = final InsertEntity entity =
new InsertEntity( new InsertEntity(
insertEntity.getName().isEmpty() ? null : insertEntity.getName(), insertEntity.getName().isEmpty() ? null : insertEntity.getName(),
convert(insertEntity.getRole())); convert(insertEntity.getRole()));
entity.setName(insertEntity.getName().isEmpty() ? null : insertEntity.getName());
convert(insertEntity, entity); convert(insertEntity, entity);
if (insertRequest.getEntityRequest().hasUploadId()) { addFileUpload(container, entity, insertRequest.getEntityRequest());
final FileProperties uploadFile =
fileTransmissionService.getUploadFile(
insertRequest.getEntityRequest().getUploadId());
if (uploadFile == null) {
entity.addError(ServerMessages.FILE_HAS_NOT_BEEN_UPLOAED);
} else {
container.addFile(uploadFile.getTmpIdentifyer(), uploadFile);
entity.getFileProperties().setTmpIdentifyer(uploadFile.getTmpIdentifyer());
}
}
container.add(entity); container.add(entity);
} catch (final NumberFormatException e) {
// ID wasn't an integer - we handle this below.
} }
break; break;
case UPDATE_REQUEST: case UPDATE_REQUEST:
final UpdateRequest updateRequest = request.getUpdateRequest(); final UpdateRequest updateRequest = sub_request.getUpdateRequest();
final Entity updateEntity = updateRequest.getEntityRequest().getEntity(); final Entity updateEntity = updateRequest.getEntityRequest().getEntity();
try { try {
...@@ -628,44 +618,38 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -628,44 +618,38 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
new UpdateEntity(getId(updateEntity.getId()), convert(updateEntity.getRole())); new UpdateEntity(getId(updateEntity.getId()), convert(updateEntity.getRole()));
entity.setName(updateEntity.getName().isEmpty() ? null : updateEntity.getName()); entity.setName(updateEntity.getName().isEmpty() ? null : updateEntity.getName());
convert(updateEntity, entity); convert(updateEntity, entity);
if (updateRequest.getEntityRequest().hasUploadId()) { addFileUpload(container, entity, updateRequest.getEntityRequest());
final FileProperties uploadFile =
fileTransmissionService.getUploadFile(
updateRequest.getEntityRequest().getUploadId());
if (uploadFile == null) {
entity.addError(ServerMessages.FILE_HAS_NOT_BEEN_UPLOAED);
} else {
container.addFile(uploadFile.getTmpIdentifyer(), uploadFile);
entity.getFileProperties().setTmpIdentifyer(uploadFile.getTmpIdentifyer());
}
}
container.add(entity); container.add(entity);
} catch (final NumberFormatException e) { } catch (final NumberFormatException e) {
// ID wasn't an integer - we handle this below. // ID wasn't an integer
return failedWriteDueToStringId(requests);
} }
break; break;
case DELETE_REQUEST: case DELETE_REQUEST:
final DeleteRequest deleteRequest = request.getDeleteRequest(); final DeleteRequest deleteRequest = sub_request.getDeleteRequest();
try { try {
final DeleteEntity entity = new DeleteEntity(getId(deleteRequest.getId())); final DeleteEntity entity = new DeleteEntity(getId(deleteRequest.getId()));
container.add(entity); container.add(entity);
} catch (final NumberFormatException e) { } catch (final NumberFormatException e) {
// ID wasn't an integer - we handle this below // ID wasn't an integer
return failedWriteDueToStringId(requests);
} }
break; break;
default: default:
throw new CaosDBException( throw new CaosDBException(
"Cannot process a " "Cannot process a "
+ request.getWrappedRequestsCase().name() + sub_request.getWrappedRequestsCase().name()
+ " in a write request."); + " in a write request.");
} }
} }
// execute the transaction
final WriteTransaction transaction = new WriteTransaction(container); final WriteTransaction transaction = new WriteTransaction(container);
transaction.setNoIdIsError(false); transaction.setNoIdIsError(false);
transaction.execute(); transaction.execute();
// put inserted/updated/deleted entities back into the response
for (final EntityInterface entity : container) { for (final EntityInterface entity : container) {
final IdResponse.Builder idResponse = IdResponse.newBuilder(); final IdResponse.Builder idResponse = IdResponse.newBuilder();
if (entity.getId() != null) { if (entity.getId() != null) {
...@@ -688,52 +672,83 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -688,52 +672,83 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
.setDeleteResponse(DeleteResponse.newBuilder().setIdResponse(idResponse)); .setDeleteResponse(DeleteResponse.newBuilder().setIdResponse(idResponse));
} }
} }
return builder.build();
}
/**
* Handle a request which contains string id (which cannot be converted to integer ids) and return
* a response which has the "ENTITY_DOES_NOT_EXIST" error for all entities with affected ids.
*
* @param request
* @return
*/
private MultiTransactionResponse failedWriteDueToStringId(final MultiTransactionRequest request) {
final org.caosdb.api.entity.v1alpha1.MultiTransactionResponse.Builder builder =
MultiTransactionResponse.newBuilder();
for (final TransactionRequest subRequest : request.getRequestsList()) {
final IdResponse.Builder idResponse = IdResponse.newBuilder();
switch (subRequest.getWrappedRequestsCase()) {
case INSERT_REQUEST:
builder
.addResponsesBuilder()
.setInsertResponse(InsertResponse.newBuilder().setIdResponse(idResponse));
// Add those entities which have not been processed because the have a string id break;
for (final TransactionRequest request : requests.getRequestsList()) {
final String id = "";
switch (request.getWrappedRequestsCase()) {
case UPDATE_REQUEST: case UPDATE_REQUEST:
final UpdateRequest updateRequest = request.getUpdateRequest(); final UpdateRequest updateRequest = subRequest.getUpdateRequest();
final Entity updateEntity = updateRequest.getEntityRequest().getEntity(); final Entity updateEntity = updateRequest.getEntityRequest().getEntity();
idResponse.setId(updateEntity.getId());
try { try {
final UpdateEntity entity = getId(updateEntity.getId());
new UpdateEntity(getId(updateEntity.getId()), convert(updateEntity.getRole()));
entity.setName(updateEntity.getName().isEmpty() ? null : updateEntity.getName());
container.add(entity);
} catch (final NumberFormatException e) { } catch (final NumberFormatException e) {
// ID wasn't an integer - we handle this below. // ID wasn't an integer
idResponse.addErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST));
} }
builder
.addResponsesBuilder()
.setUpdateResponse(UpdateResponse.newBuilder().setIdResponse(idResponse));
break;
case DELETE_REQUEST: case DELETE_REQUEST:
final DeleteRequest deleteRequest = request.getDeleteRequest(); final DeleteRequest deleteRequest = subRequest.getDeleteRequest();
idResponse.setId(deleteRequest.getId());
try { try {
final DeleteEntity entity = new DeleteEntity(getId(deleteRequest.getId())); getId(deleteRequest.getId());
container.add(entity);
} catch (final NumberFormatException e) { } catch (final NumberFormatException e) {
// ID wasn't an integer - we handle this below // ID wasn't an integer
idResponse.addErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST));
} }
default: builder
.addResponsesBuilder()
.setDeleteResponse(DeleteResponse.newBuilder().setIdResponse(idResponse));
break; break;
} default:
if (!id.isBlank()) { throw new CaosDBException(
try { "Cannot process a "
getId(id); + subRequest.getWrappedRequestsCase().name()
} catch (final NumberFormatException e) { + " in a write request.");
// ID wasn't an integer - the server doesn't support string id's yet, so that entity
// cannot exist.
final IdResponse.Builder idResponse = IdResponse.newBuilder().setId(id);
idResponse.addErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST));
builder.addResponses(
TransactionResponse.newBuilder()
.setDeleteResponse(DeleteResponse.newBuilder().setIdResponse(idResponse)));
}
} }
} }
return builder.build(); return builder.build();
} }
private void addFileUpload(
final WritableContainer container,
final EntityInterface entity,
final EntityRequest entityRequest) {
if (entityRequest.hasUploadId()) {
final FileProperties uploadFile =
fileTransmissionService.getUploadFile(entityRequest.getUploadId());
if (uploadFile == null) {
entity.addError(ServerMessages.FILE_HAS_NOT_BEEN_UPLOAED);
} else {
container.addFile(uploadFile.getTmpIdentifyer(), uploadFile);
entity.getFileProperties().setTmpIdentifyer(uploadFile.getTmpIdentifyer());
}
}
}
private Role convert(final EntityRole role) { private Role convert(final EntityRole role) {
switch (role) { switch (role) {
case ENTITY_ROLE_FILE: case ENTITY_ROLE_FILE:
...@@ -794,6 +809,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa ...@@ -794,6 +809,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa
} }
private EntityInterface convert(final Entity from, final EntityInterface entity) { private EntityInterface convert(final Entity from, final EntityInterface entity) {
entity.setName(from.getName().isEmpty() ? null : from.getName());
entity.setDescription(from.getDescription().isBlank() ? null : from.getDescription()); entity.setDescription(from.getDescription().isBlank() ? null : from.getDescription());
if (!from.getUnit().isBlank()) { if (!from.getUnit().isBlank()) {
entity.addProperty(getUnit(from.getUnit())); entity.addProperty(getUnit(from.getUnit()));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment