Skip to content

Commit 46c2156

Browse files
committed
refactor: decompose ChangeSchema
1 parent 667c4dd commit 46c2156

17 files changed

+227
-114
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.qdesrame.openapi.diff.compare;
2+
3+
import com.qdesrame.openapi.diff.model.ChangedList;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class ListDiff {
8+
9+
public static <K extends ChangedList<X>, X> K diff(K instance) {
10+
if (instance.getOldValue() == null && instance.getNewValue() == null) {
11+
return instance;
12+
}
13+
if (instance.getOldValue() == null) {
14+
instance.setIncreased(instance.getNewValue());
15+
return instance;
16+
}
17+
if (instance.getNewValue() == null) {
18+
instance.setMissing(instance.getOldValue());
19+
return instance;
20+
}
21+
instance.getIncreased().addAll(instance.getNewValue());
22+
for (X leftItem : instance.getOldValue()) {
23+
if (instance.getNewValue().contains(leftItem)) {
24+
instance.getIncreased().remove(leftItem);
25+
instance.getShared().add(leftItem);
26+
} else {
27+
instance.getMissing().add(leftItem);
28+
}
29+
}
30+
return instance;
31+
}
32+
}

src/main/java/com/qdesrame/openapi/diff/compare/SecurityDiffInfo.java

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.qdesrame.openapi.diff.compare;
22

