package org.jvnet.jaxb2_commons.xjc.outline.artificial;
import org.apache.commons.lang3.Validate;
import org.jvnet.jaxb2_commons.xjc.outline.MClassOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MPropertyAccessor;
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
import com.sun.codemodel.JBlock;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JMod;
import com.sun.codemodel.JType;
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 ConstantPropertyOutline extends AbstractPropertyOutline {
protected final JExpression value;
protected final JFieldVar field;
public ConstantPropertyOutline(Outline outline, MClassOutline classOutline,
MPropertyInfo<NType, NClass> target, final JExpression value) {
super(outline, classOutline, target);
Validate.notNull(value);
this.value = value;
this.field = generateField();
}
protected JExpression createValue() {
return value;
}
protected JFieldVar generateField() {
// generate the constant
JExpression value = createValue();
JFieldVar field = referenceClass.field(JMod.PUBLIC | JMod.STATIC
| JMod.FINAL, type, propertyInfo.getPublicName(), value);
annotate(field);
return field;
}
public MPropertyAccessor createPropertyAccessor(JExpression target) {
return new PropertyAccessor(target);
}
public class PropertyAccessor extends
AbstractPropertyOutline.PropertyAccessor {
public PropertyAccessor(JExpression target) {
super(target);
}
@Override
public boolean isConstant() {
return true;
}
public void unset(JBlock body) {
}
public void set(JBlock block, String uniqueName, JExpression value) {
}
@Override
public boolean isVirtual() {
return false;
}
public JExpression isSet() {
return JExpr.TRUE;
}
public void get(JBlock block, JVar variable) {
block.assign(variable, ConstantPropertyOutline.this.referenceClass
.staticRef(ConstantPropertyOutline.this.field));
}
}
}