@Override public void preprocessSwagger(Swagger swagger) { if (swagger != null && swagger.getPaths() != null) { for (String pathname : swagger.getPaths().keySet()) { Path path = swagger.getPath(pathname); if (path.getOperations() != null) { for (Operation operation : path.getOperations()) { boolean hasFormParameters = false; for (Parameter parameter : operation.getParameters()) { if (parameter instanceof FormParameter) { hasFormParameters = true; } } String defaultContentType = hasFormParameters ? "application/x-www-form-urlencoded" : "application/json"; String contentType = operation.getConsumes() == null || operation.getConsumes().isEmpty() ? defaultContentType : operation.getConsumes().get(0); String accepts = getAccept(operation); operation.setVendorExtension("x-contentType", contentType); operation.setVendorExtension("x-accepts", accepts); } } } } }
@Test public void resolveInlineBodyParameter() throws Exception { Swagger swagger = new Swagger(); swagger.path( "/hello", new Path() .get( new Operation() .parameter( new BodyParameter() .name("body") .schema( new ModelImpl() .property( "address", new ObjectProperty() .property("street", new StringProperty())) .property("name", new StringProperty()))))); new InlineModelResolver().flatten(swagger); Operation operation = swagger.getPaths().get("/hello").getGet(); BodyParameter bp = (BodyParameter) operation.getParameters().get(0); assertTrue(bp.getSchema() instanceof RefModel); Model body = swagger.getDefinitions().get("body"); assertTrue(body instanceof ModelImpl); ModelImpl impl = (ModelImpl) body; assertNotNull(impl.getProperties().get("address")); }
@Test public void testArrayResponse() { Swagger swagger = new Swagger(); ArrayProperty schema = new ArrayProperty(); schema.setItems(new ObjectProperty().property("name", new StringProperty())); swagger.path( "/foo/baz", new Path() .get( new Operation() .response( 200, new Response() .vendorExtension("x-foo", "bar") .description("it works!") .schema(schema)))); new InlineModelResolver().flatten(swagger); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); assertTrue(response.getSchema() instanceof ArrayProperty); ArrayProperty am = (ArrayProperty) response.getSchema(); Property items = am.getItems(); assertTrue(items instanceof ObjectProperty); ObjectProperty op = (ObjectProperty) items; Property name = op.getProperties().get("name"); assertTrue(name instanceof StringProperty); }
@Test public void testInlineMapResponse() throws Exception { Swagger swagger = new Swagger(); MapProperty schema = new MapProperty(); schema.setAdditionalProperties(new StringProperty()); swagger.path( "/foo/baz", new Path() .get( new Operation() .response( 200, new Response() .vendorExtension("x-foo", "bar") .description("it works!") .schema(schema)))); new InlineModelResolver().flatten(swagger); Json.prettyPrint(swagger); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); Property property = response.getSchema(); assertTrue(property instanceof MapProperty); assertTrue(swagger.getDefinitions().size() == 0); }
@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<String, List<CodegenOperation>> paths = generator.processPaths(swagger.getPaths()); Set<String> opIds = new HashSet<String>(); for (String path : paths.keySet()) { List<CodegenOperation> ops = paths.get(path); for (CodegenOperation op : ops) { assertFalse(opIds.contains(op.operationId)); opIds.add(op.operationId); } } }
@Test(description = "returns NSData when response format is binary") public void binaryDataTest() { final Swagger model = new SwaggerParser().read("src/test/resources/2_0/binaryDataTest.json"); final DefaultCodegen codegen = new SwiftCodegen(); final String path = "/tests/binaryResponse"; final Operation p = model.getPaths().get(path).getPost(); final CodegenOperation op = codegen.fromOperation(path, "post", p, model.getDefinitions()); Assert.assertEquals(op.returnType, "NSData"); Assert.assertEquals(op.bodyParam.dataType, "NSData"); Assert.assertTrue(op.bodyParam.isBinary); Assert.assertTrue(op.responses.get(0).isBinary); }
@Test public void testSecurityWithoutGlobal() throws Exception { final Swagger swagger = new SwaggerParser().read("src/test/resources/2_0/petstore.json"); CodegenConfig codegenConfig = new JavaClientCodegen(); ClientOptInput clientOptInput = new ClientOptInput().opts(new ClientOpts()).swagger(swagger).config(codegenConfig); DefaultGenerator gen = new DefaultGenerator(); gen.opts(clientOptInput); Map<String, List<CodegenOperation>> paths = gen.processPaths(swagger.getPaths()); CodegenSecurity cs, apiKey, petstoreAuth; // security of "getPetById": api_key CodegenOperation getPetById = findCodegenOperationByOperationId(paths, "getPetById"); assertEquals(getPetById.authMethods.size(), 2); cs = getPetById.authMethods.get(0); if ("api_key".equals(cs.name)) { apiKey = cs; petstoreAuth = getPetById.authMethods.get(1); } else { petstoreAuth = cs; apiKey = getPetById.authMethods.get(1); } assertEquals(petstoreAuth.name, "petstore_auth"); assertEquals(petstoreAuth.type, "oauth2"); assertEquals(apiKey.name, "api_key"); assertEquals(apiKey.type, "apiKey"); // security of "updatePetWithForm": petstore_auth CodegenOperation updatePetWithForm = findCodegenOperationByOperationId(paths, "updatePetWithForm"); assertEquals(updatePetWithForm.authMethods.size(), 1); petstoreAuth = updatePetWithForm.authMethods.iterator().next(); assertEquals(petstoreAuth.name, "petstore_auth"); assertEquals(petstoreAuth.type, "oauth2"); // security of "loginUser": null (no global security either) CodegenOperation loginUser = findCodegenOperationByOperationId(paths, "loginUser"); assertNull(loginUser.authMethods); }
@Test public void resolveInlineArrayBodyParameter() throws Exception { Swagger swagger = new Swagger(); swagger.path( "/hello", new Path() .get( new Operation() .parameter( new BodyParameter() .name("body") .schema( new ArrayModel() .items( new ObjectProperty() .property( "address", new ObjectProperty() .property("street", new StringProperty()))))))); new InlineModelResolver().flatten(swagger); Parameter param = swagger.getPaths().get("/hello").getGet().getParameters().get(0); assertTrue(param instanceof BodyParameter); BodyParameter bp = (BodyParameter) param; Model schema = bp.getSchema(); assertTrue(schema instanceof ArrayModel); ArrayModel am = (ArrayModel) schema; Property inner = am.getItems(); ObjectProperty op = (ObjectProperty) inner; Property name = op.getProperties().get("address"); assertTrue(name instanceof RefProperty); Model model = swagger.getDefinitions().get("hello_address"); assertNotNull(model); }
@Test public void testInlineResponseModel() throws Exception { Swagger swagger = new Swagger(); swagger .path( "/foo/bar", new Path() .get( new Operation() .response( 200, new Response() .description("it works!") .schema( new ObjectProperty().property("name", new StringProperty()))))) .path( "/foo/baz", new Path() .get( new Operation() .response( 200, new Response() .vendorExtension("x-foo", "bar") .description("it works!") .schema( new ObjectProperty().property("name", new StringProperty()))))); new InlineModelResolver().flatten(swagger); Map<String, Response> responses = swagger.getPaths().get("/foo/bar").getGet().getResponses(); Response response = responses.get("200"); assertNotNull(response); assertTrue(response.getSchema() instanceof RefProperty); ModelImpl model = (ModelImpl) swagger.getDefinitions().get("inline_response_200"); assertTrue(model.getProperties().size() == 1); assertNotNull(model.getProperties().get("name")); }
@Test public void resolveInlineArrayResponse() throws Exception { Swagger swagger = new Swagger(); swagger.path( "/foo/baz", new Path() .get( new Operation() .response( 200, new Response() .vendorExtension("x-foo", "bar") .description("it works!") .schema( new ArrayProperty() .items( new ObjectProperty() .property("name", new StringProperty())))))); new InlineModelResolver().flatten(swagger); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); assertNotNull(response); assertNotNull(response.getSchema()); Property responseProperty = response.getSchema(); // no need to flatten more assertTrue(responseProperty instanceof ArrayProperty); ArrayProperty ap = (ArrayProperty) responseProperty; Property p = ap.getItems(); assertNotNull(p); ObjectProperty innerModel = (ObjectProperty) p; assertTrue(innerModel.getProperties().size() == 1); assertNotNull(innerModel.getProperties().get("name")); }
@Test public void notResolveNonModelBodyParameter() throws Exception { Swagger swagger = new Swagger(); swagger.path( "/hello", new Path() .get( new Operation() .parameter( new BodyParameter() .name("body") .schema(new ModelImpl().type("string").format("binary"))))); new InlineModelResolver().flatten(swagger); Operation operation = swagger.getPaths().get("/hello").getGet(); BodyParameter bp = (BodyParameter) operation.getParameters().get(0); assertTrue(bp.getSchema() instanceof ModelImpl); ModelImpl m = (ModelImpl) bp.getSchema(); assertEquals("string", m.getType()); assertEquals("binary", m.getFormat()); }
@Test public void testInlineMapResponseWithObjectProperty() throws Exception { Swagger swagger = new Swagger(); MapProperty schema = new MapProperty(); schema.setAdditionalProperties(new ObjectProperty().property("name", new StringProperty())); swagger.path( "/foo/baz", new Path() .get( new Operation() .response( 200, new Response() .vendorExtension("x-foo", "bar") .description("it works!") .schema(schema)))); new InlineModelResolver().flatten(swagger); Response response = swagger.getPaths().get("/foo/baz").getGet().getResponses().get("200"); Property property = response.getSchema(); assertTrue(property instanceof RefProperty); Model inline = swagger.getDefinitions().get("inline_response_200"); assertTrue(inline instanceof ModelImpl); ModelImpl impl = (ModelImpl) inline; Property innerProperty = impl.getAdditionalProperties(); assertTrue(innerProperty instanceof ObjectProperty); ObjectProperty obj = (ObjectProperty) innerProperty; Property name = obj.getProperties().get("name"); assertTrue(name instanceof StringProperty); }
public Swagger filter( Swagger swagger, SwaggerSpecFilter filter, Map<String, List<String>> params, Map<String, String> cookies, Map<String, List<String>> headers) { Swagger clone = new Swagger(); clone .info(swagger.getInfo()) .tags(swagger.getTags() == null ? null : new ArrayList<Tag>(swagger.getTags())) .host(swagger.getHost()) .basePath(swagger.getBasePath()) .schemes(swagger.getSchemes()) .consumes(swagger.getConsumes()) .produces(swagger.getProduces()) .externalDocs(swagger.getExternalDocs()) .vendorExtensions(swagger.getVendorExtensions()); final Set<String> filteredTags = new HashSet<String>(); final Set<String> allowedTags = new HashSet<String>(); for (String resourcePath : swagger.getPaths().keySet()) { Path path = swagger.getPaths().get(resourcePath); Map<String, Operation> ops = new HashMap<String, Operation>(); ops.put("get", path.getGet()); ops.put("put", path.getPut()); ops.put("post", path.getPost()); ops.put("delete", path.getDelete()); ops.put("patch", path.getPatch()); ops.put("options", path.getOptions()); Path clonedPath = new Path(); for (String key : ops.keySet()) { Operation op = ops.get(key); if (op != null) { ApiDescription desc = new ApiDescription(resourcePath, key); final Set<String> tags; if (filter.isOperationAllowed(op, desc, params, cookies, headers)) { clonedPath.set(key, filterOperation(filter, op, desc, params, cookies, headers)); tags = allowedTags; } else { tags = filteredTags; } if (op.getTags() != null) { tags.addAll(op.getTags()); } } } if (!clonedPath.isEmpty()) { clone.path(resourcePath, clonedPath); } } final List<Tag> tags = clone.getTags(); filteredTags.removeAll(allowedTags); if (tags != null && !filteredTags.isEmpty()) { for (Iterator<Tag> it = tags.iterator(); it.hasNext(); ) { if (filteredTags.contains(it.next().getName())) { it.remove(); } } if (clone.getTags().isEmpty()) { clone.setTags(null); } } Map<String, Model> definitions = filterDefinitions(filter, swagger.getDefinitions(), params, cookies, headers); clone.setSecurityDefinitions(swagger.getSecurityDefinitions()); clone.setDefinitions(definitions); // isRemovingUnreferencedDefinitions is not defined in SwaggerSpecFilter to avoid breaking // compatibility with // existing client filters directly implementing SwaggerSpecFilter. if (filter instanceof AbstractSpecFilter) { if (((AbstractSpecFilter) filter).isRemovingUnreferencedDefinitions()) { clone = removeBrokenReferenceDefinitions(clone); } } return clone; }
private Swagger removeBrokenReferenceDefinitions(Swagger swagger) { if (swagger.getDefinitions() == null || swagger.getDefinitions().isEmpty()) return swagger; Set<String> referencedDefinitions = new TreeSet<String>(); if (swagger.getResponses() != null) { for (Response response : swagger.getResponses().values()) { String propertyRef = getPropertyRef(response.getSchema()); if (propertyRef != null) { referencedDefinitions.add(propertyRef); } } } if (swagger.getParameters() != null) { for (Parameter p : swagger.getParameters().values()) { if (p instanceof BodyParameter) { BodyParameter bp = (BodyParameter) p; Set<String> modelRef = getModelRef(bp.getSchema()); if (modelRef != null) { referencedDefinitions.addAll(modelRef); } } } } if (swagger.getPaths() != null) { for (Path path : swagger.getPaths().values()) { if (path.getParameters() != null) { for (Parameter p : path.getParameters()) { if (p instanceof BodyParameter) { BodyParameter bp = (BodyParameter) p; Set<String> modelRef = getModelRef(bp.getSchema()); if (modelRef != null) { referencedDefinitions.addAll(modelRef); } } } } if (path.getOperations() != null) { for (Operation op : path.getOperations()) { if (op.getResponses() != null) { for (Response response : op.getResponses().values()) { String propertyRef = getPropertyRef(response.getSchema()); if (propertyRef != null) { referencedDefinitions.add(propertyRef); } } } if (op.getParameters() != null) { for (Parameter p : op.getParameters()) { if (p instanceof BodyParameter) { BodyParameter bp = (BodyParameter) p; Set<String> modelRef = getModelRef(bp.getSchema()); if (modelRef != null) { referencedDefinitions.addAll(modelRef); } } } } } } } } if (swagger.getDefinitions() != null) { Set<String> nestedReferencedDefinitions = new TreeSet<String>(); for (String ref : referencedDefinitions) { locateReferencedDefinitions(ref, nestedReferencedDefinitions, swagger); } referencedDefinitions.addAll(nestedReferencedDefinitions); swagger.getDefinitions().keySet().retainAll(referencedDefinitions); } return swagger; }
@Override public List<File> generate() { Boolean generateApis = null; Boolean generateModels = null; Boolean generateSupportingFiles = null; Set<String> modelsToGenerate = null; Set<String> apisToGenerate = null; Set<String> supportingFilesToGenerate = null; // allows generating only models by specifying a CSV of models to generate, or empty for all if (System.getProperty("models") != null) { String modelNames = System.getProperty("models"); generateModels = true; if (!modelNames.isEmpty()) { modelsToGenerate = new HashSet<String>(Arrays.asList(modelNames.split(","))); } } if (System.getProperty("apis") != null) { String apiNames = System.getProperty("apis"); generateApis = true; if (!apiNames.isEmpty()) { apisToGenerate = new HashSet<String>(Arrays.asList(apiNames.split(","))); } } if (System.getProperty("supportingFiles") != null) { String supportingFiles = System.getProperty("supportingFiles"); generateSupportingFiles = true; if (!supportingFiles.isEmpty()) { supportingFilesToGenerate = new HashSet<String>(Arrays.asList(supportingFiles.split(","))); } } if (generateApis == null && generateModels == null && generateSupportingFiles == null) { // no specifics are set, generate everything generateApis = true; generateModels = true; generateSupportingFiles = true; } else { if (generateApis == null) { generateApis = false; } if (generateModels == null) { generateModels = false; } if (generateSupportingFiles == null) { generateSupportingFiles = false; } } if (swagger == null || config == null) { throw new RuntimeException("missing swagger input or config!"); } if (System.getProperty("debugSwagger") != null) { Json.prettyPrint(swagger); } List<File> files = new ArrayList<File>(); config.processOpts(); config.preprocessSwagger(swagger); config.additionalProperties().put("generatedDate", DateTime.now().toString()); config.additionalProperties().put("generatorClass", config.getClass().toString()); if (swagger.getInfo() != null) { Info info = swagger.getInfo(); if (info.getTitle() != null) { config.additionalProperties().put("appName", info.getTitle()); } if (info.getVersion() != null) { config.additionalProperties().put("appVersion", info.getVersion()); } if (info.getDescription() != null) { config .additionalProperties() .put("appDescription", config.escapeText(info.getDescription())); } if (info.getContact() != null) { Contact contact = info.getContact(); config.additionalProperties().put("infoUrl", contact.getUrl()); if (contact.getEmail() != null) { config.additionalProperties().put("infoEmail", contact.getEmail()); } } if (info.getLicense() != null) { License license = info.getLicense(); if (license.getName() != null) { config.additionalProperties().put("licenseInfo", license.getName()); } if (license.getUrl() != null) { config.additionalProperties().put("licenseUrl", license.getUrl()); } } if (info.getVersion() != null) { config.additionalProperties().put("version", info.getVersion()); } } StringBuilder hostBuilder = new StringBuilder(); String scheme; if (swagger.getSchemes() != null && swagger.getSchemes().size() > 0) { scheme = swagger.getSchemes().get(0).toValue(); } else { scheme = "https"; } hostBuilder.append(scheme); hostBuilder.append("://"); if (swagger.getHost() != null) { hostBuilder.append(swagger.getHost()); } else { hostBuilder.append("localhost"); } if (swagger.getBasePath() != null) { hostBuilder.append(swagger.getBasePath()); } String contextPath = swagger.getBasePath() == null ? "" : swagger.getBasePath(); String basePath = hostBuilder.toString(); String basePathWithoutHost = swagger.getBasePath(); // resolve inline models InlineModelResolver inlineModelResolver = new InlineModelResolver(); inlineModelResolver.flatten(swagger); List<Object> allOperations = new ArrayList<Object>(); List<Object> allModels = new ArrayList<Object>(); // models Map<String, Model> definitions = swagger.getDefinitions(); if (definitions != null) { List<String> sortedModelKeys = sortModelsByInheritance(definitions); if (generateModels) { if (modelsToGenerate != null && modelsToGenerate.size() > 0) { List<String> updatedKeys = new ArrayList<String>(); for (String m : sortedModelKeys) { if (modelsToGenerate.contains(m)) { updatedKeys.add(m); } } sortedModelKeys = updatedKeys; } for (String name : sortedModelKeys) { try { // don't generate models that have an import mapping if (config.importMapping().containsKey(name)) { continue; } Model model = definitions.get(name); Map<String, Model> modelMap = new HashMap<String, Model>(); modelMap.put(name, model); Map<String, Object> models = processModels(config, modelMap, definitions); models.putAll(config.additionalProperties()); allModels.add(((List<Object>) models.get("models")).get(0)); for (String templateName : config.modelTemplateFiles().keySet()) { String suffix = config.modelTemplateFiles().get(templateName); String filename = config.modelFileFolder() + File.separator + config.toModelFilename(name) + suffix; if (!config.shouldOverwrite(filename)) { continue; } String templateFile = getFullTemplateFile(config, templateName); String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() .withLoader( new Mustache.TemplateLoader() { @Override public Reader getTemplate(String name) { return getTemplateReader( getFullTemplateFile(config, name + ".mustache")); } }) .defaultValue("") .compile(template); writeToFile(filename, tmpl.execute(models)); files.add(new File(filename)); } } catch (Exception e) { throw new RuntimeException("Could not generate model '" + name + "'", e); } } } } if (System.getProperty("debugModels") != null) { System.out.println("############ Model info ############"); Json.prettyPrint(allModels); } // apis Map<String, List<CodegenOperation>> paths = processPaths(swagger.getPaths()); if (generateApis) { if (apisToGenerate != null && apisToGenerate.size() > 0) { Map<String, List<CodegenOperation>> updatedPaths = new TreeMap<String, List<CodegenOperation>>(); for (String m : paths.keySet()) { if (apisToGenerate.contains(m)) { updatedPaths.put(m, paths.get(m)); } } paths = updatedPaths; } for (String tag : paths.keySet()) { try { List<CodegenOperation> ops = paths.get(tag); Map<String, Object> operation = processOperations(config, tag, ops); operation.put("basePath", basePath); operation.put("basePathWithoutHost", basePathWithoutHost); operation.put("contextPath", contextPath); operation.put("baseName", tag); operation.put("modelPackage", config.modelPackage()); operation.putAll(config.additionalProperties()); operation.put("classname", config.toApiName(tag)); operation.put("classVarName", config.toApiVarName(tag)); operation.put("importPath", config.toApiImport(tag)); // Pass sortParamsByRequiredFlag through to the Mustache template... boolean sortParamsByRequiredFlag = true; if (this.config .additionalProperties() .containsKey(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG)) { sortParamsByRequiredFlag = Boolean.valueOf( (String) this.config .additionalProperties() .get(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG) .toString()); } operation.put("sortParamsByRequiredFlag", sortParamsByRequiredFlag); processMimeTypes(swagger.getConsumes(), operation, "consumes"); processMimeTypes(swagger.getProduces(), operation, "produces"); allOperations.add(new HashMap<String, Object>(operation)); for (int i = 0; i < allOperations.size(); i++) { Map<String, Object> oo = (Map<String, Object>) allOperations.get(i); if (i < (allOperations.size() - 1)) { oo.put("hasMore", "true"); } } for (String templateName : config.apiTemplateFiles().keySet()) { String filename = config.apiFilename(templateName, tag); if (!config.shouldOverwrite(filename) && new File(filename).exists()) { continue; } String templateFile = getFullTemplateFile(config, templateName); String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() .withLoader( new Mustache.TemplateLoader() { @Override public Reader getTemplate(String name) { return getTemplateReader( getFullTemplateFile(config, name + ".mustache")); } }) .defaultValue("") .compile(template); writeToFile(filename, tmpl.execute(operation)); files.add(new File(filename)); } } catch (Exception e) { throw new RuntimeException("Could not generate api file for '" + tag + "'", e); } } } if (System.getProperty("debugOperations") != null) { System.out.println("############ Operation info ############"); Json.prettyPrint(allOperations); } // supporting files Map<String, Object> bundle = new HashMap<String, Object>(); bundle.putAll(config.additionalProperties()); bundle.put("apiPackage", config.apiPackage()); Map<String, Object> apis = new HashMap<String, Object>(); apis.put("apis", allOperations); if (swagger.getHost() != null) { bundle.put("host", swagger.getHost()); } bundle.put("basePath", basePath); bundle.put("scheme", scheme); bundle.put("contextPath", contextPath); bundle.put("apiInfo", apis); bundle.put("models", allModels); bundle.put("apiFolder", config.apiPackage().replace('.', File.separatorChar)); bundle.put("modelPackage", config.modelPackage()); List<CodegenSecurity> authMethods = config.fromSecurity(swagger.getSecurityDefinitions()); if (authMethods != null && !authMethods.isEmpty()) { bundle.put("authMethods", authMethods); bundle.put("hasAuthMethods", true); } if (swagger.getExternalDocs() != null) { bundle.put("externalDocs", swagger.getExternalDocs()); } for (int i = 0; i < allModels.size() - 1; i++) { HashMap<String, CodegenModel> cm = (HashMap<String, CodegenModel>) allModels.get(i); CodegenModel m = cm.get("model"); m.hasMoreModels = true; } config.postProcessSupportingFileData(bundle); if (System.getProperty("debugSupportingFiles") != null) { System.out.println("############ Supporting file info ############"); Json.prettyPrint(bundle); } if (generateSupportingFiles) { for (SupportingFile support : config.supportingFiles()) { try { String outputFolder = config.outputFolder(); if (isNotEmpty(support.folder)) { outputFolder += File.separator + support.folder; } File of = new File(outputFolder); if (!of.isDirectory()) { of.mkdirs(); } String outputFilename = outputFolder + File.separator + support.destinationFilename; if (!config.shouldOverwrite(outputFilename)) { continue; } String templateFile = getFullTemplateFile(config, support.templateFile); boolean shouldGenerate = true; if (supportingFilesToGenerate != null && supportingFilesToGenerate.size() > 0) { if (supportingFilesToGenerate.contains(support.destinationFilename)) { shouldGenerate = true; } else { shouldGenerate = false; } } if (shouldGenerate) { if (templateFile.endsWith("mustache")) { String template = readTemplate(templateFile); Template tmpl = Mustache.compiler() .withLoader( new Mustache.TemplateLoader() { @Override public Reader getTemplate(String name) { return getTemplateReader( getFullTemplateFile(config, name + ".mustache")); } }) .defaultValue("") .compile(template); writeToFile(outputFilename, tmpl.execute(bundle)); files.add(new File(outputFilename)); } else { InputStream in = null; try { in = new FileInputStream(templateFile); } catch (Exception e) { // continue } if (in == null) { in = this.getClass() .getClassLoader() .getResourceAsStream(getCPResourcePath(templateFile)); } File outputFile = new File(outputFilename); OutputStream out = new FileOutputStream(outputFile, false); if (in != null && out != null) { System.out.println("writing file " + outputFile); IOUtils.copy(in, out); } else { if (in == null) { System.out.println("can't open " + templateFile + " for input"); } if (out == null) { System.out.println("can't open " + outputFile + " for output"); } } files.add(outputFile); } } } catch (Exception e) { throw new RuntimeException("Could not generate supporting file '" + support + "'", e); } } } config.processSwagger(swagger); return files; }