From 8d96e870e43567a3e8cd0512a397bd762fda8796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=96stlund?= Date: Tue, 16 May 2023 09:50:31 +0200 Subject: [PATCH] Refactor ApiDefinitionParser to fix issue #23 --- .../parser/ApiDefinitionParser.java | 90 +++++++++++-------- .../parser/ApiDefinitionParserTest.java | 24 ++--- 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/src/main/java/se/ams/dcatprocessor/parser/ApiDefinitionParser.java b/src/main/java/se/ams/dcatprocessor/parser/ApiDefinitionParser.java index 909f71b..c1d60c8 100644 --- a/src/main/java/se/ams/dcatprocessor/parser/ApiDefinitionParser.java +++ b/src/main/java/se/ams/dcatprocessor/parser/ApiDefinitionParser.java @@ -38,57 +38,69 @@ public class ApiDefinitionParser { private static Logger logger = LoggerFactory.getLogger(ApiDefinitionParser.class); + public enum ApiSpecSyntax { + Json, + YamlRaml, + Unknown + }; + public static JSONObject getApiJsonString(String fileString) throws IOException, ParseException { - JSONParser parser = new JSONParser(); - Stream lines; - String apiJsonString = ""; + JSONObject fullObj = parseToJsonObject(fileString); + JSONObject inner = getIn(fullObj, new String[]{"info", "x-dcat"}); + return inner == null? fullObj : inner; + } + private static JSONObject getIn(JSONObject obj, String[] path) { + for (String k: path) { + obj = (JSONObject)obj.get(k); + if (obj == null) { + return null; + } + } + return obj; + } + + public static ApiSpecSyntax guessSyntax(String fileString) { + String trimmedString = fileString.trim(); + if (trimmedString.startsWith("{") && trimmedString.endsWith("}")) { + return ApiSpecSyntax.Json; + } + + Stream lines; lines = fileString.lines(); String apiLine1 = lines.limit(1).collect(Collectors.joining("\n")); - if (apiLine1.contains("openapi")) { - apiJsonString = getFileApiYamlRaml(fileString); - } else if (apiLine1.contains("RAML")) { - apiJsonString = getFileApiYamlRaml(fileString); - } else if (apiLine1.contains("{")){ - apiJsonString = fileString; - } - else { - throw new DcatException("not supported api definition"); + if (apiLine1.contains("RAML") || apiLine1.contains("openapi")) { + return ApiSpecSyntax.YamlRaml; } - JSONObject jsonObjectFile = (JSONObject) parser.parse(apiJsonString); - if (jsonObjectFile.containsKey("info")) { - jsonObjectFile = (org.json.simple.JSONObject) (jsonObjectFile.get("info")); - jsonObjectFile = (org.json.simple.JSONObject) (jsonObjectFile.get("x-dcat")); + + return ApiSpecSyntax.Unknown; + } + + private static JSONObject parseToJsonObject(String fileString) throws IOException, ParseException { + switch (guessSyntax(fileString)) { + case Json: return (JSONObject)((new JSONParser()).parse(fileString)); + case YamlRaml: return convertYamlRamlToJsonObject(fileString); + case Unknown: {throw new DcatException("not supported api definition");} } - return jsonObjectFile; + return null; } - private static String getFileApiYamlRaml(String apiSpec) throws IOException { - FileOutputStream output = new FileOutputStream("output.json"); + private static JSONObject convertYamlRamlToJsonObject(String apiSpec) throws IOException, ParseException { + FileOutputStream output = new FileOutputStream("output.json"); // TODO: Could we use a ByteArrayOutputStream for this, instead? JsonFactory factory = new JsonFactory(); JsonGenerator generator = factory.createGenerator(output, JsonEncoding.UTF8); - try { - Yaml yamlParser = new Yaml(); - yamlParser.addImplicitResolver(Tag.YAML, Pattern.compile("^(!)$"), "!"); - Node compose = yamlParser.compose(new StringReader(apiSpec)); - build(compose, generator); - generator.close(); - output.close(); + Yaml yamlParser = new Yaml(); + yamlParser.addImplicitResolver(Tag.YAML, Pattern.compile("^(!)$"), "!"); + Node compose = yamlParser.compose(new StringReader(apiSpec)); + build(compose, generator); + generator.close(); + output.close(); - JSONParser jsonParser = new JSONParser(); - FileReader reader = new FileReader("output.json"); - - //Read JSON file - Object obj = jsonParser.parse(reader); - return obj.toString(); - //logger.debug("JSON string from file:\n"+obj.toString()); - - } catch (IOException | ParseException e) { - e.printStackTrace(); - } - return ""; + JSONParser jsonParser = new JSONParser(); + FileReader reader = new FileReader("output.json"); + return (JSONObject)jsonParser.parse(reader); } private static void build(Node yaml, JsonGenerator generator) throws IOException { @@ -126,4 +138,4 @@ private static void build(Node yaml, JsonGenerator generator) throws IOException } } } -} \ No newline at end of file +} diff --git a/src/test/java/se/ams/dcatprocessor/parser/ApiDefinitionParserTest.java b/src/test/java/se/ams/dcatprocessor/parser/ApiDefinitionParserTest.java index bee9f01..55be722 100644 --- a/src/test/java/se/ams/dcatprocessor/parser/ApiDefinitionParserTest.java +++ b/src/test/java/se/ams/dcatprocessor/parser/ApiDefinitionParserTest.java @@ -195,24 +195,24 @@ void setup() { parser = new ApiDefinitionParser(); } - //TODO: Fixa så att testet funkar + // Helper method + void checkParse(String input, ApiDefinitionParser.ApiSpecSyntax expectedSyntax, String expectedOutput) throws Exception { + assertEquals(expectedSyntax, parser.guessSyntax(input)); + assertEquals(expectedOutput, parser.getApiJsonString(input).toString()); + } + @Test void testMandatoryRamlApi() throws Exception { - try { - String result = parser.getApiJsonString(ramlApi).toString(); - assertEquals(result, ramlResult); - } catch (DcatException e) { - - } + checkParse(ramlApi, ApiDefinitionParser.ApiSpecSyntax.YamlRaml, ramlResult); } @Test void testMandatoryJsonApi() throws Exception { - try { - String result = parser.getApiJsonString(jsonApi).toString(); - assertEquals(result, jsonresult); - } catch (DcatException e) { + checkParse(jsonApi, ApiDefinitionParser.ApiSpecSyntax.Json, jsonresult); + } - } + @Test + void testMandatoryJsonApiCompactFormatting() throws Exception { + checkParse(jsonApi.replace("\n", ""), ApiDefinitionParser.ApiSpecSyntax.Json, jsonresult); } }