3-
import com.qdesrame.openapi.diff.model.ListDiff;
3+
import com.qdesrame.openapi.diff.model.ChangedList;
44
import io.swagger.v3.oas.models.security.SecurityRequirement;
55
import io.swagger.v3.oas.models.security.SecurityScheme;
66
import java.util.List;
@@ -38,13 +38,8 @@ public static Optional<List<SecurityDiffInfo>> containsList(
3838

3939
public static boolean sameList(
4040
List<SecurityDiffInfo> leftSecurities, List<SecurityDiffInfo> rightSecurities) {
41-
ListDiff<SecurityDiffInfo> listDiff = ListDiff.diff(leftSecurities, rightSecurities);
42-
43-
if (listDiff.getMissing().isEmpty() && listDiff.getIncreased().isEmpty()) {
44-
return true;
45-
}
46-
47-
return false;
41+
return ListDiff.diff(new ChangedList.SimpleChangedList<>(leftSecurities, rightSecurities))
42+
.isUnchanged();
4843
}
4944

5045
@Override

src/main/java/com/qdesrame/openapi/diff/compare/SecuritySchemeDiff.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
44

55
import com.qdesrame.openapi.diff.model.ChangedSecurityScheme;
6+
import com.qdesrame.openapi.diff.model.ChangedSecuritySchemeScopes;
67
import com.qdesrame.openapi.diff.model.DiffContext;
7-
import com.qdesrame.openapi.diff.model.ListDiff;
88
import io.swagger.v3.oas.models.Components;
99
import io.swagger.v3.oas.models.security.SecurityScheme;
1010
import java.util.HashSet;
@@ -53,10 +53,8 @@ public Optional<ChangedSecurityScheme> diff(
5353

5454
if (changedSecurityScheme != null
5555
&& leftSecurityScheme.getType() == SecurityScheme.Type.OAUTH2) {
56-
ListDiff<String> scopesDiff = ListDiff.diff(leftScopes, rightScopes);
57-
if (!scopesDiff.getIncreased().isEmpty() || !scopesDiff.getMissing().isEmpty()) {
58-
changedSecurityScheme.setChangedScopes(scopesDiff);
59-
}
56+
isChanged(ListDiff.diff(new ChangedSecuritySchemeScopes(leftScopes, rightScopes)))
57+
.ifPresent(changedSecurityScheme::setChangedScopes);
6058
}
6159

6260
return isChanged(changedSecurityScheme);

src/main/java/com/qdesrame/openapi/diff/compare/schemadiffresult/SchemaDiffResult.java

+14-12
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
import static com.qdesrame.openapi.diff.utils.ChangedUtils.isChanged;
44
import static java.util.Optional.ofNullable;
55

6+
import com.qdesrame.openapi.diff.compare.ListDiff;
67
import com.qdesrame.openapi.diff.compare.MapKeyDiff;
78
import com.qdesrame.openapi.diff.compare.OpenApiDiff;
89
import com.qdesrame.openapi.diff.model.Change;
910
import com.qdesrame.openapi.diff.model.ChangedSchema;
1011
import com.qdesrame.openapi.diff.model.DiffContext;
11-
import com.qdesrame.openapi.diff.model.ListDiff;
12-
import com.qdesrame.openapi.diff.model.schema.ChangedReadOnly;
13-
import com.qdesrame.openapi.diff.model.schema.ChangedWriteOnly;
12+
import com.qdesrame.openapi.diff.model.schema.*;
1413
import io.swagger.v3.oas.models.Components;
1514
import io.swagger.v3.oas.models.media.Schema;
1615
import java.util.*;
@@ -31,13 +30,15 @@ public SchemaDiffResult(String type, OpenApiDiff openApiDiff) {
3130
this.changedSchema.setType(type);
3231
}
3332

34-
public <T extends Schema<X>, X> Optional<ChangedSchema> diff(
33+
public <V extends Schema<X>, X> Optional<ChangedSchema> diff(
3534
HashSet<String> refSet,
3635
Components leftComponents,
3736
Components rightComponents,
38-
T left,
39-
T right,
37+
V left,
38+
V right,
4039
DiffContext context) {
40+
ChangedEnum<X> changedEnum =
41+
ListDiff.diff(new ChangedEnum<>(left.getEnum(), right.getEnum(), context));
4142
changedSchema
4243
.setContext(context)
4344
.setOldSchema(left)
@@ -46,13 +47,14 @@ public <T extends Schema<X>, X> Optional<ChangedSchema> diff(
4647
!Boolean.TRUE.equals(left.getDeprecated())
4748
&& Boolean.TRUE.equals(right.getDeprecated()))
4849
.setChangeTitle(!Objects.equals(left.getTitle(), right.getTitle()))
49-
.setChangeRequired(ListDiff.diff(left.getRequired(), right.getRequired()))
50+
.setRequired(
51+
ListDiff.diff(new ChangedRequired(left.getRequired(), right.getRequired(), context)))
5052
.setChangeDefault(!Objects.equals(left.getDefault(), right.getDefault()))
51-
.setChangeEnum(ListDiff.diff(left.getEnum(), right.getEnum()))
53+
.setEnumeration(changedEnum)
5254
.setChangeFormat(!Objects.equals(left.getFormat(), right.getFormat()))
53-
.setReadOnly(new ChangedReadOnly(context, left.getReadOnly(), right.getReadOnly()))
54-
.setWriteOnly(new ChangedWriteOnly(context, left.getWriteOnly(), right.getWriteOnly()))
55-
.setChangedMaxLength(!Objects.equals(left.getMaxLength(), right.getMaxLength()));
55+
.setReadOnly(new ChangedReadOnly(left.getReadOnly(), right.getReadOnly(), context))
56+
.setWriteOnly(new ChangedWriteOnly(left.getWriteOnly(), right.getWriteOnly(), context))
57+
.setMaxLength(new ChangedMaxLength(left.getMaxLength(), right.getMaxLength(), context));
5658

5759
openApiDiff
5860
.getExtensionsDiff()
@@ -114,7 +116,7 @@ private Map<String, Schema> filterProperties(
114116
result.put(entry.getKey(), entry.getValue());
115117
} else {
116118
// Child property is not applicable, so required cannot be applied
117-
changedSchema.getChangeRequired().getIncreased().remove(entry.getKey());
119+
changedSchema.getRequired().getIncreased().remove(entry.getKey());
118120
}
119121
}
120122
return result;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.qdesrame.openapi.diff.model;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Optional;
6+
import lombok.Getter;
7+
import lombok.Setter;
8+
import lombok.experimental.Accessors;
9+
10+
@Getter
11+
@Setter
12+
@Accessors(chain = true)
13+
public abstract class ChangedList<T> implements Changed {
14+
protected DiffContext context;
15+
protected List<T> oldValue;
16+
protected List<T> newValue;
17+
18+
private List<T> increased;
19+
private List<T> missing;
20+
private List<T> shared;
21+
22+
protected ChangedList(List<T> oldValue, List<T> newValue, DiffContext context) {
23+
this.oldValue = Optional.ofNullable(oldValue).orElse(new ArrayList<>());
24+
this.newValue = Optional.ofNullable(newValue).orElse(new ArrayList<>());
25+
this.context = context;
26+
this.shared = new ArrayList<>();
27+
this.increased = new ArrayList<>();
28+
this.missing = new ArrayList<>();
29+
}
30+
31+
@Override
32+
public DiffResult isChanged() {
33+
if (missing.isEmpty() && increased.isEmpty()) {
34+
return DiffResult.NO_CHANGES;
35+
}
36+
return isItemsChanged();
37+
}
38+
39+
public abstract DiffResult isItemsChanged();
40+
41+
public static class SimpleChangedList<T> extends ChangedList<T> {
42+
43+
public SimpleChangedList(List<T> oldValue, List<T> newValue) {
44+
super(oldValue, newValue, null);
45+
}
46+
47+
@Override
48+
public DiffResult isItemsChanged() {
49+
return DiffResult.UNKNOWN;
50+
}
51+
}
52+
}

src/main/java/com/qdesrame/openapi/diff/model/ChangedSchema.java

+17-27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.qdesrame.openapi.diff.model;
22

3-
import com.qdesrame.openapi.diff.model.schema.ChangedReadOnly;
4-
import com.qdesrame.openapi.diff.model.schema.ChangedWriteOnly;
3+
import com.qdesrame.openapi.diff.model.schema.*;
54
import io.swagger.v3.oas.models.media.Schema;
65
import java.util.LinkedHashMap;
76
import java.util.List;
@@ -11,7 +10,6 @@
1110
import lombok.Getter;
1211
import lombok.Setter;
1312
import lombok.experimental.Accessors;
14-
import org.apache.commons.collections4.CollectionUtils;
1513

1614
/** Created by adarsh.sharma on 22/12/17. */
1715
@Getter
@@ -28,14 +26,14 @@ public class ChangedSchema implements ComposedChanged {
2826
protected boolean changeDeprecated;
2927
protected ChangedMetadata description;
3028
protected boolean changeTitle;
31-
protected ListDiff<String> changeRequired;
29+
protected ChangedRequired required;
3230
protected boolean changeDefault;
33-
protected ListDiff changeEnum;
31+
protected ChangedEnum<?> enumeration;
3432
protected boolean changeFormat;
3533
protected ChangedReadOnly readOnly;
3634
protected ChangedWriteOnly writeOnly;
3735
protected boolean changedType;
38-
protected boolean changedMaxLength;
36+
protected ChangedMaxLength maxLength;
3937
protected boolean discriminatorPropertyChanged;
4038
protected ChangedSchema items;
4139
protected ChangedOneOfSchema oneOfSchema;
@@ -52,43 +50,35 @@ public ChangedSchema() {
5250
public List<Changed> getChangedElements() {
5351
return Stream.concat(
5452
changedProperties.values().stream(),
55-
Stream.of(description, readOnly, writeOnly, items, oneOfSchema, addProp, extensions))
53+
Stream.of(
54+
description,
55+
readOnly,
56+
writeOnly,
57+
items,
58+
oneOfSchema,
59+
addProp,
60+
enumeration,
61+
required,
62+
maxLength,
63+
extensions))
5664
.collect(Collectors.toList());
5765
}
5866

5967
@Override
6068
public DiffResult isCoreChanged() {
6169
if (!changedType
6270
&& (oldSchema == null && newSchema == null || oldSchema != null && newSchema != null)
63-
&& !changedMaxLength
64-
&& (changeEnum == null || changeEnum.isUnchanged())
6571
&& !changeFormat
6672
&& increasedProperties.size() == 0
6773
&& missingProperties.size() == 0
6874
&& changedProperties.values().size() == 0
6975
&& !changeDeprecated
70-
&& (changeRequired == null || changeRequired.isUnchanged())
7176
&& !discriminatorPropertyChanged) {
7277
return DiffResult.NO_CHANGES;
7378
}
74-
boolean compatibleForRequest =
75-
(changeEnum == null || changeEnum.getMissing().isEmpty())
76-
&& (changeRequired == null || CollectionUtils.isEmpty(changeRequired.getIncreased()))
77-
&& (oldSchema != null || newSchema == null)
78-
&& (!changedMaxLength
79-
|| newSchema.getMaxLength() == null
80-
|| (oldSchema.getMaxLength() != null
81-
&& oldSchema.getMaxLength() <= newSchema.getMaxLength()));
82-
79+
boolean compatibleForRequest = (oldSchema != null || newSchema == null);
8380
boolean compatibleForResponse =
84-
(changeEnum == null || changeEnum.getIncreased().isEmpty())
85-
&& (changeRequired == null || CollectionUtils.isEmpty(changeRequired.getMissing()))
86-
&& missingProperties.isEmpty()
87-
&& (oldSchema == null || newSchema != null)
88-
&& (!changedMaxLength
89-
|| oldSchema.getMaxLength() == null
90-
|| (newSchema.getMaxLength() != null
91-
&& newSchema.getMaxLength() <= oldSchema.getMaxLength()));
81+
missingProperties.isEmpty() && (oldSchema == null || newSchema != null);
9282
if ((context.isRequest() && compatibleForRequest
9383
|| context.isResponse() && compatibleForResponse)
9484
&& !changedType

src/main/java/com/qdesrame/openapi/diff/model/ChangedSecurityScheme.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ChangedSecurityScheme implements ComposedChanged {
2020
private boolean changedScheme;
2121
private boolean changedBearerFormat;
2222
private boolean changedOpenIdConnectUrl;
23-
private ListDiff<String> changedScopes;
23+
private ChangedSecuritySchemeScopes changedScopes;
2424
private ChangedMetadata description;
2525
private ChangedOAuthFlows oAuthFlows;
2626
private ChangedExtensions extensions;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.qdesrame.openapi.diff.model;
2+
3+
import java.util.List;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class ChangedSecuritySchemeScopes extends ChangedList<String> {
8+
9+
public ChangedSecuritySchemeScopes(List<String> oldValue, List<String> newValue) {
10+
super(oldValue, newValue, null);
11+
}
12+
13+
@Override
14+
public DiffResult isItemsChanged() {
15+
return DiffResult.INCOMPATIBLE;
16+
}
17+
}

src/main/java/com/qdesrame/openapi/diff/model/ComposedChanged.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ default DiffResult isChanged() {
2020
.stream()
2121
.filter(Objects::nonNull)
2222
.map(Changed::isChanged)
23-
.mapToInt(diffResult -> diffResult.getWeight())
23+
.mapToInt(DiffResult::getWeight)
2424
.max()
25-
.orElseGet(() -> 0));
25+
.orElse(0));
2626
if (isCoreChanged().getWeight() > elementsResult.getWeight()) {
2727
return isCoreChanged();
2828
} else {

src/main/java/com/qdesrame/openapi/diff/model/ListDiff.java

-49
This file was deleted.

0 commit comments

Comments
 (0)