mirror of
https://github.com/datahub-project/datahub.git
synced 2025-09-03 06:13:14 +00:00
99 lines
3.4 KiB
Java
99 lines
3.4 KiB
Java
package com.linkedin.metadata.entity;
|
|
|
|
import com.datahub.util.RecordUtils;
|
|
import com.google.common.base.Preconditions;
|
|
import com.linkedin.common.Status;
|
|
import com.linkedin.common.urn.Urn;
|
|
import com.linkedin.data.schema.RecordDataSchema;
|
|
import com.linkedin.data.template.RecordTemplate;
|
|
import com.linkedin.entity.EnvelopedAspect;
|
|
import com.linkedin.metadata.models.AspectSpec;
|
|
import com.linkedin.metadata.models.EntitySpec;
|
|
import com.linkedin.metadata.models.registry.EntityRegistry;
|
|
import com.linkedin.metadata.utils.PegasusUtils;
|
|
import com.linkedin.mxe.SystemMetadata;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
import javax.annotation.Nonnull;
|
|
|
|
import static com.linkedin.metadata.entity.EntityService.DEFAULT_RUN_ID;
|
|
|
|
|
|
@Slf4j
|
|
public class EntityUtils {
|
|
|
|
private EntityUtils() {
|
|
}
|
|
|
|
@Nonnull
|
|
public static String toJsonAspect(@Nonnull final RecordTemplate aspectRecord) {
|
|
return RecordUtils.toJsonString(aspectRecord);
|
|
}
|
|
|
|
@Nonnull
|
|
public static RecordTemplate toAspectRecord(
|
|
@Nonnull final Urn entityUrn,
|
|
@Nonnull final String aspectName,
|
|
@Nonnull final String jsonAspect,
|
|
@Nonnull final EntityRegistry entityRegistry) {
|
|
return toAspectRecord(PegasusUtils.urnToEntityName(entityUrn), aspectName, jsonAspect, entityRegistry);
|
|
}
|
|
|
|
/**
|
|
* @param entityName
|
|
* @param aspectName
|
|
* @param jsonAspect
|
|
* @param entityRegistry
|
|
* @return a RecordTemplate which has been validated, validation errors are logged as warnings
|
|
*/
|
|
public static RecordTemplate toAspectRecord(
|
|
@Nonnull final String entityName,
|
|
@Nonnull final String aspectName,
|
|
@Nonnull final String jsonAspect,
|
|
@Nonnull final EntityRegistry entityRegistry) {
|
|
final EntitySpec entitySpec = entityRegistry.getEntitySpec(entityName);
|
|
final AspectSpec aspectSpec = entitySpec.getAspectSpec(aspectName);
|
|
//TODO: aspectSpec can be null here
|
|
Preconditions.checkState(aspectSpec != null, String.format("Aspect %s could not be found", aspectName));
|
|
final RecordDataSchema aspectSchema = aspectSpec.getPegasusSchema();
|
|
RecordTemplate aspectRecord = RecordUtils.toRecordTemplate(aspectSpec.getDataTemplateClass(), jsonAspect);
|
|
RecordTemplateValidator.validate(aspectRecord, validationFailure -> {
|
|
log.warn(String.format("Failed to validate record %s against its schema.", aspectRecord));
|
|
});
|
|
return aspectRecord;
|
|
}
|
|
|
|
public static SystemMetadata parseSystemMetadata(String jsonSystemMetadata) {
|
|
if (jsonSystemMetadata == null || jsonSystemMetadata.equals("")) {
|
|
SystemMetadata response = new SystemMetadata();
|
|
response.setRunId(DEFAULT_RUN_ID);
|
|
response.setLastObserved(0);
|
|
return response;
|
|
}
|
|
return RecordUtils.toRecordTemplate(SystemMetadata.class, jsonSystemMetadata);
|
|
}
|
|
|
|
/**
|
|
* Check if entity is removed (removed=true in Status aspect) and exists
|
|
*/
|
|
public static boolean checkIfRemoved(EntityService entityService, Urn entityUrn) {
|
|
try {
|
|
|
|
if (!entityService.exists(entityUrn)) {
|
|
return false;
|
|
}
|
|
|
|
EnvelopedAspect statusAspect =
|
|
entityService.getLatestEnvelopedAspect(entityUrn.getEntityType(), entityUrn, "status");
|
|
if (statusAspect == null) {
|
|
return false;
|
|
}
|
|
Status status = new Status(statusAspect.getValue().data());
|
|
return status.isRemoved();
|
|
} catch (Exception e) {
|
|
log.error("Error while checking if {} is removed", entityUrn, e);
|
|
return false;
|
|
}
|
|
}
|
|
}
|