package org.jvnet.jaxb2_commons.xjc.generator.concrete;
import org.apache.commons.lang3.Validate;
import org.jvnet.jaxb2_commons.xjc.generator.MClassOutlineGenerator;
import org.jvnet.jaxb2_commons.xjc.generator.MPropertyOutlineGenerator;
import org.jvnet.jaxb2_commons.xjc.outline.MClassOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MPackageOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MPropertyOutline;
import org.jvnet.jaxb2_commons.xjc.outline.concrete.CMClassOutline;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassRef;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassTypeInfoVisitor;
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MPropertyInfo;
import com.sun.tools.xjc.model.CClassInfo;
import com.sun.tools.xjc.model.nav.NClass;
import com.sun.tools.xjc.model.nav.NType;
import com.sun.tools.xjc.outline.ClassOutline;
import com.sun.tools.xjc.outline.Outline;
public class CMClassOutlineGenerator implements MClassOutlineGenerator {
private final Outline outline;
private final CClassInfo classInfo;
public CMClassOutlineGenerator(Outline outline, CClassInfo classInfo) {
Validate.notNull(outline);
Validate.notNull(classInfo);
this.outline = outline;
this.classInfo = classInfo;
}
public MClassOutline generate(final MPackageOutline parent,
MModelInfo<NType, NClass> modelInfo,
MClassInfo<NType, NClass> classInfo) {
ClassOutline co = outline.getClazz(this.classInfo);
final MClassOutline superClassOutline;
if (classInfo.getBaseTypeInfo() != null) {
superClassOutline = classInfo
.getBaseTypeInfo()
.acceptClassTypeInfoVisitor(
new MClassTypeInfoVisitor<NType, NClass, MClassOutline>() {
@Override
public MClassOutline visitClassInfo(
MClassInfo<NType, NClass> info) {
return parent.getParent().getClassOutline(
info);
}
@Override
public MClassOutline visitClassRef(
MClassRef<NType, NClass> info) {
return null;
}
});
} else {
superClassOutline = null;
}
final CMClassOutline classOutline = new CMClassOutline(
parent.getParent(), parent, classInfo, superClassOutline,
co.ref, co.implClass, co.implRef);
for (MPropertyInfo<NType, NClass> propertyInfo : classInfo
.getProperties()) {
if (propertyInfo.getOrigin() instanceof PropertyOutlineGeneratorFactory) {
final MPropertyOutlineGenerator generator = ((PropertyOutlineGeneratorFactory) propertyInfo
.getOrigin()).createGenerator(outline);
final MPropertyOutline propertyOutline = generator.generate(
classOutline, modelInfo, propertyInfo);
if (propertyOutline != null) {
classOutline.addDeclaredPropertyOutline(propertyOutline);
}
}
}
return classOutline;
}
}