/** * Constructs a new descriptor for the specified class. When describing inheritence, the * descriptor of the parent class should be used and only the fields added in this object must be * supplied here. * * @param javaClass The Java type of this class * @param fields The fields described for this class * @param identity The field of the identity (key) of this class, may be null * @param extend The descriptor of the class which this class extends, * @param accessMode The access mode for this class (null is shared) or null if this is a * top-level class * @throws MappingException The extended descriptor does not match a parent class of this type */ public ClassDescriptorImpl( Class javaClass, FieldDescriptor[] fields, FieldDescriptor identity, ClassDescriptor extend, AccessMode accessMode) throws MappingException { if (!Types.isConstructable(javaClass)) throw new MappingException("mapping.classNotConstructable", javaClass.getName()); _javaClass = javaClass; if (fields == null) throw new IllegalArgumentException("Argument 'fields' is null"); _fields = (FieldDescriptor[]) fields.clone(); if (extend != null) { if (!extend.getJavaClass().isAssignableFrom(javaClass)) throw new MappingException( "mapping.classDoesNotExtend", _javaClass.getName(), extend.getJavaClass().getName()); _extends = extend; _identity = (identity == null ? _extends.getIdentity() : identity); } else { _extends = null; _identity = identity; } _accessMode = accessMode; }
protected ClassDescriptor createDescriptor(ClassMapping clsMap) throws MappingException { ClassDescriptor clsDesc; FieldDescriptor[] fields; Vector jdoFields; // If no LDAP information for class, ignore it. DAX only // supports DAX class descriptors. if (clsMap.getMapTo() == null || clsMap.getMapTo().getLdapOc() == null) return NoDescriptor; // See if we have a compiled descriptor. clsDesc = loadClassDescriptor(clsMap.getName()); if (clsDesc != null && clsDesc instanceof DAXClassDescriptor) return clsDesc; // Use super class to create class descriptor. Field descriptors will be // generated only for supported fields, see createFieldDesc later on. // This class may only extend a DAX class, otherwise no mapping will be // found for the parent. clsDesc = super.createDescriptor(clsMap); // DAX descriptor must include an identity field, the identity field // is either a field, or a container field containing only DAX fields. // If the identity field is not a JDO field, it will be cleaned later // on (we need the descriptor for relations mapping). if (clsDesc.getIdentity() == null) throw new MappingException("mapping.noIdentity", clsDesc.getJavaClass().getName()); /* if ( clsDesc.getIdentity() instanceof ContainerFieldDesc ) { FieldDescriptor[] idFields; idFields = ( (ContainerFieldDesc) clsDesc.getIdentity() ).getFields(); for ( int i = 0 ; i < idFields.length ; ++i ) if ( ! ( idFields[ i ] instanceof DAXFieldDesc ) ) throw new MappingException( "dax.identityNotDAX", idFields[ i ] ); } */ return new DAXClassDescriptor(clsDesc, clsMap.getMapTo().getLdapOc(), null); }