Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
- name: Set up Java
uses: actions/setup-java@v1
with:
java-version: 11
java-version: 17
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/maven-pulls.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ 11, 17 ]
java: [ 17, 25 ]

steps:
- uses: actions/checkout@v4
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
java: [ 11, 17 ]
java: [ 17, 25 ]

steps:
- uses: actions/checkout@v4
Expand Down Expand Up @@ -41,7 +41,7 @@ jobs:
cd ../..
export MY_JAVA_VERSION=`java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1`
echo "JAVA VERSION" ${MY_JAVA_VERSION}
if [[ ${MY_JAVA_VERSION} == "11" ]];
if [[ ${MY_JAVA_VERSION} == "17" ]];
then
export MY_POM_VERSION=`./mvnw -q -Dexec.executable="echo" -Dexec.args='${projects.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.3.1:exec`
echo "POM VERSION" ${MY_POM_VERSION}
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/prepare-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Set up Java 11
- name: Set up Java 17
uses: actions/setup-java@v4
with:
java-version: 11
java-version: 17
distribution: temurin
server-id: central
server-username: MAVEN_USERNAME
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Set up Java 11
- name: Set up Java 17
uses: actions/setup-java@v4
with:
java-version: 11
java-version: 17
distribution: temurin
server-id: central
server-username: MAVEN_USERNAME
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,9 @@ If you're interested in the change history of swagger and the Swagger Core frame
### Prerequisites
You need the following installed and available in your $PATH:

* Java 11
* Java 17
* Apache maven 3.0.4 or greater
* Jackson 2.4.5 or greater
* Jackson 3.0.3 or greater


### To build from source (currently 2.2.42-SNAPSHOT)
Expand Down
17 changes: 10 additions & 7 deletions modules/swagger-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
Expand All @@ -70,16 +69,14 @@
<artifactId>jackson-annotations</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<groupId>tools.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<groupId>tools.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
Expand Down Expand Up @@ -121,6 +118,12 @@
<artifactId>logback-core</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package io.swagger.v3.core.converter;

import com.fasterxml.jackson.databind.type.TypeFactory;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.cfg.MapperBuilder;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.databind.type.TypeFactory;
import io.swagger.v3.core.jackson.ModelResolver;
import io.swagger.v3.core.util.Configuration;
import io.swagger.v3.core.util.Json;
Expand All @@ -20,6 +23,7 @@
import java.util.ServiceLoader;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;

