Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Copyright 2017-2021 original authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.micronaut.serde.support.serializers;
import io.micronaut.context.BeanContext;
import io.micronaut.core.annotation.AnnotatedElement;
import io.micronaut.core.annotation.AnnotationMetadata;
import io.micronaut.core.annotation.Internal;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.annotation.Order;
import io.micronaut.core.beans.BeanIntrospection;
import io.micronaut.core.beans.BeanMethod;
import io.micronaut.core.beans.BeanReadProperty;
import io.micronaut.core.beans.UnsafeBeanReadProperty;
import io.micronaut.core.beans.exceptions.IntrospectionException;
import io.micronaut.core.naming.NameUtils;
import io.micronaut.core.order.OrderUtil;
import io.micronaut.core.order.Ordered;
import io.micronaut.core.type.Argument;
import io.micronaut.core.util.CollectionUtils;
import io.micronaut.inject.annotation.AnnotationMetadataHierarchy;
import io.micronaut.inject.qualifiers.Qualifiers;
import io.micronaut.serde.PropertyFilter;
import io.micronaut.serde.SerdeIntrospections;
import io.micronaut.serde.Serializer;
import io.micronaut.serde.config.SerdeConfiguration;
import io.micronaut.serde.config.SerializationConfiguration;
import io.micronaut.serde.config.annotation.SerdeConfig;
import io.micronaut.serde.config.naming.PropertyNamingStrategy;
import io.micronaut.serde.exceptions.SerdeException;
import io.micronaut.serde.support.util.SerdeAnnotationUtil;
import io.micronaut.serde.support.util.SerdeArgumentConf;
import io.micronaut.serde.support.util.SubtypeInfo;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Modifier;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.Function;
import java.util.function.Predicate;
@Internal
final class SerBean {
private static final Comparator> BEAN_PROPERTY_COMPARATOR = (o1, o2) -> OrderUtil.COMPARATOR.compare(
new Ordered() {
@Override
public int getOrder() {
return o1.intValue(Order.class).orElse(0);
}
}, new Ordered() {
@Override
public int getOrder() {
return o2.intValue(Order.class).orElse(0);
}
}
);
private static final String JK_PROP = "com.fasterxml.jackson.annotation.JsonProperty";
private static final String JACKSON_VALUE = "com.fasterxml.jackson.annotation.JsonValue";
// CHECKSTYLE:OFF
@NonNull
public final BeanIntrospection introspection;
public final List> writeProperties;
@Nullable
public final String wrapperProperty;
@Nullable
public final String arrayWrapperProperty;
@Nullable
public SerProperty jsonValue;
public final SerializationConfiguration configuration;
public final boolean simpleBean;
public final boolean subtyped;
public final PropertyFilter propertyFilter;
public final SubtypeInfo subtypeInfo;
@Nullable
private final SerdeArgumentConf serdeArgumentConf;
private volatile boolean initialized;
private volatile boolean initializing;
private List initializers = new ArrayList<>();
// CHECKSTYLE:ON
SerBean(Argument type,
SerdeIntrospections introspections,
Serializer.EncoderContext encoderContext,
@Nullable SerdeArgumentConf serdeArgumentConf,
SerializationConfiguration serializationConfiguration,
@Nullable BeanContext beanContext) throws SerdeException {
// !!! Avoid accessing annotations from the argument, the annotations are not included in the cache key
this.serdeArgumentConf = serdeArgumentConf;
this.configuration = encoderContext.getSerializationConfiguration().orElse(serializationConfiguration);
this.introspection = introspections.getSerializableIntrospection(type);
this.propertyFilter = getPropertyFilterIfPresent(beanContext, type.getSimpleName());
subtypeInfo = serdeArgumentConf == null ? null : serdeArgumentConf.getSubtypeInfo();
boolean allowIgnoredProperties = introspection.booleanValue(SerdeConfig.SerIgnored.class, SerdeConfig.SerIgnored.ALLOW_SERIALIZE).orElse(false);
@Nullable
Predicate argumentPropertyPredicate = serdeArgumentConf == null ? null : serdeArgumentConf.resolveAllowPropertyPredicate(allowIgnoredProperties);
PropertyNamingStrategy defaultPropertyNamingStrategy = encoderContext.getSerdeConfiguration().map(SerdeConfiguration::getPropertyNamingStrategy).orElse(null);
PropertyNamingStrategy entityPropertyNamingStrategy = getPropertyNamingStrategy(introspection, encoderContext, defaultPropertyNamingStrategy);
final Collection, AnnotationMetadata>> properties =
introspection.getBeanReadProperties().stream()
.filter(this::filterProperty)
.sorted(BEAN_PROPERTY_COMPARATOR)
.map(beanProperty -> {
Optional> constructorArgument = Arrays.stream(introspection.getConstructor().getArguments())
.filter(a -> a.getName().equals(beanProperty.getName()) && a.getType().equals(beanProperty.getType()))
.findFirst();
return constructorArgument., AnnotationMetadata>>map(argument -> new AbstractMap.SimpleEntry<>(
beanProperty,
new AnnotationMetadataHierarchy(argument.getAnnotationMetadata(), beanProperty.getAnnotationMetadata())
)).orElseGet(() -> new AbstractMap.SimpleEntry<>(
beanProperty,
beanProperty.getAnnotationMetadata()
));
})
.toList();
final Map.Entry, AnnotationMetadata> serPropEntry = properties.stream()
.filter(bp -> bp.getValue().hasAnnotation(SerdeConfig.SerValue.class) || bp.getValue().hasAnnotation(JACKSON_VALUE))
.findFirst().orElse(null);
if (serPropEntry != null) {
wrapperProperty = null;
BeanReadProperty beanProperty = serPropEntry.getKey();
final Argument