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

mybatis / generator / 2202

05 May 2026 07:27PM UTC coverage: 91.746% (+0.04%) from 91.703%
2202

push

github

web-flow
Merge pull request #1508 from mybatis/renovate/com.github.javaparser-javaparser-core-3.x

Update dependency com.github.javaparser:javaparser-core to v3.28.1

2454 of 3154 branches covered (77.81%)

12038 of 13121 relevant lines covered (91.75%)

0.92 hits per line

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

98.25
/core/mybatis-generator-core/src/main/java/org/mybatis/generator/config/Context.java
1
/*
2
 *    Copyright 2006-2026 the original author or authors.
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
 *       https://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 org.mybatis.generator.config;
17

18
import static org.mybatis.generator.internal.util.StringUtility.isTrue;
19
import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
20
import static org.mybatis.generator.internal.util.messages.Messages.getString;
21

22
import java.util.ArrayList;
23
import java.util.Collections;
24
import java.util.List;
25
import java.util.Objects;
26
import java.util.Optional;
27
import java.util.stream.Stream;
28

29
import org.jspecify.annotations.Nullable;
30
import org.mybatis.generator.api.KnownRuntime;
31

32
public class Context extends PropertyHolder {
33
    private final String id;
34
    private final @Nullable JDBCConnectionConfiguration jdbcConnectionConfiguration;
35
    private final @Nullable ConnectionFactoryConfiguration connectionFactoryConfiguration;
36
    private final @Nullable SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration;
37
    private final @Nullable JavaTypeResolverConfiguration javaTypeResolverConfiguration;
38
    private final ModelGeneratorConfiguration modelGeneratorConfiguration;
39
    private final @Nullable ClientGeneratorConfiguration clientGeneratorConfiguration;
40
    private final List<TableConfiguration> tableConfigurations;
41
    private final ModelType defaultModelType;
42
    private final String beginningDelimiter;
43
    private final String endingDelimiter;
44
    private final @Nullable Boolean autoDelimitKeywords;
45
    private final @Nullable CommentGeneratorConfiguration commentGeneratorConfiguration;
46
    private final List<PluginConfiguration> pluginConfigurations;
47
    private final @Nullable String targetRuntime;
48
    private final @Nullable String introspectedColumnImpl;
49
    private final @Nullable IndentationConfiguration indentationConfiguration;
50

51
    protected Context(Builder builder) {
52
        super(builder);
1✔
53
        id = Objects.requireNonNull(builder.id, getString("ValidationError.16")); //$NON-NLS-1$
1✔
54
        defaultModelType = Objects.requireNonNullElseGet(builder.defaultModelType,
1✔
55
                () -> calculateDefaultModelType(builder.targetRuntime));
1✔
56
        tableConfigurations = Collections.unmodifiableList(builder.tableConfigurations);
1✔
57
        pluginConfigurations = Collections.unmodifiableList(builder.pluginConfigurations);
1✔
58
        commentGeneratorConfiguration = builder.commentGeneratorConfiguration;
1✔
59
        jdbcConnectionConfiguration = builder.jdbcConnectionConfiguration;
1✔
60
        connectionFactoryConfiguration = builder.connectionFactoryConfiguration;
1✔
61
        sqlMapGeneratorConfiguration = builder.sqlMapGeneratorConfiguration;
1✔
62
        javaTypeResolverConfiguration = builder.javaTypeResolverConfiguration;
1✔
63
        introspectedColumnImpl = builder.introspectedColumnImpl;
1✔
64
        modelGeneratorConfiguration = Objects.requireNonNull(builder.modelGeneratorConfiguration,
1✔
65
                getString("ValidationError.8", id)); //$NON-NLS-1$
1✔
66
        clientGeneratorConfiguration = builder.clientGeneratorConfiguration;
1✔
67
        targetRuntime = builder.targetRuntime;
1✔
68

69
        String property = getProperty(PropertyRegistry.CONTEXT_BEGINNING_DELIMITER);
1✔
70
        beginningDelimiter = property == null ? Defaults.DEFAULT_BEGINNING_DELIMITER : property;
1!
71

72
        property = getProperty(PropertyRegistry.CONTEXT_ENDING_DELIMITER);
1✔
73
        endingDelimiter = property == null ? Defaults.DEFAULT_ENDING_DELIMITER : property;
1!
74

75
        property = getProperty(PropertyRegistry.CONTEXT_AUTO_DELIMIT_KEYWORDS);
1✔
76
        autoDelimitKeywords = isTrue(property);
1✔
77

78
        indentationConfiguration = builder.indentationConfiguration;
1✔
79
    }
1✔
80

81
    private ModelType calculateDefaultModelType(@Nullable String targetRuntime) {
82
        if (targetRuntime == null) {
1✔
83
            return ModelType.FLAT; // MyBatis Dynamic SQL is the default runtime
1✔
84
        } else {
85
            KnownRuntime knownRuntime = KnownRuntime.getByAlias(targetRuntime);
1✔
86
            if (knownRuntime.isDynamicSqlBased() || knownRuntime == KnownRuntime.MYBATIS3_SIMPLE) {
1✔
87
                return ModelType.FLAT;
1✔
88
            } else {
89
                return ModelType.CONDITIONAL;
1✔
90
            }
91
        }
92
    }
93

94
    public Optional<ClientGeneratorConfiguration> getClientGeneratorConfiguration() {
95
        return Optional.ofNullable(clientGeneratorConfiguration);
1✔
96
    }
97

98
    public ModelGeneratorConfiguration getModelGeneratorConfiguration() {
99
        return Objects.requireNonNull(modelGeneratorConfiguration);
1✔
100
    }
101

102
    public Optional<JavaTypeResolverConfiguration> getJavaTypeResolverConfiguration() {
103
        return Optional.ofNullable(javaTypeResolverConfiguration);
1✔
104
    }
105

106
    public Optional<SqlMapGeneratorConfiguration> getSqlMapGeneratorConfiguration() {
107
        return Optional.ofNullable(sqlMapGeneratorConfiguration);
1✔
108
    }
109

110
    public Optional<IndentationConfiguration> getIndentationConfiguration() {
111
        return Optional.ofNullable(indentationConfiguration);
1✔
112
    }
113

114
    /**
115
     * This method does a simple validate, it makes sure that all required fields have been filled in. It does not do
116
     * any more complex operations such as validating that database tables exist or validating that named columns exist
117
     *
118
     * @param errors
119
     *            the errors
120
     */
