diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java index 2bf33ee823f..1056e854f8a 100644 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/DefaultCodegen.java @@ -1792,6 +1792,20 @@ public class DefaultCodegen { opList = new ArrayList(); operations.put(tag, opList); } + // check for operationId uniqueness + + String uniqueName = co.operationId; + int counter = 0; + for(CodegenOperation op : opList) { + if(uniqueName.equals(op.operationId)) { + uniqueName = co.operationId + "_" + counter; + counter ++; + } + } + if(!co.operationId.equals(uniqueName)) { + LOGGER.warn("generated unique operationId `" + uniqueName + "`"); + } + co.operationId = uniqueName; opList.add(co); co.baseName = tag; } diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java index 3ed3b131c85..ed83c89c8f0 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/DefaultGeneratorTest.java @@ -9,22 +9,16 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; +import java.io.*; import java.nio.charset.StandardCharsets; -import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.fail; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertNull; +import static org.testng.Assert.*; /** * Tests for DefaultGenerator logic @@ -182,6 +176,30 @@ public class DefaultGeneratorTest { assertTrue(pom.exists()); } + @Test + public void testGenerateUniqueOperationIds() { + final File output = folder.getRoot(); + + final Swagger swagger = new SwaggerParser().read("src/test/resources/2_0/duplicateOperationIds.yaml"); + CodegenConfig codegenConfig = new JavaClientCodegen(); + codegenConfig.setOutputDir(output.getAbsolutePath()); + + ClientOptInput clientOptInput = new ClientOptInput().opts(new ClientOpts()).swagger(swagger).config(codegenConfig); + + DefaultGenerator generator = new DefaultGenerator(); + generator.opts(clientOptInput); + + Map> paths = generator.processPaths(swagger.getPaths()); + Set opIds = new HashSet(); + for(String path : paths.keySet()) { + List ops = paths.get(path); + for(CodegenOperation op : ops) { + assertFalse(opIds.contains(op.operationId)); + opIds.add(op.operationId); + } + } + } + private void changeContent(File file) throws IOException { Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), UTF_8)); out.write(TEST_SKIP_OVERWRITE); @@ -198,5 +216,4 @@ public class DefaultGeneratorTest { } return null; } - } diff --git a/modules/swagger-codegen/src/test/resources/2_0/duplicateOperationIds.yaml b/modules/swagger-codegen/src/test/resources/2_0/duplicateOperationIds.yaml new file mode 100644 index 00000000000..f6d26797b7e --- /dev/null +++ b/modules/swagger-codegen/src/test/resources/2_0/duplicateOperationIds.yaml @@ -0,0 +1,21 @@ +--- +swagger: "2.0" +info: + version: "1.0.1" + title: "fun!" +basePath: "/v1" +paths: + /one: + get: + operationId: "duplicate" + parameters: [] + responses: + 200: + description: "success" + /two: + get: + operationId: "duplicate" + parameters: [] + responses: + 200: + description: "success"