use of net.minecraft.server.v1_16_R3.Entity in project entity-service by hypertrace.
the class EntityDataServiceImpl method upsert.
/**
* Creates or Updates an Entity <br>
* If the entityId is provided it is used as is to update the Entity. If the identifying
* attributes are provided, then the entityId is generated from them If none of the above are
* provided, we error out. The ID of the entity is generated from its identifying attributes.
*
* @param request Entity to be created
* @param responseObserver Observer to be notified on about the Entity creation request
*/
@Override
public void upsert(Entity request, StreamObserver<Entity> responseObserver) {
String tenantId = RequestContext.CURRENT.get().getTenantId().orElse(null);
if (tenantId == null) {
responseObserver.onError(new ServiceException("Tenant id is missing in the request."));
return;
}
try {
Entity normalizedEntity = this.entityNormalizer.normalize(tenantId, request);
java.util.Collection<Entity> existingEntityCollection = getExistingEntities(List.of(normalizedEntity));
upsertEntity(tenantId, normalizedEntity.getEntityId(), normalizedEntity.getEntityType(), normalizedEntity, Entity.newBuilder(), entitiesCollection, responseObserver);
entityChangeEventGenerator.sendChangeNotification(RequestContext.CURRENT.get(), existingEntityCollection, List.of(normalizedEntity));
} catch (Throwable throwable) {
LOG.warn("Failed to upsert: {}", request, throwable);
responseObserver.onError(throwable);
}
}
use of net.minecraft.server.v1_16_R3.Entity in project entity-service by hypertrace.
the class EntityDataServiceImpl method upsertEntities.
@Override
public void upsertEntities(Entities request, StreamObserver<Empty> responseObserver) {
String tenantId = RequestContext.CURRENT.get().getTenantId().orElse(null);
if (tenantId == null) {
responseObserver.onError(new ServiceException("Tenant id is missing in the request."));
return;
}
try {
Map<Key, Entity> entities = request.getEntityList().stream().map(entity -> this.entityNormalizer.normalize(tenantId, entity)).collect(Collectors.toUnmodifiableMap(entity -> this.entityNormalizer.getEntityDocKey(tenantId, entity), Function.identity()));
java.util.Collection<Entity> existingEntities = getExistingEntities(entities.values());
upsertEntities(entities, entitiesCollection, responseObserver);
entityChangeEventGenerator.sendChangeNotification(RequestContext.CURRENT.get(), existingEntities, entities.values());
} catch (Throwable throwable) {
LOG.warn("Failed to upsert: {}", request, throwable);
responseObserver.onError(throwable);
}
}
use of net.minecraft.server.v1_16_R3.Entity in project entity-service by hypertrace.
the class EntityDataServiceImpl method upsertEnrichedEntities.
@Override
public void upsertEnrichedEntities(EnrichedEntities request, StreamObserver<Empty> responseObserver) {
String tenantId = RequestContext.CURRENT.get().getTenantId().orElse(null);
if (isNull(tenantId)) {
responseObserver.onError(new ServiceException("Tenant id is missing in the request."));
return;
}
for (EnrichedEntity entity : request.getEntitiesList()) {
if (StringUtils.isEmpty(entity.getEntityType())) {
LOG.info("{}. Invalid upsertEnrichedEntities request:{}", entity, ErrorMessages.ENTITY_TYPE_EMPTY);
responseObserver.onError(new RuntimeException(ErrorMessages.ENTITY_TYPE_EMPTY));
return;
}
if (StringUtils.isEmpty(entity.getEntityId())) {
LOG.info("{}. Invalid upsertEnrichedEntities request:{}", entity, ErrorMessages.ENTITY_ID_EMPTY);
responseObserver.onError(new RuntimeException(ErrorMessages.ENTITY_ID_EMPTY));
return;
}
}
Map<Key, EnrichedEntity> entities = request.getEntitiesList().stream().collect(Collectors.toUnmodifiableMap(entity -> this.entityNormalizer.getEntityDocKey(tenantId, entity.getEntityType(), entity.getEntityId()), Function.identity()));
upsertEntities(entities, enrichedEntitiesCollection, responseObserver);
}
use of net.minecraft.server.v1_16_R3.Entity in project entity-service by hypertrace.
the class EntityChangeEventGeneratorImpl method sendChangeNotification.
@Override
public void sendChangeNotification(RequestContext requestContext, Collection<Entity> existingEntities, Collection<Entity> updatedEntities) {
Map<String, Entity> existingEntityMap = existingEntities.stream().collect(Collectors.toMap(Entity::getEntityId, identity()));
Map<String, Entity> upsertedEntityMap = updatedEntities.stream().collect(Collectors.toMap(Entity::getEntityId, identity()));
MapDifference<String, Entity> mapDifference = Maps.difference(existingEntityMap, upsertedEntityMap);
mapDifference.entriesOnlyOnRight().entrySet().forEach(entry -> {
sendCreateNotification(requestContext, entry.getValue());
});
mapDifference.entriesDiffering().entrySet().forEach(entry -> {
MapDifference.ValueDifference<Entity> valueDifference = entry.getValue();
Entity prevEntity = valueDifference.leftValue();
Entity currEntity = valueDifference.rightValue();
sendUpdateNotification(requestContext, prevEntity, currEntity);
});
mapDifference.entriesOnlyOnLeft().entrySet().forEach(entry -> {
sendDeleteNotification(requestContext, entry.getValue());
});
}
use of net.minecraft.server.v1_16_R3.Entity in project entity-service by hypertrace.
the class EntityChangeEventGeneratorImplTest method sendCreateNotification.
@Test
void sendCreateNotification() {
List<Entity> entities = createEntities(2);
changeEventGenerator.sendCreateNotification(requestContext, entities);
InOrder inOrderVerifier = inOrder(eventProducer);
inOrderVerifier.verify(eventProducer).send(KeyUtil.getKey(entities.get(0)), EntityChangeEventValue.newBuilder().setCreateEvent(EntityCreateEvent.newBuilder().setCreatedEntity(entities.get(0)).build()).setEventTimeMillis(CURRENT_TIME_MILLIS).build());
inOrderVerifier.verify(eventProducer).send(KeyUtil.getKey(entities.get(1)), EntityChangeEventValue.newBuilder().setCreateEvent(EntityCreateEvent.newBuilder().setCreatedEntity(entities.get(1)).build()).setEventTimeMillis(CURRENT_TIME_MILLIS).build());
}
Aggregations