package fr.openwide.core.jpa.more.business.difference.util;
import org.bindgen.BindingRoot;
import com.google.common.collect.ImmutableList;
import fr.openwide.core.jpa.util.HibernateUtils;
public class TypeSafeBindingProxyInitializer<R> implements IProxyInitializer<R> {
private final Iterable<? extends BindingRoot<? extends R, ?>> bindings;
@SafeVarargs
public TypeSafeBindingProxyInitializer(BindingRoot<? extends R, ?> ... functions) {
super();
this.bindings = ImmutableList.copyOf(functions);
}
public TypeSafeBindingProxyInitializer(Iterable<? extends BindingRoot<? extends R, ?>> functions) {
super();
this.bindings = ImmutableList.copyOf(functions);
}
@Override
public void initialize(R value) {
R unwrapped = HibernateUtils.unwrap(value);
for (BindingRoot<? extends R, ?> binding : bindings) {
HibernateUtils.initialize(getTypeSafe(binding, unwrapped));
}
}
@SuppressWarnings("unchecked")
private <R2 extends R, T> T getTypeSafe(BindingRoot<R2, T> binding, R unwrapped) {
if (unwrapped != null && binding.getRootBinding().getType().isAssignableFrom(unwrapped.getClass())) {
return binding.getSafelyWithRoot((R2)unwrapped);
} else {
return null;
}
}
}