diff --git a/caosdb-proto b/caosdb-proto index 4845aa8e479b85b50a130530bbc96a0cab4f8688..8febce70a96b3322d61a74e4567ade8b33f75369 160000 --- a/caosdb-proto +++ b/caosdb-proto @@ -1 +1 @@ -Subproject commit 4845aa8e479b85b50a130530bbc96a0cab4f8688 +Subproject commit 8febce70a96b3322d61a74e4567ade8b33f75369 diff --git a/pom.xml b/pom.xml index 0b3121bda423d81306bb4ee91aef9fdced2886d4..f3ab3fc572e2d7d50a31198ed295ad6439a030c6 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.6</version> + <version>0.5.0-GRPC0.0.7</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 b92974c53a90e12d20637cb602f40fd0fbd94e89..bc26f539e04ebc9d3d696d731f57654fe7a7ddcc 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -6,24 +6,35 @@ import java.util.LinkedList; import java.util.List; import java.util.UUID; import org.apache.shiro.SecurityUtils; -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.FullEntityRequest; +import org.caosdb.api.entity.v1alpha1.IdResponse; import org.caosdb.api.entity.v1alpha1.MessageCode; +import org.caosdb.api.entity.v1alpha1.MultiTransactionRequest; +import org.caosdb.api.entity.v1alpha1.MultiTransactionResponse; import org.caosdb.api.entity.v1alpha1.Parent; -import org.caosdb.api.entity.v1alpha1.RetrieveRequest; +import org.caosdb.api.entity.v1alpha1.QueryOrIdRequest; import org.caosdb.api.entity.v1alpha1.RetrieveResponse; +import org.caosdb.api.entity.v1alpha1.TransactionRequest; +import org.caosdb.api.entity.v1alpha1.TransactionRequest.WrappedRequestsCase; +import org.caosdb.api.entity.v1alpha1.TransactionResponse; import org.caosdb.api.entity.v1alpha1.Version; +import org.caosdb.server.entity.DeleteEntity; import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.InsertEntity; import org.caosdb.server.entity.MagicTypes; import org.caosdb.server.entity.Message; import org.caosdb.server.entity.RetrieveEntity; +import org.caosdb.server.entity.Role; import org.caosdb.server.entity.container.ParentContainer; import org.caosdb.server.entity.container.PropertyContainer; import org.caosdb.server.entity.container.RetrieveContainer; +import org.caosdb.server.entity.container.WritableContainer; import org.caosdb.server.entity.wrapper.Property; import org.caosdb.server.transaction.Retrieve; +import org.caosdb.server.transaction.WriteTransaction; import org.caosdb.server.utils.EntityStatus; import org.caosdb.server.utils.ServerMessages; @@ -69,15 +80,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa if (from.hasParents()) { builder.addAllParents(convert(from.getParents())); } - if (from.hasMessage(Message.MessageType.Error.toString())) { - builder.addAllErrors(convert(from.getMessages(Message.MessageType.Error.toString()))); - } - if (from.hasMessage(Message.MessageType.Warning.toString())) { - builder.addAllErrors(convert(from.getMessages(Message.MessageType.Warning.toString()))); - } - if (from.hasMessage(Message.MessageType.Info.toString())) { - builder.addAllErrors(convert(from.getMessages(Message.MessageType.Info.toString()))); - } + appendMessages(from, builder); return builder.build(); } @@ -104,6 +107,8 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa // TODO move to Message class. if (m.equals(ServerMessages.ENTITY_DOES_NOT_EXIST)) { return MessageCode.MESSAGE_CODE_ENTITY_DOES_NOT_EXIST; + } else if (m.equals(ServerMessages.ENTITY_HAS_NO_PROPERTIES)) { + return MessageCode.MESSAGE_CODE_ENTITY_HAS_NO_PROPERTIES; } throw new UnsupportedOperationException("Unkown message code: " + m.toString()); } @@ -191,11 +196,11 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa }; } - public Integer getId(final ByIdRequest request) { - return Integer.parseInt(request.getId()); + public Integer getId(final String id) { + return Integer.parseInt(id); } - public RetrieveResponse retrieve(final RetrieveRequest request) throws Exception { + public RetrieveResponse retrieve(final QueryOrIdRequest queryOrIdRequest) throws Exception { Entity responseEntity = null; final org.caosdb.api.entity.v1alpha1.RetrieveResponse.Builder builder = @@ -203,7 +208,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa final RetrieveContainer container = new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); try { - final RetrieveEntity entity = new RetrieveEntity(getId(request.getById())); + final RetrieveEntity entity = new RetrieveEntity(getId(queryOrIdRequest.getId())); container.add(entity); final Retrieve transaction = new Retrieve(container); @@ -212,7 +217,7 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa } 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()); + responseEntity = entityDoesNotExist(queryOrIdRequest.getId()); } builder.setEntity(responseEntity); @@ -234,11 +239,114 @@ public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBa return System.currentTimeMillis(); } + public MultiTransactionResponse transaction(final MultiTransactionRequest request) + throws Exception { + final TransactionResponse response = singleTransaction(request.getRequests(0)); + return MultiTransactionResponse.newBuilder().addResponses(response).build(); + } + + public TransactionResponse singleTransaction(final TransactionRequest request) throws Exception { + final WrappedRequestsCase requestCase = request.getWrappedRequestsCase(); + switch (requestCase) { + case RETRIEVE_REQUEST: + return TransactionResponse.newBuilder() + .setRetrieveResponse(retrieve(request.getRetrieveRequest())) + .build(); + case INSERT_REQUEST: + return TransactionResponse.newBuilder() + .setInsertResponse(insert(request.getInsertRequest())) + .build(); + case DELETE_REQUEST: + return TransactionResponse.newBuilder() + .setDeleteResponse(delete(request.getDeleteRequest())) + .build(); + default: + throw new UnsupportedOperationException("Not implemented"); + } + } + + private IdResponse delete(final QueryOrIdRequest deleteRequest) throws Exception { + + final String id = deleteRequest.getId(); + final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder = IdResponse.newBuilder(); + builder.setId(id); + final WritableContainer container = + new WritableContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); + try { + final DeleteEntity entity = new DeleteEntity(getId(id)); + container.add(entity); + + final WriteTransaction transaction = new WriteTransaction(container); + transaction.execute(); + appendMessages(entity, builder); + } catch (final NumberFormatException e) { + // ID wasn't an integer - the server doesn't support string id's yet, so that entity cannot + // exist. + builder.addEntityErrors(convert(ServerMessages.ENTITY_DOES_NOT_EXIST)); + } + + return builder.build(); + } + + private IdResponse insert(final FullEntityRequest insertRequest) throws Exception { + final Entity insertEntity = insertRequest.getEntity(); + + final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder = IdResponse.newBuilder(); + final WritableContainer container = + new WritableContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); + final InsertEntity entity = convert(insertEntity); + container.add(entity); + final WriteTransaction transaction = new WriteTransaction(container); + transaction.execute(); + + builder.setId(Integer.toString(entity.getId())); + appendMessages(entity, builder); + + return builder.build(); + } + + private void appendMessages( + final EntityInterface from, final org.caosdb.api.entity.v1alpha1.Entity.Builder builder) { + if (from.hasMessage(Message.MessageType.Error.toString())) { + builder.addAllErrors(convert(from.getMessages(Message.MessageType.Error.toString()))); + } + if (from.hasMessage(Message.MessageType.Warning.toString())) { + builder.addAllWarnings(convert(from.getMessages(Message.MessageType.Warning.toString()))); + } + if (from.hasMessage(Message.MessageType.Info.toString())) { + builder.addAllInfos(convert(from.getMessages(Message.MessageType.Info.toString()))); + } + } + + private void appendMessages( + final EntityInterface from, final org.caosdb.api.entity.v1alpha1.IdResponse.Builder builder) { + if (from.hasMessage(Message.MessageType.Error.toString())) { + builder.addAllEntityErrors(convert(from.getMessages(Message.MessageType.Error.toString()))); + } + if (from.hasMessage(Message.MessageType.Warning.toString())) { + builder.addAllEntityWarnings( + convert(from.getMessages(Message.MessageType.Warning.toString()))); + } + if (from.hasMessage(Message.MessageType.Info.toString())) { + builder.addAllEntityInfos(convert(from.getMessages(Message.MessageType.Info.toString()))); + } + } + + private InsertEntity convert(final Entity insertEntity) { + final InsertEntity entity = + new InsertEntity( + insertEntity.getName().isEmpty() ? null : insertEntity.getName(), + Role.parse(insertEntity.getRole())); + // TODO (other basic attributes, properties, parents) + return entity; + } + @Override - public void retrieve( - final RetrieveRequest request, final StreamObserver<RetrieveResponse> responseObserver) { + public void multiTransaction( + final MultiTransactionRequest request, + final StreamObserver<MultiTransactionResponse> responseObserver) { try { - final RetrieveResponse response = retrieve(request); + final MultiTransactionResponse response = transaction(request); responseObserver.onNext(response); responseObserver.onCompleted();