Skip to content

Commit abc7542

Browse files
authored
Merge pull request #379 from SentryMan/pkg-private-custom
Support pkg private custom adapters
2 parents 66b01cd + ff35475 commit abc7542

File tree

7 files changed

+49
-14
lines changed

7 files changed

+49
-14
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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ void addFactory(String fullName) {
3131
factoryTypes.add(fullName);
3232
}
3333

34-
public void addWithType(String type) {
34+
void addWithType(String type) {
3535
withTypes.add(type);
3636
}
3737

@@ -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
}
@@ -83,7 +85,7 @@ Collection<String> allImports() {
8385
return packageImports;
8486
}
8587

86-
public boolean isEmpty() {
88+
boolean isEmpty() {
8789
return allTypes.isEmpty() && factoryTypes.isEmpty();
8890
}
8991

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ 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+
var meta = pkgPrivate ? pkgPrivateMetaData(typeElement) : metaData;
140142
final var type = typeElement.getQualifiedName().toString();
141143
if (isGenericJsonAdapter(typeElement)) {
142144
ElementFilter.fieldsIn(typeElement.getEnclosedElements()).stream()
@@ -146,7 +148,7 @@ private void registerCustomAdapters(Set<? extends Element> elements) {
146148
x -> {},
147149
() -> logError(typeElement, "Generic adapters require a public static AdapterFactory FACTORY field"));
148150

149-
metaData.addFactory(type);
151+
meta.addFactory(type);
150152
} else {
151153
ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream()
152154
.filter(m -> m.getModifiers().contains(Modifier.PUBLIC))
@@ -159,11 +161,16 @@ private void registerCustomAdapters(Set<? extends Element> elements) {
159161
x -> {},
160162
() -> logNote(typeElement, "Non-Generic adapters should have a public constructor with a single Jsonb parameter"));
161163

162-
metaData.add(type);
164+
meta.add(type);
163165
}
164166
}
165167
}
166168

169+
private ComponentMetaData pkgPrivateMetaData(TypeElement typeElement) {
170+
var packageName = APContext.elements().getPackageOf(typeElement).getQualifiedName().toString();
171+
return privateMetaData.computeIfAbsent(packageName, k -> new ComponentMetaData());
172+
}
173+
167174
private static boolean isGenericJsonAdapter(TypeElement typeElement) {
168175
return typeElement.getInterfaces().stream()
169176
.map(UType::parse)
@@ -299,13 +306,13 @@ private static TypeElement implementationType(ImportPrism importPrism) {
299306
private void writeComponent(boolean processingOver) {
300307
if (processingOver) {
301308
try {
302-
if (!metaData.all().isEmpty()) {
309+
if (!metaData.isEmpty()) {
303310
componentWriter.initialise(false);
304311
componentWriter.write();
305312
}
306313

307314
for (var meta : privateMetaData.values()) {
308-
if (meta.all().isEmpty()) {
315+
if (meta.isEmpty()) {
309316
continue;
310317
}
311318
var writer = new SimpleComponentWriter(meta);
@@ -370,9 +377,7 @@ private void writeAdapter(TypeElement typeElement, BeanReader beanReader) {
370377
try {
371378
final SimpleAdapterWriter beanWriter = new SimpleAdapterWriter(beanReader);
372379
if (beanReader.isPkgPrivate()) {
373-
var packageName = APContext.elements().getPackageOf(typeElement).getQualifiedName().toString();
374-
var meta = privateMetaData.computeIfAbsent(packageName, k -> new ComponentMetaData());
375-
writeMeta(beanWriter, meta);
380+
writeMeta(beanWriter, pkgPrivateMetaData(typeElement));
376381
} else {
377382
writeMeta(beanWriter, metaData);
378383
}

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)