package org.jvnet.jaxb2_commons.xml.bind.model.concrete; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.xml.namespace.QName; import org.jvnet.jaxb2_commons.lang.Validate; import org.jvnet.jaxb2_commons.xml.bind.model.MContainer; import org.jvnet.jaxb2_commons.xml.bind.model.MCustomizable; import org.jvnet.jaxb2_commons.xml.bind.model.MCustomizations; import org.jvnet.jaxb2_commons.xml.bind.model.MElementInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MEnumConstantInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfo; import org.jvnet.jaxb2_commons.xml.bind.model.MTypeInfoVisitor; import org.jvnet.jaxb2_commons.xml.bind.model.concrete.origin.EnumConstantOrigin; import org.jvnet.jaxb2_commons.xml.bind.model.concrete.origin.EnumLeafInfoOrigin; import org.jvnet.jaxb2_commons.xml.bind.model.origin.MEnumLeafInfoOrigin; import com.sun.xml.bind.v2.model.core.EnumConstant; import com.sun.xml.bind.v2.model.core.EnumLeafInfo; public class CMEnumLeafInfo<T, C extends T> implements MEnumLeafInfo<T, C>, MCustomizable { private final MEnumLeafInfoOrigin origin; private final CMCustomizations customizations = new CMCustomizations(); private final C targetClass; private final MPackageInfo _package; private final MContainer container; private final String name; private final String localName; private final MTypeInfo<T, C> baseTypeInfo; private final List<MEnumConstantInfo<T, C>> constants = new ArrayList<MEnumConstantInfo<T, C>>(); private final List<MEnumConstantInfo<T, C>> _constants = Collections .unmodifiableList(constants); private final QName elementName; public CMEnumLeafInfo(MEnumLeafInfoOrigin origin, C targetClass, MPackageInfo _package, MContainer container, String localName, MTypeInfo<T, C> baseTypeInfo, QName elementName) { Validate.notNull(origin); Validate.notNull(targetClass); Validate.notNull(_package); Validate.notNull(localName); Validate.notNull(baseTypeInfo); this.origin = origin; this.targetClass = targetClass; this._package = _package; this.container = container; this.localName = localName; this.name = _package.getPackagedName(localName); this.baseTypeInfo = baseTypeInfo; // May be null this.elementName = elementName; } public MCustomizations getCustomizations() { return customizations; } public MEnumLeafInfoOrigin getOrigin() { return origin; } public C getTargetClass() { return targetClass; } public T getTargetType() { return targetClass; } public MElementInfo<T, C> createElementInfo(MTypeInfo<T, C> scope, QName substitutionHead) { return new CMElementInfo<T, C>(getOrigin().createElementInfoOrigin(), getPackageInfo(), getContainer(), getLocalName(), getElementName(), scope, this, substitutionHead); } public String getName() { return name; } public String getLocalName() { return localName; } public MPackageInfo getPackageInfo() { return _package; } public MContainer getContainer() { return container; } public String getContainerLocalName(String delimiter) { final String localName = getLocalName(); if (localName == null) { return null; } else { final MContainer container = getContainer(); if (container == null) { return localName; } else { final String containerLocalName = container .getContainerLocalName(delimiter); return containerLocalName == null ? localName : containerLocalName + delimiter + localName; } } } public MTypeInfo<T, C> getBaseTypeInfo() { return baseTypeInfo; } public List<MEnumConstantInfo<T, C>> getConstants() { return _constants; } public void addEnumConstantInfo(MEnumConstantInfo<T, C> enumConstantInfo) { Validate.notNull(enumConstantInfo); this.constants.add(enumConstantInfo); } @SuppressWarnings("unchecked") public void removeEnumConstantInfo(MEnumConstantInfo<T, C> enumConstantInfo) { Validate.notNull(enumConstantInfo); if (getOrigin() instanceof EnumLeafInfoOrigin && enumConstantInfo.getOrigin() instanceof EnumConstantOrigin) { // TODO EnumLeafInfo<T, C> eli = (EnumLeafInfo<T, C>) ((EnumLeafInfoOrigin) getOrigin()) .getSource(); EnumConstant<T, C> ec = (EnumConstant<T, C>) ((EnumConstantOrigin) enumConstantInfo .getOrigin()).getSource(); Iterator iterator = eli.getConstants().iterator(); while (iterator.hasNext()) { if (iterator.next() == ec) { iterator.remove(); } } } // TODO Auto-generated method stub } public QName getElementName() { return elementName; } @Override public String toString() { return MessageFormat.format("EnumInfo [{0}]", getBaseTypeInfo()); } public <V> V acceptTypeInfoVisitor(MTypeInfoVisitor<T, C, V> visitor) { return visitor.visitEnumLeafInfo(this); } }