*
* Be careful while changing order of processing.
*/
protected MetadataDescriptor processEmbeddableClass() {
final Class embeddableClass = getReferenceClass();
MetadataDescriptor embeddableDescriptor = null;
try {
embeddableDescriptor = m_project.getDescriptor(embeddableClass);
} catch (Exception exception) {
// expected as we do lazy processing of embeddables.
}
if (embeddableDescriptor == null) {
// The embeddable class is not yet processed, so process it now.
embeddableDescriptor = new MetadataDescriptor(embeddableClass);
// adding to projects sets up appropriate persistence-unit-defaults
m_project.addDescriptor(embeddableDescriptor);
embeddableDescriptor.setIgnoreAnnotations(isMetadataComplete(embeddableDescriptor));
AccessType accessType = determineAccessTypeOfEmbedded(embeddableDescriptor);
embeddableDescriptor.setUsesPropertyAccess(accessType == PROPERTY ? true : false);
ClassAccessor embeddableAccessor = buildAccessor(embeddableDescriptor);
embeddableAccessor.process();
embeddableAccessor.setIsProcessed();
} else {
// We have already processed this embeddable class. let's validate
// that it is not used in entities with conflicting access type.
// Conflicting access-type is not allowed when there is no metadata
// in the embeddable class.
if (!isMetadataPresent(embeddableDescriptor)) {
boolean embeddableUsesPropertyAccess = embeddableDescriptor.usesPropertyAccess();
boolean entityUsesPropertyAccess = m_descriptor.usesPropertyAccess();
if (embeddableUsesPropertyAccess != entityUsesPropertyAccess) {
m_validator.throwConflictingAccessTypeInEmbeddable(embeddableClass);
}