From f67ed2dc0fd580cd9244e06b60d17783caf2096b Mon Sep 17 00:00:00 2001 From: Fady Moussallam Date: Sat, 30 Mar 2019 10:16:47 +0100 Subject: [PATCH 1/2] OpenAPIV3Parser#getExtensions() not finding extensions on OSGi #1003 --- .../io/swagger/v3/parser/OpenAPIV3Parser.java | 23 ++++++++++++++++--- .../v3/parser/test/OpenAPIV3ParserTest.java | 13 +++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java index 58e9201f1f..26dfce3538 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java @@ -197,19 +197,36 @@ public SwaggerParseResult readContents(String swaggerAsString, List getExtensions() { + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + List extensions = getExtensions(tccl); + ClassLoader cl = SwaggerParserExtension.class.getClassLoader(); + if (cl != tccl) { + extensions.addAll(getExtensions(cl)); + } + extensions.add(0, new OpenAPIV3Parser()); + return extensions; + } + + protected List getExtensions(ClassLoader cl) { List extensions = new ArrayList<>(); - ServiceLoader loader = ServiceLoader.load(SwaggerParserExtension.class); + ServiceLoader loader = ServiceLoader.load(SwaggerParserExtension.class, cl); Iterator itr = loader.iterator(); while (itr.hasNext()) { extensions.add(itr.next()); } - extensions.add(0, new OpenAPIV3Parser()); return extensions; } - /** + /** * Transform the swagger-model version of AuthorizationValue into a parser-specific one, to avoid * dependencies across extensions * diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index e858a1642c..e422b38500 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -1801,6 +1801,19 @@ public void shouldParseExternalSchemaModelHavingReferenceToItsLocalModel() { assertThat(((Schema) modelSchema.getProperties().get("id")).get$ref(), equalTo("#/components/schemas/ValueId")); } + @Test(description = "Test that extensions can be found on the class classloader in addition to tccl.") + public void testIssue1003_ExtensionsClassloader() { + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + try { + // Temporarily switch tccl to an unproductive cl + final ClassLoader tcclTemp = new java.net.URLClassLoader(new java.net.URL[] {}, ClassLoader.getSystemClassLoader()); + Thread.currentThread().setContextClassLoader(tcclTemp); + assertNotNull(new OpenAPIV3Parser().read("src/test/resources/test.yaml")); + } finally { + Thread.currentThread().setContextClassLoader(tccl); + } + } + private static int getDynamicPort() { return new Random().ints(10000, 20000).findFirst().getAsInt(); } From 420ac9923d012de7a29b67c8ff09bc8aa8484321 Mon Sep 17 00:00:00 2001 From: Fady Moussallam Date: Sat, 30 Mar 2019 10:59:31 +0100 Subject: [PATCH 2/2] OpenAPIV3Parser#getExtensions() not finding extensions on OSGi #1003 (formatting) --- .../io/swagger/v3/parser/OpenAPIV3Parser.java | 4 ++-- .../v3/parser/test/OpenAPIV3ParserTest.java | 21 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java index 26dfce3538..2dffb33439 100644 --- a/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java +++ b/modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java @@ -202,10 +202,10 @@ public SwaggerParseResult readContents(String swaggerAsString, List getExtensions() { - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); List extensions = getExtensions(tccl); ClassLoader cl = SwaggerParserExtension.class.getClassLoader(); if (cl != tccl) { diff --git a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java index e422b38500..5724380a79 100644 --- a/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java +++ b/modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIV3ParserTest.java @@ -1803,15 +1803,18 @@ public void shouldParseExternalSchemaModelHavingReferenceToItsLocalModel() { @Test(description = "Test that extensions can be found on the class classloader in addition to tccl.") public void testIssue1003_ExtensionsClassloader() { - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); - try { - // Temporarily switch tccl to an unproductive cl - final ClassLoader tcclTemp = new java.net.URLClassLoader(new java.net.URL[] {}, ClassLoader.getSystemClassLoader()); - Thread.currentThread().setContextClassLoader(tcclTemp); - assertNotNull(new OpenAPIV3Parser().read("src/test/resources/test.yaml")); - } finally { - Thread.currentThread().setContextClassLoader(tccl); - } + ClassLoader tccl = Thread.currentThread().getContextClassLoader(); + OpenAPI api = null; + try { + // Temporarily switch tccl to an unproductive cl + final ClassLoader tcclTemp = new java.net.URLClassLoader(new java.net.URL[] {}, + ClassLoader.getSystemClassLoader()); + Thread.currentThread().setContextClassLoader(tcclTemp); + api = new OpenAPIV3Parser().read("src/test/resources/test.yaml"); + } finally { + Thread.currentThread().setContextClassLoader(tccl); + } + assertNotNull(api); } private static int getDynamicPort() {