/** * */ package ecologylab.bigsemantics.metadata; import java.util.ArrayList; import ecologylab.bigsemantics.metametadata.MetaMetadata; import ecologylab.bigsemantics.metametadata.MmdGenericTypeVar; import ecologylab.serialization.ClassDescriptor; import ecologylab.serialization.annotations.simpl_inherit; /** * Special class descriptor for Metadata subclasses. * * @author andruid * */ @simpl_inherit public class MetadataClassDescriptor extends ClassDescriptor<MetadataFieldDescriptor> implements Cloneable { private MetaMetadata definingMmd; public MetadataClassDescriptor() { } /** * Called by reflection with a Metadata subclass. * * @param thatClass */ public MetadataClassDescriptor(Class thatClass) { super(thatClass); } public MetadataClassDescriptor( MetaMetadata definingMmd, String tagName, String comment, String describedClassPackageName, String describedClassSimpleName, ClassDescriptor superClass, ArrayList<String> interfaces) { super(tagName, comment, describedClassPackageName, describedClassSimpleName, superClass, interfaces); this.definingMmd = definingMmd; } public void addMetadataFieldDescriptor(MetadataFieldDescriptor fd) { this.addFieldDescriptor(fd); } /** * @return the definingMmd */ public MetaMetadata getDefiningMmd() { return definingMmd; } public void setDefiningMmd(MetaMetadata mmd) { this.definingMmd = mmd; } public void setDefiningMmdIfNotSet(MetaMetadata mmd) { if (this.definingMmd == null) { this.definingMmd = mmd; } } @Override public boolean isGenericClass() { for (MmdGenericTypeVar mmdGenericTypeVar : this.definingMmd.getGenericTypeVarsList()) { // if name and bound specified, this should be a new definition of a generic type var. // currently we require that a bound is needed, although in fact this can be omitted in some cases. if (mmdGenericTypeVar.getName() != null && mmdGenericTypeVar.getExtendsAttribute() != null) { return true; } } return false; } }