Skip to content

Commit

Permalink
Merge pull request #9 from treblereel/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
treblereel authored Jul 9, 2024
2 parents 3179ef2 + a673a27 commit 893000a
Show file tree
Hide file tree
Showing 27 changed files with 688 additions and 86 deletions.
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ Supported `JSON-B` annotations:
* [@JsonbTypeSerializer](###@JsonbTypeSerializer)
* [@JsonbTypeDeserializer](###@JsonbTypeDeserializer)
* [@JsonbTransient](###@JsonbTransient)
* [@JsonbPropertyOrder](###@JsonbPropertyOrder)

### @JsonbProperty
Allows customization of field (or JavaBean property) name.This name is used either in serialization or in deserialization.
Expand All @@ -116,6 +117,7 @@ public class Person {
### @JsonbTypeDeserializer
Annotation provides way how to set custom JsonbSerializer/JsonbDeserializer to field or JavaBean property.
* field
* type

```java
@JsonbTypeSerializer(ObjectJsonbTypeSerializer.class)
Expand Down Expand Up @@ -184,3 +186,19 @@ public class Person {
//{"lastName":"Doe"}
```

### @JsonbPropertyOrder
JsonbPropertyOrder allows us to specify the order of properties in the JSON representation of the class, which can be useful when working with systems that have strict ordering requirements.

* type
```java
@JSONMapper
@JsonbPropertyOrder({"property3", "property2", "property1"})
public class MyClass {
private String property1;
private String property2;
private String property3;
// getters and setters
}
//{"property3":"value3","property2":"value2","property1":"value1"}
```

2 changes: 1 addition & 1 deletion common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>mapper-parent</artifactId>
<groupId>org.treblereel.gwt.json.mapper</groupId>
<version>0.4.1</version>
<version>0.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,13 @@ public SerializerJsonbTypeSerializerWrapper(JsonbSerializer<T> serializer, Strin

@Override
public void serialize(T obj, JsonGenerator generator, SerializationContext ctx) {
JsonGenerator gen = generator.writeKey(property);
serializer.serialize(obj, gen, ctx);
if (obj instanceof Object[]) {
JsonGenerator builder = generator.writeStartArray(property);
serializer.serialize(obj, builder, ctx);
builder.writeEnd();
} else {
JsonGenerator gen = generator.writeKey(property);
serializer.serialize(obj, gen, ctx);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,16 @@ public void serialize(
builder.writeEnd();
}
}

@Override
public void serialize(T[] obj, JsonGenerator generator, SerializationContext ctx) {
if (obj != null) {
JsonSerializationContext jsonSerializationContext = (JsonSerializationContext) ctx;
for (int i = 0; i < obj.length; i++) {
JsonGeneratorDecorator arrayElmBuilder = jsonSerializationContext.createGenerator();
serializer.serialize(obj[i], arrayElmBuilder, ctx);
generator.write(arrayElmBuilder.builder().build());
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ public void serialize(

@Override
public void serialize(T[] obj, JsonGenerator generator, SerializationContext ctx) {
throw new UnsupportedOperationException();
for (int i = 0; i < obj.length; i++) {
serializer.serialize(obj[i], generator, ctx);
}
}
}
2 changes: 1 addition & 1 deletion json-impl/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>mapper-parent</artifactId>
<groupId>org.treblereel.gwt.json.mapper</groupId>
<version>0.4.1</version>
<version>0.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,17 @@ public JsonArrayGenerator(
this.name = name;
}

@Override
public JsonGenerator writeStartObject() {
return new JsonGeneratorDecorator(builder, ctx) {
@Override
public JsonGenerator writeEnd() {
arrayBuilder.add(builder.build());
return this;
}
};
}

@Override
public JsonGenerator writeEnd() {
builder.add(name, arrayBuilder);
Expand Down
12 changes: 10 additions & 2 deletions json-impl/src/main/java/jakarta/json/stream/JsonParserImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@

package jakarta.json.stream;

import jakarta.json.JsonArray;
import jakarta.json.JsonObject;
import jakarta.json.JsonValue;
import jakarta.json.JsonValueDecorator;
import java.math.BigDecimal;
import jsinterop.base.Js;

public class JsonParserImpl implements JsonParser {

Expand All @@ -37,12 +37,20 @@ public boolean hasNext() {

@Override
public Event next() {
if (holder != null && Js.typeof(holder).equals("object")) {
if (holder != null
&& (holder.getValueType() != null && holder.getValueType() == JsonValue.ValueType.OBJECT)) {
return Event.START_OBJECT;
}
return null;
}

public JsonArray getArray() {
if (holder.getValueType() == JsonValue.ValueType.ARRAY) {
return holder.asJsonArray();
}
throw new IllegalStateException("Not an array");
}

public JsonObject getObject() {
if (holder.getValueType() == JsonValue.ValueType.OBJECT) {
if (holder instanceof JsonObject) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,14 @@ public GwtArrayJsonGenerator(JsArray array, SerializationContext ctx) {

@Override
public JsonGenerator writeStartObject() {
throw new UnsupportedOperationException();
JsonObjectBuilderImpl builder = new JsonObjectBuilderImpl();
return new JsonGeneratorDecorator(builder, ctx) {
@Override
public JsonGenerator writeEnd() {
array.push(builder.build().asJsonObject());
return this;
}
};
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public <T extends JsonValue> List<T> getValuesAs(Class<T> clazz) {

@Override
public String getString(int index) {
return array.getAt(index).toString();
return new JsonStringImpl(array.getAt(index)).getString();
}

@Override
Expand Down
16 changes: 5 additions & 11 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<groupId>org.treblereel.gwt.json.mapper</groupId>
<artifactId>mapper-parent</artifactId>
<packaging>pom</packaging>
<version>0.4.1</version>
<version>0.5</version>
<modules>
<module>json-impl</module>
<module>common</module>
Expand Down Expand Up @@ -70,26 +70,25 @@
<maven.gpg.plugin>1.6</maven.gpg.plugin>
<maven.javadoc.plugin>3.2.0</maven.javadoc.plugin>
<maven.source.plugin>3.2.1</maven.source.plugin>
<maven.j2cl.plugin>0.19</maven.j2cl.plugin>
<maven.j2cl.plugin>0.23.1</maven.j2cl.plugin>
<maven.release.plugin>2.5.3</maven.release.plugin>
<maven.surfire.plugin>3.0.0-M1</maven.surfire.plugin>
<maven.nexus.staging.plugin>1.6.8</maven.nexus.staging.plugin>
<maven.scm.provider.gitexe>1.9.5</maven.scm.provider.gitexe>

<!-- generation related deps -->
<javaparser.core.version>3.13.1</javaparser.core.version>
<apache.commons.lang3.version>3.9</apache.commons.lang3.version>

<auto.common.version>0.11</auto.common.version>
<auto.service.version>1.0-rc6</auto.service.version>

<!-- J2CL deps -->
<gwt.jakarta.version>0.2</gwt.jakarta.version>
<gwt.jakarta.version>0.4</gwt.jakarta.version>

<!-- J2CL deps -->
<com.google.jsinterop.base.version>1.0.0</com.google.jsinterop.base.version>
<elemental2.version>1.1.0</elemental2.version>
<j2cl.version>0.10.0-3c97afeac</j2cl.version>
<elemental2.version>1.2.1</elemental2.version>
<j2cl.version>v20240622-2</j2cl.version>

<!-- Testing -->
<junit.version>4.13.1</junit.version>
Expand Down Expand Up @@ -129,11 +128,6 @@
<artifactId>auto-service</artifactId>
<version>${auto.service.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${apache.commons.lang3.version}</version>
</dependency>
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
Expand Down
6 changes: 1 addition & 5 deletions processor/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<parent>
<artifactId>mapper-parent</artifactId>
<groupId>org.treblereel.gwt.json.mapper</groupId>
<version>0.4.1</version>
<version>0.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>

Expand Down Expand Up @@ -53,10 +53,6 @@
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-core</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
import org.treblereel.gwt.json.mapper.apt.processor.BeanProcessor;

@AutoService(Processor.class)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedSourceVersion(SourceVersion.RELEASE_11)
public class GenerationProcessor extends AbstractProcessor {

private final Set<TypeElement> beans = new HashSet<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,15 @@
package org.treblereel.gwt.json.mapper.apt.definition;

import com.google.auto.common.MoreElements;
import jakarta.json.bind.annotation.JsonbPropertyOrder;
import jakarta.json.bind.annotation.JsonbTransient;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import org.treblereel.gwt.json.mapper.apt.context.GenerationContext;

public class BeanDefinition {
Expand All @@ -34,24 +39,34 @@ public BeanDefinition(TypeElement asTypeElement, GenerationContext generationCon
}

public Stream<PropertyDefinition> getPropertyDefinitionsAsStream() {
return context.getTypeUtils().getAllFieldsIn(element).stream()
.filter(field -> !field.getModifiers().contains(Modifier.STATIC))
.filter(field -> !field.getModifiers().contains(Modifier.FINAL))
.filter(field -> !field.getModifiers().contains(Modifier.TRANSIENT))
.filter(field -> field.getAnnotation(JsonbTransient.class) == null)
.map(
field -> {
PropertyDefinition propertyDefinition = new PropertyDefinition(field, context);
/* if (TypeUtils.hasTypeParameter(field.asType())) {
TypeMirror typeMirror =
context
.getProcessingEnv()
.getTypeUtils()
.asMemberOf((DeclaredType) element.asType(), field);
propertyDefinition.setBean(typeMirror);
}*/
return propertyDefinition;
});
Stream<VariableElement> asStream =
context.getTypeUtils().getAllFieldsIn(element).stream()
.filter(field -> !field.getModifiers().contains(Modifier.STATIC))
.filter(field -> !field.getModifiers().contains(Modifier.FINAL))
.filter(field -> !field.getModifiers().contains(Modifier.TRANSIENT))
.filter(field -> field.getAnnotation(JsonbTransient.class) == null);

if (element.getAnnotation(JsonbPropertyOrder.class) != null
&& element.getAnnotation(JsonbPropertyOrder.class).value() != null) {
LinkedHashSet properties = new LinkedHashSet<>();
String[] order = element.getAnnotation(JsonbPropertyOrder.class).value();
Map<String, PropertyDefinition> asMap =
asStream.collect(
Collectors.toMap(
variableElement -> variableElement.getSimpleName().toString(),
variableElement -> new PropertyDefinition(variableElement, context),
(o1, o2) -> o1,
java.util.LinkedHashMap::new));

for (String s : order) {
if (asMap.containsKey(s)) {
properties.add(asMap.remove(s));
}
}
properties.addAll(asMap.values());
return properties.stream();
}
return asStream.map(field -> new PropertyDefinition(field, context));
}

public String getPackageQualifiedName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,11 @@ private TypeElement checkBean(TypeElement type) {
&& type.getEnclosingElement().getKind().equals(ElementKind.PACKAGE)) {
throw new GenerationException("A @JSONMapper bean [" + type + "] must not be static");
}
if (!type.getModifiers().contains(Modifier.STATIC)
&& !type.getEnclosingElement().getKind().equals(ElementKind.PACKAGE)) {
throw new GenerationException(
"If @JSONMapper bean [" + type + "] is a inner class, it must be static");
}

if (context.getTypeUtils().isJsonbTypeSerializer(type)
&& type.getAnnotation(JSONMapper.class) != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
import javax.lang.model.util.ElementFilter;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import org.apache.commons.lang3.StringUtils;
import org.treblereel.gwt.json.mapper.apt.context.GenerationContext;
import org.treblereel.gwt.json.mapper.apt.exception.GenerationException;

Expand Down Expand Up @@ -139,7 +138,7 @@ public ExecutableElement getGetter(VariableElement variable) {
List<String> method = compileGetterMethodName(variable);
return MoreElements.asType(variable.getEnclosingElement()).getEnclosedElements().stream()
.filter(e -> e.getKind().equals(ElementKind.METHOD))
.filter(e -> method.contains(e.toString()))
.filter(e -> method.contains(e.getSimpleName().toString()))
.filter(e -> !e.getModifiers().contains(Modifier.PRIVATE))
.filter(e -> !e.getModifiers().contains(Modifier.STATIC))
.map(MoreElements::asExecutable)
Expand All @@ -158,9 +157,9 @@ public List<String> compileGetterMethodName(VariableElement variable) {
String varName = variable.getSimpleName().toString();
boolean isBoolean = isBoolean(variable);
List<String> result = new ArrayList<>();
result.add("get" + StringUtils.capitalize(varName) + "()");
result.add("get" + capitalize(varName));
if (isBoolean) {
result.add("is" + StringUtils.capitalize(varName) + "()");
result.add("is" + capitalize(varName));
}
return result;
}
Expand Down Expand Up @@ -192,7 +191,7 @@ private String compileSetterMethodName(VariableElement variable) {
String varName = variable.getSimpleName().toString();
StringBuffer sb = new StringBuffer();
sb.append("set");
sb.append(StringUtils.capitalize(varName));
sb.append(capitalize(varName));
sb.append("(");
sb.append(variable.asType());
sb.append(")");
Expand Down Expand Up @@ -394,4 +393,8 @@ private TypeMirror asBoxedType(TypeKind type) {
return types.boxedClass(primitive).asType();
}
}

private String capitalize(String name) {
return name.substring(0, 1).toUpperCase() + name.substring(1);
}
}
Loading

0 comments on commit 893000a

Please sign in to comment.