/**
* Copyright (C) 2015 Zalando SE (http://tech.zalando.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.zalando.stups.swagger.codegen;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import org.apache.commons.io.IOUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.io.Resources;
import io.swagger.util.Yaml;
/**
* @author jbellmann
*/
public class YamlToJson {
private String outputDirectoryPath;
private String yamlInputPath;
private CodegeneratorLogger logger = new SystemOutCodegeneratorLogger();
private YamlToJson(final String yamlInputPath, final String outputDirectoryPath,
final CodegeneratorLogger codegeneratorLogger) {
this.yamlInputPath = yamlInputPath;
this.outputDirectoryPath = outputDirectoryPath;
this.logger = codegeneratorLogger;
}
public void convert() {
logger.info("Generate .json file from .yaml");
File outputDirectory = new File(outputDirectoryPath);
if (!outputDirectory.exists()) {
outputDirectory.mkdirs();
logger.info("OutputDirectory created");
}
File jsonFile = new File(outputDirectory, getYamlFilename() + ".json");
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter(jsonFile);
fileWriter.write(getYamlFileContentAsJson());
fileWriter.flush();
logger.info("File written to " + jsonFile.getAbsolutePath());
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
IOUtils.closeQuietly(fileWriter);
}
}
protected String getYamlFileContentAsJson() throws IOException {
String data = "";
if (yamlInputPath.startsWith("http") || yamlInputPath.startsWith("https")) {
data = new String(Resources.toByteArray(new URL(yamlInputPath)));
} else {
data = new String(Files.readAllBytes(java.nio.file.Paths.get(new File(yamlInputPath).toURI())));
}
ObjectMapper yamlMapper = Yaml.mapper();
JsonNode rootNode = yamlMapper.readTree(data);
// must have swagger node set
JsonNode swaggerNode = rootNode.get("swagger");
return rootNode.toString();
}
protected String getYamlFilename() {
if (yamlInputPath.startsWith("http") || yamlInputPath.startsWith("https")) {
int lastSlashIndex = yamlInputPath.lastIndexOf("/");
String filename = yamlInputPath.substring(lastSlashIndex + 1);
return filenameSubstring(filename);
} else {
File file = new File(yamlInputPath);
if (!file.exists()) {
throw new RuntimeException("Api-File not found: " + yamlInputPath);
} else {
String filename = file.getName();
return filenameSubstring(filename);
}
}
}
protected String filenameSubstring(String filename) {
return filename.substring(0, filename.indexOf("."));
}
public static YamlToJsonBuilder builder() {
return new YamlToJsonBuilder();
}
public static class YamlToJsonBuilder {
private String yamlInputPath;
private String outputDirectoryPath;
private CodegeneratorLogger codegeneratorLogger = new SystemOutCodegeneratorLogger();
public YamlToJsonBuilder withYamlInputPath(final String yamlInputPath) {
this.yamlInputPath = yamlInputPath;
return this;
}
public YamlToJsonBuilder withOutputDirectoryPath(final String outputDirectoryPath) {
this.outputDirectoryPath = outputDirectoryPath;
return this;
}
public YamlToJsonBuilder withCodegeneratorLogger(final CodegeneratorLogger codegeneratorLogger) {
this.codegeneratorLogger = codegeneratorLogger;
return this;
}
public YamlToJson build() {
return new YamlToJson(yamlInputPath, outputDirectoryPath, codegeneratorLogger);
}
}
}