package org.jvnet.jaxb2_commons.plugin.enumvalue; import java.util.Arrays; import java.util.Collection; import javax.xml.namespace.QName; import org.jvnet.jaxb2_commons.lang.EnumValue; import org.jvnet.jaxb2_commons.plugin.AbstractParameterizablePlugin; import org.jvnet.jaxb2_commons.plugin.Customizations; import org.jvnet.jaxb2_commons.plugin.CustomizedIgnoring; import org.jvnet.jaxb2_commons.plugin.Ignoring; import org.jvnet.jaxb2_commons.util.ClassUtils; import org.xml.sax.ErrorHandler; import com.sun.codemodel.JClass; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JExpr; import com.sun.codemodel.JMethod; import com.sun.codemodel.JMod; import com.sun.tools.xjc.Options; import com.sun.tools.xjc.model.CEnumLeafInfo; import com.sun.tools.xjc.outline.Aspect; import com.sun.tools.xjc.outline.EnumOutline; import com.sun.tools.xjc.outline.Outline; public class EnumValuePlugin extends AbstractParameterizablePlugin { @Override public String getOptionName() { return "XenumValue"; } @Override public String getUsage() { return "Forces generated @XmlEnums implement the org.jvnet.jaxb2_commons.lang.EnumValue<T> interface."; } private Ignoring ignoring = new CustomizedIgnoring( org.jvnet.jaxb2_commons.plugin.equals.Customizations.IGNORED_ELEMENT_NAME, Customizations.IGNORED_ELEMENT_NAME, Customizations.GENERATED_ELEMENT_NAME); public Ignoring getIgnoring() { return ignoring; } public void setIgnoring(Ignoring ignoring) { this.ignoring = ignoring; } @Override public Collection<QName> getCustomizationElementNames() { return Arrays .asList(org.jvnet.jaxb2_commons.plugin.equals.Customizations.IGNORED_ELEMENT_NAME, Customizations.IGNORED_ELEMENT_NAME, Customizations.GENERATED_ELEMENT_NAME); } @Override public boolean run(Outline outline, Options opt, ErrorHandler errorHandler) { for (final EnumOutline enumOutline : outline.getEnums()) { if (!getIgnoring().isIgnored(enumOutline)) { processEnumOutline(enumOutline); } } return true; } protected void processEnumOutline(EnumOutline enumOutline) { CEnumLeafInfo enumLeafInfo = enumOutline.target; JClass enumType = enumLeafInfo.base.toType(enumOutline.parent(), Aspect.EXPOSED).boxify(); final JDefinedClass theClass = enumOutline.clazz; ClassUtils._implements(theClass, theClass.owner().ref(EnumValue.class) .narrow(enumType)); final JMethod enumValue$enumValue = theClass.method(JMod.PUBLIC, enumType, "enumValue"); enumValue$enumValue.body()._return(JExpr._this().invoke("value")); } }