Skip to content

Commit

Permalink
ArC: prevent duplicate bean discovery & detect duplicate bean identif…
Browse files Browse the repository at this point in the history
…iers

A bean class may occur in the bean archive index multiple times, because
the index is in fact a composite of multiple indices and there's nothing
preventing duplicity in the composition.

Fortunately, all the additional customizations (such as default scope or
unremovability from `AdditionalBeanBuildItem`) are passed around outside
of the bean archive index (for example, as annotation transformations or
as `BeanProcessor` configuration), so they are not lost.
  • Loading branch information
Ladicek committed Dec 7, 2023
1 parent abe537f commit 5b2a514
Showing 1 changed file with 29 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -956,8 +956,14 @@ private List<BeanInfo> findBeans(Collection<DotName> beanDefiningAnnotations, Li
.map(StereotypeInfo::getName)
.collect(Collectors.toSet());

Set<DotName> seenClasses = new HashSet<>();

// If needed use the specialized immutable index to discover beans
for (ClassInfo beanClass : beanArchiveImmutableIndex.getKnownClasses()) {
if (!seenClasses.add(beanClass.name())) {
// avoid discovering the same bean twice
continue;
}

if (Modifier.isInterface(beanClass.flags()) || Modifier.isAbstract(beanClass.flags())
|| beanClass.isAnnotation() || beanClass.isEnum()) {
Expand Down Expand Up @@ -1583,6 +1589,29 @@ private void validateBeans(List<Throwable> errors, Consumer<BytecodeTransformer>
}
}
}

List<Map.Entry<String, List<BeanInfo>>> duplicateBeanIds = beans.stream()
.collect(Collectors.groupingBy(BeanInfo::getIdentifier))
.entrySet()
.stream()
.filter(entry -> entry.getValue().size() > 1)
.collect(Collectors.toList());
if (!duplicateBeanIds.isEmpty()) {
String separator = "====================";
StringBuilder error = new StringBuilder("\n")
.append(separator).append(separator).append(separator).append(separator).append("\n")
.append("Multiple beans with the same identifier found!\n")
.append("----------------------------------------------\n")
.append("This is an internal error. Please report a bug and attach the following listing.\n\n");
for (Map.Entry<String, List<BeanInfo>> entry : duplicateBeanIds) {
error.append(entry.getKey()).append(" -> ").append(entry.getValue().size()).append(" beans:\n");
for (BeanInfo bean : entry.getValue()) {
error.append("- ").append(bean).append("\n");
}
}
error.append(separator).append(separator).append(separator).append(separator).append("\n");
errors.add(new DeploymentException(error.toString()));
}
}

private void findNamespaces(BeanInfo bean, Set<String> namespaces) {
Expand Down

0 comments on commit 5b2a514

Please sign in to comment.