Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package org.example.customer.creator;

import io.avaje.jsonb.Json;
import io.avaje.jsonb.Json.Alias;
import io.avaje.jsonb.Json.Creator;
import io.avaje.jsonb.Json.Property;

@Json
public class Quaternion {

// Scalar r in versor form
@Property("W")
private final double m_w;

// Vector v in versor form
@Property("X")
private final double m_x;

@Property("Y")
private final double m_y;

@Property("Z")
private final double m_z;

/** Constructs a quaternion with a default angle of 0 degrees. */
public Quaternion() {
m_w = 1.0;
m_x = 0.0;
m_y = 0.0;
m_z = 0.0;
}

/**
* Constructs a quaternion with the given components.
*
* @param w W component of the quaternion.
* @param x X component of the quaternion.
* @param y Y component of the quaternion.
* @param z Z component of the quaternion.
*/
@Creator
public Quaternion(
@Alias("W") double w,
@Alias("X") double x,
@Alias("Y") double y,
@Alias("Z") double z) {
m_w = w;
m_x = x;
m_y = y;
m_z = z;
}

/**
* Returns W component of the quaternion.
*
* @return W component of the quaternion.
*/
public double getW() {
return m_w;
}

/**
* Returns X component of the quaternion.
*
* @return X component of the quaternion.
*/
public double getX() {
return m_x;
}

/**
* Returns Y component of the quaternion.
*
* @return Y component of the quaternion.
*/
public double getY() {
return m_y;
}

/**
* Returns Z component of the quaternion.
*
* @return Z component of the quaternion.
*/
public double getZ() {
return m_z;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.example.customer.creator;

import io.avaje.jsonb.Jsonb;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class QuaternionTest {

final Jsonb jsonb = Jsonb.builder().build();

@Test
void asJson() {
var q = new Quaternion(0.1, 0.2, 0.3, 0.4);

String json = jsonb.toJson(q);
Quaternion fromJson = jsonb.type(Quaternion.class).fromJson(json);

assertThat(fromJson.getW()).isEqualTo(0.1);
assertThat(fromJson.getX()).isEqualTo(0.2);
assertThat(fromJson.getY()).isEqualTo(0.3);
assertThat(fromJson.getZ()).isEqualTo(0.4);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;

import io.avaje.jsonb.generator.MethodReader.MethodParam;

final class ClassReader implements BeanReader {

private static final boolean useInstanceofPattern = jdkVersion() >= 17;
Expand Down Expand Up @@ -509,11 +511,13 @@ private void writeJsonBuildResult(Append writer, String varName) {
writer.append(", ");
}

final var paramName = params.get(i).name();
MethodParam methodParam = params.get(i);
final var paramName = methodParam.name();
final var aliases = aliasesForParam(methodParam);
var name =
allFields.stream()
.filter(FieldReader::isConstructorParam)
.filter(f -> f.propertyName().equals(paramName) || f.fieldName().equals(paramName))
.filter(field -> isMatchParam(field, paramName, aliases))
.map(FieldReader::fieldName)
.findFirst()
.orElse(paramName);
Expand All @@ -534,6 +538,20 @@ private void writeJsonBuildResult(Append writer, String varName) {
}
}

private static boolean isMatchParam(FieldReader field, String paramName, Set<String> aliases) {
return field.propertyName().equals(paramName)
|| field.fieldName().equals(paramName)
|| field.aliases().contains(paramName)
|| aliases.contains(field.propertyName())
|| aliases.contains(field.fieldName());
}

private static Set<String> aliasesForParam(MethodParam methodParam) {
return AliasPrism.getOptionalOn(methodParam.element()).map(AliasPrism::value).stream()
.flatMap(List::stream)
.collect(Collectors.toSet());
}

private void writeFromJsonWithSubTypes(Append writer) {
final var typeVar = usesTypeProperty ? "_val$" + typePropertyKey() : "type";
final var useSwitch = subTypes.size() >= 3;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,9 @@ void writeFromJsonSwitch(Append writer, boolean defaultConstructor, String varNa
writer.append(" case \"%s\":", propertyKey).eol();
}
final String propertyKey = caseInsensitiveKeys ? propertyName.toLowerCase() : propertyName;
writer.append(" case \"%s\": ", propertyKey).eol();
if (!aliases.contains(propertyName)) {
writer.append(" case \"%s\": ", propertyKey).eol();
}
if (!deserialize) {
writer.append(" reader.skipValue();");
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,12 @@ void read(TypeElement type) {
for (var param : constructor.getParams()) {
var name = param.name();
var element = param.element();
var matchingField = localFields.stream()
.filter(f -> f.propertyName().equals(name) || f.fieldName().equals(name))
.findFirst();
var aliases = aliasesForParam(element);

var matchingField =
localFields.stream()
.filter(field -> isMatchParam(field, name, aliases))
.findFirst();
matchingField.ifPresentOrElse(f -> f.readParam(element), () -> readField(element, localFields));
}
}
Expand All @@ -190,6 +193,20 @@ void read(TypeElement type) {
}
}

private static boolean isMatchParam(FieldReader field, String name, Set<String> aliases) {
return field.propertyName().equals(name)
|| field.fieldName().equals(name)
|| field.aliases().contains(name)
|| aliases.contains(field.propertyName())
|| aliases.contains(field.fieldName());
}

private static Set<String> aliasesForParam(VariableElement element) {
return AliasPrism.getOptionalOn(element).map(AliasPrism::value).stream()
.flatMap(List::stream)
.collect(Collectors.toSet());
}

private void readField(Element element, List<FieldReader> localFields) {
final Element mixInField = mixInFields.get(element.getSimpleName().toString());
if (mixInField != null && APContext.types().isSameType(mixInField.asType(), element.asType())) {
Expand Down