Skip to content

Commit e484204

Browse files
committed
Ensure to uses the correct document to resolve
Closes #793 Closes #322
1 parent c90da8c commit e484204

File tree

3 files changed

+73
-65
lines changed

3 files changed

+73
-65
lines changed

Diff for: jsonschema2pojo-core/src/main/java/org/jsonschema2pojo/rules/PropertyRule.java

+35-39
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private JsonNode resolveRefs(JsonNode node, Schema parent) {
193193
if (node.has("$ref")) {
194194
Schema refSchema = ruleFactory.getSchemaStore().create(parent, node.get("$ref").asText(), ruleFactory.getGenerationConfig().getRefFragmentPathDelimiters());
195195
JsonNode refNode = refSchema.getContent();
196-
return resolveRefs(refNode, parent);
196+
return resolveRefs(refNode, refSchema);
197197
} else {
198198
return node;
199199
}
@@ -245,54 +245,50 @@ private JMethod addSetter(JDefinedClass c, JFieldVar field, String jsonPropertyN
245245
return setter;
246246
}
247247

248-
private JMethod addBuilderMethod(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node) {
249-
JMethod result = null;
250-
if(ruleFactory.getGenerationConfig().isUseInnerClassBuilders()) {
251-
result = addInnerBuilderMethod(c, field, jsonPropertyName, node);
252-
} else {
253-
result = addLegacyBuilder(c, field, jsonPropertyName, node);
248+
private JMethod addBuilderMethod(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node) {
249+
JMethod result = null;
250+
if(ruleFactory.getGenerationConfig().isUseInnerClassBuilders()) {
251+
result = addInnerBuilderMethod(c, field, jsonPropertyName, node);
252+
} else {
253+
result = addLegacyBuilder(c, field, jsonPropertyName, node);
254+
}
255+
return result;
254256
}
255-
return result;
256-
}
257-
258-
private JMethod addLegacyBuilder(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node) {
259-
JMethod builder = c.method(JMod.PUBLIC, c, getBuilderName(jsonPropertyName, node));
260257

261-
JVar param = builder.param(field.type(), field.name());
262-
JBlock body = builder.body();
263-
body.assign(JExpr._this().ref(field), param);
264-
body._return(JExpr._this());
258+
private JMethod addLegacyBuilder(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node) {
259+
JMethod builder = c.method(JMod.PUBLIC, c, getBuilderName(jsonPropertyName, node));
265260

266-
return builder;
267-
}
261+
JVar param = builder.param(field.type(), field.name());
262+
JBlock body = builder.body();
263+
body.assign(JExpr._this().ref(field), param);
264+
body._return(JExpr._this());
268265

269-
private JMethod addInnerBuilderMethod(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node) {
270-
JDefinedClass builderClass = ruleFactory.getReflectionHelper().getBaseBuilderClass(c);
266+
return builder;
267+
}
271268

272-
JMethod builderMethod = builderClass.method(JMod.PUBLIC, builderClass, getBuilderName(jsonPropertyName, node));
269+
private JMethod addInnerBuilderMethod(JDefinedClass c, JFieldVar field, String jsonPropertyName, JsonNode node) {
270+
JDefinedClass builderClass = ruleFactory.getReflectionHelper().getBaseBuilderClass(c);
273271

274-
JVar param = builderMethod.param(field.type(), field.name());
275-
JBlock body = builderMethod.body();
276-
body.assign(JExpr.ref(JExpr.cast(c, JExpr._this().ref("instance")), field), param);
277-
body._return(JExpr._this());
272+
JMethod builderMethod = builderClass.method(JMod.PUBLIC, builderClass, getBuilderName(jsonPropertyName, node));
278273

279-
return builderMethod;
280-
}
274+
JVar param = builderMethod.param(field.type(), field.name());
275+
JBlock body = builderMethod.body();
276+
body.assign(JExpr.ref(JExpr.cast(c, JExpr._this().ref("instance")), field), param);
277+
body._return(JExpr._this());
281278

282-
private String getBuilderClassName(JDefinedClass c) {
283-
return ruleFactory.getNameHelper().getBuilderClassName(c);
284-
}
279+
return builderMethod;
280+
}
285281

286-
private String getBuilderName(String propertyName, JsonNode node) {
287-
return ruleFactory.getNameHelper().getBuilderName(propertyName, node);
288-
}
282+
private String getBuilderName(String propertyName, JsonNode node) {
283+
return ruleFactory.getNameHelper().getBuilderName(propertyName, node);
284+
}
289285

290-
private String getSetterName(String propertyName, JsonNode node) {
291-
return ruleFactory.getNameHelper().getSetterName(propertyName, node);
292-
}
286+
private String getSetterName(String propertyName, JsonNode node) {
287+
return ruleFactory.getNameHelper().getSetterName(propertyName, node);
288+
}
293289

294-
private String getGetterName(String propertyName, JType type, JsonNode node) {
295-
return ruleFactory.getNameHelper().getGetterName(propertyName, type, node);
296-
}
290+
private String getGetterName(String propertyName, JType type, JsonNode node) {
291+
return ruleFactory.getNameHelper().getGetterName(propertyName, type, node);
292+
}
297293

298294
}

Diff for: jsonschema2pojo-integration-tests/src/test/java/org/jsonschema2pojo/integration/ref/FragmentRefIT.java

+35-26
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package org.jsonschema2pojo.integration.ref;
1818

19+
import static org.hamcrest.MatcherAssert.*;
1920
import static org.hamcrest.Matchers.*;
20-
import static org.junit.Assert.*;
2121

2222
import java.io.IOException;
2323

@@ -65,41 +65,50 @@ public void refToFragmentOfAnotherSchemaIsReadSuccessfully() throws NoSuchMethod
6565
assertThat(aClass.getName(), is("com.example.AdditionalPropertyValue"));
6666

6767
}
68-
68+
69+
@Test
70+
public void refToFragmentOfAnotherSchemaThatAlsoHasARefIsReadSuccessfully() throws NoSuchMethodException {
71+
72+
Class<?> aClass = fragmentRefsClass.getMethod("getFragmentWithAnotherRef").getReturnType();
73+
74+
assertThat(aClass.getName(), is("java.lang.String"));
75+
76+
}
77+
6978
@Test
7079
public void selfRefWithoutParentFile() throws IOException {
7180
JCodeModel codeModel = new JCodeModel();
7281
JsonNode schema = new ObjectMapper().readTree("{\"type\":\"object\", \"properties\":{\"a\":{\"$ref\":\"#/b\"}}, \"b\":\"string\"}");
73-
82+
7483
JPackage p = codeModel._package("com.example");
7584
new RuleFactory().getSchemaRule().apply("Example", schema, null, p, new Schema(null, schema, null));
7685
}
77-
86+
7887
@Test
7988
public void refToInnerFragmentThatHasRefToOuterFragmentWithoutParentFile() throws IOException {
8089
JCodeModel codeModel = new JCodeModel();
81-
JsonNode schema = new ObjectMapper().readTree("{\n" +
82-
" \"type\": \"object\",\n" +
83-
" \"definitions\": {\n" +
84-
" \"location\": {\n" +
85-
" \"type\": \"object\",\n" +
86-
" \"properties\": {\n" +
87-
" \"cat\": {\n" +
88-
" \"$ref\": \"#/definitions/cat\"\n" +
89-
" }\n" +
90-
" }\n" +
91-
" },\n" +
92-
" \"cat\": {\n" +
93-
" \"type\": \"number\"\n" +
94-
" }\n" +
95-
" },\n" +
96-
" \"properties\": {\n" +
97-
" \"location\": {\n" +
98-
" \"$ref\": \"#/definitions/location\"\n" +
99-
" }\n" +
100-
" }\n" +
101-
"}");
102-
90+
JsonNode schema = new ObjectMapper().readTree("{\n" +
91+
" \"type\": \"object\",\n" +
92+
" \"definitions\": {\n" +
93+
" \"location\": {\n" +
94+
" \"type\": \"object\",\n" +
95+
" \"properties\": {\n" +
96+
" \"cat\": {\n" +
97+
" \"$ref\": \"#/definitions/cat\"\n" +
98+
" }\n" +
99+
" }\n" +
100+
" },\n" +
101+
" \"cat\": {\n" +
102+
" \"type\": \"number\"\n" +
103+
" }\n" +
104+
" },\n" +
105+
" \"properties\": {\n" +
106+
" \"location\": {\n" +
107+
" \"$ref\": \"#/definitions/location\"\n" +
108+
" }\n" +
109+
" }\n" +
110+
"}");
111+
103112
JPackage p = codeModel._package("com.example");
104113
new RuleFactory().getSchemaRule().apply("Example", schema, null, p, new Schema(null, schema, null));
105114
}

Diff for: jsonschema2pojo-integration-tests/src/test/resources/schema/ref/fragmentRefs.json

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
},
1010
"fragmentOfA" : {
1111
"$ref" : "a.json/#/additionalProperties"
12+
},
13+
"fragmentWithAnotherRef" : {
14+
"$ref" : "nestedSelfRefsReadAsString.json/#/definitions/Thing/properties/namespace"
1215
}
1316
},
1417
"additionalProperties" : false

0 commit comments

Comments
 (0)