Skip to content

Feature: Parse from string #18

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jan 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 0 additions & 40 deletions src/main/java/com/apiflows/model/OpenAPIWorkflow.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<SourceDescription> sourceDescriptions = new ArrayList<>();
private List<Workflow> 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;
}
Expand Down
78 changes: 52 additions & 26 deletions src/main/java/com/apiflows/parser/OpenAPIWorkflowParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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("{")) {
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/com/apiflows/parser/OpenAPIWorkflowParserResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,17 @@

public class OpenAPIWorkflowParserResult {

public enum Format {
JSON, YAML
}
private boolean valid = true;
private List<String> errors = null;
private OpenAPIWorkflow openAPIWorkflow;

private String location;
private String content;
private Format format;

public boolean isValid() {
return valid;
}
Expand Down Expand Up @@ -37,4 +44,37 @@ public void setErrors(List<String> 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);
}

}
31 changes: 25 additions & 6 deletions src/main/java/com/apiflows/parser/source/OperationBinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Operation> 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()) {
Expand All @@ -52,15 +59,27 @@ List<Operation> 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()) {
operations.addAll(pathItem.readOperations());
}

return operations;

}

Operation findOperationById(String operationId, List<Operation> operations) {
Expand Down Expand Up @@ -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);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down