diff --git a/caosdb-proto b/caosdb-proto index dd9abe3499367c4eded4774ade1acbc90ef048b3..12f072263c05208464b80c0124bde0396b100d86 160000 --- a/caosdb-proto +++ b/caosdb-proto @@ -1 +1 @@ -Subproject commit dd9abe3499367c4eded4774ade1acbc90ef048b3 +Subproject commit 12f072263c05208464b80c0124bde0396b100d86 diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java index 1ca75f9cde9bbe4ad74eb337abcda4775be94f0c..3d7df68a50a170fe930807014f36c24bf086820d 100644 --- a/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java +++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionServiceImpl.java @@ -1,20 +1,192 @@ package org.caosdb.server.grpc; import io.grpc.stub.StreamObserver; +import java.util.Iterator; +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.Parent; import org.caosdb.api.entity.v1alpha1.RetrieveRequest; import org.caosdb.api.entity.v1alpha1.RetrieveResponse; +import org.caosdb.api.entity.v1alpha1.Version; +import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.MagicTypes; +import org.caosdb.server.entity.RetrieveEntity; +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.wrapper.Property; +import org.caosdb.server.transaction.Retrieve; +import org.caosdb.server.utils.EntityStatus; public class EntityTransactionServiceImpl extends EntityTransactionServiceImplBase { + public String getStringUnit(final EntityInterface entity) { + for (final Property p : entity.getProperties()) { + if (MagicTypes.UNIT.getId() == p.getId()) { + p.setEntityStatus(EntityStatus.IGNORE); + return p.getValue().toString(); + } + } + return null; + } + + public Entity convert(final EntityInterface from) { + final Builder builder = Entity.newBuilder(); + + if (from.getRole() != null) { + builder.setRole(from.getRole().toString()); + } + if (from.hasId()) { + builder.setId(from.getId().toString()); + } + if (from.hasVersion()) { + builder.setVersion(convert(from.getVersion())); + } + if (from.hasName()) { + builder.setName(from.getName()); + } + if (from.hasDescription()) { + builder.setDescription(from.getDescription()); + } + if (from.hasDatatype()) { + builder.setDatatype(from.getDatatype().getName()); + } + if (from.hasUnit()) { + builder.setUnit(getStringUnit(from)); + } + if (from.hasProperties()) { + builder.addAllProperties(convert(from.getProperties())); + } + if (from.hasParents()) { + builder.addAllParents(convert(from.getParents())); + } + + return builder.build(); + } + + public Version convert(final org.caosdb.server.entity.Version from) { + final org.caosdb.api.entity.v1alpha1.Version.Builder builder = Version.newBuilder(); + + builder.setId(from.getId()); + return builder.build(); + } + + public Parent convert(final org.caosdb.server.entity.wrapper.Parent from) { + final org.caosdb.api.entity.v1alpha1.Parent.Builder builder = Parent.newBuilder(); + if (from.hasId()) { + builder.setId(from.getId().toString()); + } + if (from.hasName()) { + builder.setName(from.getName()); + } + if (from.hasDescription()) { + builder.setDescription(from.getDescription()); + } + + return builder.build(); + } + + public org.caosdb.api.entity.v1alpha1.Property convert(final Property from) { + final org.caosdb.api.entity.v1alpha1.Property.Builder builder = + org.caosdb.api.entity.v1alpha1.Property.newBuilder(); + + if (from.hasId()) { + builder.setId(from.getId().toString()); + } + if (from.hasName()) { + builder.setName(from.getName()); + } + if (from.hasDescription()) { + builder.setDescription(from.getDescription()); + } + if (from.hasDatatype()) { + builder.setDatatype(from.getDatatype().getName()); + } + if (from.hasUnit()) { + builder.setUnit(getStringUnit(from)); + } + if (from.hasValue()) { + builder.setValue(from.getValue().toString()); + } + builder.setImportance(from.getStatementStatus().toString()); + return builder.build(); + } + + public Iterable<? extends org.caosdb.api.entity.v1alpha1.Property> convert( + final PropertyContainer from) { + final Iterator<org.caosdb.server.entity.wrapper.Property> iterator = from.iterator(); + return () -> + new Iterator<>() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public org.caosdb.api.entity.v1alpha1.Property next() { + return convert(iterator.next()); + } + }; + } + + public Iterable<? extends Parent> convert(final ParentContainer from) { + final Iterator<org.caosdb.server.entity.wrapper.Parent> iterator = from.iterator(); + return () -> + new Iterator<>() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public Parent next() { + return convert(iterator.next()); + } + }; + } + + public Integer getId(final ByIdRequest request) { + return Integer.parseInt(request.getId()); + } + + public Entity retrieve(final RetrieveRequest request) throws Exception { + + final RetrieveContainer container = + new RetrieveContainer(SecurityUtils.getSubject(), getTimestamp(), getSRID(), null); + final RetrieveEntity entity = new RetrieveEntity(getId(request.getById())); + container.add(entity); + + final Retrieve transaction = new Retrieve(container); + transaction.execute(); + return convert(transaction.getContainer().get(0)); + } + + private String getSRID() { + return UUID.randomUUID().toString(); + } + + private Long getTimestamp() { + return System.currentTimeMillis(); + } + @Override public void retrieve( final RetrieveRequest request, final StreamObserver<RetrieveResponse> responseObserver) { - final Entity entity = Entity.newBuilder().setDescription("This is an entity").build(); - final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build(); + try { + final Entity entity = retrieve(request); + final RetrieveResponse response = RetrieveResponse.newBuilder().setEntity(entity).build(); + responseObserver.onNext(response); + responseObserver.onCompleted(); - responseObserver.onNext(response); - responseObserver.onCompleted(); + } catch (final Exception e) { + e.printStackTrace(); + responseObserver.onError(e); + } } } diff --git a/src/main/java/org/caosdb/server/transaction/Retrieve.java b/src/main/java/org/caosdb/server/transaction/Retrieve.java index 250df0423869ae97a766da2fc54131e04d5257ca..45647c1d554d38ab2b90e91f9516305265d370b8 100644 --- a/src/main/java/org/caosdb/server/transaction/Retrieve.java +++ b/src/main/java/org/caosdb/server/transaction/Retrieve.java @@ -54,14 +54,14 @@ public class Retrieve extends Transaction<RetrieveContainer> { { final ResolveNames r = new ResolveNames(); r.init(JobFailureSeverity.WARN, null, this); - ScheduledJob scheduledJob = getSchedule().add(r); + final ScheduledJob scheduledJob = getSchedule().add(r); getSchedule().runJob(scheduledJob); } { final RemoveDuplicates job = new RemoveDuplicates(); job.init(JobFailureSeverity.ERROR, null, this); - ScheduledJob scheduledJob = getSchedule().add(job); + final ScheduledJob scheduledJob = getSchedule().add(job); getSchedule().runJob(scheduledJob); } diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java index fe0b63f333e0151aed161ce3fa3914794e5f3d52..028afdd695652cbe912e1c48dd0ac2491ec59c3a 100644 --- a/src/main/java/org/caosdb/server/transaction/Transaction.java +++ b/src/main/java/org/caosdb/server/transaction/Transaction.java @@ -91,7 +91,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra * * <p>E.g. in {@link Retrieve} and {@link WriteTransaction}. */ - protected void makeSchedule() throws Exception { + protected void makeSchedule() { // load flag jobs final Job loadContainerFlags = Job.getJob("LoadContainerFlagJobs", JobFailureSeverity.ERROR, null, this);