diff --git a/neverpile-commons-actuator/src/main/java/com/neverpile/common/actuate/InfoContributorAutoConfiguration.java b/neverpile-commons-actuator/src/main/java/com/neverpile/common/actuate/InfoContributorAutoConfiguration.java index 066f2f5..983a455 100644 --- a/neverpile-commons-actuator/src/main/java/com/neverpile/common/actuate/InfoContributorAutoConfiguration.java +++ b/neverpile-commons-actuator/src/main/java/com/neverpile/common/actuate/InfoContributorAutoConfiguration.java @@ -4,6 +4,7 @@ import org.springframework.boot.actuate.autoconfigure.info.InfoContributorProperties; import org.springframework.boot.actuate.info.GitInfoContributor; import org.springframework.boot.actuate.info.InfoContributor; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate; @@ -11,15 +12,13 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.info.GitProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; /** * Auto-configuration for info contributors. */ -@Configuration( - proxyBeanMethods = false) +@AutoConfiguration @AutoConfigureAfter(ProjectInfoAutoConfiguration.class) @EnableConfigurationProperties(InfoContributorProperties.class) public class InfoContributorAutoConfiguration { diff --git a/neverpile-commons-authorization/pom.xml b/neverpile-commons-authorization/pom.xml index 3e18991..489c245 100644 --- a/neverpile-commons-authorization/pom.xml +++ b/neverpile-commons-authorization/pom.xml @@ -26,7 +26,7 @@ org.springframework.boot - spring-boot-starter-oauth2-resource-server + spring-boot-starter-security-oauth2-resource-server true diff --git a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/api/AuthorizationService.java b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/api/AuthorizationService.java index cf67ad5..cdc3808 100644 --- a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/api/AuthorizationService.java +++ b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/api/AuthorizationService.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.Set; -import org.springframework.boot.web.servlet.server.Session; import org.springframework.http.HttpRequest; import com.neverpile.common.authorization.policy.AccessPolicy; @@ -17,7 +16,7 @@ *

* Further sources of input for decisions will usually be rights, roles scopes etc. of the principal * attempting the access as well as possibly other information like the current {@link HttpRequest}, - * the {@link Session}, configuration information (e.g. an {@link AccessPolicy}) or other factors. + * the Session, configuration information (e.g. an {@link AccessPolicy}) or other factors. * However, these sources are not mandated by this interface and must thus be propagated by other * means. */ diff --git a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/AccessPolicy.java b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/AccessPolicy.java index 475596e..7af2c5b 100644 --- a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/AccessPolicy.java +++ b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/AccessPolicy.java @@ -1,5 +1,6 @@ package com.neverpile.common.authorization.policy; +import java.io.Serial; import java.io.Serializable; import java.time.Instant; import java.util.ArrayList; @@ -39,6 +40,7 @@ * editors, log output etc. to describe the policy in human-readable form. */ public class AccessPolicy implements Serializable { + @Serial private static final long serialVersionUID = 1L; private static final String VERISON_1 = "2018-09-26"; diff --git a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/JwtClaimAuthenticationMatcher.java b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/JwtClaimAuthenticationMatcher.java index 49b8adc..3430d85 100644 --- a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/JwtClaimAuthenticationMatcher.java +++ b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/JwtClaimAuthenticationMatcher.java @@ -8,7 +8,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.context.expression.MapAccessor; import org.springframework.expression.AccessException; import org.springframework.expression.EvaluationContext; import org.springframework.expression.EvaluationException; @@ -18,14 +17,15 @@ import org.springframework.expression.TypedValue; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.DataBindingMethodResolver; +import org.springframework.expression.spel.support.MapAccessor; import org.springframework.expression.spel.support.SimpleEvaluationContext; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; @Component @ConditionalOnClass(JwtAuthenticationToken.class) @@ -68,8 +68,8 @@ public TypedValue read(final EvaluationContext context, final Object target, fin private Object nodeToValue(final JsonNode v) { if (v.isMissingNode()) return null; - if (v.isTextual()) - return v.asText(); + if (v.isString()) + return v.asString(); if (v.isFloatingPointNumber()) return v.asDouble(); if (v.isNumber()) @@ -107,8 +107,7 @@ public void write(final EvaluationContext context, final Object target, final St @Override public boolean matchAuthentication(final Authentication authentication, final List subjects) { - if (authentication instanceof JwtAuthenticationToken) { - JwtAuthenticationToken jwtToken = (JwtAuthenticationToken) authentication; + if (authentication instanceof JwtAuthenticationToken jwtToken) { // expose all claims as variables Map claims = jwtToken.getToken().getClaims(); @@ -130,8 +129,8 @@ public boolean matchAuthentication(final Authentication authentication, final Li Object result = expression.getValue(ctx, Object.class); if (null == result) { outcome = false; - } else if (result instanceof Boolean) { - outcome = (Boolean) result; + } else if (result instanceof Boolean booleanValue) { + outcome = booleanValue; } else { outcome = true; } diff --git a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/PolicyBasedAuthorizationService.java b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/PolicyBasedAuthorizationService.java index 696fe6e..a9b00f8 100644 --- a/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/PolicyBasedAuthorizationService.java +++ b/neverpile-commons-authorization/src/main/java/com/neverpile/common/authorization/policy/impl/PolicyBasedAuthorizationService.java @@ -19,8 +19,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import com.neverpile.common.authorization.api.Action; import com.neverpile.common.authorization.api.AuthorizationContext; import com.neverpile.common.authorization.api.AuthorizationService; @@ -265,18 +264,10 @@ private boolean matchesWildcardAction(final String key, final Collection private boolean satisfiesConditions(final AccessRule rule, final AuthorizationContext conditionContext) { boolean m = rule.getConditions().matches(conditionContext); - if (LOGGER.isDebugEnabled()) - try { - LOGGER.debug(" Rule '{}' the context {} the conditions {}", rule.getName(), - m ? "SATISFIES" : "does not satisfy", - new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(rule.getConditions())); - } catch (JsonProcessingException e) { - LOGGER.debug( - " Rule '{}' the context {} the conditions (but could not write the conditions as JSON, because of {})", - rule.getName(), m ? "SATISFIES" : "does not satisfy", e.getMessage()); - } - + LOGGER.debug(" Rule '{}' the context {} the conditions {}", rule.getName(), + m ? "SATISFIES" : "does not satisfy", + new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(rule.getConditions())); return m; } } diff --git a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/Config.java b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/Config.java index 9f77129..218dd8e 100644 --- a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/Config.java +++ b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/Config.java @@ -1,25 +1,21 @@ package com.neverpile.authorization; import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -import com.fasterxml.jackson.databind.util.StdDateFormat; import com.neverpile.common.condition.config.ConditionModule; +import tools.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationModule; + @SpringBootConfiguration -@Import({ConditionModule.class +@Import({ + ConditionModule.class }) public class Config { @Bean - Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { - return b -> { - b.annotationIntrospector(new JacksonAnnotationIntrospector()); - b.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - b.dateFormat(new StdDateFormat()); - }; + JsonMapperBuilderCustomizer jacksonCustomizer() { + return builder -> builder.addModule(new JakartaXmlBindAnnotationModule()); } } diff --git a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/JwtClaimAuthenticationMatcherTest.java b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/JwtClaimAuthenticationMatcherTest.java index efc0729..f0c8374 100644 --- a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/JwtClaimAuthenticationMatcherTest.java +++ b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/JwtClaimAuthenticationMatcherTest.java @@ -12,7 +12,7 @@ import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import com.neverpile.common.authorization.policy.impl.JwtClaimAuthenticationMatcher; public class JwtClaimAuthenticationMatcherTest { diff --git a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/PolicyPersistenceTest.java b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/PolicyPersistenceTest.java index 482ce6f..f16cbc3 100644 --- a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/PolicyPersistenceTest.java +++ b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/config/PolicyPersistenceTest.java @@ -12,8 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.json.JsonTest; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.exc.UnrecognizedPropertyException; import com.neverpile.common.authorization.policy.AccessPolicy; import com.neverpile.common.authorization.policy.AccessRule; import com.neverpile.common.authorization.policy.Effect; diff --git a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/policy/impl/PolicyBasedAuthorizationServiceTest.java b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/policy/impl/PolicyBasedAuthorizationServiceTest.java index 8ec3cd6..b5406e6 100644 --- a/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/policy/impl/PolicyBasedAuthorizationServiceTest.java +++ b/neverpile-commons-authorization/src/test/java/com/neverpile/authorization/policy/impl/PolicyBasedAuthorizationServiceTest.java @@ -11,10 +11,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import com.neverpile.common.authorization.api.Action; import com.neverpile.common.authorization.api.Permission; @@ -34,7 +34,7 @@ public class PolicyBasedAuthorizationServiceTest { @Autowired PolicyBasedAuthorizationService authService; - @MockBean + @MockitoBean PolicyRepository mockPolicyRepository; private final EmptyAuthorizationContext eac = new EmptyAuthorizationContext(); diff --git a/neverpile-commons-condition/pom.xml b/neverpile-commons-condition/pom.xml index 650dc0e..9dc9b66 100644 --- a/neverpile-commons-condition/pom.xml +++ b/neverpile-commons-condition/pom.xml @@ -20,6 +20,11 @@ spring-boot-starter-json + + tools.jackson.module + jackson-module-jakarta-xmlbind-annotations + + org.springframework.boot spring-boot-starter-test diff --git a/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/FalseCondition.java b/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/FalseCondition.java index 8213c00..0720450 100644 --- a/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/FalseCondition.java +++ b/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/FalseCondition.java @@ -12,6 +12,6 @@ public class FalseCondition extends AbstractTargetListCondition { @Override protected boolean eval(final Specifier s, final Object value) { - return null == value || (value instanceof Boolean ? !((Boolean) value) : !Boolean.parseBoolean(value.toString().trim())); + return null == value || (value instanceof Boolean b ? !b : !Boolean.parseBoolean(value.toString().trim())); } } diff --git a/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/TrueCondition.java b/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/TrueCondition.java index b2f6e53..9c5d528 100644 --- a/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/TrueCondition.java +++ b/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/TrueCondition.java @@ -14,6 +14,6 @@ public class TrueCondition extends AbstractTargetListCondition { protected boolean eval(final Specifier s, final Object value) { return null == value ? false : - value instanceof Boolean ? ((Boolean) value) : Boolean.valueOf(value.toString().trim()); + value instanceof Boolean b ? b : Boolean.valueOf(value.toString().trim()); } } diff --git a/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/config/ConditionModule.java b/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/config/ConditionModule.java index 4ffa75b..ab5878a 100644 --- a/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/config/ConditionModule.java +++ b/neverpile-commons-condition/src/main/java/com/neverpile/common/condition/config/ConditionModule.java @@ -2,8 +2,8 @@ import static java.util.stream.Collectors.toMap; -import java.io.IOException; import java.io.Serial; +import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -16,34 +16,36 @@ import org.springframework.context.annotation.Import; import org.springframework.stereotype.Component; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.DeserializationConfig; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.KeyDeserializer; -import com.fasterxml.jackson.databind.Module; -import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.deser.BeanDeserializer; -import com.fasterxml.jackson.databind.deser.BeanDeserializerBase; -import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier; -import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.ser.BeanSerializer; -import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; +import tools.jackson.core.JsonGenerator; +import tools.jackson.core.JsonParser; +import tools.jackson.core.JsonToken; +import tools.jackson.core.Version; +import tools.jackson.databind.BeanDescription; +import tools.jackson.databind.DeserializationConfig; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.ValueDeserializer; +import tools.jackson.databind.ValueSerializer; +import tools.jackson.databind.KeyDeserializer; +import tools.jackson.databind.JacksonModule; +import tools.jackson.databind.SerializationConfig; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.deser.ValueDeserializerModifier; +import tools.jackson.databind.deser.bean.BeanDeserializer; +import tools.jackson.databind.exc.UnrecognizedPropertyException; +import tools.jackson.databind.module.SimpleModule; +import tools.jackson.databind.ser.BeanPropertyWriter; +import tools.jackson.databind.ser.BeanSerializer; +import tools.jackson.databind.ser.UnrolledBeanSerializer; +import tools.jackson.databind.ser.ValueSerializerModifier; + import com.neverpile.common.condition.CompositeCondition; import com.neverpile.common.condition.Condition; import com.neverpile.common.condition.CoreConditionRegistry; import com.neverpile.common.specifier.Specifier; /** - * A Jackson {@link Module} extending Jackson with capabilities for the marshalling and + * A Jackson {@link JacksonModule} extending Jackson with capabilities for the marshalling and * unmarshalling of {@link Condition}s. *

* The {@link Condition} type hierarchy is supposed to be extensible. To that end, a @@ -68,10 +70,10 @@ public ConditionModule() { setSerializerModifier(new ConditionSerializerModifier()); setDeserializerModifier(new ConditionDeserializerModifier()); - addKeySerializer(Specifier.class, new JsonSerializer<>() { + addKeySerializer(Specifier.class, new ValueSerializer<>() { @Override - public void serialize(final Specifier value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException { - gen.writeFieldName(value.asString()); + public void serialize(final Specifier value, final JsonGenerator gen, final SerializationContext serializers) { + gen.writeName(value.asString()); } }); addKeyDeserializer(Specifier.class, new KeyDeserializer() { @@ -92,8 +94,8 @@ private void init() { .collect(toMap(Map.Entry::getValue, Map.Entry::getKey)); // invert mapping } - public class ConditionSerializerModifier extends BeanSerializerModifier { - public class CompositeConditionSerializer extends BeanSerializer { + public class ConditionSerializerModifier extends ValueSerializerModifier { + public class CompositeConditionSerializer extends BeanSerializer implements Serializable { @Serial private static final long serialVersionUID = 1L; @@ -101,10 +103,13 @@ public CompositeConditionSerializer(final BeanSerializer serializer) { super(serializer); } + public CompositeConditionSerializer(UnrolledBeanSerializer serializer) { + super(serializer); + } + @Override - protected void serializeFields(final Object bean, final JsonGenerator gen, final SerializerProvider provider) - throws IOException { - super.serializeFields(bean, gen, provider); + protected void _serializePropertiesNoView(final Object bean, final JsonGenerator gen, final SerializationContext provider, BeanPropertyWriter[] props) { + super._serializePropertiesNoView(bean, gen, provider, props); CompositeCondition dto = (CompositeCondition) bean; @@ -120,10 +125,10 @@ protected void serializeFields(final Object bean, final JsonGenerator gen, final throw new IllegalArgumentException( "Cannot serialize condition of type " + c.getClass() + ": name cannot be resolved"); - provider.defaultSerializeField(name, c, gen); + provider.defaultSerializeProperty(name, c, gen); } } else { - gen.writeFieldName("conditions"); + gen.writeName("conditions"); gen.writeStartArray(); for (Condition c : dto.getConditions()) { String name = conditionNameByClass.get(c.getClass()); @@ -133,7 +138,7 @@ protected void serializeFields(final Object bean, final JsonGenerator gen, final "Cannot serialize condition of type " + c.getClass() + ": name cannot be resolved"); gen.writeStartObject(); - provider.defaultSerializeField(name, c, gen); + provider.defaultSerializeProperty(name, c, gen); gen.writeEndObject(); } gen.writeEndArray(); @@ -142,35 +147,35 @@ protected void serializeFields(final Object bean, final JsonGenerator gen, final } @Override - public JsonSerializer modifySerializer(final SerializationConfig config, final BeanDescription beanDesc, - final JsonSerializer serializer) { - if (CompositeCondition.class.isAssignableFrom(beanDesc.getBeanClass())) { + public ValueSerializer modifySerializer(final SerializationConfig config, final BeanDescription.Supplier beanDesc, + final ValueSerializer serializer) { + if (CompositeCondition.class.isAssignableFrom(beanDesc.getBeanClass()) && serializer instanceof BeanSerializer) { return new CompositeConditionSerializer((BeanSerializer) serializer); + } else if (CompositeCondition.class.isAssignableFrom(beanDesc.getBeanClass()) && serializer instanceof UnrolledBeanSerializer) { + return new CompositeConditionSerializer((UnrolledBeanSerializer) serializer); } return serializer; } } - public class ConditionDeserializerModifier extends BeanDeserializerModifier { + public class ConditionDeserializerModifier extends ValueDeserializerModifier { - public class CompositeConditionDeserializer extends BeanDeserializer { + public class CompositeConditionDeserializer extends BeanDeserializer implements Serializable { @Serial private static final long serialVersionUID = 1L; - public CompositeConditionDeserializer(final BeanDeserializerBase base) { + public CompositeConditionDeserializer(final BeanDeserializer base) { super(base); - } - private void deserializeNamedCondition(final JsonParser p, final DeserializationContext ctxt, final Object beanOrClass, final String conditionName) - throws IOException { + private void deserializeNamedCondition(final JsonParser p, final DeserializationContext ctxt, final Object beanOrClass, final String conditionName) { Class conditionClass = conditionClassByName.get(conditionName); if (null == conditionClass) throw UnrecognizedPropertyException.from(p, beanOrClass, conditionName, new ArrayList<>(conditionClassByName.keySet())); else { JavaType valueType = ctxt.getTypeFactory().constructType(conditionClass); - JsonDeserializer deserializer = ctxt.findRootValueDeserializer(valueType); + ValueDeserializer deserializer = ctxt.findRootValueDeserializer(valueType); Object value = deserializer.deserialize(p, ctxt); ((CompositeCondition) beanOrClass).addCondition((Condition) value); } @@ -178,12 +183,12 @@ private void deserializeNamedCondition(final JsonParser p, final Deserialization @Override protected void handleUnknownProperty(final JsonParser p, final DeserializationContext ctxt, - final Object beanOrClass, final String propName) throws IOException { + final Object beanOrClass, final String propName) { deserializeNamedCondition(p, ctxt, beanOrClass, propName); } @Override - protected void handleIgnoredProperty(final JsonParser p, final DeserializationContext ctxt, final Object beanOrClass, final String propName) throws IOException { + protected void handleIgnoredProperty(final JsonParser p, final DeserializationContext ctxt, final Object beanOrClass, final String propName) { /* * Support conditions in an array named "conditions" for cases when the condition names are not unique. * @@ -240,7 +245,7 @@ protected void handleIgnoredProperty(final JsonParser p, final DeserializationCo case END_OBJECT: break; // end loop - case FIELD_NAME: + case PROPERTY_NAME: String conditionName = p.currentName(); // The deserializer for a named condition expects to be located @@ -281,10 +286,10 @@ protected void handleIgnoredProperty(final JsonParser p, final DeserializationCo } @Override - public JsonDeserializer modifyDeserializer(final DeserializationConfig config, final BeanDescription beanDesc, - final JsonDeserializer deserializer) { - if (CompositeCondition.class.isAssignableFrom(beanDesc.getBeanClass())) { - return new CompositeConditionDeserializer((BeanDeserializerBase) deserializer); + public ValueDeserializer modifyDeserializer(final DeserializationConfig config, BeanDescription.Supplier beanDescRef, + final ValueDeserializer deserializer) { + if (CompositeCondition.class.isAssignableFrom(beanDescRef.getBeanClass()) && deserializer instanceof BeanDeserializer bs) { + return new CompositeConditionDeserializer(bs); } return deserializer; } diff --git a/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/ConditionEvaluationTest.java b/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/ConditionEvaluationTest.java index 37ccc13..a30a23f 100644 --- a/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/ConditionEvaluationTest.java +++ b/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/ConditionEvaluationTest.java @@ -7,11 +7,11 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.test.autoconfigure.json.JsonTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import com.neverpile.common.specifier.Specifier; -import static org.mockito.BDDMockito.*; +import static org.mockito.BDDMockito.given; @JsonTest public class ConditionEvaluationTest { @@ -29,7 +29,7 @@ public boolean matches(final ConditionContext context) { } }; - @MockBean + @MockitoBean ConditionContext ctx; @Test diff --git a/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/Config.java b/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/Config.java index c13ea80..c201564 100644 --- a/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/Config.java +++ b/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/Config.java @@ -1,26 +1,21 @@ package com.neverpile.common.condition; import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; -import com.fasterxml.jackson.databind.util.StdDateFormat; import com.neverpile.common.condition.config.ConditionModule; +import tools.jackson.module.jakarta.xmlbind.JakartaXmlBindAnnotationModule; + @SpringBootConfiguration @Import({ ConditionModule.class }) public class Config { @Bean - Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { - return b -> { - b.annotationIntrospector(new JacksonAnnotationIntrospector()); - b.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - b.dateFormat(new StdDateFormat()); - }; + JsonMapperBuilderCustomizer jacksonCustomizer() { + return builder -> builder.addModule(new JakartaXmlBindAnnotationModule()); } } diff --git a/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/json/ConditionJsonMarshallingTest.java b/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/json/ConditionJsonMarshallingTest.java index 01620f1..208f8b7 100644 --- a/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/json/ConditionJsonMarshallingTest.java +++ b/neverpile-commons-condition/src/test/java/com/neverpile/common/condition/json/ConditionJsonMarshallingTest.java @@ -8,7 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.json.JsonTest; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import com.neverpile.common.condition.AndCondition; import com.neverpile.common.condition.EqualsCondition; import com.neverpile.common.condition.ExistsCondition; diff --git a/neverpile-commons-locking/pom.xml b/neverpile-commons-locking/pom.xml index 5dca0d6..b9b3a75 100644 --- a/neverpile-commons-locking/pom.xml +++ b/neverpile-commons-locking/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot - spring-boot-starter-web + spring-boot-starter-webmvc org.springframework.boot @@ -34,6 +34,11 @@ + + org.springframework.boot + spring-boot-starter-data-jpa-test + test + com.h2database h2 @@ -48,16 +53,6 @@ org.springframework.boot spring-boot-starter-test test - - - junit - junit - - - org.junit.vintage - junit-vintage-engine - - org.junit.jupiter @@ -67,6 +62,7 @@ io.rest-assured rest-assured + ${rest-assured.version} test diff --git a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/LockedException.java b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/LockedException.java index 58b49a4..c40a97a 100644 --- a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/LockedException.java +++ b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/LockedException.java @@ -1,10 +1,14 @@ package com.neverpile.common.locking; +import java.io.Serial; + + import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.LOCKED) public class LockedException extends RuntimeException { + @Serial private static final long serialVersionUID = 1L; public LockedException(String message) { diff --git a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/jpa/JPALockService.java b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/jpa/JPALockService.java index deafa59..bf9a81c 100644 --- a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/jpa/JPALockService.java +++ b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/jpa/JPALockService.java @@ -12,7 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.stereotype.Service; diff --git a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/ConflictException.java b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/ConflictException.java index b310229..618bfaa 100644 --- a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/ConflictException.java +++ b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/ConflictException.java @@ -1,9 +1,13 @@ package com.neverpile.common.locking.rest; +import java.io.Serial; + + import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.CONFLICT, reason = "Locked by other party") public class ConflictException extends Exception { + @Serial private static final long serialVersionUID = 1L; } diff --git a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NoContestException.java b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NoContestException.java index 75f8d78..ec07745 100644 --- a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NoContestException.java +++ b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NoContestException.java @@ -1,10 +1,14 @@ package com.neverpile.common.locking.rest; +import java.io.Serial; + + import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.BAD_REQUEST, reason = "Can not contest this lock. (There is no lock for this scope or you are the locks owner)") public class NoContestException extends Exception { + @Serial private static final long serialVersionUID = 1L; } diff --git a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NotFoundException.java b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NotFoundException.java index 7471cfe..a6ee02f 100644 --- a/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NotFoundException.java +++ b/neverpile-commons-locking/src/main/java/com/neverpile/common/locking/rest/NotFoundException.java @@ -1,9 +1,13 @@ package com.neverpile.common.locking.rest; +import java.io.Serial; + + import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @ResponseStatus(code = HttpStatus.NOT_FOUND, reason = "No such lock") public class NotFoundException extends Exception { + @Serial private static final long serialVersionUID = 1L; } diff --git a/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/jpa/JPALockServiceTest.java b/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/jpa/JPALockServiceTest.java index 02bb178..7da00aa 100644 --- a/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/jpa/JPALockServiceTest.java +++ b/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/jpa/JPALockServiceTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.data.jpa.test.autoconfigure.DataJpaTest; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.transaction.TestTransaction; diff --git a/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/LockServiceResourceTest.java b/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/LockServiceResourceTest.java index 9479779..8f1ad80 100644 --- a/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/LockServiceResourceTest.java +++ b/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/LockServiceResourceTest.java @@ -9,17 +9,15 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; import org.mockito.BDDMockito; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Bean; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import com.neverpile.common.locking.LockService; import com.neverpile.common.locking.LockService.LockRequestResult; @@ -28,9 +26,8 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; -@ExtendWith(SpringExtension.class) @SpringBootTest( - webEnvironment = WebEnvironment.RANDOM_PORT, properties = "server.error.include-message=always") + webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.web.error.include-message=always") @EnableAutoConfiguration public class LockServiceResourceTest { @TestConfiguration @@ -44,7 +41,7 @@ public LockServiceResource lsr() { @LocalServerPort int port; - @MockBean + @MockitoBean LockService mockLockService; @BeforeEach diff --git a/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/NoOpLockServiceResourceTest.java b/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/NoOpLockServiceResourceTest.java index 4573b33..99ddad9 100644 --- a/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/NoOpLockServiceResourceTest.java +++ b/neverpile-commons-locking/src/test/java/com/neverpile/common/locking/rest/NoOpLockServiceResourceTest.java @@ -6,14 +6,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.web.server.LocalServerPort; import org.springframework.context.annotation.Bean; -import org.springframework.test.context.junit.jupiter.SpringExtension; import com.neverpile.common.locking.LockService.LockRequestResult; import com.neverpile.common.locking.LockService.LockState; @@ -21,9 +19,8 @@ import io.restassured.RestAssured; import io.restassured.http.ContentType; -@ExtendWith(SpringExtension.class) @SpringBootTest( - webEnvironment = WebEnvironment.RANDOM_PORT, properties = "server.error.include-message=always") + webEnvironment = WebEnvironment.RANDOM_PORT, properties = "spring.web.error.include-message=always") @EnableAutoConfiguration public class NoOpLockServiceResourceTest { @TestConfiguration diff --git a/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/JsonOpenApiFragment.java b/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/JsonOpenApiFragment.java index 53a4ec2..32cc9da 100644 --- a/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/JsonOpenApiFragment.java +++ b/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/JsonOpenApiFragment.java @@ -4,8 +4,8 @@ import java.io.IOException; import java.io.InputStream; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.node.ObjectNode; /** * A JSON-node-based implementation of {@link OpenApiFragment}. @@ -15,7 +15,7 @@ public class JsonOpenApiFragment implements OpenApiFragment { private final String name; - private ObjectNode root = new ObjectMapper().createObjectNode(); + private ObjectNode root = new JsonMapper().createObjectNode(); /** * Create a global fragment with the given name. Add contents to it by setting the root node @@ -51,7 +51,7 @@ public String getName() { @Override public InputStream getFragmentStream() throws IOException { - return new ByteArrayInputStream(new ObjectMapper().writeValueAsBytes(root)); + return new ByteArrayInputStream(new JsonMapper().writeValueAsBytes(root)); } /** diff --git a/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/SecurityFragment.java b/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/SecurityFragment.java index 58a2bce..bd2b1bb 100644 --- a/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/SecurityFragment.java +++ b/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/SecurityFragment.java @@ -1,7 +1,7 @@ package com.neverpile.common.openapi; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; /** * An {@link OpenApiFragment} used to declare {@code securityScheme}s and endpoint {@code security}. @@ -16,7 +16,7 @@ public class SecurityFragment extends JsonOpenApiFragment { public SecurityFragment(final String name) { super(name); - schemesNode = getRoot().with("components").with("securitySchemes"); + schemesNode = getRoot().withObjectProperty("components").withObjectProperty("securitySchemes"); securityNode = getRoot().withArray("security"); } @@ -35,7 +35,7 @@ public SecurityFragment(final String name) { * @return a security fragment */ public SecurityFragment withBasicAuth() { - getSchemesNode().with("basicAuth").put("type", "http").put("scheme", "basic"); + getSchemesNode().withObjectProperty("basicAuth").put("type", "http").put("scheme", "basic"); getSecurityNode().addObject().withArray("basicAuth"); return this; } @@ -70,7 +70,7 @@ public FlowBuilder withRefreshUrl(final String url) { } public FlowBuilder withScope(final String scope, final String description) { - flowNode.with("scopes").put(scope, description); + flowNode.withObjectProperty("scopes").put(scope, description); return this; } @@ -89,7 +89,7 @@ public OAuthFragmentBuilder(final SecurityFragment securityFragment, final Objec } public FlowBuilder withFlow(final OAuthFlowType type) { - return new FlowBuilder(this, oauthNode.with("flows").with(type.name())); + return new FlowBuilder(this, oauthNode.withObjectProperty("flows").withObjectProperty(type.name())); } public SecurityFragment complete() { @@ -120,7 +120,7 @@ public SecurityFragment complete() { */ // @formatter:on public OAuthFragmentBuilder withOAuth() { - ObjectNode oauthNode = getSchemesNode().with("oAuth").put("type", "oauth2"); + ObjectNode oauthNode = getSchemesNode().withObjectProperty("oAuth").put("type", "oauth2"); getSecurityNode().addObject().withArray("oAuth"); return new OAuthFragmentBuilder(this, oauthNode); } diff --git a/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/ServersFragment.java b/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/ServersFragment.java index c3c9bc2..6097729 100644 --- a/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/ServersFragment.java +++ b/neverpile-commons-openapi/src/main/java/com/neverpile/common/openapi/ServersFragment.java @@ -1,6 +1,6 @@ package com.neverpile.common.openapi; -import com.fasterxml.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ArrayNode; /** * An {@link OpenApiFragment} used to declare {@code servers}s at which the endpoints are exposed. diff --git a/neverpile-commons-opentelemetry/pom.xml b/neverpile-commons-opentelemetry/pom.xml index 4263151..81f30f4 100644 --- a/neverpile-commons-opentelemetry/pom.xml +++ b/neverpile-commons-opentelemetry/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot - spring-boot-starter-aop + spring-boot-starter-aspectj diff --git a/neverpile-commons-opentracing/pom.xml b/neverpile-commons-opentracing/pom.xml index 1b6724a..20bc088 100644 --- a/neverpile-commons-opentracing/pom.xml +++ b/neverpile-commons-opentracing/pom.xml @@ -16,7 +16,7 @@ org.springframework.boot - spring-boot-starter-aop + spring-boot-starter-aspectj diff --git a/neverpile-commons-opentracing/src/main/java/com/neverpile/common/opentracing/aspect/OpentracingAspect.java b/neverpile-commons-opentracing/src/main/java/com/neverpile/common/opentracing/aspect/OpentracingAspect.java index 018860a..d8d3640 100644 --- a/neverpile-commons-opentracing/src/main/java/com/neverpile/common/opentracing/aspect/OpentracingAspect.java +++ b/neverpile-commons-opentracing/src/main/java/com/neverpile/common/opentracing/aspect/OpentracingAspect.java @@ -19,7 +19,7 @@ import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; import org.springframework.util.ClassUtils; -import org.springframework.util.StringUtils; +import org.springframework.util.ObjectUtils; import com.neverpile.common.opentracing.Tag; import com.neverpile.common.opentracing.Tag.TagExtractor; @@ -104,7 +104,7 @@ private void setupTag(final MethodSignature signature, final int parameterIndex, } else { // otherwise build a single tag - String tagKey = !StringUtils.isEmpty(annotation.name()) + String tagKey = !ObjectUtils.isEmpty(annotation.name()) ? annotation.name() : findParameterName(signature, parameterIndex); Object value = arg; @@ -134,10 +134,10 @@ private String findParameterName(final MethodSignature signature, final int para private void setTag(final Span span, final String key, final Object value) { if (null == value) span.setTag(key, ""); - else if (value instanceof Number) - span.setTag(key, (Number) value); - else if (value instanceof Boolean) - span.setTag(key, (Boolean) value); + else if (value instanceof Number number) + span.setTag(key, number); + else if (value instanceof Boolean booleanValue) + span.setTag(key, booleanValue); else span.setTag(key, value.toString()); } @@ -152,7 +152,7 @@ private Span startSpan(final MethodSignature signature, final Object target) { private String getOperationName(final MethodSignature signature, final Object target) { String operationName; TraceInvocation newSpanAnnotation = signature.getMethod().getAnnotation(TraceInvocation.class); - if (StringUtils.isEmpty(newSpanAnnotation.operationName())) { + if (ObjectUtils.isEmpty(newSpanAnnotation.operationName())) { operationName = (target != null ? ClassUtils.getUserClass(target).getSimpleName() : signature.getDeclaringType().getSimpleName()) + "." + signature.getName(); diff --git a/neverpile-commons-swagger-ui/pom.xml b/neverpile-commons-swagger-ui/pom.xml index a576e3a..f21c59a 100644 --- a/neverpile-commons-swagger-ui/pom.xml +++ b/neverpile-commons-swagger-ui/pom.xml @@ -27,7 +27,7 @@ org.springframework.boot - spring-boot-starter-web + spring-boot-starter-webmvc org.springframework.boot @@ -35,16 +35,12 @@ io.swagger.core.v3 - swagger-annotations - - - io.swagger.core.v3 - swagger-models + swagger-models-jakarta - com.fasterxml.jackson.dataformat + tools.jackson.dataformat jackson-dataformat-yaml @@ -61,12 +57,12 @@ io.swagger.core.v3 - swagger-annotations + swagger-annotations-jakarta ${swagger.version} io.swagger.core.v3 - swagger-models + swagger-models-jakarta ${swagger.version} diff --git a/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiAutoConfiguration.java b/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiAutoConfiguration.java index 0425fc4..5ee8164 100644 --- a/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiAutoConfiguration.java +++ b/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiAutoConfiguration.java @@ -1,11 +1,11 @@ package com.neverpile.common.openapi.rest; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -@Configuration +@AutoConfiguration @EnableWebMvc @ConditionalOnProperty(name = "stage", havingValue = "test") public class OpenApiAutoConfiguration { diff --git a/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionMerger.java b/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionMerger.java index 0f7f72a..a76af4f 100644 --- a/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionMerger.java +++ b/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionMerger.java @@ -8,18 +8,18 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.dataformat.yaml.YAMLMapper; import com.neverpile.common.openapi.OpenApiFragment; import com.neverpile.common.specifier.Specifier; public class OpenApiDefinitionMerger { private static final Logger LOGGER = LoggerFactory.getLogger(OpenApiDefinitionMerger.class); - ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()); + ObjectMapper yamlMapper = new YAMLMapper(); public ObjectNode mergeFragments(final Collection fragments) throws IOException { ObjectNode merged = yamlMapper.createObjectNode(); @@ -28,7 +28,7 @@ public ObjectNode mergeFragments(final Collection fragments) th for (OpenApiFragment fragment : fragments) { try (InputStream is = fragment.getFragmentStream()) { JsonNode fragmentContent = yamlMapper.readTree(is); - fragmentContent.fields().forEachRemaining(e -> mergeField(e, merged, path)); + fragmentContent.properties().forEach(e -> mergeField(e, merged, path)); } } @@ -71,7 +71,7 @@ private void mergeField(final Map.Entry entry, final ObjectNod case OBJECT : if (!existing.isMissingNode()) { // objects are merged recursively - value.fields().forEachRemaining(e -> mergeField(e, (ObjectNode) existing, subPath)); + value.properties().forEach(e -> mergeField(e, (ObjectNode) existing, subPath)); } else { merged.set(name, value); } diff --git a/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionResource.java b/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionResource.java index 0039791..1ac4cad 100644 --- a/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionResource.java +++ b/neverpile-commons-swagger-ui/src/main/java/com/neverpile/common/openapi/rest/OpenApiDefinitionResource.java @@ -14,10 +14,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.node.ObjectNode; +import tools.jackson.dataformat.yaml.YAMLMapper; +import tools.jackson.dataformat.yaml.YAMLWriteFeature; + import com.neverpile.common.openapi.OpenApiFragment; @RestController @@ -66,11 +67,11 @@ public ResponseEntity mergedDefinitions(@RequestHeader("Accept") final List25 UTF-8 UTF-8 - 3.5.9 + 4.0.1 + 6.0.0