121
    public void validate(List<String> errors) {
122
        if (!stringHasValue(id)) {
1!
123
            errors.add(getString("ValidationError.16")); //$NON-NLS-1$
×
124
        }
125

126
        if (jdbcConnectionConfiguration == null && connectionFactoryConfiguration == null) {
1✔
127
            // must specify one
128
            errors.add(getString("ValidationError.10", id)); //$NON-NLS-1$
1✔
129
        } else if (jdbcConnectionConfiguration != null && connectionFactoryConfiguration != null) {
1✔
130
            // must not specify both
131
            errors.add(getString("ValidationError.10", id)); //$NON-NLS-1$
1✔
132
        } else if (jdbcConnectionConfiguration != null) {
1✔
133
            jdbcConnectionConfiguration.validate(errors);
1✔
134
        } else {
135
            connectionFactoryConfiguration.validate(errors);
1✔
136
        }
137

138
        modelGeneratorConfiguration.validate(errors, id);
1✔
139

140
        KnownRuntime knownRuntime = KnownRuntime.getByAlias(targetRuntime);
1✔
141
        if (clientGeneratorConfiguration != null) {
1✔
142
            clientGeneratorConfiguration.validate(errors, id, knownRuntime);
1✔
143
        }
144

145
        if (knownRuntime.isLegacyMyBatis3Based()
1✔
146
                && clientGeneratorConfiguration != null
147
                && clientGeneratorConfiguration.requiresXmlMapper()
1✔
148
                && sqlMapGeneratorConfiguration == null) {
149
            errors.add(getString("ValidationError.9", id)); //$NON-NLS-1$
1✔
150
        }
151

152
        if (knownRuntime == KnownRuntime.MYBATIS3_DYNAMIC_SQL || knownRuntime == KnownRuntime.MYBATIS3_SIMPLE) {
1✔
153
            if (defaultModelType != ModelType.FLAT && defaultModelType != ModelType.RECORD) {
1!
154
                errors.add(getString("ValidationError.29", getId())); //$NON-NLS-1$
×
155
            }
156
        }
157

158
        if (sqlMapGeneratorConfiguration != null) {
1✔
159
            sqlMapGeneratorConfiguration.validate(errors, id);
1✔
160
        }
161

162
        if (tableConfigurations.isEmpty()) {
1✔
163
            errors.add(getString("ValidationError.3", id)); //$NON-NLS-1$
1✔
164
        } else {
165
            for (int i = 0; i < tableConfigurations.size(); i++) {
1✔
166
                TableConfiguration tc = tableConfigurations.get(i);
1✔
167

168
                tc.validate(errors, i, this, knownRuntime);
1✔
169
            }
170
        }
171

172
        for (PluginConfiguration pluginConfiguration : pluginConfigurations) {
1✔
173
            pluginConfiguration.validate(errors, id);
1✔
174
        }
1✔
175
    }
