Skip to content

Commit

Permalink
Switch to using MethodHandles for property value propagations
Browse files Browse the repository at this point in the history
Signed-off-by: Gyúróczki Gergő <gergonoorbi@gmail.com>
  • Loading branch information
Degubi committed Jul 11, 2020
1 parent 03d49c0 commit 14bc19a
Show file tree
Hide file tree
Showing 9 changed files with 250 additions and 628 deletions.
42 changes: 19 additions & 23 deletions src/main/java/org/eclipse/yasson/internal/ClassParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,14 @@
import java.util.stream.Collectors;

import jakarta.json.bind.JsonbException;
import jakarta.json.bind.config.PropertyVisibilityStrategy;

import org.eclipse.yasson.internal.model.ClassModel;
import org.eclipse.yasson.internal.model.CreatorModel;
import org.eclipse.yasson.internal.model.JsonbAnnotatedElement;
import org.eclipse.yasson.internal.model.JsonbCreator;
import org.eclipse.yasson.internal.model.Property;
import org.eclipse.yasson.internal.model.PropertyModel;
import org.eclipse.yasson.internal.model.ReflectionPropagation;
import org.eclipse.yasson.internal.model.customization.CreatorCustomization;
import org.eclipse.yasson.internal.properties.MessageKeys;
import org.eclipse.yasson.internal.properties.Messages;

Expand Down Expand Up @@ -90,8 +89,7 @@ void parseProperties(ClassModel classModel, JsonbAnnotatedElement<Class<?>> clas
sortedPropertyModels.forEach(propertyModel -> {
for (CreatorModel creatorModel : creator.getParams()) {
if (creatorModel.getName().equals(propertyModel.getPropertyName())) {
CreatorCustomization customization = (CreatorCustomization) creatorModel.getCustomization();
customization.setPropertyModel(propertyModel);
creatorModel.getCustomization().setPropertyModel(propertyModel);
}
}
});
Expand All @@ -101,7 +99,7 @@ void parseProperties(ClassModel classModel, JsonbAnnotatedElement<Class<?>> clas

}

private void mergePropertyModels(List<PropertyModel> unsortedMerged) {
private static void mergePropertyModels(List<PropertyModel> unsortedMerged) {
PropertyModel[] clone = unsortedMerged.toArray(new PropertyModel[unsortedMerged.size()]);
for (int i = 0; i < clone.length; i++) {
for (int j = i + 1; j < clone.length; j++) {
Expand Down Expand Up @@ -205,7 +203,7 @@ private void parseMethods(Class<?> clazz,
* Filter out certain methods that get forcibly added to some classes.
* For example the public groovy.lang.MetaClass X.getMetaClass() method from Groovy classes
*/
private boolean isSpecialCaseMethod(Class<?> clazz, Method m) {
private static boolean isSpecialCaseMethod(Class<?> clazz, Method m) {
if (!Modifier.isPublic(m.getModifiers()) || Modifier.isStatic(m.getModifiers()) || m.isSynthetic()) {
return false;
}
Expand All @@ -223,19 +221,19 @@ private boolean isSpecialCaseMethod(Class<?> clazz, Method m) {
return false;
}

private boolean isGetter(Method m) {
private static boolean isGetter(Method m) {
return (m.getName().startsWith(GET_PREFIX) || m.getName().startsWith(IS_PREFIX)) && m.getParameterCount() == 0;
}

private boolean isSetter(Method m) {
private static boolean isSetter(Method m) {
return m.getName().startsWith(SET_PREFIX) && m.getParameterCount() == 1;
}

private String toPropertyMethod(String name) {
private static String toPropertyMethod(String name) {
return lowerFirstLetter(name.substring(name.startsWith(IS_PREFIX) ? 2 : 3, name.length()));
}

private String lowerFirstLetter(String name) {
private static String lowerFirstLetter(String name) {
Objects.requireNonNull(name);
if (name.length() == 0) {
//methods named get() or set()
Expand All @@ -251,11 +249,11 @@ private String lowerFirstLetter(String name) {
return new String(chars);
}

private boolean isPropertyMethod(Method m) {
private static boolean isPropertyMethod(Method m) {
return isGetter(m) || isSetter(m);
}

private void parseFields(JsonbAnnotatedElement<Class<?>> classElement, Map<String, Property> classProperties) {
private static void parseFields(JsonbAnnotatedElement<Class<?>> classElement, Map<String, Property> classProperties) {
Field[] declaredFields = AccessController.doPrivileged(
(PrivilegedAction<Field[]>) () -> classElement.getElement().getDeclaredFields());
for (Field field : declaredFields) {
Expand All @@ -269,7 +267,7 @@ private void parseFields(JsonbAnnotatedElement<Class<?>> classElement, Map<Strin
}
}

private void checkPropertyNameClash(List<PropertyModel> collectedProperties, Class<?> cls) {
private static void checkPropertyNameClash(List<PropertyModel> collectedProperties, Class<?> cls) {
final List<PropertyModel> checkedProperties = new ArrayList<>();
for (PropertyModel collectedPropertyModel : collectedProperties) {
for (PropertyModel checkedPropertyModel : checkedProperties) {
Expand Down Expand Up @@ -312,10 +310,9 @@ private List<PropertyModel> getSortedParentProperties(ClassModel classModel,
} else {
//merge
final Property merged = mergeProperty(current, parentProp, classElement);
ReflectionPropagation propagation = new ReflectionPropagation(current,
classModel.getClassCustomization()
.getPropertyVisibilityStrategy());
if (propagation.isReadable()) {
PropertyVisibilityStrategy propertyVisibilityStrategy = classModel.getClassCustomization().getPropertyVisibilityStrategy();

if (PropertyModel.isPropertyReadable(current.getField(), current.getGetter(), propertyVisibilityStrategy)) {
classProperties.replace(current.getName(), merged);
} else {
sortedProperties.add(new PropertyModel(classModel, merged, jsonbContext));
Expand Down Expand Up @@ -348,20 +345,20 @@ private List<PropertyModel> getSortedParentProperties(ClassModel classModel,
* @param parent parent implementation
* @return effective method to register as getter or setter
*/
private Method selectMostSpecificNonDefaultMethod(Method current, Method parent) {
private static Method selectMostSpecificNonDefaultMethod(Method current, Method parent) {
return (
current != null ? (
parent != null && current.isDefault()
&& !parent.isDefault() ? parent : current) : parent);
}

private Property mergeProperty(Property current, PropertyModel parentProp, JsonbAnnotatedElement<Class<?>> classElement) {
private static Property mergeProperty(Property current, PropertyModel parentProp, JsonbAnnotatedElement<Class<?>> classElement) {
Field field = current.getField() != null
? current.getField() : parentProp.getPropagation().getField();
? current.getField() : parentProp.getField();
Method getter = selectMostSpecificNonDefaultMethod(current.getGetter(),
parentProp.getPropagation().getGetter());
parentProp.getGetter());
Method setter = selectMostSpecificNonDefaultMethod(current.getSetter(),
parentProp.getPropagation().getSetter());
parentProp.getSetter());

Property merged = new Property(parentProp.getPropertyName(), classElement);
if (field != null) {
Expand All @@ -375,5 +372,4 @@ private Property mergeProperty(Property current, PropertyModel parentProp, Jsonb
}
return merged;
}

}

This file was deleted.

This file was deleted.

0 comments on commit 14bc19a

Please sign in to comment.