Skip to content

Commit b86e57b

Browse files
authored
Merge pull request #18 from API-Flows/parse-from-string
Feature: Parse from string
2 parents 4d34622 + 49695e7 commit b86e57b

File tree

5 files changed

+119
-74
lines changed

5 files changed

+119
-74
lines changed

src/main/java/com/apiflows/model/OpenAPIWorkflow.java

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,52 +5,12 @@
55

66
public class OpenAPIWorkflow {
77

8-
public enum Format {
9-
JSON, YAML
10-
}
11-
12-
private String location;
13-
private String content;
14-
private Format format;
15-
168
private String workflowsSpec;
179
private Info info;
1810
private List<SourceDescription> sourceDescriptions = new ArrayList<>();
1911
private List<Workflow> workflows = new ArrayList<>();
2012
private Components components;
2113

22-
public String getLocation() {
23-
return location;
24-
}
25-
26-
public void setLocation(String location) {
27-
this.location = location;
28-
}
29-
30-
public String getContent() {
31-
return content;
32-
}
33-
34-
public void setContent(String content) {
35-
this.content = content;
36-
}
37-
38-
public Format getFormat() {
39-
return format;
40-
}
41-
42-
public void setFormat(Format format) {
43-
this.format = format;
44-
}
45-
46-
public boolean isJson() {
47-
return Format.JSON.equals(this.format);
48-
}
49-
50-
public boolean isYaml() {
51-
return Format.YAML.equals(this.format);
52-
}
53-
5414
public String getWorkflowsSpec() {
5515
return workflowsSpec;
5616
}

src/main/java/com/apiflows/parser/OpenAPIWorkflowParser.java

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,44 +17,71 @@ public class OpenAPIWorkflowParser {
1717

1818
private static final Logger LOGGER = LoggerFactory.getLogger(OpenAPIWorkflowParser.class);
1919

20-
public OpenAPIWorkflowParserResult parse(String location) {
21-
return parse(location, new ParseOptions());
20+
/**
21+
* Parse an OpenAPI Workflow file
22+
* @param input url, filepath or content (as string)
23+
* @return instance of OpenAPIWorkflowParserResult
24+
*/
25+
public OpenAPIWorkflowParserResult parse(String input) {
26+
return parse(input, new ParseOptions());
2227
}
2328

24-
public OpenAPIWorkflowParserResult parse(String location, ParseOptions options) {
29+
/**
30+
* Parse an OpenAPI Workflow file
31+
* @param input url, filepath or content (as string)
32+
* @param options Options
33+
* @return instance of OpenAPIWorkflowParserResult
34+
*/
35+
public OpenAPIWorkflowParserResult parse(String input, ParseOptions options) {
2536

2637
OpenAPIWorkflowParserResult result = new OpenAPIWorkflowParserResult();
2738

28-
PathUtil pathUtil = new PathUtil();
29-
HttpUtil httpUtil = new HttpUtil();
30-
3139
try {
40+
41+
PathUtil pathUtil = new PathUtil();
42+
HttpUtil httpUtil = new HttpUtil();
43+
3244
String content;
3345

34-
if (httpUtil.isUrl(location)) {
35-
content = httpUtil.call(location);
46+
if (httpUtil.isUrl(input)) {
47+
content = httpUtil.call(input);
48+
result.setLocation(input);
49+
} else if (pathUtil.isFile(input)) {
50+
content = pathUtil.getFromFile(input);
51+
result.setLocation(input);
3652
} else {
37-
content = pathUtil.getFromFile(location);
53+
// content as string
54+
content = input;
55+
result.setLocation(null);
3856
}
3957

40-
final ObjectMapper mapper = getObjectMapper(content);
58+
result.setContent(content);
59+
result.setFormat(getFormat(content));
4160

42-
OpenAPIWorkflow openAPIWorkflow = mapper.readValue(content, OpenAPIWorkflow.class);
43-
openAPIWorkflow.setLocation(location);
44-
openAPIWorkflow.setContent(content);
45-
openAPIWorkflow.setFormat(getFormat(content));
61+
try {
4662

47-
result.setOpenAPIWorkflow(openAPIWorkflow);
63+
final ObjectMapper mapper = getObjectMapper(content);
4864

49-
if(options != null && options.isApplyValidation()) {
50-
OpenAPIWorkflowValidatorResult validatorResult = new OpenAPIWorkflowValidator().validate(openAPIWorkflow);
51-
result.setValid(validatorResult.isValid());
52-
result.setErrors(validatorResult.getErrors());
53-
}
65+
OpenAPIWorkflow openAPIWorkflow = mapper.readValue(content, OpenAPIWorkflow.class);
66+
67+
result.setOpenAPIWorkflow(openAPIWorkflow);
5468

55-
new OperationBinder().bind(openAPIWorkflow);
69+
if(options != null && options.isApplyValidation()) {
70+
OpenAPIWorkflowValidatorResult validatorResult = new OpenAPIWorkflowValidator().validate(openAPIWorkflow);
71+
result.setValid(validatorResult.isValid());
72+
result.setErrors(validatorResult.getErrors());
73+
}
74+
75+
new OperationBinder().bind(openAPIWorkflow, result.getLocation());
76+
77+
new WorkflowBinder().bind(openAPIWorkflow);
78+
79+
} catch (Exception e) {
80+
LOGGER.error(e.getMessage(), e);
81+
result.setValid(false);
82+
result.addError(e.getMessage());
83+
}
5684

57-
new WorkflowBinder().bind(openAPIWorkflow);
5885

5986
} catch (Exception e) {
6087
LOGGER.error(e.getMessage(), e);
@@ -64,15 +91,14 @@ public OpenAPIWorkflowParserResult parse(String location, ParseOptions options)
6491
return result;
6592
}
6693

67-
OpenAPIWorkflow.Format getFormat(String content) {
94+
OpenAPIWorkflowParserResult.Format getFormat(String content) {
6895
if (content.trim().startsWith("{")) {
69-
return OpenAPIWorkflow.Format.JSON;
96+
return OpenAPIWorkflowParserResult.Format.JSON;
7097
} else {
71-
return OpenAPIWorkflow.Format.YAML;
98+
return OpenAPIWorkflowParserResult.Format.YAML;
7299
}
73100
}
74101

75-
76102
private ObjectMapper getObjectMapper(String content) {
77103
ObjectMapper objectMapper = null;
78104
if (content.trim().startsWith("{")) {

src/main/java/com/apiflows/parser/OpenAPIWorkflowParserResult.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,17 @@
66

77
public class OpenAPIWorkflowParserResult {
88

9+
public enum Format {
10+
JSON, YAML
11+
}
912
private boolean valid = true;
1013
private List<String> errors = null;
1114
private OpenAPIWorkflow openAPIWorkflow;
1215

16+
private String location;
17+
private String content;
18+
private Format format;
19+
1320
public boolean isValid() {
1421
return valid;
1522
}
@@ -37,4 +44,37 @@ public void setErrors(List<String> errors) {
3744
public void addError(String error) {
3845
this.errors.add(error);
3946
}
47+
48+
public String getLocation() {
49+
return location;
50+
}
51+
52+
public void setLocation(String location) {
53+
this.location = location;
54+
}
55+
56+
public String getContent() {
57+
return content;
58+
}
59+
60+
public void setContent(String content) {
61+
this.content = content;
62+
}
63+
64+
public Format getFormat() {
65+
return format;
66+
}
67+
68+
public void setFormat(Format format) {
69+
this.format = format;
70+
}
71+
72+
public boolean isJson() {
73+
return Format.JSON.equals(this.format);
74+
}
75+
76+
public boolean isYaml() {
77+
return Format.YAML.equals(this.format);
78+
}
79+
4080
}

src/main/java/com/apiflows/parser/source/OperationBinder.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.apiflows.model.SourceDescription;
55
import com.apiflows.model.Step;
66
import com.apiflows.model.Workflow;
7+
import com.apiflows.parser.util.HttpUtil;
78
import io.swagger.v3.oas.models.OpenAPI;
89
import io.swagger.v3.oas.models.Operation;
910
import io.swagger.v3.oas.models.PathItem;
@@ -26,12 +27,18 @@ public class OperationBinder {
2627
* Binds workflow operations
2728
* @param openAPIWorkflow
2829
*/
29-
public void bind(OpenAPIWorkflow openAPIWorkflow) {
30+
public void bind(OpenAPIWorkflow openAPIWorkflow, String location) {
3031
List<Operation> operations = new ArrayList<>();
3132

3233
for(SourceDescription source : openAPIWorkflow.getSourceDescriptions()) {
33-
String filename = getRootFolder(openAPIWorkflow.getLocation()) + "/" + source.getUrl();
34-
operations.addAll(getOperations(filename));
34+
if(new HttpUtil().isUrl(source.getUrl())) {
35+
// absolute url
36+
operations.addAll(getOperations(source.getUrl()));
37+
} else {
38+
// relative path
39+
String filename = getRootFolder(location) + "/" + source.getUrl();
40+
operations.addAll(getOperations(filename));
41+
}
3542
}
3643

3744
for(Workflow workflow : openAPIWorkflow.getWorkflows()) {
@@ -52,15 +59,27 @@ List<Operation> getOperations(String openapi) {
5259
ParseOptions options = new ParseOptions();
5360
options.setResolve(true);
5461

55-
SwaggerParseResult parseResult = openApiParser.readLocation(openapi, null, options);
62+
SwaggerParseResult parseResult = null;
63+
64+
try {
65+
parseResult = openApiParser.readLocation(openapi, null, options);
66+
} catch (Exception e) {
67+
LOGGER.error("Cannot find or parse source description: " + openapi, e);
68+
throw new RuntimeException("Cannot find or parse source description: " + openapi);
69+
}
70+
71+
if(parseResult == null || parseResult.getOpenAPI() == null) {
72+
LOGGER.error("Cannot find or parse source description: " + openapi);
73+
throw new RuntimeException("Cannot parse source description: " + openapi);
74+
}
75+
5676
OpenAPI openAPI = parseResult.getOpenAPI();
5777

5878
for(PathItem pathItem : openAPI.getPaths().values()) {
5979
operations.addAll(pathItem.readOperations());
6080
}
6181

6282
return operations;
63-
6483
}
6584

6685
Operation findOperationById(String operationId, List<Operation> operations) {
@@ -123,7 +142,7 @@ String getRootFolder(String location) {
123142
} else {
124143
Path filePath = Paths.get(location);
125144

126-
return filePath.getParent().toString();
145+
return (filePath.getParent() != null ? filePath.getParent().toString() : null);
127146
}
128147
}
129148

src/test/java/com/apiflows/parser/source/OperationBinderTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ void bind() {
3939

4040
OpenAPIWorkflowParserResult result = new OpenAPIWorkflowParser().parse(WORKFLOWS_SPEC_FILE);
4141

42-
binder.bind(result.getOpenAPIWorkflow());
42+
binder.bind(result.getOpenAPIWorkflow(), WORKFLOWS_SPEC_FILE);
4343

4444
assertNotNull(result);
4545
Workflow workflowApplyCoupon = result.getOpenAPIWorkflow().getWorkflows().get(0);
@@ -62,7 +62,7 @@ void bindFromUrl() {
6262

6363
OpenAPIWorkflowParserResult result = new OpenAPIWorkflowParser().parse(WORKFLOWS_SPEC_FILE);
6464

65-
binder.bind(result.getOpenAPIWorkflow());
65+
binder.bind(result.getOpenAPIWorkflow(), WORKFLOWS_SPEC_FILE);
6666

6767
assertNotNull(result);
6868
Workflow workflowApplyCoupon = result.getOpenAPIWorkflow().getWorkflows().get(0);

0 commit comments

Comments
 (0)