diff --git a/src/main/java/com/apiflows/model/OpenAPIWorkflow.java b/src/main/java/com/apiflows/model/OpenAPIWorkflow.java index 07887ac..443b0f2 100644 --- a/src/main/java/com/apiflows/model/OpenAPIWorkflow.java +++ b/src/main/java/com/apiflows/model/OpenAPIWorkflow.java @@ -5,52 +5,12 @@ public class OpenAPIWorkflow { - public enum Format { - JSON, YAML - } - - private String location; - private String content; - private Format format; - private String workflowsSpec; private Info info; private List sourceDescriptions = new ArrayList<>(); private List workflows = new ArrayList<>(); private Components components; - public String getLocation() { - return location; - } - - public void setLocation(String location) { - this.location = location; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - public Format getFormat() { - return format; - } - - public void setFormat(Format format) { - this.format = format; - } - - public boolean isJson() { - return Format.JSON.equals(this.format); - } - - public boolean isYaml() { - return Format.YAML.equals(this.format); - } - public String getWorkflowsSpec() { return workflowsSpec; } diff --git a/src/main/java/com/apiflows/parser/OpenAPIWorkflowParser.java b/src/main/java/com/apiflows/parser/OpenAPIWorkflowParser.java index a22aff3..35cd4a0 100644 --- a/src/main/java/com/apiflows/parser/OpenAPIWorkflowParser.java +++ b/src/main/java/com/apiflows/parser/OpenAPIWorkflowParser.java @@ -17,44 +17,71 @@ public class OpenAPIWorkflowParser { private static final Logger LOGGER = LoggerFactory.getLogger(OpenAPIWorkflowParser.class); - public OpenAPIWorkflowParserResult parse(String location) { - return parse(location, new ParseOptions()); + /** + * Parse an OpenAPI Workflow file + * @param input url, filepath or content (as string) + * @return instance of OpenAPIWorkflowParserResult + */ + public OpenAPIWorkflowParserResult parse(String input) { + return parse(input, new ParseOptions()); } - public OpenAPIWorkflowParserResult parse(String location, ParseOptions options) { + /** + * Parse an OpenAPI Workflow file + * @param input url, filepath or content (as string) + * @param options Options + * @return instance of OpenAPIWorkflowParserResult + */ + public OpenAPIWorkflowParserResult parse(String input, ParseOptions options) { OpenAPIWorkflowParserResult result = new OpenAPIWorkflowParserResult(); - PathUtil pathUtil = new PathUtil(); - HttpUtil httpUtil = new HttpUtil(); - try { + + PathUtil pathUtil = new PathUtil(); + HttpUtil httpUtil = new HttpUtil(); + String content; - if (httpUtil.isUrl(location)) { - content = httpUtil.call(location); + if (httpUtil.isUrl(input)) { + content = httpUtil.call(input); + result.setLocation(input); + } else if (pathUtil.isFile(input)) { + content = pathUtil.getFromFile(input); + result.setLocation(input); } else { - content = pathUtil.getFromFile(location); + // content as string + content = input; + result.setLocation(null); } - final ObjectMapper mapper = getObjectMapper(content); + result.setContent(content); + result.setFormat(getFormat(content)); - OpenAPIWorkflow openAPIWorkflow = mapper.readValue(content, OpenAPIWorkflow.class); - openAPIWorkflow.setLocation(location); - openAPIWorkflow.setContent(content); - openAPIWorkflow.setFormat(getFormat(content)); + try { - result.setOpenAPIWorkflow(openAPIWorkflow); + final ObjectMapper mapper = getObjectMapper(content); - if(options != null && options.isApplyValidation()) { - OpenAPIWorkflowValidatorResult validatorResult = new OpenAPIWorkflowValidator().validate(openAPIWorkflow); - result.setValid(validatorResult.isValid()); - result.setErrors(validatorResult.getErrors()); - } + OpenAPIWorkflow openAPIWorkflow = mapper.readValue(content, OpenAPIWorkflow.class); + + result.setOpenAPIWorkflow(openAPIWorkflow); - new OperationBinder().bind(openAPIWorkflow); + if(options != null && options.isApplyValidation()) { + OpenAPIWorkflowValidatorResult validatorResult = new OpenAPIWorkflowValidator().validate(openAPIWorkflow); + result.setValid(validatorResult.isValid()); + result.setErrors(validatorResult.getErrors()); + } + + new OperationBinder().bind(openAPIWorkflow, result.getLocation()); + + new WorkflowBinder().bind(openAPIWorkflow); + + } catch (Exception e) { + LOGGER.error(e.getMessage(), e); + result.setValid(false); + result.addError(e.getMessage()); + } - new WorkflowBinder().bind(openAPIWorkflow); } catch (Exception e) { LOGGER.error(e.getMessage(), e); @@ -64,15 +91,14 @@ public OpenAPIWorkflowParserResult parse(String location, ParseOptions options) return result; } - OpenAPIWorkflow.Format getFormat(String content) { + OpenAPIWorkflowParserResult.Format getFormat(String content) { if (content.trim().startsWith("{")) { - return OpenAPIWorkflow.Format.JSON; + return OpenAPIWorkflowParserResult.Format.JSON; } else { - return OpenAPIWorkflow.Format.YAML; + return OpenAPIWorkflowParserResult.Format.YAML; } } - private ObjectMapper getObjectMapper(String content) { ObjectMapper objectMapper = null; if (content.trim().startsWith("{")) { diff --git a/src/main/java/com/apiflows/parser/OpenAPIWorkflowParserResult.java b/src/main/java/com/apiflows/parser/OpenAPIWorkflowParserResult.java index ebfa196..b747903 100644 --- a/src/main/java/com/apiflows/parser/OpenAPIWorkflowParserResult.java +++ b/src/main/java/com/apiflows/parser/OpenAPIWorkflowParserResult.java @@ -6,10 +6,17 @@ public class OpenAPIWorkflowParserResult { + public enum Format { + JSON, YAML + } private boolean valid = true; private List errors = null; private OpenAPIWorkflow openAPIWorkflow; + private String location; + private String content; + private Format format; + public boolean isValid() { return valid; } @@ -37,4 +44,37 @@ public void setErrors(List errors) { public void addError(String error) { this.errors.add(error); } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public Format getFormat() { + return format; + } + + public void setFormat(Format format) { + this.format = format; + } + + public boolean isJson() { + return Format.JSON.equals(this.format); + } + + public boolean isYaml() { + return Format.YAML.equals(this.format); + } + } diff --git a/src/main/java/com/apiflows/parser/source/OperationBinder.java b/src/main/java/com/apiflows/parser/source/OperationBinder.java index 1b8a8db..d5bfeb2 100644 --- a/src/main/java/com/apiflows/parser/source/OperationBinder.java +++ b/src/main/java/com/apiflows/parser/source/OperationBinder.java @@ -4,6 +4,7 @@ import com.apiflows.model.SourceDescription; import com.apiflows.model.Step; import com.apiflows.model.Workflow; +import com.apiflows.parser.util.HttpUtil; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; @@ -26,12 +27,18 @@ public class OperationBinder { * Binds workflow operations * @param openAPIWorkflow */ - public void bind(OpenAPIWorkflow openAPIWorkflow) { + public void bind(OpenAPIWorkflow openAPIWorkflow, String location) { List operations = new ArrayList<>(); for(SourceDescription source : openAPIWorkflow.getSourceDescriptions()) { - String filename = getRootFolder(openAPIWorkflow.getLocation()) + "/" + source.getUrl(); - operations.addAll(getOperations(filename)); + if(new HttpUtil().isUrl(source.getUrl())) { + // absolute url + operations.addAll(getOperations(source.getUrl())); + } else { + // relative path + String filename = getRootFolder(location) + "/" + source.getUrl(); + operations.addAll(getOperations(filename)); + } } for(Workflow workflow : openAPIWorkflow.getWorkflows()) { @@ -52,7 +59,20 @@ List getOperations(String openapi) { ParseOptions options = new ParseOptions(); options.setResolve(true); - SwaggerParseResult parseResult = openApiParser.readLocation(openapi, null, options); + SwaggerParseResult parseResult = null; + + try { + parseResult = openApiParser.readLocation(openapi, null, options); + } catch (Exception e) { + LOGGER.error("Cannot find or parse source description: " + openapi, e); + throw new RuntimeException("Cannot find or parse source description: " + openapi); + } + + if(parseResult == null || parseResult.getOpenAPI() == null) { + LOGGER.error("Cannot find or parse source description: " + openapi); + throw new RuntimeException("Cannot parse source description: " + openapi); + } + OpenAPI openAPI = parseResult.getOpenAPI(); for(PathItem pathItem : openAPI.getPaths().values()) { @@ -60,7 +80,6 @@ List getOperations(String openapi) { } return operations; - } Operation findOperationById(String operationId, List operations) { @@ -123,7 +142,7 @@ String getRootFolder(String location) { } else { Path filePath = Paths.get(location); - return filePath.getParent().toString(); + return (filePath.getParent() != null ? filePath.getParent().toString() : null); } } diff --git a/src/test/java/com/apiflows/parser/source/OperationBinderTest.java b/src/test/java/com/apiflows/parser/source/OperationBinderTest.java index e9285f1..9a1a64f 100644 --- a/src/test/java/com/apiflows/parser/source/OperationBinderTest.java +++ b/src/test/java/com/apiflows/parser/source/OperationBinderTest.java @@ -39,7 +39,7 @@ void bind() { OpenAPIWorkflowParserResult result = new OpenAPIWorkflowParser().parse(WORKFLOWS_SPEC_FILE); - binder.bind(result.getOpenAPIWorkflow()); + binder.bind(result.getOpenAPIWorkflow(), WORKFLOWS_SPEC_FILE); assertNotNull(result); Workflow workflowApplyCoupon = result.getOpenAPIWorkflow().getWorkflows().get(0); @@ -62,7 +62,7 @@ void bindFromUrl() { OpenAPIWorkflowParserResult result = new OpenAPIWorkflowParser().parse(WORKFLOWS_SPEC_FILE); - binder.bind(result.getOpenAPIWorkflow()); + binder.bind(result.getOpenAPIWorkflow(), WORKFLOWS_SPEC_FILE); assertNotNull(result); Workflow workflowApplyCoupon = result.getOpenAPIWorkflow().getWorkflows().get(0);