1 package org.onap.graphinventory.generate;
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.HashSet;
9 import java.util.regex.Matcher;
10 import java.util.stream.Collectors;
11 import org.apache.maven.plugin.logging.Log;
12 import com.fasterxml.jackson.core.JsonProcessingException;
13 import com.fasterxml.jackson.databind.ObjectMapper;
14 import io.swagger.models.Path;
15 import io.swagger.models.Swagger;
16 import io.swagger.models.parameters.Parameter;
17 import io.swagger.models.parameters.SerializableParameter;
18 import io.swagger.parser.SwaggerParser;
20 public class SwaggerConverter {
22 private final Log log;
24 public SwaggerConverter(Log log) {
28 public Map<String, ObjectType> getDoc(String swaggerLocation) throws JsonProcessingException {
29 Swagger swagger = new SwaggerParser().read(swaggerLocation);
31 Map<String, Path> paths = swagger.getPaths().entrySet().stream()
32 .filter(item -> !item.getKey().endsWith("/relationship-list/relationship"))
33 .collect(Collectors.toMap(item -> item.getKey(), item -> item.getValue()));
35 Matcher pluralMatcher;
36 Matcher singularMatcher;
37 Matcher topLevelMatcher;
39 Map<String, ObjectType> output = new HashMap<>();
40 for (Map.Entry<String, Path> entry : paths.entrySet()) {
42 pluralMatcher = Patterns.pluralPattern.matcher(entry.getKey());
43 singularMatcher = Patterns.singularPattern.matcher(entry.getKey());
44 topLevelMatcher = Patterns.topLevelPattern.matcher(entry.getKey());
46 if (pluralMatcher.matches()) {
47 if (!output.containsKey(pluralMatcher.group("name"))) {
48 output.put(pluralMatcher.group("name"), new ObjectType());
50 item = output.get(pluralMatcher.group("name"));
51 item.setType("plural");
52 item.setName(pluralMatcher.group("name"));
53 item.setPartialUri(pluralMatcher.group("partial"));
54 item.getPaths().add(entry.getKey());
56 if (topLevelMatcher.matches()) {
57 item.setTopLevel(topLevelMatcher.group(1));
58 if (!output.containsKey(topLevelMatcher.group(1))) {
59 output.put(topLevelMatcher.group(1), new ObjectType());
60 output.get(topLevelMatcher.group(1)).setType("top level");
61 output.get(topLevelMatcher.group(1)).setName(topLevelMatcher.group(1));
62 output.get(topLevelMatcher.group(1)).setPartialUri("/" + topLevelMatcher.group(1));
63 output.get(topLevelMatcher.group(1)).getPaths().add("/" + topLevelMatcher.group(1));
67 } else if (singularMatcher.matches()) {
69 if (!output.containsKey(singularMatcher.group("name"))) {
70 output.put(singularMatcher.group("name"), new ObjectType());
72 item = output.get(singularMatcher.group("name"));
74 item.setType("singular");
75 item.setName(singularMatcher.group("name"));
76 item.setPartialUri(singularMatcher.group("partial"));
78 item.getPaths().add(entry.getKey());
80 if (topLevelMatcher.matches()) {
81 item.setTopLevel(topLevelMatcher.group(1));
82 if (!output.containsKey(topLevelMatcher.group(1))) {
83 output.put(topLevelMatcher.group(1), new ObjectType());
84 output.get(topLevelMatcher.group(1)).setType("top level");
85 output.get(topLevelMatcher.group(1)).setName(topLevelMatcher.group(1));
86 output.get(topLevelMatcher.group(1)).setPartialUri("/" + topLevelMatcher.group(1));
87 output.get(topLevelMatcher.group(1)).getPaths().add("/" + topLevelMatcher.group(1));
90 List<Parameter> parameters = entry.getValue().getGet().getParameters();
92 if (parameters != null) {
93 parameters.stream().filter(param -> "path".equals(param.getIn())).collect(Collectors.toList());
95 for (Parameter p : parameters) {
96 ObjectField field = new ObjectField();
98 field.setName(p.getName());
99 field.setType(((SerializableParameter) p).getType());
100 item.getFields().add(field);
104 item = output.get(singularMatcher.group("name"));
105 if (singularMatcher.group("partial").contains(item.getName() + ".")) {
106 item.setPartialUri(singularMatcher.group("partial"));
108 item.getPaths().add(entry.getKey());
113 ObjectMapper mapper = new ObjectMapper();
115 for (ObjectType item : output.values()) {
116 for (String path : item.getPaths()) {
117 String partialUriReplacer = item.getPartialUri().replaceAll("\\{[^}]+\\}", "[^/]+");
118 String childParentUri = path.replaceFirst(partialUriReplacer + "$", "");
119 for (ObjectType itemToUpdate : output.values()) {
120 if (itemToUpdate.getPaths().stream()
121 .anyMatch(itemToUpdateUri -> itemToUpdateUri.equals(childParentUri))) {
122 itemToUpdate.getChildren().add(item.getName());
128 log.debug(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(output));
130 for (Map.Entry<String, ObjectType> item : output.entrySet()) {
132 if (item.getValue().getType().equals("plural")) {
133 Set<String> children = item.getValue().getChildren();
134 // should only be one
135 if (!children.isEmpty()) {
136 item.getValue().setAdditionalName(children.iterator().next());
139 Set<String> pluralChildren = new HashSet<>();
140 for (String child : item.getValue().getChildren()) {
141 if (output.get(child).getType().equals("plural")) {
142 Set<String> children = output.get(child).getChildren();
143 pluralChildren.addAll(children);
146 item.getValue().getChildren().addAll(pluralChildren);
148 if (item.getValue().getType().equals("plural")) {
149 for (String child : item.getValue().getChildren()) {
151 .setPartialUri(item.getValue().getPartialUri() + output.get(child).getPartialUri());
155 if (!item.getValue().getFields().isEmpty()) {
156 Matcher templates = Patterns.urlTemplatePattern.matcher(item.getValue().getPartialUri());
157 List<String> localFields = new ArrayList<>();
158 while (templates.find()) {
159 localFields.add(templates.group(1));
161 item.getValue().setFields(item.getValue().getFields().stream()
162 .filter(f -> localFields.contains(f.getName())).collect(Collectors.toList()));
166 output.values().stream().filter(item -> item.getType().equals("plural"))
167 .forEach(item -> item.getChildren().clear());