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

Commit 79c2348

Browse files
authored
Merge pull request swagger-api#1068 from Talend/master
OpenAPIV3Parser#getExtensions() not finding extensions on OSGi swagger-api#1003
2 parents 7160ffb + 3dd768e commit 79c2348

2 files changed

Lines changed: 38 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 a list of extensions
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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1803,6 +1803,23 @@ public void shouldParseExternalSchemaModelHavingReferenceToItsLocalModel() {
18031803
assertThat(((Schema) modelSchema.getProperties().get("id")).get$ref(), equalTo("#/components/schemas/ValueId"));
18041804
}
18051805

1806+
1807+
@Test(description = "Test that extensions can be found on the class classloader in addition to tccl.")
1808+
public void testIssue1003_ExtensionsClassloader() {
1809+
ClassLoader tccl = Thread.currentThread().getContextClassLoader();
1810+
OpenAPI api = null;
1811+
try {
1812+
// Temporarily switch tccl to an unproductive cl
1813+
final ClassLoader tcclTemp = new java.net.URLClassLoader(new java.net.URL[] {},
1814+
ClassLoader.getSystemClassLoader());
1815+
Thread.currentThread().setContextClassLoader(tcclTemp);
1816+
api = new OpenAPIV3Parser().read("src/test/resources/test.yaml");
1817+
} finally {
1818+
Thread.currentThread().setContextClassLoader(tccl);
1819+
}
1820+
assertNotNull(api);
1821+
}
1822+
18061823
@Test
18071824
public void shouldParseApiWithMultipleParameterReferences() {
18081825
// given
@@ -1821,6 +1838,7 @@ public void shouldParseApiWithMultipleParameterReferences() {
18211838
assertThat(parameters.get("NameParam").getName(), equalTo("name"));
18221839

18231840
assertThat(result.getMessages(), equalTo(emptyList()));
1841+
18241842
}
18251843

18261844
private static int getDynamicPort() {

0 commit comments

Comments
 (0)