package org.jvnet.jaxb2_commons.xjc.outline.artificial; import org.jvnet.jaxb2_commons.xjc.outline.MClassOutline; import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo; import com.sun.codemodel.JBlock; import com.sun.codemodel.JExpression; import com.sun.codemodel.JFieldVar; import com.sun.codemodel.JMethod; import com.sun.codemodel.JMod; import com.sun.codemodel.JVar; import com.sun.tools.xjc.model.nav.NClass; import com.sun.tools.xjc.model.nav.NType; import com.sun.tools.xjc.outline.Outline; public abstract class AbstractSinglePropertyOutline extends AbstractPropertyOutline { protected final JFieldVar field; protected final JMethod getter; protected final JMethod setter; public AbstractSinglePropertyOutline(Outline outline, MClassOutline classOutline, MPropertyInfo<NType, NClass> target) { super(outline, classOutline, target); this.field = generateField(); this.getter = generateGetter(); this.setter = generateSetter(); } protected JFieldVar generateField() { final JFieldVar field = referenceClass.field(JMod.PROTECTED, type, propertyInfo.getPrivateName()); annotate(field); return field; } protected abstract JMethod generateGetter(); protected abstract JMethod generateSetter(); protected String getGetterMethodName() { return (type.boxify().getPrimitiveType() == codeModel.BOOLEAN ? "is" : "get") + propertyInfo.getPublicName(); } protected String getSetterMethodName() { return "set" + propertyInfo.getPublicName(); } protected abstract class PropertyAccessor extends AbstractPropertyOutline.PropertyAccessor { public PropertyAccessor(JExpression target) { super(target); } public void get(JBlock block, JVar variable) { block.assign(variable, target.invoke(AbstractSinglePropertyOutline.this.getter)); } public void set(JBlock block, String uniqueName, JExpression value) { block.invoke(target, AbstractSinglePropertyOutline.this.setter) .arg(value); } } }