Skip to content

Commit

Permalink
Restore autoProvides to exclude http controllers and generated http r…
Browse files Browse the repository at this point in the history
…outes (#587)

The change to autoProvides for Event support also meant that http controllers and http routes started to get included into autoProvides. The problem there is that http controllers are not expected to be public exported types and autoProvides with GenericType doesn't check is the type parameters are public.
  • Loading branch information
rbygrave authored Jun 4, 2024
1 parent 1e98bf9 commit 6aa7a1b
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ final class Constants {

static final String PATH = "io.avaje.http.api.Path";
static final String CONTROLLER = "io.avaje.http.api.Controller";
static final String HTTP_GENERATED = "io.avaje.http.api.Generated";

static final String AT_SINGLETON = "@Singleton";
static final String AT_PROXY = "@Proxy";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,12 @@
import static io.avaje.inject.generator.APContext.logWarn;
import static io.avaje.inject.generator.APContext.types;
import static io.avaje.inject.generator.ProcessingContext.asElement;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Stream;

import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.*;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;

Expand All @@ -34,6 +30,8 @@ final class TypeExtendsReader {
private final boolean publicAccess;
private final boolean autoProvide;
private final boolean proxyBean;
private final boolean controller;
private final boolean generatedBeanFactory;
private boolean closeable;
/**
* The implied qualifier name based on naming convention.
Expand All @@ -51,23 +49,26 @@ final class TypeExtendsReader {
this.publicAccess = baseType.getModifiers().contains(Modifier.PUBLIC);
this.autoProvide = autoProvide();
this.proxyBean = proxyBean;
this.controller = hasAnnotation(Constants.CONTROLLER) || hasAnnotation(Constants.HTTP_GENERATED);
this.generatedBeanFactory = GeneratedPrism.isPresent(baseType);
}

private boolean autoProvide() {
return publicAccess
&& !controller
&& !generatedBeanFactory
&& !FactoryPrism.isPresent(baseType)
&& !ProxyPrism.isPresent(baseType)
&& !GeneratedPrism.isPresent(baseType)
&& !isController();
&& !ProxyPrism.isPresent(baseType);
}

@SuppressWarnings("unchecked")
private boolean isController() {
try {
return baseType.getAnnotation((Class<Annotation>) Class.forName(Constants.CONTROLLER)) != null;
} catch (final ClassNotFoundException e) {
return false;
private boolean hasAnnotation(String annotationFQN) {
for (final var m : baseType.getAnnotationMirrors()) {
final CharSequence mfqn = ((TypeElement) m.getAnnotationType().asElement()).getQualifiedName();
if (annotationFQN.contentEquals(mfqn)) {
return true;
}
}
return false;
}

UType baseType() {
Expand Down Expand Up @@ -119,6 +120,10 @@ String providesAspect() {
}

List<UType> autoProvides() {
if (controller || implementsBeanFactory()) {
// http controller, http route, or http request scoped controller via BeanFactory
return List.of();
}
if (baseTypeIsInterface) {
return List.of(Util.unwrapProvider(baseUType));
}
Expand All @@ -132,6 +137,15 @@ List<UType> autoProvides() {
return autoProvides;
}

private boolean implementsBeanFactory() {
for (UType interfaceType : interfaceTypes) {
if (Constants.BEAN_FACTORY.equals(interfaceType.mainType())) {
return true;
}
}
return false;
}

List<UType> provides() {
return providesTypes;
}
Expand Down

0 comments on commit 6aa7a1b

Please sign in to comment.