-
Notifications
You must be signed in to change notification settings - Fork 88
Expand file tree
/
Copy pathSwaggerDiff.java
More file actions
157 lines (137 loc) · 5.31 KB
/
SwaggerDiff.java
File metadata and controls
157 lines (137 loc) · 5.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
package com.deepoove.swagger.diff;
import com.deepoove.swagger.diff.compare.SpecificationDiff;
import com.deepoove.swagger.diff.model.ChangedEndpoint;
import com.deepoove.swagger.diff.model.Endpoint;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.models.Swagger;
import io.swagger.models.auth.AuthorizationValue;
import io.swagger.parser.SwaggerCompatConverter;
import io.swagger.parser.SwaggerParser;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
@Data
public class SwaggerDiff {
public static final String SWAGGER_VERSION_V2 = "2.0";
private static Logger logger = LoggerFactory.getLogger(SwaggerDiff.class);
private Swagger oldSpecSwagger;
private Swagger newSpecSwagger;
private List<Endpoint> newEndpoints;
private List<Endpoint> missingEndpoints;
private List<ChangedEndpoint> changedEndpoints;
/**
* compare two swagger 1.x doc
*
* @param oldSpec old api-doc location:Json or Http
* @param newSpec new api-doc location:Json or Http
*/
public static SwaggerDiff compareV1(final String oldSpec, final String newSpec) {
return compare(oldSpec, newSpec, null, null);
}
/**
* compare two swagger v2.0 doc
*
* @param oldSpec old api-doc location:Json or Http
* @param newSpec new api-doc location:Json or Http
*/
public static SwaggerDiff compareV2(final String oldSpec, final String newSpec) {
return compare(oldSpec, newSpec, null, SWAGGER_VERSION_V2);
}
/**
* compare two swagger v2.0 Sring
*
* @param oldSpec old api-doc json as string
* @param newSpec new api-doc json as string
*/
public static SwaggerDiff compareV2Raw(String oldSpec, String newSpec) {
return new SwaggerDiff(oldSpec, newSpec).compare();
}
public static SwaggerDiff compare(String oldSpec, String newSpec,
List<AuthorizationValue> auths, String version) {
return new SwaggerDiff(oldSpec, newSpec, auths, version).compare();
}
/**
* @param rawOldSpec
* @param rawNewSpec
*/
private SwaggerDiff(String rawOldSpec, String rawNewSpec) {
SwaggerParser swaggerParser = new SwaggerParser();
oldSpecSwagger = swaggerParser.parse(rawOldSpec);
newSpecSwagger = swaggerParser.parse(rawNewSpec);
if (null == oldSpecSwagger || null == newSpecSwagger) {
throw new RuntimeException("cannot read api-doc from spec.");
}
}
/**
* @param oldSpec
* @param newSpec
* @param auths
* @param version
*/
private SwaggerDiff(final String oldSpec, final String newSpec, final List<AuthorizationValue> auths,
final String version) {
if (SWAGGER_VERSION_V2.equals(version)) {
SwaggerParser swaggerParser = new SwaggerParser();
oldSpecSwagger = swaggerParser.read(oldSpec, auths, true);
newSpecSwagger = swaggerParser.read(newSpec, auths, true);
} else {
SwaggerCompatConverter swaggerCompatConverter = new SwaggerCompatConverter();
try {
oldSpecSwagger = swaggerCompatConverter.read(oldSpec, auths);
newSpecSwagger = swaggerCompatConverter.read(newSpec, auths);
} catch (IOException e) {
logger.error("cannot read api-doc from spec[version_v1.x]", e);
return;
}
}
if (null == oldSpecSwagger || null == newSpecSwagger) {
throw new RuntimeException(
"cannot read api-doc from spec.");
}
}
/**
* Compare two swagger v2.0 docs by JsonNode
*
* @param oldSpec old Swagger specification document in v2.0 format as a JsonNode
* @param newSpec new Swagger specification document in v2.0 format as a JsonNode
*/
public static SwaggerDiff compareV2(JsonNode oldSpec, JsonNode newSpec) {
return new SwaggerDiff(oldSpec, newSpec).compare();
}
private SwaggerDiff(JsonNode oldSpec, JsonNode newSpec) {
SwaggerParser swaggerParser = new SwaggerParser();
oldSpecSwagger = swaggerParser.read(oldSpec, true);
newSpecSwagger = swaggerParser.read(newSpec, true);
if (null == oldSpecSwagger || null == newSpecSwagger) {
throw new RuntimeException(
"cannot read api-doc from spec.");
}
}
private SwaggerDiff compare() {
SpecificationDiff diff = SpecificationDiff.diff(oldSpecSwagger, newSpecSwagger);
this.newEndpoints = diff.getNewEndpoints();
this.missingEndpoints = diff.getMissingEndpoints();
this.changedEndpoints = diff.getChangedEndpoints();
return this;
}
public boolean isBackwardsCompatible() {
if (!getMissingEndpoints().isEmpty()) {
return false;
} else {
for (ChangedEndpoint changedEndpoint : getChangedEndpoints()) {
if (!changedEndpoint.isBackwardsCompatible()) {
return false;
}
}
}
return true;
}
public String getOldVersion() {
return oldSpecSwagger.getInfo().getVersion();
}
public String getNewVersion() {
return newSpecSwagger.getInfo().getVersion();
}
}