Skip to content

Commit 99aef8e

Browse files
committed
feat: migrate java-httpclient template from feign to default http client
1 parent 6d3ee44 commit 99aef8e

24 files changed

Lines changed: 1808 additions & 712 deletions

pkg/generator/openapi-java/generator.go

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,21 @@ func (g *JavaGenerator) ToCodeType(schema *base.Schema, schemaType openapigenera
230230

231231
// normal types
232232
switch {
233+
case len(schema.Type) == 0 && len(schema.OneOf) > 0:
234+
codeTypes := make([]openapigenerator.CodeType, 0, len(schema.OneOf))
235+
for _, oneOfSchema := range schema.OneOf {
236+
codeType, err := g.ToCodeType(oneOfSchema.Schema(), schemaType, true)
237+
if err != nil {
238+
return openapigenerator.DefaultCodeType, errors.Join(fmt.Errorf("unhandled oneOf type. schema: %s, format: %s", schema.Type, schema.Format), err)
239+
}
240+
codeTypes = append(codeTypes, codeType)
241+
}
242+
243+
if openapigenerator.HaveSameCodeTypeName(codeTypes) {
244+
return codeTypes[0], nil
245+
} else {
246+
return openapigenerator.CodeType{Name: "Object"}, nil
247+
}
233248
case slices.Contains(schema.Type, "string"):
234249
switch schema.Format {
235250
case "uri":
@@ -238,7 +253,7 @@ func (g *JavaGenerator) ToCodeType(schema *base.Schema, schemaType openapigenera
238253
return openapigenerator.CodeType{TypeArgs: []openapigenerator.CodeType{openapigenerator.NewSimpleCodeType(g.BoxType("byte", isNullable), schema)}, IsArray: true}, nil
239254
case "date", "date-time":
240255
return openapigenerator.CodeType{Name: "Instant", ImportPath: "java.time"}, nil
241-
case "uuid:":
256+
case "uuid":
242257
return openapigenerator.CodeType{Name: "UUID", ImportPath: "java.util"}, nil
243258
default:
244259
return openapigenerator.CodeType{Name: "String"}, nil
@@ -260,7 +275,7 @@ func (g *JavaGenerator) ToCodeType(schema *base.Schema, schemaType openapigenera
260275
case "uint64":
261276
return openapigenerator.CodeType{Name: "BigInteger", ImportPath: "java.math"}, nil
262277
default:
263-
return openapigenerator.NewSimpleCodeType("long", schema), nil
278+
return openapigenerator.NewSimpleCodeType(g.BoxType("long", isNullable), schema), nil
264279
}
265280
case slices.Contains(schema.Type, "number"):
266281
switch schema.Format {
@@ -272,15 +287,13 @@ func (g *JavaGenerator) ToCodeType(schema *base.Schema, schemaType openapigenera
272287
return openapigenerator.NewSimpleCodeType(g.BoxType("double", isNullable), schema), nil
273288
}
274289
case slices.Contains(schema.Type, "array"):
290+
if schema.Items == nil || schema.Items.A == nil {
291+
return openapigenerator.DefaultCodeType, fmt.Errorf("array schema missing items definition")
292+
}
275293
arrayType, err := g.ToCodeType(schema.Items.A.Schema(), schemaType, true)
276294
if err != nil {
277295
return openapigenerator.DefaultCodeType, errors.Join(fmt.Errorf("unhandled array type. schema: %s, format: %s", schema.Type, schema.Format), err)
278296
}
279-
280-
isArrayTypeNullable := openapiutil.IsSchemaNullable(schema.Items.A.Schema())
281-
if isArrayTypeNullable {
282-
return openapigenerator.NewListCodeType(arrayType, schema), nil
283-
}
284297
return openapigenerator.NewListCodeType(arrayType, schema), nil // NewArrayCodeType
285298
case slices.Contains(schema.Type, "object") || schema.Type == nil:
286299
if schema.PatternProperties != nil {
@@ -313,21 +326,6 @@ func (g *JavaGenerator) ToCodeType(schema *base.Schema, schemaType openapigenera
313326
}
314327
return openapigenerator.CodeType{Name: g.ToClassName(schema.Title)}, nil // TODO: import path
315328
}
316-
case len(schema.Type) == 0 && len(schema.OneOf) > 0:
317-
codeTypes := make([]openapigenerator.CodeType, 0, len(schema.OneOf))
318-
for _, oneOfSchema := range schema.OneOf {
319-
codeType, err := g.ToCodeType(oneOfSchema.Schema(), schemaType, true)
320-
if err != nil {
321-
return openapigenerator.DefaultCodeType, errors.Join(fmt.Errorf("unhandled oneOf type. schema: %s, format: %s", schema.Type, schema.Format), err)
322-
}
323-
codeTypes = append(codeTypes, codeType)
324-
}
325-
326-
if openapigenerator.HaveSameCodeTypeName(codeTypes) {
327-
return codeTypes[0], nil
328-
} else {
329-
return openapigenerator.CodeType{Name: "Object"}, nil
330-
}
331329
default:
332330
return openapigenerator.DefaultCodeType, fmt.Errorf("unhandled type. schema: %s, format: %s", schema.Type, schema.Format)
333331
}

pkg/generator/openapi-java/generator_test.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ var (
3232
modelArrayOfMap []byte
3333
//go:embed specs/model-array-oneof.yaml
3434
modelArrayOfOneOf []byte
35+
//go:embed specs/model-uuid.yaml
36+
modelUUID []byte
3537
//go:embed specs/callback-basic.yaml
3638
callbackBasic []byte
3739
//go:embed specs/webhook-basic.yaml
@@ -125,7 +127,23 @@ func TestArrayOfOneOf(t *testing.T) {
125127
assert.Len(t, templateData.Models, 1)
126128
assert.Equal(t, "BookDto", templateData.Models[0].Name)
127129
assert.Equal(t, true, templateData.Models[0].IsTypeAlias)
128-
assert.Equal(t, "List<Object>", templateData.Models[0].Parent.QualifiedType)
130+
assert.Equal(t, "List<String>", templateData.Models[0].Parent.QualifiedType)
131+
}
132+
133+
func TestModelUUIDFormat(t *testing.T) {
134+
// arrange
135+
v3doc := openapidocument.OpenV3DocumentForTest(modelUUID)
136+
137+
// act
138+
templateData, err := openapigenerator.BuildTemplateData(v3doc, NewGenerator(), commonPackages)
139+
assert.NoError(t, err)
140+
assert.NotNil(t, templateData)
141+
142+
// assert
143+
assert.Len(t, templateData.Models, 1)
144+
assert.Equal(t, "BookDto", templateData.Models[0].Name)
145+
assert.Equal(t, "id", templateData.Models[0].Properties[0].Name)
146+
assert.Equal(t, "java.util.UUID", templateData.Models[0].Properties[0].Type.QualifiedType)
129147
}
130148

131149
func TestCallbackBasic(t *testing.T) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
openapi: 3.0.1
2+
info:
3+
title: Sample API
4+
version: 1.0.0
5+
x-name: Sample API
6+
components:
7+
schemas:
8+
Book:
9+
title: BookDto
10+
type: object
11+
properties:
12+
id:
13+
type: string
14+
format: uuid

pkg/template/templates/openapi-java-httpclient/aconfig.go

Lines changed: 62 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,37 +34,29 @@ var Template = templateapi.Config{
3434
Type: templateapi.TypeAPIOnce,
3535
Kind: templateapi.KindAPI,
3636
},
37-
// core - api
3837
{
39-
SourceTemplate: "api_main_default.gohtml",
38+
SourceTemplate: "api_client_base.gohtml",
4039
Snippets: templateapi.DefaultSnippets,
4140
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Client | toFilePath }}",
42-
TargetFileName: "{{ .Metadata.Name }}Api.java",
41+
TargetFileName: "Abstract{{ .Metadata.Name }}ApiClient.java",
4342
Type: templateapi.TypeAPIOnce,
4443
Kind: templateapi.KindAPI,
4544
},
45+
// core - api
4646
{
4747
SourceTemplate: "api_main_consumer.gohtml",
4848
Snippets: templateapi.DefaultSnippets,
4949
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Client | toFilePath }}",
50-
TargetFileName: "{{ .Metadata.Name }}ConsumerApi.java",
50+
TargetFileName: "{{ .Metadata.Name }}Api.java",
5151
Type: templateapi.TypeAPIOnce,
5252
Kind: templateapi.KindAPI,
5353
},
5454
// core - services
55-
{
56-
SourceTemplate: "api_service_default.gohtml",
57-
Snippets: templateapi.DefaultSnippets,
58-
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Client | toFilePath }}",
59-
TargetFileName: "{{ .Service.Type }}Api.java",
60-
Type: templateapi.TypeAPIEach,
61-
Kind: templateapi.KindAPI,
62-
},
6355
{
6456
SourceTemplate: "api_service_consumer.gohtml",
6557
Snippets: templateapi.DefaultSnippets,
6658
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Client | toFilePath }}",
67-
TargetFileName: "{{ .Service.Type }}ConsumerApi.java",
59+
TargetFileName: "{{ .Service.Type }}Api.java",
6860
Type: templateapi.TypeAPIEach,
6961
Kind: templateapi.KindAPI,
7062
},
@@ -77,6 +69,14 @@ var Template = templateapi.Config{
7769
Type: templateapi.TypeOperationEach,
7870
Kind: templateapi.KindAPI,
7971
},
72+
{
73+
SourceTemplate: "response.gohtml",
74+
Snippets: templateapi.DefaultSnippets,
75+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Responses | toFilePath }}",
76+
TargetFileName: "{{ .Operation.Name }}Response.java",
77+
Type: templateapi.TypeOperationEach,
78+
Kind: templateapi.KindAPI,
79+
},
8080
// core - model
8181
{
8282
SourceTemplate: "model.gohtml",
@@ -94,6 +94,55 @@ var Template = templateapi.Config{
9494
Type: templateapi.TypeEnumEach,
9595
Kind: templateapi.KindModel,
9696
},
97+
// core - auth
98+
{
99+
SourceTemplate: "auth_api.gohtml",
100+
Snippets: templateapi.DefaultSnippets,
101+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Auth | toFilePath }}",
102+
TargetFileName: "AuthMethod.java",
103+
Type: templateapi.TypeAPIOnce,
104+
Kind: templateapi.KindAPI,
105+
},
106+
{
107+
SourceTemplate: "auth_apikey.gohtml",
108+
Snippets: templateapi.DefaultSnippets,
109+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Auth | toFilePath }}",
110+
TargetFileName: "ApiKeyAuthMethod.java",
111+
Type: templateapi.TypeAPIOnce,
112+
Kind: templateapi.KindAPI,
113+
},
114+
{
115+
SourceTemplate: "auth_basic.gohtml",
116+
Snippets: templateapi.DefaultSnippets,
117+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Auth | toFilePath }}",
118+
TargetFileName: "BasicAuthMethod.java",
119+
Type: templateapi.TypeAPIOnce,
120+
Kind: templateapi.KindAPI,
121+
},
122+
{
123+
SourceTemplate: "auth_bearer.gohtml",
124+
Snippets: templateapi.DefaultSnippets,
125+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Auth | toFilePath }}",
126+
TargetFileName: "BearerAuthMethod.java",
127+
Type: templateapi.TypeAPIOnce,
128+
Kind: templateapi.KindAPI,
129+
},
130+
{
131+
SourceTemplate: "auth_oauth2client.gohtml",
132+
Snippets: templateapi.DefaultSnippets,
133+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Auth | toFilePath }}",
134+
TargetFileName: "OAuth2ClientCredentialAuthMethod.java",
135+
Type: templateapi.TypeAPIOnce,
136+
Kind: templateapi.KindAPI,
137+
},
138+
{
139+
SourceTemplate: "auth_oauth2user.gohtml",
140+
Snippets: templateapi.DefaultSnippets,
141+
TargetDirectory: "core/src/main/java/{{ .Common.Packages.Auth | toFilePath }}",
142+
TargetFileName: "OAuth2UserCredentialAuthMethod.java",
143+
Type: templateapi.TypeAPIOnce,
144+
Kind: templateapi.KindAPI,
145+
},
97146
// spring - main
98147
{
99148
SourceTemplate: "build.gradle.kts.spring.gohtml",

0 commit comments

Comments
 (0)