Skip to content

Commit c7d52a6

Browse files
committed
reader listener support
1 parent 03d98a9 commit c7d52a6

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed

modules/swagger-jaxrs2/src/main/java/io/swagger/jaxrs2/Reader.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,37 @@ public int compare(Class<?> class1, Class<?> class2) {
132132
});
133133
sortedClasses.addAll(classes);
134134

135+
Map<Class<?>, ReaderListener> listeners = new HashMap<>();
136+
137+
for (Class<?> cls : sortedClasses) {
138+
if (ReaderListener.class.isAssignableFrom(cls) && !listeners.containsKey(cls)) {
139+
try {
140+
listeners.put(cls, (ReaderListener) cls.newInstance());
141+
} catch (Exception e) {
142+
LOGGER.error("Failed to create ReaderListener", e);
143+
}
144+
}
145+
}
146+
147+
for (ReaderListener listener : listeners.values()) {
148+
try {
149+
listener.beforeScan(this, openAPI);
150+
} catch (Exception e) {
151+
LOGGER.error("Unexpected error invoking beforeScan listener [" + listener.getClass().getName() + "]", e);
152+
}
153+
}
154+
135155
for (Class<?> cls : sortedClasses) {
136156
read(cls, "");
137157
}
138158

159+
for (ReaderListener listener : listeners.values()) {
160+
try {
161+
listener.afterScan(this, openAPI);
162+
} catch (Exception e) {
163+
LOGGER.error("Unexpected error invoking afterScan listener [" + listener.getClass().getName() + "]", e);
164+
}
165+
}
139166
return openAPI;
140167
}
141168

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.swagger.jaxrs2;
2+
3+
import io.swagger.oas.models.OpenAPI;
4+
5+
/**
6+
* Listener providing hooks for customizing automatically generated OpenAPI definitions in a JAX-RS
7+
* environment. Any classes picked up during the scanning process implementing this interface will
8+
* be instantiated via newInstance() and invoked before and after generating OpenAPI definitions, allowing
9+
* code to add additional data or change the generated definition.
10+
*/
11+
12+
public interface ReaderListener {
13+
14+
/**
15+
* Called before the OpenAPI definition gets populated from scanned classes. Use this method to
16+
* pre-process the OpenAPI definition before it gets populated.
17+
*
18+
* @param reader the reader used to read annotations and build the openAPI definition
19+
* @param openAPI the initial OpenAPI definition
20+
*/
21+
22+
void beforeScan(Reader reader, OpenAPI openAPI);
23+
24+
/**
25+
* Called after a OpenAPI definition has been populated from scanned classes. Use this method to
26+
* post-process OpenAPI definitions.
27+
*
28+
* @param reader the reader used to read annotations and build the OpenAPI definition
29+
* @param openAPI the configured OpenAPI definition
30+
*/
31+
32+
void afterScan(Reader reader, OpenAPI openAPI);
33+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package io.swagger.jaxrs2.annotations.readerListener;
2+
3+
import io.swagger.jaxrs2.Reader;
4+
import io.swagger.jaxrs2.resources.ReaderListenerResource;
5+
import io.swagger.oas.models.OpenAPI;
6+
import org.testng.annotations.Test;
7+
8+
import java.util.Collections;
9+
10+
import static org.testng.Assert.assertEquals;
11+
import static org.testng.Assert.assertNotNull;
12+
13+
public class ReaderListenerTest {
14+
15+
@Test(description = "test a readerListener resource")
16+
public void testReaderListener() throws Exception{
17+
Reader reader = new Reader(new OpenAPI());
18+
OpenAPI openAPI = reader.read(Collections.singleton(ReaderListenerResource.class));
19+
assertNotNull(openAPI);
20+
assertEquals(openAPI.getTags().get(0).getName(), "Tag-added-before-read");
21+
assertEquals(openAPI.getTags().get(1).getName(), "Tag-added-after-read");
22+
}
23+
24+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.swagger.jaxrs2.resources;
2+
3+
import io.swagger.jaxrs2.Reader;
4+
import io.swagger.jaxrs2.ReaderListener;
5+
import io.swagger.oas.annotations.Operation;
6+
import io.swagger.oas.annotations.Parameter;
7+
import io.swagger.oas.annotations.media.Schema;
8+
import io.swagger.oas.models.OpenAPI;
9+
import io.swagger.oas.models.tags.Tag;
10+
11+
import javax.ws.rs.GET;
12+
import javax.ws.rs.Path;
13+
import javax.ws.rs.QueryParam;
14+
import javax.ws.rs.core.Response;
15+
16+
public class ReaderListenerResource implements ReaderListener {
17+
18+
@GET
19+
@Path("/")
20+
@Operation(operationId = "operationId",
21+
summary = "Operation Summary",
22+
description = "Operation Description")
23+
public Response getSummaryAndDescription(@QueryParam("subscriptionId") @Parameter(in = "path", name = "subscriptionId",
24+
required = true, description = "parameter description",
25+
allowEmptyValue = true, allowReserved = true,
26+
schema = @Schema(
27+
type = "string",
28+
format = "uuid",
29+
description = "the generated UUID",
30+
readOnly = true)
31+
) String subscriptionId,
32+
@QueryParam("description") String description) {
33+
return Response.ok().entity("ok").build();
34+
}
35+
36+
@Override
37+
public void beforeScan(Reader reader, OpenAPI openAPI) {
38+
openAPI.addTagsItem(new Tag().name("Tag-added-before-read"));
39+
}
40+
41+
@Override
42+
public void afterScan(Reader reader, OpenAPI openAPI) {
43+
openAPI.addTagsItem(new Tag().name("Tag-added-after-read"));
44+
}
45+
}

0 commit comments

Comments
 (0)