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.MElementOutlineGenerator;
import org.jvnet.jaxb2_commons.xjc.generator.MEnumOutlineGenerator;
import org.jvnet.jaxb2_commons.xjc.generator.MModelOutlineGenerator;
import org.jvnet.jaxb2_commons.xjc.generator.MPackageOutlineGenerator;
import org.jvnet.jaxb2_commons.xjc.outline.MClassOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MElementOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MEnumOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MModelOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MPackageOutline;
import org.jvnet.jaxb2_commons.xjc.outline.concrete.CMModelOutline;
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.MElementInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MEnumLeafInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MModelInfo;
import org.jvnet.jaxb2_commons.xml.bind.model.MPackageInfo;
import com.sun.tools.xjc.model.Model;
import com.sun.tools.xjc.model.nav.NClass;
import com.sun.tools.xjc.model.nav.NType;
import com.sun.tools.xjc.outline.Outline;
public class CMModelOutlineGenerator implements MModelOutlineGenerator {
private final Outline outline;
private final Model model;
public CMModelOutlineGenerator(Outline outline, Model model) {
Validate.notNull(outline);
Validate.notNull(model);
this.outline = outline;
this.model = model;
}
public MModelOutline generate(MModelInfo<NType, NClass> modelInfo) {
final CMModelOutline modelOutline = new CMModelOutline(modelInfo,
outline.getCodeModel());
for (MClassInfo<NType, NClass> classInfo : modelInfo.getClassInfos()) {
generatePackageOutline(modelOutline, modelInfo,
classInfo.getPackageInfo());
}
for (MElementInfo<NType, NClass> elementInfo : modelInfo
.getElementInfos()) {
generatePackageOutline(modelOutline, modelInfo,
elementInfo.getPackageInfo());
}
for (MEnumLeafInfo<NType, NClass> enumLeafInfo : modelInfo
.getEnumLeafInfos()) {
generatePackageOutline(modelOutline, modelInfo,
enumLeafInfo.getPackageInfo());
}
for (MClassInfo<NType, NClass> classInfo : modelInfo.getClassInfos()) {
generateClassOutline(modelOutline, modelInfo, classInfo);
}
for (MElementInfo<NType, NClass> elementInfo : modelInfo
.getElementInfos()) {
generateElementOutline(modelOutline, modelInfo, elementInfo);
}
for (MEnumLeafInfo<NType, NClass> enumLeafInfo : modelInfo
.getEnumLeafInfos()) {
generateEnumOutline(modelOutline, modelInfo, enumLeafInfo);
}
// TODO Auto-generated method stub
return modelOutline;
}
private void generatePackageOutline(CMModelOutline modelOutline,
MModelInfo<NType, NClass> modelInfo, MPackageInfo packageInfo) {
if (modelOutline.getPackageOutline(packageInfo) == null &&
packageInfo.getOrigin() instanceof PackageOutlineGeneratorFactory) {
final MPackageOutlineGenerator generator = ((PackageOutlineGeneratorFactory) packageInfo
.getOrigin()).createGenerator(outline);
final MPackageOutline packageOutline = generator.generate(
modelOutline, modelInfo, packageInfo);
modelOutline.addPackageOutline(packageOutline);
}
}
private void generateClassOutline(final CMModelOutline modelOutline,
final MModelInfo<NType, NClass> modelInfo,
MClassInfo<NType, NClass> classInfo) {
if (classInfo.getBaseTypeInfo() != null) {
classInfo.getBaseTypeInfo().acceptClassTypeInfoVisitor(
new MClassTypeInfoVisitor<NType, NClass, Void>() {
@Override
public Void visitClassInfo(
MClassInfo<NType, NClass> info) {
generateClassOutline(modelOutline, modelInfo, info);
return null;
}
@Override
public Void visitClassRef(MClassRef<NType, NClass> info) {
return null;
}
});
}
if (classInfo.getOrigin() instanceof ClassOutlineGeneratorFactory) {
final MClassOutlineGenerator generator = ((ClassOutlineGeneratorFactory) classInfo
.getOrigin()).createGenerator(this.outline);
final MClassOutline classOutline = generator.generate(
modelOutline.getPackageOutline(classInfo.getPackageInfo()),
modelInfo, classInfo);
if (classOutline != null) {
modelOutline.addClassOutline(classOutline);
}
}
}
private void generateElementOutline(CMModelOutline modelOutline,
MModelInfo<NType, NClass> modelInfo,
MElementInfo<NType, NClass> elementInfo)
{
if (elementInfo.getOrigin() instanceof ElementOutlineGeneratorFactory) {
final MElementOutlineGenerator generator = ((ElementOutlineGeneratorFactory) elementInfo
.getOrigin()).createGenerator(outline);
final MElementOutline elementOutline = generator
.generate(modelOutline.getPackageOutline(elementInfo
.getPackageInfo()), modelInfo, elementInfo);
if (elementOutline != null) {
modelOutline.addElementOutline(elementOutline);
}
}
}
private void generateEnumOutline(CMModelOutline modelOutline,
MModelInfo<NType, NClass> modelInfo,
MEnumLeafInfo<NType, NClass> enumLeafInfo)
{
if (enumLeafInfo.getOrigin() instanceof EnumOutlineGeneratorFactory) {
final MEnumOutlineGenerator generator = ((EnumOutlineGeneratorFactory) enumLeafInfo
.getOrigin()).createGenerator(outline);
final MEnumOutline enumOutline = generator.generate(modelOutline
.getPackageOutline(enumLeafInfo.getPackageInfo()),
modelInfo, enumLeafInfo);
if (enumOutline != null) {
modelOutline.addEnumOutline(enumOutline);
}
}
}
}