diff --git a/pom.xml b/pom.xml index 1aa8a6b4c519d703d36421c85883d25d13a7c7de..5a2e9f9d60a8083b99ee61f2cefed59bde473da9 100644 --- a/pom.xml +++ b/pom.xml @@ -25,7 +25,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>org.caosdb</groupId> <artifactId>caosdb-server</artifactId> - <version>0.5.0-GRPC0.0.17</version> + <version>0.5.0-GRPC0.0.19</version> <packaging>jar</packaging> <name>CaosDB Server</name> <scm> diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index d0c659679390fa0dbf2ff3f939b7062c38a63f90..ceb69a007dd29f3022b39f45637ef7ed91947dbb 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -15,7 +15,6 @@ import org.caosdb.api.entity.v1alpha1.DeleteRequest; import org.caosdb.api.entity.v1alpha1.DeleteResponse; import org.caosdb.api.entity.v1alpha1.Entity; 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.EntityRole; import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase; @@ -427,7 +426,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa private org.caosdb.api.entity.v1alpha1.ReferenceDataType.Builder convertReferenceDatatype( final ReferenceDatatype datatype) { - return ReferenceDataType.newBuilder().setName(datatype.toString()); + return ReferenceDataType.newBuilder().setName(datatype.getName()); } public Iterable<? extends org.caosdb.api.entity.v1alpha1.Property> convert( @@ -575,45 +574,82 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa switch (requestCase) { case RETRIEVE_REQUEST: return retrieve(request); - case DELETE_REQUEST: - return delete(request); default: - return MultiTransactionResponse.newBuilder() - .addResponses(singleTransaction(request.getRequests(0))) - .build(); + return write(request); } } - public TransactionResponse singleTransaction(final TransactionRequest request) throws Exception { - final WrappedRequestsCase requestCase = request.getWrappedRequestsCase(); - switch (requestCase) { - case INSERT_REQUEST: - return TransactionResponse.newBuilder() - .setInsertResponse(insert(request.getInsertRequest())) - .build(); - case UPDATE_REQUEST: - return TransactionResponse.newBuilder() - .setUpdateResponse(update(request.getUpdateRequest())) - .build(); - default: - throw new UnsupportedOperationException("Not implemented"); - } - } - - private MultiTransactionResponse delete(final MultiTransactionRequest requests) throws Exception { + private MultiTransactionResponse write(final MultiTransactionRequest requests) throws Exception { final MultiTransactionResponse.Builder builder = MultiTransactionResponse.newBuilder(); final WritableContainer container = new WritableContainer( SecurityUtils.getSubject(), getTimestamp(), getSRID(), new HashMap<String, String>()); for (final TransactionRequest request : requests.getRequestsList()) { - final DeleteRequest deleteRequest = request.getDeleteRequest(); - final String id = deleteRequest.getId(); - try { - final DeleteEntity entity = new DeleteEntity(getId(id)); - container.add(entity); + switch (request.getWrappedRequestsCase()) { + case INSERT_REQUEST: + final InsertRequest insertRequest = request.getInsertRequest(); + final Entity insertEntity = insertRequest.getEntityRequest().getEntity(); + + try { + final InsertEntity entity = + new InsertEntity( + insertEntity.getName().isEmpty() ? null : insertEntity.getName(), + convert(insertEntity.getRole())); + entity.setName(insertEntity.getName().isEmpty() ? null : insertEntity.getName()); + convert(insertEntity, entity); + if (insertRequest.getEntityRequest().hasUploadId()) { + 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); + } catch (final NumberFormatException e) { + // ID wasn't an integer - we handle this below. + } + break; + case UPDATE_REQUEST: + final UpdateRequest updateRequest = request.getUpdateRequest(); + final Entity updateEntity = updateRequest.getEntityRequest().getEntity(); + + try { + final UpdateEntity entity = + new UpdateEntity(getId(updateEntity.getId()), convert(updateEntity.getRole())); + entity.setName(updateEntity.getName().isEmpty() ? null : updateEntity.getName()); + convert(updateEntity, entity); + if (updateRequest.getEntityRequest().hasUploadId()) { + 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); + } catch (final NumberFormatException e) { + // ID wasn't an integer - we handle this below. + } + break; + case DELETE_REQUEST: + final DeleteRequest deleteRequest = request.getDeleteRequest(); + try { + final DeleteEntity entity = new DeleteEntity(getId(deleteRequest.getId())); + container.add(entity); - } catch (final NumberFormatException e) { - // ID wasn't an integer - we handle this below + } catch (final NumberFormatException e) { + // ID wasn't an integer - we handle this below + } + break; + default: + throw new UnsupportedOperationException("Not implemented"); } } @@ -621,18 +657,56 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa transaction.execute(); for (final EntityInterface entity : container) { - final IdResponse.Builder idResponse = - IdResponse.newBuilder().setId(entity.getId().toString()); + final IdResponse.Builder idResponse = IdResponse.newBuilder(); + if (entity.getId() != null) { + idResponse.setId(entity.getId().toString()); + } appendMessages(entity, idResponse); - builder - .addResponsesBuilder() - .setDeleteResponse(DeleteResponse.newBuilder().setIdResponse(idResponse)); + if (entity instanceof InsertEntity) { + builder + .addResponsesBuilder() + .setInsertResponse(InsertResponse.newBuilder().setIdResponse(idResponse)); + } else if (entity instanceof UpdateEntity) { + + builder + .addResponsesBuilder() + .setUpdateResponse(UpdateResponse.newBuilder().setIdResponse(idResponse)); + } else { + builder + .addResponsesBuilder() + .setDeleteResponse(DeleteResponse.newBuilder().setIdResponse(idResponse)); + } } - // Add those entities which have not been retrieved because the have a string id - for (final TransactionRequest sub_request : requests.getRequestsList()) { - final String id = sub_request.getRetrieveRequest().getId(); + // Add those entities which have not been processed because the have a string id + for (final TransactionRequest request : requests.getRequestsList()) { + final String id = ""; + switch (request.getWrappedRequestsCase()) { + case UPDATE_REQUEST: + final UpdateRequest updateRequest = request.getUpdateRequest(); + final Entity updateEntity = updateRequest.getEntityRequest().getEntity(); + + try { + final UpdateEntity entity = + new UpdateEntity(getId(updateEntity.getId()), convert(updateEntity.getRole())); + entity.setName(updateEntity.getName().isEmpty() ? null : updateEntity.getName()); + container.add(entity); + } catch (final NumberFormatException e) { + // ID wasn't an integer - we handle this below. + } + case DELETE_REQUEST: + final DeleteRequest deleteRequest = request.getDeleteRequest(); + try { + final DeleteEntity entity = new DeleteEntity(getId(deleteRequest.getId())); + container.add(entity); + + } catch (final NumberFormatException e) { + // ID wasn't an integer - we handle this below + } + default: + break; + } if (!id.isBlank()) { try { getId(id); @@ -650,19 +724,6 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa return builder.build(); } - private InsertResponse insert(final InsertRequest insertRequest) throws Exception { - final EntityRequest entityRequest = insertRequest.getEntityRequest(); - final Entity insertEntity = entityRequest.getEntity(); - final InsertEntity entity = - new InsertEntity( - insertEntity.getName().isEmpty() ? null : insertEntity.getName(), - convert(insertEntity.getRole())); - - return InsertResponse.newBuilder() - .setIdResponse(write(convert(insertEntity, entity), entityRequest)) - .build(); - } - private Role convert(final EntityRole role) { switch (role) { case ENTITY_ROLE_FILE: @@ -678,57 +739,6 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa } } - private UpdateResponse update(final UpdateRequest updateRequest) throws Exception { - final EntityRequest entityRequest = updateRequest.getEntityRequest(); - final Entity updateEntity = entityRequest.getEntity(); - final String id = updateEntity.getId(); - try { - final UpdateEntity entity = new UpdateEntity(getId(id), convert(updateEntity.getRole())); - entity.setName(updateEntity.getName().isEmpty() ? null : updateEntity.getName()); - - return UpdateResponse.newBuilder() - .setIdResponse(write(convert(updateEntity, entity), entityRequest)) - .build(); - } catch (final NumberFormatException e) { - // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot - // exist. - return UpdateResponse.newBuilder() - .setIdResponse( - IdResponse.newBuilder() - .setId(id) - .addErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST))) - .build(); - } - } - - private IdResponse write(final EntityInterface entity, final EntityRequest entityRequest) - throws Exception { - - final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder = IdResponse.newBuilder(); - final WritableContainer container = - new WritableContainer( - SecurityUtils.getSubject(), getTimestamp(), getSRID(), new HashMap<>()); - container.add(entity); - 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()); - } - } - final WriteTransaction transaction = new WriteTransaction(container); - transaction.execute(); - if (entity.hasId()) { - builder.setId(Integer.toString(entity.getId())); - } - appendMessages(entity, builder); - - return builder.build(); - } - private void appendMessages( final EntityInterface from, final org.caosdb.api.entity.v1alpha1.EntityResponse.Builder builder) { diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java index 62a9beea1921f34dd3646bcc78ed9086d05e6098..7a9a0519efc908e549a53f560af10a0ceffb3b27 100644 --- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java +++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java @@ -288,7 +288,7 @@ public class WriteTransaction extends Transaction<WritableContainer> entity.setEntityStatus(EntityStatus.UNQUALIFIED); entity.addError(ServerMessages.AUTHORIZATION_ERROR); entity.addInfo(exc.getMessage()); - } catch (ClassCastException exc) { + } catch (final ClassCastException exc) { // not an update entity. ignore. } @@ -308,10 +308,10 @@ public class WriteTransaction extends Transaction<WritableContainer> // split up the TransactionContainer into three containers, one for each // type of writing transaction. - TransactionContainer inserts = new TransactionContainer(); - TransactionContainer updates = new TransactionContainer(); - TransactionContainer deletes = new TransactionContainer(); - for (EntityInterface entity : getContainer()) { + final TransactionContainer inserts = new TransactionContainer(); + final TransactionContainer updates = new TransactionContainer(); + final TransactionContainer deletes = new TransactionContainer(); + for (final EntityInterface entity : getContainer()) { if (entity instanceof InsertEntity) { inserts.add(entity); } else if (entity instanceof UpdateEntity) { @@ -492,7 +492,7 @@ public class WriteTransaction extends Transaction<WritableContainer> } else { newProperty.setEntityStatus(EntityStatus.UNQUALIFIED); newProperty.addError(ServerMessages.ENTITY_HAS_NO_ID); - newProperty.addInfo("On updates, allways specify the id not just the name."); + newProperty.addInfo("On updates, always specify the id not just the name."); newEntity.addError(ServerMessages.ENTITY_HAS_UNQUALIFIED_PROPERTIES); newEntity.setEntityStatus(EntityStatus.UNQUALIFIED); return needPermissions; @@ -526,7 +526,7 @@ public class WriteTransaction extends Transaction<WritableContainer> } else { newParent.setEntityStatus(EntityStatus.UNQUALIFIED); newParent.addError(ServerMessages.ENTITY_HAS_NO_ID); - newParent.addInfo("On updates, allways specify the id not just the name."); + newParent.addInfo("On updates, always specify the id not just the name."); newEntity.addError(ServerMessages.ENTITY_HAS_UNQUALIFIED_PROPERTIES); newEntity.setEntityStatus(EntityStatus.UNQUALIFIED); return needPermissions;