package org.jvnet.jaxb2_commons.xjc.outline.concrete;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.Validate;
import org.jvnet.jaxb2_commons.xjc.outline.MClassOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MModelOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MPackageOutline;
import org.jvnet.jaxb2_commons.xjc.outline.MPropertyOutline;
import org.jvnet.jaxb2_commons.xml.bind.model.MClassInfo;
import com.sun.codemodel.JClass;
import com.sun.codemodel.JDefinedClass;
import com.sun.tools.xjc.model.nav.NClass;
import com.sun.tools.xjc.model.nav.NType;
public class CMClassOutline implements MClassOutline {
private final MModelOutline parent;
private final MPackageOutline packageOutline;
private final MClassInfo<NType, NClass> target;
private final MClassOutline superClassOutline;
private final JDefinedClass referenceCode;
private final JDefinedClass implementationCode;
private final JClass implementationReferenceCode;
private final List<MPropertyOutline> declaredPropertyOutlines = new ArrayList<MPropertyOutline>();
private final List<MPropertyOutline> _delcaredPropertyOutlines = Collections
.unmodifiableList(declaredPropertyOutlines);
public CMClassOutline(MModelOutline parent, MPackageOutline packageOutline,
MClassInfo<NType, NClass> target, MClassOutline superClassOutline,
JDefinedClass referenceCode, JDefinedClass implementationCode,
JClass implementationReferenceCode) {
Validate.notNull(parent);
Validate.notNull(packageOutline);
Validate.notNull(target);
Validate.notNull(referenceCode);
Validate.notNull(implementationCode);
Validate.notNull(implementationReferenceCode);
this.parent = parent;
this.packageOutline = packageOutline;
this.target = target;
this.superClassOutline = superClassOutline;
this.referenceCode = referenceCode;
this.implementationCode = implementationCode;
this.implementationReferenceCode = implementationReferenceCode;
}
public MModelOutline getParent() {
return parent;
}
public MPackageOutline getPackageOutline() {
return packageOutline;
}
public MClassInfo<NType, NClass> getTarget() {
return target;
}
public MClassOutline getSuperClassOutline() {
return superClassOutline;
}
public JDefinedClass getReferenceCode() {
return referenceCode;
}
public JDefinedClass getImplementationCode() {
return implementationCode;
}
public JClass getImplementationReferenceCode() {
return implementationReferenceCode;
}
public List<MPropertyOutline> getPropertyOutlines() {
if (getSuperClassOutline() == null) {
return getDeclaredPropertyOutlines();
} else {
final List<MPropertyOutline> propertyOutlines = new ArrayList<MPropertyOutline>();
propertyOutlines.addAll(getSuperClassOutline()
.getPropertyOutlines());
propertyOutlines.addAll(getDeclaredPropertyOutlines());
return Collections.unmodifiableList(propertyOutlines);
}
}
public List<MPropertyOutline> getDeclaredPropertyOutlines() {
return _delcaredPropertyOutlines;
}
public void addDeclaredPropertyOutline(MPropertyOutline propertyOutline) {
this.declaredPropertyOutlines.add(propertyOutline);
}
}