Skip to content

Commit 139ccb3

Browse files
committed
Prevent "field recursion found" error
1 parent 1ad0a72 commit 139ccb3

File tree

7 files changed

+363
-12
lines changed

7 files changed

+363
-12
lines changed

GenerateGitlabClient.java

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import java.nio.file.Paths;
1212
import java.util.Arrays;
1313
import java.util.List;
14+
import java.util.Map;
15+
import java.util.Map.Entry;
1416
import java.util.Objects;
1517

1618
import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
@@ -96,6 +98,10 @@ public static Config createConfig(Schema schema) {
9698
Type project = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "Project");
9799
Type board = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "Board");
98100
Type epicBoard = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "EpicBoard");
101+
Type milestoneConnection = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "MilestoneConnection");
102+
Type milestone = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "Milestone");
103+
Type releaseConnection = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "ReleaseConnection");
104+
Type release = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "Release");
99105

100106
SchemaUtil.getFieldByName(schema, boardList, "id")
101107
.getType()
@@ -112,9 +118,9 @@ public static Config createConfig(Schema schema) {
112118
schema.getTypes()
113119
.add(createWorkItemRef());
114120
schema.getTypes()
115-
.add(createBoardRef(mapper, board));
121+
.add(createDuplicatedRefType(mapper, board));
116122
schema.getTypes()
117-
.add(createEpicBoardRef(mapper, epicBoard));
123+
.add(createDuplicatedRefType(mapper, epicBoard));
118124
schema.getTypes()
119125
.add(createProjectContainingSingleIssueBoard(mapper, project));
120126
schema.getTypes()
@@ -131,8 +137,19 @@ public static Config createConfig(Schema schema) {
131137
.add(createProjectContainingIssueBoards(mapper, project));
132138
schema.getTypes()
133139
.add(createProjectContainingReleases(mapper, project));
140+
schema.getTypes()
141+
.add(createDuplicatedRefType(mapper, releaseConnection, Map.of("Release", "ReleaseRef")));
142+
schema.getTypes()
143+
.add(createDuplicatedRefType(mapper, release));
134144
schema.getTypes()
135145
.add(createProjectContainingMilestones(mapper, project));
146+
schema.getTypes()
147+
.add(createDuplicatedRefType(mapper, milestoneConnection, Map.of("Milestone", "MilestoneRef")));
148+
schema.getTypes()
149+
.add(createDuplicatedRefType(mapper, milestone));
150+
151+
applyRenamingsOnFields(release, Map.of("MilestoneConnection", "MilestoneConnectionRef"));
152+
applyRenamingsOnFields(milestone, Map.of("ReleaseConnection", "ReleaseConnectionRef"));
136153

137154
//See: https://gitlab.com/gitlab-org/gitlab/-/issues/499834
138155
Type label = SchemaUtil.getTypeByKindAndName(schema, Kind.OBJECT, "Label");
@@ -167,6 +184,7 @@ public static Config createConfig(Schema schema) {
167184
.addIncludeName("Iteration") //
168185
.addIncludeName("LinkedWorkItemTypeConnection") //
169186
.addIncludeName("Milestone") //
187+
.addIncludeName("MilestoneRef") //
170188
.addIncludeName("DiscussionConnection") //
171189
.addIncludeName("WorkItemTimelogConnection") //
172190
.addIncludeName("WorkItemWidgetDefinitionWeight") //
@@ -192,7 +210,10 @@ public static Config createConfig(Schema schema) {
192210
.addIncludeName("ProjectContainingMilestones") //
193211
.addIncludeName("ReleaseConnection") //
194212
.addIncludeName("Release") //
213+
.addIncludeName("ReleaseConnectionRef") //
214+
.addIncludeName("ReleaseRef") //
195215
.addIncludeName("MilestoneConnection") //
216+
.addIncludeName("MilestoneConnectionRef") //
196217
.addIncludeName("Todo") //
197218
.addIncludeName("WorkItemClosingMergeRequest") //
198219
.addIncludeName("WorkItemTimelog") //
@@ -815,6 +836,13 @@ public static Config createConfig(Schema schema) {
815836
.addIncludeName("updatedAt") //
816837
.addIncludeName("webPath") //
817838
) //
839+
.addFilter(new FieldsFilter()
840+
.setTypeKind(Kind.OBJECT)
841+
.setTypeName("MilestoneRef")
842+
.addIncludeName("id") //
843+
.addIncludeName("title") //
844+
.addIncludeName("webPath") //
845+
) //
818846
.addFilter(new FieldsFilter()
819847
.setTypeKind(Kind.OBJECT)
820848
.setTypeName("TaskCompletionStatus")
@@ -1075,6 +1103,12 @@ public static Config createConfig(Schema schema) {
10751103
.addIncludeName("pageInfo")
10761104
.addIncludeName("nodes") //
10771105
) //
1106+
.addFilter(new FieldsFilter()
1107+
.setTypeKind(Kind.OBJECT)
1108+
.setTypeName("ReleaseConnectionRef")
1109+
.addIncludeName("pageInfo")
1110+
.addIncludeName("nodes") //
1111+
) //
10781112
.addFilter(new FieldsFilter()
10791113
.setTypeKind(Kind.OBJECT)
10801114
.setTypeName("Release")
@@ -1086,12 +1120,25 @@ public static Config createConfig(Schema schema) {
10861120
.addIncludeName("upcomingRelease") //
10871121
.addIncludeName("milestones") //
10881122
) //
1123+
.addFilter(new FieldsFilter()
1124+
.setTypeKind(Kind.OBJECT)
1125+
.setTypeName("ReleaseRef")
1126+
.addIncludeName("id")
1127+
.addIncludeName("name")
1128+
.addIncludeName("tagName") //
1129+
) //
10891130
.addFilter(new FieldsFilter()
10901131
.setTypeKind(Kind.OBJECT)
10911132
.setTypeName("MilestoneConnection")
10921133
.addIncludeName("pageInfo")
10931134
.addIncludeName("nodes") //
10941135
) //
1136+
.addFilter(new FieldsFilter()
1137+
.setTypeKind(Kind.OBJECT)
1138+
.setTypeName("MilestoneConnectionRef")
1139+
.addIncludeName("pageInfo")
1140+
.addIncludeName("nodes") //
1141+
) //
10951142
.addFilter(new FieldsFilter()
10961143
.setTypeKind(Kind.OBJECT)
10971144
.setTypeName("TimeboxReport")
@@ -1943,12 +1990,34 @@ public static Config createConfig(Schema schema) {
19431990
return config;
19441991
}
19451992

1946-
private static Type createBoardRef(ObjectMapper mapper, Type board) {
1947-
return duplicateType(mapper, board, "BoardRef");
1993+
private static Type createDuplicatedRefType(ObjectMapper mapper, Type type) {
1994+
return createDuplicatedRefType(mapper, type, Map.of());
19481995
}
19491996

1950-
private static Type createEpicBoardRef(ObjectMapper mapper, Type epicBoard) {
1951-
return duplicateType(mapper, epicBoard, "EpicBoardRef");
1997+
private static Type createDuplicatedRefType(ObjectMapper mapper, Type type, Map<String, String> rename) {
1998+
Type newType = duplicateType(mapper, type, type.getName() + "Ref");
1999+
applyRenamingsOnFields(newType, rename);
2000+
return newType;
2001+
}
2002+
2003+
private static void applyRenamingsOnFields(Type type, Map<String, String> rename) {
2004+
for (Field f : type.getFields()) {
2005+
TypeRef t = f.getType();
2006+
applyRenamingsOnType(t, rename);
2007+
}
2008+
}
2009+
2010+
private static void applyRenamingsOnType(TypeRef type, Map<String, String> rename) {
2011+
if (type.getOfType() != null) {
2012+
applyRenamingsOnType(type.getOfType(), rename);
2013+
}
2014+
if (type.getKind() == Kind.OBJECT) {
2015+
for (Entry<String, String> e : rename.entrySet()) {
2016+
if (Objects.equals(e.getKey(), type.getName())) {
2017+
type.setName(e.getValue());
2018+
}
2019+
}
2020+
}
19522021
}
19532022

19542023
private static Type createGroupContainingSingleIssueBoard(ObjectMapper mapper, Type group) {

src/main/java/graphql/gitlab/model/Milestone.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class Milestone {
3838
/**
3939
* Releases associated with this milestone.
4040
*/
41-
private ReleaseConnection releases;
41+
private ReleaseConnectionRef releases;
4242

4343
/**
4444
* Timestamp of the milestone start date.
@@ -115,11 +115,11 @@ public Milestone setId(String id) {
115115
return this;
116116
}
117117

118-
public ReleaseConnection getReleases() {
118+
public ReleaseConnectionRef getReleases() {
119119
return releases;
120120
}
121121

122-
public Milestone setReleases(ReleaseConnection releases) {
122+
public Milestone setReleases(ReleaseConnectionRef releases) {
123123
this.releases = releases;
124124
return this;
125125
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package graphql.gitlab.model;
2+
3+
import java.util.List;
4+
import java.util.Objects;
5+
6+
import org.eclipse.microprofile.graphql.Name;
7+
8+
/**
9+
* The connection type for Milestone.
10+
*/
11+
@Name("MilestoneConnectionRef")
12+
public class MilestoneConnectionRef {
13+
14+
/**
15+
* A list of nodes.
16+
*/
17+
private List<MilestoneRef> nodes;
18+
19+
/**
20+
* Information to aid in pagination.
21+
*/
22+
private PageInfo pageInfo;
23+
24+
public List<MilestoneRef> getNodes() {
25+
return nodes;
26+
}
27+
28+
public MilestoneConnectionRef setNodes(List<MilestoneRef> nodes) {
29+
this.nodes = nodes;
30+
return this;
31+
}
32+
33+
public PageInfo getPageInfo() {
34+
return pageInfo;
35+
}
36+
37+
public MilestoneConnectionRef setPageInfo(PageInfo pageInfo) {
38+
this.pageInfo = pageInfo;
39+
return this;
40+
}
41+
42+
@Override
43+
public int hashCode() {
44+
return Objects.hash(nodes, pageInfo);
45+
}
46+
47+
@Override
48+
public boolean equals(Object obj) {
49+
if (this == obj)
50+
return true;
51+
if (obj == null)
52+
return false;
53+
if (getClass() != obj.getClass())
54+
return false;
55+
MilestoneConnectionRef other = (MilestoneConnectionRef) obj;
56+
return Objects.equals(nodes, other.nodes) && Objects.equals(pageInfo, other.pageInfo);
57+
}
58+
59+
@Override
60+
public String toString() {
61+
return "MilestoneConnectionRef [nodes=" + nodes + ", pageInfo=" + pageInfo + "]";
62+
}
63+
64+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package graphql.gitlab.model;
2+
3+
import java.util.Objects;
4+
5+
import org.eclipse.microprofile.graphql.Name;
6+
7+
/**
8+
* Represents a milestone
9+
*/
10+
@Name("MilestoneRef")
11+
public class MilestoneRef {
12+
13+
/**
14+
* ID of the milestone.
15+
*/
16+
private String id;
17+
18+
/**
19+
* Title of the milestone.
20+
*/
21+
private String title;
22+
23+
/**
24+
* Web path of the milestone.
25+
*/
26+
private String webPath;
27+
28+
public String getId() {
29+
return id;
30+
}
31+
32+
public MilestoneRef setId(String id) {
33+
this.id = id;
34+
return this;
35+
}
36+
37+
public String getTitle() {
38+
return title;
39+
}
40+
41+
public MilestoneRef setTitle(String title) {
42+
this.title = title;
43+
return this;
44+
}
45+
46+
public String getWebPath() {
47+
return webPath;
48+
}
49+
50+
public MilestoneRef setWebPath(String webPath) {
51+
this.webPath = webPath;
52+
return this;
53+
}
54+
55+
@Override
56+
public int hashCode() {
57+
return Objects.hash(id, title, webPath);
58+
}
59+
60+
@Override
61+
public boolean equals(Object obj) {
62+
if (this == obj)
63+
return true;
64+
if (obj == null)
65+
return false;
66+
if (getClass() != obj.getClass())
67+
return false;
68+
MilestoneRef other = (MilestoneRef) obj;
69+
return Objects.equals(id, other.id) && Objects.equals(title, other.title) && Objects.equals(webPath, other.webPath);
70+
}
71+
72+
@Override
73+
public String toString() {
74+
return "MilestoneRef [id=" + id + ", title=" + title + ", webPath=" + webPath + "]";
75+
}
76+
77+
}

src/main/java/graphql/gitlab/model/Release.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class Release {
2828
/**
2929
* Milestones associated to the release.
3030
*/
31-
private MilestoneConnection milestones;
31+
private MilestoneConnectionRef milestones;
3232

3333
/**
3434
* Name of the release.
@@ -72,11 +72,11 @@ public Release setId(ReleaseID id) {
7272
return this;
7373
}
7474

75-
public MilestoneConnection getMilestones() {
75+
public MilestoneConnectionRef getMilestones() {
7676
return milestones;
7777
}
7878

79-
public Release setMilestones(MilestoneConnection milestones) {
79+
public Release setMilestones(MilestoneConnectionRef milestones) {
8080
this.milestones = milestones;
8181
return this;
8282
}

0 commit comments

Comments
 (0)