001: //$Id: AbstractComponentTuplizer.java 9210 2006-02-03 22:15:19Z steveebersole $
002: package org.hibernate.tuple.component;
003:
004: import java.lang.reflect.Method;
005: import java.util.Iterator;
006:
007: import org.hibernate.HibernateException;
008: import org.hibernate.tuple.Instantiator;
009: import org.hibernate.engine.SessionFactoryImplementor;
010: import org.hibernate.mapping.Component;
011: import org.hibernate.mapping.Property;
012: import org.hibernate.property.Getter;
013: import org.hibernate.property.Setter;
014:
015: /**
016: * Support for tuplizers relating to components.
017: *
018: * @author Gavin King
019: * @author Steve Ebersole
020: */
021: public abstract class AbstractComponentTuplizer implements
022: ComponentTuplizer {
023:
024: protected final Getter[] getters;
025: protected final Setter[] setters;
026: protected final int propertySpan;
027: protected final Instantiator instantiator;
028: protected final boolean hasCustomAccessors;
029:
030: protected abstract Instantiator buildInstantiator(
031: Component component);
032:
033: protected abstract Getter buildGetter(Component component,
034: Property prop);
035:
036: protected abstract Setter buildSetter(Component component,
037: Property prop);
038:
039: protected AbstractComponentTuplizer(Component component) {
040: propertySpan = component.getPropertySpan();
041: getters = new Getter[propertySpan];
042: setters = new Setter[propertySpan];
043:
044: Iterator iter = component.getPropertyIterator();
045: boolean foundCustomAccessor = false;
046: int i = 0;
047: while (iter.hasNext()) {
048: Property prop = (Property) iter.next();
049: getters[i] = buildGetter(component, prop);
050: setters[i] = buildSetter(component, prop);
051: if (!prop.isBasicPropertyAccessor()) {
052: foundCustomAccessor = true;
053: }
054: i++;
055: }
056: hasCustomAccessors = foundCustomAccessor;
057:
058: String[] getterNames = new String[propertySpan];
059: String[] setterNames = new String[propertySpan];
060: Class[] propTypes = new Class[propertySpan];
061: for (int j = 0; j < propertySpan; j++) {
062: getterNames[j] = getters[j].getMethodName();
063: setterNames[j] = setters[j].getMethodName();
064: propTypes[j] = getters[j].getReturnType();
065: }
066: instantiator = buildInstantiator(component);
067: }
068:
069: public Object getPropertyValue(Object component, int i)
070: throws HibernateException {
071: return getters[i].get(component);
072: }
073:
074: public Object[] getPropertyValues(Object component)
075: throws HibernateException {
076: Object[] values = new Object[propertySpan];
077: for (int i = 0; i < propertySpan; i++) {
078: values[i] = getPropertyValue(component, i);
079: }
080: return values;
081: }
082:
083: public boolean isInstance(Object object) {
084: return instantiator.isInstance(object);
085: }
086:
087: public void setPropertyValues(Object component, Object[] values)
088: throws HibernateException {
089: for (int i = 0; i < propertySpan; i++) {
090: setters[i].set(component, values[i], null);
091: }
092: }
093:
094: /**
095: * This method does not populate the component parent
096: */
097: public Object instantiate() throws HibernateException {
098: return instantiator.instantiate();
099: }
100:
101: public Object getParent(Object component) {
102: return null;
103: }
104:
105: public boolean hasParentProperty() {
106: return false;
107: }
108:
109: public boolean isMethodOf(Method method) {
110: return false;
111: }
112:
113: public void setParent(Object component, Object parent,
114: SessionFactoryImplementor factory) {
115: throw new UnsupportedOperationException();
116: }
117:
118: }
|