1✔
176

177
    public String getId() {
178
        return id;
1✔
179
    }
180

181
    public ModelType getDefaultModelType() {
182
        return defaultModelType;
1✔
183
    }
184

185
    public String getBeginningDelimiter() {
186
        return beginningDelimiter;
1✔
187
    }
188

189
    public String getEndingDelimiter() {
190
        return endingDelimiter;
1✔
191
    }
192

193
    public Optional<CommentGeneratorConfiguration> getCommentGeneratorConfiguration() {
194
        return Optional.ofNullable(commentGeneratorConfiguration);
1✔
195
    }
196

197
    public Optional<String> getTargetRuntime() {
198
        return Optional.ofNullable(targetRuntime);
1✔
199
    }
200

201
    public Optional<String> getIntrospectedColumnImpl() {
202
        return Optional.ofNullable(introspectedColumnImpl);
1✔
203
    }
204

205

206
    public int getIntrospectionSteps() {
207
        int steps = 0;
1✔
208

209
        steps++; // connect to database
1✔
210

211
        // for each table:
212
        //
213
        // 1. Create introspected table implementation
214

215
        steps += tableConfigurations.size();
1✔
216

217
        return steps;
1✔
218
    }
219

220
    public Stream<PluginConfiguration> pluginConfigurations() {
221
        return pluginConfigurations.stream();
1✔
222
    }
223

224
    public List<TableConfiguration> tableConfigurations() {
225
        return tableConfigurations;
1✔
226
    }
227

228
    public boolean autoDelimitKeywords() {
229
        return autoDelimitKeywords != null && autoDelimitKeywords;
1!
230
    }
231

232
    public @Nullable ConnectionFactoryConfiguration getConnectionFactoryConfiguration() {
233
        return connectionFactoryConfiguration;
1✔
234
    }
235

236
    public @Nullable JDBCConnectionConfiguration getJDBCConnectionConfiguration() {
237
        return jdbcConnectionConfiguration;
1✔
238
    }
239

