Replace all exposed superclasses in final step after traversal

See gh-28676
This commit is contained in:
Juergen Hoeller
2024-02-28 15:39:53 +01:00
parent aeb77cf4e1
commit fa5d246a1b
2 changed files with 36 additions and 14 deletions

View File

@@ -468,6 +468,9 @@ class ConfigurationClassParser {
* the superclass exposure on a different config class with the same superclass.
*/
private void removeKnownSuperclass(String removedClass, boolean replace) {
String replacedSuperclass = null;
ConfigurationClass replacingClass = null;
Iterator<Map.Entry<String, List<ConfigurationClass>>> it = this.knownSuperclasses.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, List<ConfigurationClass>> entry = it.next();
@@ -476,22 +479,29 @@ class ConfigurationClassParser {
it.remove();
}
else if (replace) {
try {
ConfigurationClass otherClass = entry.getValue().get(0);
SourceClass sourceClass = asSourceClass(otherClass, DEFAULT_EXCLUSION_FILTER).getSuperClass();
while (!sourceClass.getMetadata().getClassName().equals(entry.getKey()) &&
sourceClass.getMetadata().getSuperClassName() != null) {
sourceClass = sourceClass.getSuperClass();
}
doProcessConfigurationClass(otherClass, sourceClass, DEFAULT_EXCLUSION_FILTER);
}
catch (IOException ex) {
throw new BeanDefinitionStoreException(
"I/O failure while removing configuration class [" + removedClass + "]", ex);
}
replacedSuperclass = entry.getKey();
replacingClass = entry.getValue().get(0);
}
}
}
if (replacingClass != null) {
try {
SourceClass sourceClass = asSourceClass(replacingClass, DEFAULT_EXCLUSION_FILTER).getSuperClass();
while (!sourceClass.getMetadata().getClassName().equals(replacedSuperclass) &&
sourceClass.getMetadata().getSuperClassName() != null) {
sourceClass = sourceClass.getSuperClass();
}
do {
sourceClass = doProcessConfigurationClass(replacingClass, sourceClass, DEFAULT_EXCLUSION_FILTER);
}
while (sourceClass != null);
}
catch (IOException ex) {
throw new BeanDefinitionStoreException(
"I/O failure while removing configuration class [" + removedClass + "]", ex);
}
}
}
/**