package org.jvnet.jaxb2_commons.plugin.wildcard; import java.util.Arrays; import java.util.Collection; import javax.xml.namespace.QName; import org.jvnet.jaxb2_commons.plugin.AbstractParameterizablePlugin; import org.jvnet.jaxb2_commons.util.CustomizationUtils; import org.xml.sax.ErrorHandler; import com.sun.tools.xjc.model.CClassInfo; import com.sun.tools.xjc.model.CPropertyInfo; import com.sun.tools.xjc.model.CReferencePropertyInfo; import com.sun.tools.xjc.model.Model; import com.sun.xml.bind.v2.model.core.WildcardMode; public class WildcardPlugin extends AbstractParameterizablePlugin { @Override public String getOptionName() { return "Xwildcard"; } @Override public String getUsage() { return "Allows specifying the wildcard mode in wildcard properties."; } @Override public void postProcessModel(Model model, ErrorHandler errorHandler) { final boolean laxModel = CustomizationUtils.containsCustomization( model, Customizations.LAX_ELEMENT_NAME); final boolean skipModel = CustomizationUtils.containsCustomization( model, Customizations.SKIP_ELEMENT_NAME); final boolean strictModel = CustomizationUtils.containsCustomization( model, Customizations.STRICT_ELEMENT_NAME); for (CClassInfo classInfo : model.beans().values()) { final boolean laxClassInfo = CustomizationUtils .containsCustomization(classInfo, Customizations.LAX_ELEMENT_NAME); final boolean skipClassInfo = CustomizationUtils .containsCustomization(classInfo, Customizations.SKIP_ELEMENT_NAME); final boolean strictClassInfo = CustomizationUtils .containsCustomization(classInfo, Customizations.STRICT_ELEMENT_NAME); for (CPropertyInfo propertyInfo : classInfo.getProperties()) { if (propertyInfo instanceof CReferencePropertyInfo) { final CReferencePropertyInfo referencePropertyInfo = (CReferencePropertyInfo) propertyInfo; final boolean laxPropertyInfo = CustomizationUtils .containsCustomization(referencePropertyInfo, Customizations.LAX_ELEMENT_NAME); final boolean skipPropertyInfo = CustomizationUtils .containsCustomization(referencePropertyInfo, Customizations.SKIP_ELEMENT_NAME); final boolean strictPropertyInfo = CustomizationUtils .containsCustomization(referencePropertyInfo, Customizations.STRICT_ELEMENT_NAME); if (laxModel) { referencePropertyInfo.setWildcard(WildcardMode.LAX); } else if (skipModel) { referencePropertyInfo.setWildcard(WildcardMode.SKIP); } else if (strictModel) { referencePropertyInfo.setWildcard(WildcardMode.STRICT); } if (laxClassInfo) { referencePropertyInfo.setWildcard(WildcardMode.LAX); } else if (skipClassInfo) { referencePropertyInfo.setWildcard(WildcardMode.SKIP); } else if (strictClassInfo) { referencePropertyInfo.setWildcard(WildcardMode.STRICT); } if (laxPropertyInfo) { referencePropertyInfo.setWildcard(WildcardMode.LAX); } else if (skipPropertyInfo) { referencePropertyInfo.setWildcard(WildcardMode.SKIP); } else if (strictPropertyInfo) { referencePropertyInfo.setWildcard(WildcardMode.STRICT); } } } } } @Override public Collection<QName> getCustomizationElementNames() { return Arrays .asList(org.jvnet.jaxb2_commons.plugin.wildcard.Customizations.LAX_ELEMENT_NAME, org.jvnet.jaxb2_commons.plugin.wildcard.Customizations.SKIP_ELEMENT_NAME, org.jvnet.jaxb2_commons.plugin.wildcard.Customizations.STRICT_ELEMENT_NAME); } }