package org.jvnet.jaxb2_commons.xml.bind.model.concrete;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
import org.jvnet.jaxb2_commons.lang.Validate;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassTypeInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassTypeInfoVisitor;
import org.jvnet.jaxb2_commons.xml.bind.model.MContainer;
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.MPackageInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
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.ClassInfoOrigin;
import org.jvnet.jaxb2_commons.xml.bind.model.concrete.origin.PropertyInfoOrigin;
import org.jvnet.jaxb2_commons.xml.bind.model.origin.MClassInfoOrigin;
import com.sun.xml.bind.v2.model.core.ClassInfo;
import com.sun.xml.bind.v2.model.core.PropertyInfo;
public class CMClassInfo<T, C extends T> implements MClassInfo<T, C> {
private final MClassInfoOrigin origin;
private CMCustomizations customizations = new CMCustomizations();
private final C targetClass;
private final MPackageInfo _package;
private final String name;
private final String localName;
private final MContainer container;
private final MClassTypeInfo<T, C> baseTypeInfo;
private final QName elementName;
private List<MPropertyInfo<T, C>> properties = new ArrayList<MPropertyInfo<T, C>>();
private List<MPropertyInfo<T, C>> unmodifiableProperties = Collections
.unmodifiableList(properties);
public CMClassInfo(MClassInfoOrigin origin, C targetClass,
MPackageInfo _package, MContainer container, String localName,
MClassTypeInfo<T, C> baseTypeInfo, QName elementName) {
super();
Validate.notNull(origin);
Validate.notNull(targetClass);
Validate.notNull(_package);
Validate.notNull(localName);
this.origin = origin;
this.targetClass = targetClass;
this.name = _package.getPackagedName(localName);
this.localName = localName;
this._package = _package;
this.container = container;
this.baseTypeInfo = baseTypeInfo;
this.elementName = elementName;
}
public MCustomizations getCustomizations() {
return customizations;
}
public MClassInfoOrigin 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 MPackageInfo getPackageInfo() {
return _package;
}
public String getName() {
return name;
}
public String getLocalName() {
return localName;
}
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 MContainer getScope() {
return container;
}
public MClassTypeInfo<T, C> getBaseTypeInfo() {
return baseTypeInfo;
}
public List<MPropertyInfo<T, C>> getProperties() {
return unmodifiableProperties;
}
public QName getElementName() {
return elementName;
}
public void addProperty(MPropertyInfo<T, C> propertyInfo) {
Validate.notNull(propertyInfo);
this.properties.add(propertyInfo);
}
@SuppressWarnings("unchecked")
public void removeProperty(MPropertyInfo<T, C> propertyInfo) {
Validate.notNull(propertyInfo);
this.properties.remove(propertyInfo);
if (getOrigin() instanceof ClassInfoOrigin
&& propertyInfo.getOrigin() instanceof PropertyInfoOrigin) {
ClassInfo<T, C> ci = (ClassInfo<T, C>) ((ClassInfoOrigin) getOrigin())
.getSource();
PropertyInfo<T, C> pi = (PropertyInfo<T, C>) ((PropertyInfoOrigin) propertyInfo
.getOrigin()).getSource();
ci.getProperties().remove(pi);
}
}
public String toString() {
return "ClassInfo [" + getName() + "]";
}
public <V> V acceptTypeInfoVisitor(MTypeInfoVisitor<T, C, V> visitor) {
return visitor.visitClassInfo(this);
}
@Override
public <V> V acceptClassTypeInfoVisitor(
MClassTypeInfoVisitor<T, C, V> visitor) {
return visitor.visitClassInfo(this);
}
}