Skip to content

Commit 545bfdf

Browse files
committed
support pkg private custom adapters
now can use package private custom adapters
1 parent 66b01cd commit 545bfdf

File tree

7 files changed

+69
-25
lines changed

7 files changed

+69
-25
lines changed

blackbox-test/src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
provides JsonbExtension
1111
with
1212
org.example.customer.customtype.CustomTypeComponent,
13+
org.example.other.custom.CustomJsonComponent,
1314
org.example.jsonb.GeneratedJsonComponent,
1415
org.example.pkg_private.PkgPrivateJsonComponent;
1516

blackbox-test/src/main/java/org/example/other/custom/CustomEntryJsonAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import io.avaje.json.*;
99

1010
@CustomAdapter
11-
public class CustomEntryJsonAdapter<K, V> implements JsonAdapter<Entry<K, V>> {
11+
class CustomEntryJsonAdapter<K, V> implements JsonAdapter<Entry<K, V>> {
1212

1313
private final JsonAdapter<K> generic1;
1414
private final JsonAdapter<V> generic2;

jsonb-generator/src/main/java/io/avaje/jsonb/generator/ComponentMetaData.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ void setFullName(String fullName) {
4141

4242
String fullName(boolean pkgPrivate) {
4343
if (fullName == null) {
44-
String topPackage = TopPackage.of(allTypes);
44+
var everyType = new ArrayList<>(allTypes);
45+
everyType.addAll(factoryTypes);
46+
String topPackage = TopPackage.of(everyType);
4547
if (!topPackage.endsWith(".jsonb") && !pkgPrivate) {
4648
topPackage += ".jsonb";
4749
}

jsonb-generator/src/main/java/io/avaje/jsonb/generator/JsonbProcessor.java

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -137,29 +137,43 @@ private Optional<? extends Set<? extends Element>> getElements(RoundEnvironment
137137

138138
private void registerCustomAdapters(Set<? extends Element> elements) {
139139
for (final var typeElement : ElementFilter.typesIn(elements)) {
140+
var pkgPrivate = !typeElement.getModifiers().contains(Modifier.PUBLIC);
141+
142+
var meta =
143+
pkgPrivate
144+
? privateMetaData.computeIfAbsent(
145+
APContext.elements().getPackageOf(typeElement).getQualifiedName().toString(),
146+
k -> new ComponentMetaData())
147+
: metaData;
140148
final var type = typeElement.getQualifiedName().toString();
141149
if (isGenericJsonAdapter(typeElement)) {
142150
ElementFilter.fieldsIn(typeElement.getEnclosedElements()).stream()
143-
.filter(isStaticFactory())
144-
.findFirst()
145-
.ifPresentOrElse(
146-
x -> {},
147-
() -> logError(typeElement, "Generic adapters require a public static AdapterFactory FACTORY field"));
148-
149-
metaData.addFactory(type);
151+
.filter(isStaticFactory())
152+
.findFirst()
153+
.ifPresentOrElse(
154+
x -> {},
155+
() ->
156+
logError(
157+
typeElement,
158+
"Generic adapters require a public static AdapterFactory FACTORY field"));
159+
160+
meta.addFactory(type);
150161
} else {
151162
ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream()
152-
.filter(m -> m.getModifiers().contains(Modifier.PUBLIC))
153-
.filter(m -> m.getParameters().size() == 1)
154-
.map(m -> m.getParameters().get(0).asType().toString())
155-
.map(Util::trimAnnotations)
156-
.filter("io.avaje.jsonb.Jsonb"::equals)
157-
.findAny()
158-
.ifPresentOrElse(
159-
x -> {},
160-
() -> logNote(typeElement, "Non-Generic adapters should have a public constructor with a single Jsonb parameter"));
161-
162-
metaData.add(type);
163+
.filter(m -> m.getModifiers().contains(Modifier.PUBLIC))
164+
.filter(m -> m.getParameters().size() == 1)
165+
.map(m -> m.getParameters().get(0).asType().toString())
166+
.map(Util::trimAnnotations)
167+
.filter("io.avaje.jsonb.Jsonb"::equals)
168+
.findAny()
169+
.ifPresentOrElse(
170+
x -> {},
171+
() ->
172+
logNote(
173+
typeElement,
174+
"Non-Generic adapters should have a public constructor with a single Jsonb parameter"));
175+
176+
meta.add(type);
163177
}
164178
}
165179
}
@@ -299,13 +313,13 @@ private static TypeElement implementationType(ImportPrism importPrism) {
299313
private void writeComponent(boolean processingOver) {
300314
if (processingOver) {
301315
try {
302-
if (!metaData.all().isEmpty()) {
316+
if (!metaData.isEmpty()) {
303317
componentWriter.initialise(false);
304318
componentWriter.write();
305319
}
306320

307321
for (var meta : privateMetaData.values()) {
308-
if (meta.all().isEmpty()) {
322+
if (meta.isEmpty()) {
309323
continue;
310324
}
311325
var writer = new SimpleComponentWriter(meta);

jsonb-generator/src/main/java/io/avaje/jsonb/generator/TopPackage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
final class TopPackage {
66

7-
private String topPackage;
7+
private String topPackage = "";
88

99
static String of(Collection<String> values) {
1010
return new TopPackage(values).value();

jsonb-generator/src/main/java/io/avaje/jsonb/generator/Util.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private static String trimArrayBrackets(String type) {
5353

5454
static String packageOf(String cls) {
5555
int pos = cls.lastIndexOf('.');
56-
return (pos == -1) ? "" : cls.substring(0, pos);
56+
return pos == -1 ? "" : cls.substring(0, pos);
5757
}
5858

5959
static String shortName(String fullType) {
@@ -115,7 +115,7 @@ private static String cutAnnotations(String input) {
115115
/** Return the common parent package. */
116116
static String commonParent(String currentTop, String aPackage) {
117117
if (aPackage == null) return currentTop;
118-
if (currentTop == null) return packageOf(aPackage);
118+
if (currentTop.isBlank()) return packageOf(aPackage);
119119
if (aPackage.startsWith(currentTop)) {
120120
return currentTop;
121121
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package io.avaje.jsonb.generator.models.valid.pkg_private;
2+
3+
import java.math.BigDecimal;
4+
import java.math.RoundingMode;
5+
6+
import io.avaje.json.JsonAdapter;
7+
import io.avaje.json.JsonReader;
8+
import io.avaje.json.JsonWriter;
9+
import io.avaje.jsonb.CustomAdapter;
10+
import io.avaje.jsonb.Jsonb;
11+
12+
@CustomAdapter
13+
class MoneySerializer implements JsonAdapter<BigDecimal> {
14+
15+
/** Constructor takes Jsonb, registered via AdapterBuilder */
16+
public MoneySerializer(Jsonb jsonb) {}
17+
18+
@Override
19+
public BigDecimal fromJson(JsonReader reader) {
20+
return reader.readDecimal().setScale(2, RoundingMode.DOWN);
21+
}
22+
23+
@Override
24+
public void toJson(JsonWriter writer, BigDecimal value) {
25+
writer.value(value.setScale(2, RoundingMode.DOWN));
26+
}
27+
}

0 commit comments

Comments
 (0)