11package io .avaje .jsonb .generator ;
22
3- import static io .avaje .jsonb .generator .APContext .*;
4- import javax .annotation .processing .FilerException ;
3+ import static io .avaje .jsonb .generator .APContext .typeElement ;
4+ import static java .util .stream .Collectors .toList ;
5+
6+ import java .util .Map ;
7+
58import javax .lang .model .element .AnnotationMirror ;
9+ import javax .lang .model .element .Modifier ;
610import javax .lang .model .element .TypeElement ;
711import javax .lang .model .type .TypeMirror ;
8- import javax .tools .FileObject ;
9- import javax .tools .StandardLocation ;
10- import java .io .FileNotFoundException ;
11- import java .io .LineNumberReader ;
12- import java .io .Reader ;
13- import java .nio .file .NoSuchFileException ;
14- import java .util .ArrayList ;
15- import java .util .Collections ;
16- import java .util .List ;
17- import java .util .Objects ;
1812
1913final class ComponentReader {
2014
2115 private final ComponentMetaData componentMetaData ;
16+ private final Map <String , ComponentMetaData > privateMetaData ;
2217
23- ComponentReader (ComponentMetaData metaData ) {
18+ ComponentReader (ComponentMetaData metaData , Map < String , ComponentMetaData > privateMetaData ) {
2419 this .componentMetaData = metaData ;
20+ this .privateMetaData = privateMetaData ;
2521 }
2622
2723 void read () {
28- ProcessingContext .readExistingMetaInfServices ().stream ()
29- .map (APContext ::typeElement )
30- .filter (Objects ::nonNull )
31- .filter (t -> "io.avaje.jsonb.spi.GeneratedComponent" .equals (t .getSuperclass ().toString ()))
32- .findFirst ()
33- .ifPresent (
34- moduleType -> {
35- if (moduleType != null ) {
36- componentMetaData .setFullName (moduleType .getQualifiedName ().toString ());
37- readMetaData (moduleType );
38- }
39- });
24+ for (String fqn : ProcessingContext .readExistingMetaInfServices ()) {
25+ final TypeElement moduleType = typeElement (fqn );
26+
27+ if (isGeneratedComponent (moduleType )) {
28+ var adapters =
29+ MetaDataPrism .getInstanceOn (moduleType ).value ().stream ()
30+ .map (APContext ::asTypeElement )
31+ .collect (toList ());
32+
33+ if (adapters .get (0 ).getModifiers ().contains (Modifier .PUBLIC )) {
34+ componentMetaData .setFullName (fqn );
35+ adapters .forEach (t -> readMetaData (moduleType ));
36+
37+ } else {
38+ // non-public adapters grouped by packageName, does not support generic types (JsonFactory)
39+ var packageName = APContext .elements ().getPackageOf (moduleType ).getQualifiedName ().toString ();
40+ var meta = privateMetaData .computeIfAbsent (packageName , k -> new ComponentMetaData ());
41+ adapters .stream ()
42+ .map (TypeElement ::getQualifiedName )
43+ .map (Object ::toString )
44+ .forEach (meta ::add );
45+ }
46+ }
47+ }
48+ }
49+
50+ private static boolean isGeneratedComponent (TypeElement moduleType ) {
51+ return moduleType != null && "io.avaje.jsonb.spi.GeneratedComponent" .equals (moduleType .getSuperclass ().toString ());
4052 }
4153
42- /**
43- * Read the existing JsonAdapters from the MetaData annotation of the generated component.
44- */
54+ /** Read the existing JsonAdapters from the MetaData annotation of the generated component. */
4555 private void readMetaData (TypeElement moduleType ) {
4656 for (final AnnotationMirror annotationMirror : moduleType .getAnnotationMirrors ()) {
4757
@@ -50,13 +60,13 @@ private void readMetaData(TypeElement moduleType) {
5060
5161 if (metaData != null ) {
5262 metaData .value ().stream ()
53- .map (TypeMirror ::toString )
54- .forEach (componentMetaData ::add );
63+ .map (TypeMirror ::toString )
64+ .forEach (componentMetaData ::add );
5565
5666 } else if (metaDataFactory != null ) {
5767 metaDataFactory .value ().stream ()
58- .map (TypeMirror ::toString )
59- .forEach (componentMetaData ::addFactory );
68+ .map (TypeMirror ::toString )
69+ .forEach (componentMetaData ::addFactory );
6070 }
6171 }
6272 }
0 commit comments