Skip to content
This repository was archived by the owner on Nov 24, 2022. It is now read-only.

Commit f67ed2d

Browse files
committed
OpenAPIV3Parser#getExtensions() not finding extensions on OSGi swagger-api#1003
1 parent f94d751 commit f67ed2d

2 files changed

Lines changed: 33 additions & 3 deletions

File tree

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -197,19 +197,36 @@ public SwaggerParseResult readContents(String swaggerAsString, List<Authorizatio
197197
return result;
198198
}
199199

200+
/**
201+
* Locates extensions on the current thread class loader and then, if it differs
202+
* from this class classloader (as in OSGi), locates extensions from this
203+
* class classloader as well.
204+
*
205+
* @return
206+
*/
200207
protected List<SwaggerParserExtension> getExtensions() {
208+
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
209+
List<SwaggerParserExtension> extensions = getExtensions(tccl);
210+
ClassLoader cl = SwaggerParserExtension.class.getClassLoader();
211+
if (cl != tccl) {
212+
extensions.addAll(getExtensions(cl));
213+
}
214+
extensions.add(0, new OpenAPIV3Parser());
215+
return extensions;
216+
}
217+
218+
protected List<SwaggerParserExtension> getExtensions(ClassLoader cl) {
201219
List<SwaggerParserExtension> extensions = new ArrayList<>();
202220

203-
ServiceLoader<SwaggerParserExtension> loader = ServiceLoader.load(SwaggerParserExtension.class);
221+
ServiceLoader<SwaggerParserExtension> loader = ServiceLoader.load(SwaggerParserExtension.class, cl);
204222
Iterator<SwaggerParserExtension> itr = loader.iterator();
205223
while (itr.hasNext()) {
206224
extensions.add(itr.next());
207225
}
208-
extensions.add(0, new OpenAPIV3Parser());
209226
return extensions;
210227
}
211228

212-
/**
229+
/**
213230
* Transform the swagger-model version of AuthorizationValue into a parser-specific one, to avoid
214231
* dependencies across extensions
215232
*

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,6 +1801,19 @@ public void shouldParseExternalSchemaModelHavingReferenceToItsLocalModel() {
18011801
assertThat(((Schema) modelSchema.getProperties().get("id")).get$ref(), equalTo("#/components/schemas/ValueId"));
18021802
}
18031803

1804+
@Test(description = "Test that extensions can be found on the class classloader in addition to tccl.")
1805+
public void testIssue1003_ExtensionsClassloader() {
1806+
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
1807+
try {
1808+
// Temporarily switch tccl to an unproductive cl
1809+
final ClassLoader tcclTemp = new java.net.URLClassLoader(new java.net.URL[] {}, ClassLoader.getSystemClassLoader());
1810+
Thread.currentThread().setContextClassLoader(tcclTemp);
1811+
assertNotNull(new OpenAPIV3Parser().read("src/test/resources/test.yaml"));
1812+
} finally {
1813+
Thread.currentThread().setContextClassLoader(tccl);
1814+
}
1815+
}
1816+
18041817
private static int getDynamicPort() {
18051818
return new Random().ints(10000, 20000).findFirst().getAsInt();
18061819
}

0 commit comments

Comments
 (0)