@Override
public P loadSafe(final Value<FullEntity<?>> container, final LoadContext ctx, final Path path) throws SkipException {
final String containerDiscriminator = container.get().contains(DISCRIMINATOR_PROPERTY) ? container.get().getString(DISCRIMINATOR_PROPERTY) : null;
if (!Objects.equals(discriminator, containerDiscriminator)) {
final ClassTranslator<? extends P> translator = byDiscriminator.get(containerDiscriminator);
if (translator == null) {
throw new IllegalStateException("Datastore object has discriminator value '" + containerDiscriminator + "' but no relevant @Subclass is registered");
} else {
final StringValue discriminatorValue = StringValue.newBuilder(translator.getDiscriminator()).setExcludeFromIndexes(true).build();
final FullEntity<?> updatedEntity = FullEntity.newBuilder(container.get()).set(DISCRIMINATOR_PROPERTY, discriminatorValue).build();
return translator.load(EntityValue.of(updatedEntity), ctx, path);
}
} else {
if (log.isTraceEnabled())
log.trace(LogUtils.msg(path, "Instantiating a " + declaredClass.getName()));
final P into = forge.construct(declaredClass);
populator.load(container.get(), ctx, path, into);
return into;
}
}