• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

torand / openapi2java / 15204169920

23 May 2025 06:49AM UTC coverage: 82.07%. Remained the same
15204169920

push

github

torand
refactor: renamed config param 'generateResourceClasses' to 'generateResourceInterfaces'

526 of 750 branches covered (70.13%)

Branch coverage included in aggregate %.

1 of 2 new or added lines in 2 files covered. (50.0%)

1433 of 1637 relevant lines covered (87.54%)

4.77 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.43
/src/main/java/io/github/torand/openapi2java/ResourceGenerator.java
1
/*
2
 * Copyright (c) 2024 Tore Eide Andersen
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
package io.github.torand.openapi2java;
17

18
import io.github.torand.openapi2java.collectors.ComponentResolver;
19
import io.github.torand.openapi2java.collectors.ResourceInfoCollector;
20
import io.github.torand.openapi2java.model.ResourceInfo;
21
import io.github.torand.openapi2java.utils.StringHelper;
22
import io.github.torand.openapi2java.writers.ResourceWriter;
23
import io.swagger.v3.oas.models.OpenAPI;
24
import io.swagger.v3.oas.models.tags.Tag;
25
import org.slf4j.Logger;
26
import org.slf4j.LoggerFactory;
27

28
import java.io.IOException;
29
import java.util.concurrent.atomic.AtomicInteger;
30
import java.util.stream.Stream;
31

32
import static io.github.torand.openapi2java.utils.CollectionHelper.isEmpty;
33
import static io.github.torand.openapi2java.utils.StringHelper.isBlank;
34
import static io.github.torand.openapi2java.utils.StringHelper.pluralSuffix;
35
import static io.github.torand.openapi2java.writers.WriterFactory.createResourceWriter;
36
import static java.util.stream.Collectors.joining;
37

38
public class ResourceGenerator {
39
    private static final Logger logger = LoggerFactory.getLogger(ResourceGenerator.class);
4✔
40
    private final Options opts;
41

42
    public ResourceGenerator(Options opts) {
2✔
43
        this.opts = opts;
3✔
44
    }
1✔
45

46
    public void generate(OpenAPI openApiDoc) {
47
        int clientCount = 0;
2✔
48

49
        if (isEmpty(openApiDoc.getTags())) {
4✔
50
            if (isBlank(opts.resourceNameOverride)) {
5!
NEW
51
                logger.error("The OpenAPI specification does not contain tags. Please configure a resource name override to generate a resource interface.");
×
52
                return;
×
53
            }
54

55
            clientCount = generateWithNameOverride(openApiDoc);
5✔
56
        } else {
57
            clientCount = generateFromTags(openApiDoc);
4✔
58
        }
59

60
        logger.info("Generated {} REST client{} in directory {}", clientCount, pluralSuffix(clientCount), opts.outputDir);
21✔
61
    }
1✔
62

63
    private int generateWithNameOverride(OpenAPI openApiDoc) {
64
        ComponentResolver componentResolver = new ComponentResolver(openApiDoc);
5✔
65
        ResourceInfoCollector resourceInfoCollector = new ResourceInfoCollector(componentResolver, opts);
7✔
66

67
        String resourceName = opts.resourceNameOverride;
4✔
68

69
        if (opts.verbose) {
4!
70
            logger.info("Generating REST client: {}{}", resourceName, opts.resourceNameSuffix);
7✔
71
        }
72

73
        ResourceInfo resourceInfo = resourceInfoCollector.getResourceInfo(resourceName, openApiDoc.getPaths(), openApiDoc.getSecurity(), null);
9✔
74

75
        String resourceFilename = resourceInfo.name + opts.getFileExtension();
7✔
76
        try (ResourceWriter resourceWriter = createResourceWriter(resourceFilename, opts)) {
5✔
77
            if (resourceInfo.isEmpty()) {
3!
78
                logger.warn("No paths found in OpenAPI specification");
×
79
                return 0;
×
80
            } else {
81
                resourceWriter.write(resourceInfo);
3✔
82
                return 1;
4✔
83
            }
84
        } catch (IOException e) {
×
85
            logger.error("Failed to write file {}", resourceFilename, e);
×
86
            return 0;
×
87
        }
88
    }
89

90
    private int generateFromTags(OpenAPI openApiDoc) {
91
        ComponentResolver componentResolver = new ComponentResolver(openApiDoc);
5✔
92
        ResourceInfoCollector resourceInfoCollector = new ResourceInfoCollector(componentResolver, opts);
7✔
93

94
        AtomicInteger clientCount = new AtomicInteger(0);
5✔
95

96
        openApiDoc.getTags().forEach(tag -> {
8✔
97
            if (isEmpty(opts.includeTags) || opts.includeTags.contains(tag.getName())) {
5!
98
                String resourceName = getResourceName(tag);
4✔
99

100
                if (opts.verbose) {
4!
101
                    logger.info("Generating REST client for tag \"{}\": {}{}", tag.getName(), resourceName, opts.resourceNameSuffix);
20✔
102
                }
103

104
                ResourceInfo resourceInfo = resourceInfoCollector.getResourceInfo(resourceName, openApiDoc.getPaths(), openApiDoc.getSecurity(), tag);
9✔
105

106
                String resourceFilename = resourceInfo.name + opts.getFileExtension();
7✔
107
                try (ResourceWriter resourceWriter = createResourceWriter(resourceFilename, opts)) {
5✔
108
                    if (resourceInfo.isEmpty()) {
3!
109
                        logger.warn("No paths found for tag \"{}\"", tag.getName());
×
110
                    } else {
111
                        resourceWriter.write(resourceInfo);
3✔
112
                        clientCount.incrementAndGet();
3✔
113
                    }
114
                } catch (IOException e) {
×
115
                    logger.error("Failed to write file {}", resourceFilename, e);
×
116
                }
1✔
117
            }
118
        });
1✔
119

120
        return clientCount.get();
3✔
121
    }
122

123
    private String getResourceName(Tag tag) {
124
        String tagName = tag.getName().trim();
4✔
125
        String[] tagSubNames = tagName.split(" ");
4✔
126
        return Stream.of(tagSubNames).map(StringHelper::capitalize).collect(joining());
8✔
127
    }
128
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc