package pl.net.bluesoft.rnd.processtool.hibernate.transform;
import org.apache.commons.beanutils.expression.DefaultResolver;
import org.apache.commons.beanutils.expression.Resolver;
import org.hibernate.property.Getter;
import org.hibernate.property.Setter;
import java.util.List;
/**
* @author: amichalak@bluesoft.net.pl
*/
public abstract class AbstractNestedStub {
protected static final Resolver resolver = new DefaultResolver();
protected final NestedPropertyAccessor parent;
protected final String nestedPropertyName;
protected AbstractNestedStub(NestedPropertyAccessor parent, String nestedPropertyName) {
this.parent = parent;
this.nestedPropertyName = nestedPropertyName;
}
protected Setter addSetter(List<Setter> setterChain, Getter prevGetter, String nextPart) {
Class nextClass = prevGetter != null ? prevGetter.getReturnType() : parent.getBaseClass();
Setter nextSetter = parent.getPropertySetter(nextClass, nextPart);
setterChain.add(nextSetter);
return nextSetter;
}
protected Getter addGetter(List<Getter> getterChain, Getter prevGetter, String nextPart) {
Class nextClass = prevGetter != null ? prevGetter.getReturnType() : parent.getBaseClass();
Getter nextGetter = parent.getPropertyGetter(nextClass, nextPart);
getterChain.add(nextGetter);
return nextGetter;
}
protected String getPropertyPath(int index) {
int occurrences = 0;
int end = 0;
for (; end < nestedPropertyName.length() && occurrences != index; ++end) {
char c = nestedPropertyName.charAt(end);
if (c == '.') {
++occurrences;
}
}
return nestedPropertyName.substring(0, end == 0 ? nestedPropertyName.length() : end);
}
}