public class ModelConverters {
private static ModelConverters SINGLETON = null;
Expand All @@ -30,8 +34,7 @@ public class ModelConverters {
private final Set<String> skippedClasses = new HashSet<>();

public ModelConverters() {
converters = new CopyOnWriteArrayList<>();
converters.add(new ModelResolver(Json.mapper()));
this(false);
}

public ModelConverters(boolean openapi31) {
Expand All @@ -52,6 +55,15 @@ public ModelConverters(boolean openapi31, Schema.SchemaResolution schemaResoluti
}
}

public ModelConverters(boolean openapi31, Consumer<MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>>> mapperBuilderCustomizer) {
converters = new CopyOnWriteArrayList<>();
if (openapi31) {
converters.add(new ModelResolver(Json31.mapper(mapperBuilderCustomizer)).openapi31(true));
} else {
converters.add(new ModelResolver(Json.mapper(mapperBuilderCustomizer)));
}
}

public ModelConverters(Configuration configuration) {
converters = new CopyOnWriteArrayList<>();
boolean openapi31 =configuration != null && configuration.isOpenAPI31() != null && configuration.isOpenAPI31();
Expand All @@ -67,20 +79,32 @@ public Set<String> getSkippedPackages() {
}

public static ModelConverters getInstance(boolean openapi31) {
return getInstance(openapi31, mapperBuilder -> {});
}

public static ModelConverters getInstance(boolean openapi31, Consumer<MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>>> mapperBuilderCustomizer) {
if (openapi31) {
if (SINGLETON31 == null) {
SINGLETON31 = new ModelConverters(openapi31);
SINGLETON31 = new ModelConverters(openapi31, mapperBuilderCustomizer);
init(SINGLETON31);
}
return SINGLETON31;
}
if (SINGLETON == null) {
SINGLETON = new ModelConverters(openapi31);
SINGLETON = new ModelConverters(openapi31, mapperBuilderCustomizer);
init(SINGLETON);
}
return SINGLETON;
}

public static ModelConverters getInstance() {
return getInstance(false);
}

public static ModelConverters getInstance(Consumer<MapperBuilder<? extends ObjectMapper, ? extends MapperBuilder<?, ?>>> mapperBuilderCustomizer) {
return getInstance(false, mapperBuilderCustomizer);
}

public static void reset() {
synchronized (ModelConverters.class) {
SINGLETON = null;
Expand Down Expand Up @@ -145,10 +169,6 @@ private static void init(ModelConverters converter) {
}

}
public static ModelConverters getInstance() {
return getInstance(false);
}


public void addConverter(ModelConverter converter) {
converters.add(0, converter);
Expand Down Expand Up @@ -233,7 +253,7 @@ public boolean isRegisteredAsSkippedClass(String className) {
}

private boolean shouldProcess(Type type) {
final Class<?> cls = TypeFactory.defaultInstance().constructType(type).getRawClass();
final Class<?> cls = TypeFactory.createDefaultInstance().constructType(type).getRawClass();
if (cls.isPrimitive()) {
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.swagger.v3.oas.models.responses.ApiResponses;
import io.swagger.v3.oas.models.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import tools.jackson.core.JacksonException;

import java.io.IOException;
import java.util.ArrayList;
Expand Down Expand Up @@ -290,7 +291,7 @@ protected Map<String, Schema> filterComponentsSchema(OpenAPISpecFilter filter, M
}
clonedComponentsSchema.put(key, clonedModel);

} catch (IOException e) {
} catch (JacksonException e) {
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package io.swagger.v3.core.jackson;

import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.AnnotationIntrospector;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyName;
import com.fasterxml.jackson.databind.jsontype.NamedType;
import com.fasterxml.jackson.databind.module.SimpleModule;
import tools.jackson.core.Version;
import tools.jackson.databind.AnnotationIntrospector;
import tools.jackson.databind.BeanDescription;
import tools.jackson.databind.JavaType;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.PropertyName;
import tools.jackson.databind.cfg.MapperBuilder;
import tools.jackson.databind.introspect.AccessorNamingStrategy;
import tools.jackson.databind.introspect.BasicBeanDescription;
import tools.jackson.databind.introspect.DefaultAccessorNamingStrategy;
import tools.jackson.databind.jsontype.NamedType;
import tools.jackson.databind.module.SimpleModule;
import io.swagger.v3.core.converter.AnnotatedType;
import io.swagger.v3.core.converter.ModelConverter;
import io.swagger.v3.core.converter.ModelConverterContext;
Expand All @@ -33,14 +37,16 @@ protected AbstractModelConverter(ObjectMapper mapper) {
}

protected AbstractModelConverter(ObjectMapper mapper, TypeNameResolver typeNameResolver) {
mapper.registerModule(
new SimpleModule("swagger", Version.unknownVersion()) {
_mapper = mapper.rebuild()
.addModule(new SimpleModule("swagger", Version.unknownVersion()) {
@Override
public void setupModule(SetupContext context) {
context.insertAnnotationIntrospector(new SwaggerAnnotationIntrospector());
}
});
_mapper = mapper;
})
.accessorNaming(new DefaultAccessorNamingStrategy.Provider()
.withFirstCharAcceptance(true, true))
.build();
_typeNameResolver = typeNameResolver;
}

Expand All @@ -61,7 +67,7 @@ public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterato
* @return the current AnnotationIntrospector
*/
protected AnnotationIntrospector _intr() {
return _mapper.getSerializationConfig().getAnnotationIntrospector();
return _mapper.serializationConfig().getAnnotationIntrospector();
}

protected String _typeName(JavaType type) {
Expand Down Expand Up @@ -95,10 +101,10 @@ protected String _findTypeName(JavaType type, BeanDescription beanDesc) {
return "List";
}
if (beanDesc == null) {
beanDesc = _mapper.getSerializationConfig().introspectClassAnnotations(type);
beanDesc = _mapper._serializationContext().introspectBeanDescription(type);
}

PropertyName rootName = _intr().findRootName(beanDesc.getClassInfo());
PropertyName rootName = _intr().findRootName(_mapper.serializationConfig(), beanDesc.getClassInfo());
if (rootName != null && rootName.hasSimpleName()) {
return rootName.getSimpleName();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,37 @@
package io.swagger.v3.core.jackson;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import tools.jackson.core.JacksonException;
import tools.jackson.core.JsonGenerator;

import io.swagger.v3.oas.models.responses.ApiResponses;
import tools.jackson.databind.SerializationContext;
import tools.jackson.databind.ValueSerializer;

import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;

public class ApiResponsesSerializer extends JsonSerializer<ApiResponses> {
public class ApiResponsesSerializer extends ValueSerializer<ApiResponses> {

@Override
public void serialize(
ApiResponses value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
ApiResponses value, JsonGenerator jgen, SerializationContext provider)
throws JacksonException {

if (value != null && value.getExtensions() != null && !value.getExtensions().isEmpty()) {
jgen.writeStartObject();

if (!value.isEmpty()) {
for (Entry<String, io.swagger.v3.oas.models.responses.ApiResponse> entry: value.entrySet()) {
jgen.writeObjectField(entry.getKey() , entry.getValue());
jgen.writePOJOProperty(entry.getKey() , entry.getValue());
}
}
for (Map.Entry<String, Object> entry: value.getExtensions().entrySet()) {
jgen.writeObjectField(entry.getKey(), entry.getValue());
jgen.writePOJOProperty(entry.getKey(), entry.getValue());
}
jgen.writeEndObject();
} else {
provider.defaultSerializeValue(value, jgen);
jgen.writePOJO(value);
}
}
}
Loading