240
    public static class Builder extends AbstractBuilder<Builder> {
1✔
241
        private @Nullable String id;
242
        private @Nullable ModelType defaultModelType;
243
        private @Nullable String targetRuntime;
244
        private @Nullable String introspectedColumnImpl;
245
        private final List<PluginConfiguration> pluginConfigurations = new ArrayList<>();
1✔
246
        private final ArrayList<TableConfiguration> tableConfigurations = new ArrayList<>();
1✔
247
        private @Nullable CommentGeneratorConfiguration commentGeneratorConfiguration;
248
        private @Nullable JDBCConnectionConfiguration jdbcConnectionConfiguration;
249
        private @Nullable ConnectionFactoryConfiguration connectionFactoryConfiguration;
250
        private @Nullable SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration;
251
        private @Nullable JavaTypeResolverConfiguration javaTypeResolverConfiguration;
252
        private @Nullable ModelGeneratorConfiguration modelGeneratorConfiguration;
253
        private @Nullable ClientGeneratorConfiguration clientGeneratorConfiguration;
254
        private @Nullable IndentationConfiguration indentationConfiguration;
255

256
        @Override
257
        protected Builder getThis() {
258
            return this;
1✔
259
        }
260

261
        public Context build() {
262
            return new Context(this);
1✔
263
        }
264

265
        public Builder withId(String id) {
266
            this.id = id;
1✔
267
            return this;
1✔
268
        }
269

270
        public Builder withDefaultModelType(@Nullable ModelType defaultModelType) {
271
            this.defaultModelType = defaultModelType;
1✔
272
            return this;
1✔
273
        }
274

275
        public Builder withTargetRuntime(@Nullable String targetRuntime) {
276
            this.targetRuntime = targetRuntime;
1✔
277
            return this;
1✔
278
        }
279

280
        public Builder withIntrospectedColumnImpl(@Nullable String introspectedColumnImpl) {
281
            this.introspectedColumnImpl = introspectedColumnImpl;
1✔
282
            return this;
1✔
283
        }
284

285
        @SuppressWarnings("UnusedReturnValue")
286
        public Builder withPluginConfiguration(PluginConfiguration pluginConfiguration) {
287
            pluginConfigurations.add(pluginConfiguration);
1✔
288
            return this;
1✔
289
        }
290

291
        @SuppressWarnings("UnusedReturnValue")
292
        public Builder withTableConfiguration(TableConfiguration tableConfiguration) {
293
            tableConfigurations.add(tableConfiguration);
1✔
294
            return this;
1✔
295
        }
296

297
        @SuppressWarnings("UnusedReturnValue")
298
        public Builder withCommentGeneratorConfiguration(CommentGeneratorConfiguration commentGeneratorConfiguration) {
299
            this.commentGeneratorConfiguration = commentGeneratorConfiguration;
1✔
300
            return this;
1✔
301
        }
302

303
        @SuppressWarnings("UnusedReturnValue")
304
        public Builder withJdbcConnectionConfiguration(JDBCConnectionConfiguration jdbcConnectionConfiguration) {
305
            this.jdbcConnectionConfiguration = jdbcConnectionConfiguration;
1✔
306
            return this;
1✔
307
        }
308

309
        @SuppressWarnings("UnusedReturnValue")
310
        public Builder withSqlMapGeneratorConfiguration(SqlMapGeneratorConfiguration sqlMapGeneratorConfiguration) {
311
            this.sqlMapGeneratorConfiguration = sqlMapGeneratorConfiguration;
1✔
312
            return this;
1✔
313
        }
314

315
        public Builder withConnectionFactoryConfiguration(
316
                ConnectionFactoryConfiguration connectionFactoryConfiguration) {
317
            this.connectionFactoryConfiguration = connectionFactoryConfiguration;
1✔
318
            return this;
1✔
319
        }
320

321
        @SuppressWarnings("UnusedReturnValue")
322
        public Builder withJavaTypeResolverConfiguration(JavaTypeResolverConfiguration javaTypeResolverConfiguration) {
323
            this.javaTypeResolverConfiguration = javaTypeResolverConfiguration;
1✔
324
            return this;
1✔
325
        }
326

327
        public Builder withModelGeneratorConfiguration(
328
                ModelGeneratorConfiguration modelGeneratorConfiguration) {
329
            this.modelGeneratorConfiguration = modelGeneratorConfiguration;
1✔
330
            return this;
1✔
331
        }
332

333
        @SuppressWarnings("UnusedReturnValue")
334
        public Builder withClientGeneratorConfiguration(ClientGeneratorConfiguration clientGeneratorConfiguration) {
335
            this.clientGeneratorConfiguration = clientGeneratorConfiguration;
1✔
336
            return this;
1✔
337
        }
338

339
        public Builder withIndentationConfiguration(IndentationConfiguration indentationConfiguration) {
340
            this.indentationConfiguration = indentationConfiguration;
1✔
341
            return this;
1✔
342
        }
343
    }
344
}
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