Skip to content

Commit

Permalink
Apply adapters based on property read/write type
Browse files Browse the repository at this point in the history
  • Loading branch information
aguibert committed Aug 26, 2019
1 parent 36fc203 commit ee060ce
Show file tree
Hide file tree
Showing 13 changed files with 218 additions and 58 deletions.
18 changes: 8 additions & 10 deletions src/main/java/org/eclipse/yasson/internal/ComponentMatcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -172,20 +172,18 @@ public Optional<DeserializerBinding<?>> getDeserializerBinding(Type propertyRunt
* @param customization customization with component info
* @return components info if present
*/
public Optional<AdapterBinding> getAdapterBinding(Type propertyRuntimeType, ComponentBoundCustomization customization) {
if (customization == null || customization.getAdapterBinding() == null) {
public Optional<AdapterBinding> getSerializeAdapterBinding(Type propertyRuntimeType, ComponentBoundCustomization customization) {
if (customization == null || customization.getSerializeAdapterBinding() == null) {
return searchComponentBinding(propertyRuntimeType, ComponentBindings::getAdapterInfo);
}
return Optional.of(customization.getAdapterBinding());
return Optional.of(customization.getSerializeAdapterBinding());
}

private <T extends AbstractComponentBinding> Optional<T> getComponentBinding(Type propertyRuntimeType, T componentBinding) {
//need runtime check, ParameterizedType property may have generic components assigned which is not compatible
//for given runtime type
if (matches(propertyRuntimeType, componentBinding.getBindingType())) {
return Optional.of(componentBinding);

public Optional<AdapterBinding> getDeserializeAdapterBinding(Type propertyRuntimeType, ComponentBoundCustomization customization) {
if (customization == null || customization.getDeserializeAdapterBinding() == null) {
return searchComponentBinding(propertyRuntimeType, ComponentBindings::getAdapterInfo);
}
return Optional.empty();
return Optional.of(customization.getDeserializeAdapterBinding());
}

private <T extends AbstractComponentBinding> Optional<T> searchComponentBinding(Type runtimeType, ComponentSupplier<T> supplier) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public CreatorModel(String name, Parameter parameter, JsonbContext context) {
JsonbNumberFormatter constructorNumberFormatter = context.getAnnotationIntrospector().getConstructorNumberFormatter(annotated);
JsonbDateFormatter constructorDateFormatter = context.getAnnotationIntrospector().getConstructorDateFormatter(annotated);
final JsonbAnnotatedElement<Class<?>> clsElement = annotationIntrospector.collectAnnotations(parameter.getType());
final CustomizationBuilder builder = new ClassCustomizationBuilder();
final ClassCustomizationBuilder builder = new ClassCustomizationBuilder();
builder.setAdapterInfo(annotationIntrospector.getAdapterBinding(clsElement));
builder.setDeserializerBinding(annotationIntrospector.getDeserializerBinding(clsElement));
builder.setSerializerBinding(annotationIntrospector.getSerializerBinding(clsElement));
Expand Down
30 changes: 10 additions & 20 deletions src/main/java/org/eclipse/yasson/internal/model/PropertyModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,8 +113,8 @@ private JsonbSerializer<?> resolveCachedSerializer() {
if (!ReflectionUtils.isResolvedType(serializationType)) {
return null;
}
if (customization.getAdapterBinding() != null) {
return new AdaptedObjectSerializer<>(classModel, customization.getAdapterBinding());
if (customization.getSerializeAdapterBinding() != null) {
return new AdaptedObjectSerializer<>(classModel, customization.getSerializeAdapterBinding());
}
if (customization.getSerializerBinding() != null) {
return new UserSerializerSerializer<>(classModel, customization.getSerializerBinding().getJsonbSerializer());
Expand Down Expand Up @@ -147,14 +147,6 @@ public Type getPropertySerializationType() {
return getterMethodType == null ? propertyType : getterMethodType.getMethodType();
}

private AdapterBinding getUserAdapterBinding(Property property, JsonbContext jsonbContext) {
final AdapterBinding adapterBinding = jsonbContext.getAnnotationIntrospector().getAdapterBinding(property);
if (adapterBinding != null) {
return adapterBinding;
}
return jsonbContext.getComponentMatcher().getAdapterBinding(propertyType, null).orElse(null);
}

private SerializerBinding<?> getUserSerializerBinding(Property property, JsonbContext jsonbContext) {
final SerializerBinding serializerBinding = jsonbContext.getAnnotationIntrospector().getSerializerBinding(property);
if (serializerBinding != null) {
Expand Down Expand Up @@ -202,7 +194,14 @@ private PropertyCustomization introspectCustomization(Property property, JsonbCo
builder.setDeserializerBinding(introspector.getDeserializerBinding(property));
}

builder.setAdapterInfo(getUserAdapterBinding(property, jsonbContext));
final AdapterBinding adapterBinding = jsonbContext.getAnnotationIntrospector().getAdapterBinding(property);
if (adapterBinding != null) {
builder.setSerializeAdapter(adapterBinding);
builder.setDeserializeAdapter(adapterBinding);
} else {
builder.setSerializeAdapter(jsonbContext.getComponentMatcher().getSerializeAdapterBinding(getPropertySerializationType(), null).orElse(null));
builder.setDeserializeAdapter(jsonbContext.getComponentMatcher().getDeserializeAdapterBinding(getPropertyDeserializationType(), null).orElse(null));
}

introspectDateFormatter(property, introspector, builder, jsonbContext);
introspectNumberFormatter(property, introspector, builder);
Expand Down Expand Up @@ -326,15 +325,6 @@ public String getPropertyName() {
return propertyName;
}

/**
* Runtime type of a property. May be a TypeVariable or WildcardType.
*
* @return type of a property
*/
public Type getPropertyType() {
return propertyType;
}

/**
* Model of declaring class of this property.
* @return class model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
public interface ComponentBoundCustomization {

/**
* Adapter wrapper class with resolved generic information.
*
* @return components wrapper
* @return Adapter wrapper class with resolved generic information.
*/
AdapterBinding getSerializeAdapterBinding();

/**
* @return Adapter wrapper class with resolved generic information.
*/
AdapterBinding getAdapterBinding();
AdapterBinding getDeserializeAdapterBinding();

/**
* Serializer wrapper with resolved generic info.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public CustomizationBase(CustomizationBuilder builder) {
*/
public CustomizationBase(CustomizationBase other) {
this.nillable = other.isNillable();
this.adapterBinding = other.getAdapterBinding();
this.adapterBinding = other.getSerializeAdapterBinding();
this.serializerBinding = other.getSerializerBinding();
this.deserializerBinding = other.getDeserializerBinding();
}
Expand All @@ -50,12 +50,12 @@ public boolean isNillable() {
return nillable;
}

/**
* Adapter wrapper class with resolved generic information.
*
* @return components wrapper
*/
public AdapterBinding getAdapterBinding() {
public AdapterBinding getSerializeAdapterBinding() {
return adapterBinding;
}

@Override
public AdapterBinding getDeserializeAdapterBinding() {
return adapterBinding;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

package org.eclipse.yasson.internal.model.customization;

import org.eclipse.yasson.internal.components.AdapterBinding;
import org.eclipse.yasson.internal.serializer.JsonbDateFormatter;
import org.eclipse.yasson.internal.serializer.JsonbNumberFormatter;

Expand All @@ -24,22 +25,21 @@
public class PropertyCustomization extends CustomizationBase {

private final String jsonReadName;

private final String jsonWriteName;

private final JsonbNumberFormatter serializeNumberFormatter;

private final JsonbNumberFormatter deserializeNumberFormatter;

private final JsonbDateFormatter serializeDateFormatter;

private final JsonbDateFormatter deserializeDateFormatter;

private final AdapterBinding serializeAdapter;
private final AdapterBinding deserializeAdapter;

private boolean readTransient;

private boolean writeTransient;

private final Class implementationClass;
private final Class<?> implementationClass;

/**
* Copies properties from builder an creates immutable instance.
Expand All @@ -48,6 +48,8 @@ public class PropertyCustomization extends CustomizationBase {
*/
public PropertyCustomization(PropertyCustomizationBuilder builder) {
super(builder);
this.serializeAdapter = builder.getSerializeAdapter();
this.deserializeAdapter = builder.getDeserializeAdapter();
this.jsonReadName = builder.getJsonReadName();
this.jsonWriteName = builder.getJsonWriteName();
this.serializeNumberFormatter = builder.getSerializeNumberFormatter();
Expand Down Expand Up @@ -121,8 +123,18 @@ public boolean isWriteTransient() {
*
* @return class implementing property interface
*/
public Class getImplementationClass() {
public Class<?> getImplementationClass() {
return implementationClass;
}

@Override
public AdapterBinding getDeserializeAdapterBinding() {
return deserializeAdapter;
}

@Override
public AdapterBinding getSerializeAdapterBinding() {
return serializeAdapter;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

package org.eclipse.yasson.internal.model.customization;

import org.eclipse.yasson.internal.components.AdapterBinding;
import org.eclipse.yasson.internal.serializer.JsonbDateFormatter;
import org.eclipse.yasson.internal.serializer.JsonbNumberFormatter;

Expand All @@ -24,20 +25,19 @@
public class PropertyCustomizationBuilder extends CustomizationBuilder {

private String jsonReadName;

private String jsonWriteName;

private JsonbNumberFormatter serializeNumberFormatter;

private JsonbNumberFormatter deserializeNumberFormatter;

private JsonbDateFormatter serializeDateFormatter;

private JsonbDateFormatter deserializeDateFormatter;

private boolean readTransient;

private boolean writeTransient;

private AdapterBinding serializeAdapter;
private AdapterBinding deserializeAdapter;

private Class implementationClass;

Expand Down Expand Up @@ -212,4 +212,30 @@ public Class getImplementationClass() {
public void setImplementationClass(Class implementationClass) {
this.implementationClass = implementationClass;
}

@Override
public void setAdapterInfo(AdapterBinding adapterInfo) {
throw new UnsupportedOperationException();
}

@Override
public AdapterBinding getAdapterInfo() {
return null;
}

public AdapterBinding getSerializeAdapter() {
return serializeAdapter;
}

public void setSerializeAdapter(AdapterBinding adapter) {
this.serializeAdapter = adapter;
}

public AdapterBinding getDeserializeAdapter() {
return deserializeAdapter;
}

public void setDeserializeAdapter(AdapterBinding adapter) {
this.deserializeAdapter = adapter;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@ public DeserializerBuilder withJsonValueType(JsonParser.Event event) {
*
* @return built item
*/
@SuppressWarnings("unchecked")
public JsonbDeserializer<?> build() {
runtimeType = resolveRuntimeType();
Class<?> rawType = ReflectionUtils.getRawType(getRuntimeType());
Expand All @@ -95,7 +94,7 @@ public JsonbDeserializer<?> build() {
}

//Second user components is registered.
Optional<AdapterBinding> adapterBinding = componentMatcher.getAdapterBinding(getRuntimeType(), componentBoundCustomization);
Optional<AdapterBinding> adapterBinding = componentMatcher.getDeserializeAdapterBinding(getRuntimeType(), componentBoundCustomization);
if (adapterBinding.isPresent()) {
adapterInfoOptional = adapterBinding;
runtimeType = adapterInfoOptional.get().getToType();
Expand Down Expand Up @@ -247,7 +246,7 @@ private Type resolveRuntimeType() {

private Class<?> getInterfaceMappedType(Class<?> interfaceType) {
if (interfaceType.isInterface()) {
Class implementationClass = null;
Class<?> implementationClass = null;
//annotation
if (customization instanceof PropertyCustomization) {
implementationClass = ((PropertyCustomization) customization).getImplementationClass();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public void appendResult(Object result) {
if (model == null) {
return;
}
values.put(model.getReadName(), new ValueWrapper(model, convertNullToOptionalEmpty(model.getPropertyType(), result)));
values.put(model.getReadName(), new ValueWrapper(model, convertNullToOptionalEmpty(model.getPropertyDeserializationType(), result)));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ private void marshallProperty(T object, JsonGenerator generator, SerializationCo
return;
}

Optional<Type> runtimeTypeOptional = ReflectionUtils.resolveOptionalType(this, propertyModel.getPropertyType());
Optional<Type> runtimeTypeOptional = ReflectionUtils.resolveOptionalType(this, propertyModel.getPropertySerializationType());
Type genericType = runtimeTypeOptional.orElse(null);
final JsonbSerializer<?> serializer = new SerializerBuilder(marshaller.getJsonbContext())
.withWrapper(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public JsonbSerializer<?> build() {
}

//Second user components is registered.
Optional<AdapterBinding> adapterInfoOptional = componentMatcher.getAdapterBinding(getRuntimeType(), customization);
Optional<AdapterBinding> adapterInfoOptional = componentMatcher.getSerializeAdapterBinding(getRuntimeType(), customization);
if (adapterInfoOptional.isPresent()) {
return new AdaptedObjectSerializer<>(classModel, adapterInfoOptional.get());
}
Expand Down

0 comments on commit ee060ce

Please sign in to comment.