diff --git a/caosdb-proto b/caosdb-proto index f2588df914386beeeaacca4ea566516d23dc4baa..4845aa8e479b85b50a130530bbc96a0cab4f8688 160000 --- a/caosdb-proto +++ b/caosdb-proto @@ -1 +1 @@ -Subproject commit f2588df914386beeeaacca4ea566516d23dc4baa +Subproject commit 4845aa8e479b85b50a130530bbc96a0cab4f8688 diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index c45a011d6f39f47e9b9732b1090194128bc75589..b92974c53a90e12d20637cb602f40fd0fbd94e89 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -10,6 +10,7 @@ import org.caosdb.api.entity.v1alpha1.ByIdRequest; import org.caosdb.api.entity.v1alpha1.Entity; import org.caosdb.api.entity.v1alpha1.Entity.Builder; import org.caosdb.api.entity.v1alpha1.EntityTransactionServiceGrpc.EntityTransactionServiceImplBase; +import org.caosdb.api.entity.v1alpha1.MessageCode; import org.caosdb.api.entity.v1alpha1.Parent; import org.caosdb.api.entity.v1alpha1.RetrieveRequest; import org.caosdb.api.entity.v1alpha1.RetrieveResponse; @@ -24,6 +25,7 @@ import org.caosdb.server.entity.container.RetrieveContainer; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.transaction.Retrieve; import org.caosdb.server.utils.EntityStatus; +import org.caosdb.server.utils.ServerMessages; public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBase { @@ -92,11 +94,20 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa private org.caosdb.api.entity.v1alpha1.Message convert(final Message m) { final org.caosdb.api.entity.v1alpha1.Message.Builder builder = org.caosdb.api.entity.v1alpha1.Message.newBuilder(); - builder.setCode(m.getCode()); + final MessageCode code = getMessageCode(m); + builder.setCode(code.getNumber()); builder.setDescription(m.getDescription()); return builder.build(); } + private MessageCode getMessageCode(final Message m) { + // TODO move to Message class. + if (m.equals(ServerMessages.ENTITY_DOES_NOT_EXIST)) { + return MessageCode.MESSAGE_CODE_ENTITY_DOES_NOT_EXIST; + } + throw new UnsupportedOperationException("Unkown message code: " + m.toString()); + } + public Version convert(final org.caosdb.server.entity.Version from) { final org.caosdb.api.entity.v1alpha1.Version.Builder builder = Version.newBuilder(); @@ -184,16 +195,35 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa return Integer.parseInt(request.getId()); } - public Entity retrieve(final RetrieveRequest request) throws Exception { + public RetrieveResponse retrieve(final RetrieveRequest request) throws Exception { + Entity responseEntity = null; + final org.caosdb.api.entity.v1alpha1.RetrieveResponse.Builder builder = + RetrieveResponse.newBuilder(); final RetrieveContainer container = new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); - final RetrieveEntity entity = new RetrieveEntity(getId(request.getById())); - container.add(entity); + try { + final RetrieveEntity entity = new RetrieveEntity(getId(request.getById())); + container.add(entity); + + final Retrieve transaction = new Retrieve(container); + transaction.execute(); + responseEntity = convert(transaction.getContainer().get(0)); + } catch (final NumberFormatException e) { + // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot + // exist. + responseEntity = entityDoesNotExist(request.getById().getId()); + } + + builder.setEntity(responseEntity); + return builder.build(); + } - final Retrieve transaction = new Retrieve(container); - transaction.execute(); - return convert(transaction.getContainer().get(0)); + private Entity entityDoesNotExist(final String id) { + return Entity.newBuilder() + .addErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST)) + .setId(id) + .build(); } private String getSRID() { @@ -208,8 +238,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa public void retrieve( final RetrieveRequest request, final StreamObserver<RetrieveResponse> responseObserver) { try { - final Entity entity = retrieve(request); - final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build(); + final RetrieveResponse response = retrieve(request); responseObserver.onNext(response); responseObserver.onCompleted();