package pl.net.bluesoft.rnd.processtool.hibernate.transform;
import org.hibernate.HibernateException;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.property.Getter;
import java.lang.reflect.Member;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author: amichalak@bluesoft.net.pl
*/
public class NestedGetter extends AbstractNestedStub implements Getter {
private final transient Method method;
private Class<?> clazz;
private List<Getter> getterChain = new ArrayList<Getter>();
public NestedGetter(NestedPropertyAccessor parent, String nestedPropertyName) {
super(parent, nestedPropertyName);
Getter prevGetter = null;
String propertyName = nestedPropertyName;
do {
String nextPart = resolver.next(propertyName);
prevGetter = addGetter(getterChain, prevGetter, nextPart);
propertyName = resolver.remove(propertyName);
}
while (resolver.hasNested(propertyName));
this.method = prevGetter.getMethod();
this.clazz = method.getDeclaringClass();
}
@Override
public Object get(Object owner) throws HibernateException {
Object result = null;
Object base = owner;
for (Getter getter : getterChain) {
result = getter.get(base);
if (result == null) {
break;
}
base = result;
}
return result;
}
@Override
public Object getForInsert(Object owner, Map mergeMap, SessionImplementor session) throws HibernateException {
return get(owner);
}
@Override
public Member getMember() {
return method;
}
@Override
public Class getReturnType() {
return method.getReturnType();
}
@Override
public String getMethodName() {
return method.getName();
}
@Override
public Method getMethod() {
return method;
}
@Override
public String toString() {
return "NestedGetter{" +
"nestedPropertyName='" + nestedPropertyName + '\'' +
", clazz=" + clazz.getName() +
", method=" + method.getName() +
'}';
}
}