2 * This file is part of yosql. It is subject to the license terms in the LICENSE file found in the top-level
3 * directory of this distribution and at https://creativecommons.org/publicdomain/zero/1.0/. No part of yosql,
4 * including this file, may be copied, modified, propagated, or distributed except according to the terms contained
8 package wtf
.metio
.yosql
.codegen
.blocks
;
10 import com
.squareup
.javapoet
.CodeBlock
;
11 import com
.squareup
.javapoet
.FieldSpec
;
12 import com
.squareup
.javapoet
.TypeName
;
13 import wtf
.metio
.yosql
.codegen
.api
.AnnotationGenerator
;
14 import wtf
.metio
.yosql
.codegen
.api
.Fields
;
15 import wtf
.metio
.yosql
.internals
.jdk
.Strings
;
16 import wtf
.metio
.yosql
.models
.immutables
.JavaConfiguration
;
17 import wtf
.metio
.yosql
.models
.immutables
.NamesConfiguration
;
18 import wtf
.metio
.yosql
.models
.immutables
.SqlConfiguration
;
20 import javax
.lang
.model
.element
.Modifier
;
21 import java
.lang
.reflect
.Type
;
23 public final class DefaultFields
implements Fields
{
25 private static final String NAME_REGEX
= "([a-z])([A-Z])";
26 private static final String NAME_REPLACEMENT
= "$1_$2";
28 private final AnnotationGenerator annotations
;
29 private final JavaConfiguration java
;
30 private final NamesConfiguration names
;
33 final AnnotationGenerator annotations
,
34 final JavaConfiguration java
,
35 final NamesConfiguration names
) {
36 this.annotations
= annotations
;
42 public FieldSpec
field(final Type type
, final String name
) {
43 return field(TypeName
.get(type
), name
);
47 public FieldSpec
field(final TypeName type
, final String name
) {
48 final var builder
= builder(type
, name
).addModifiers(Modifier
.PRIVATE
);
49 if (java
.useFinal()) {
50 builder
.addModifiers(Modifier
.FINAL
);
52 return builder
.build();
56 public FieldSpec
.Builder
prepareConstant(final Type type
, final String name
) {
57 return prepareConstant(TypeName
.get(type
), name
);
61 public FieldSpec
.Builder
prepareConstant(final TypeName type
, final String name
) {
62 return builder(type
, name
).addModifiers(Modifier
.PRIVATE
, Modifier
.STATIC
, Modifier
.FINAL
);
66 public CodeBlock
initialize(final String statement
) {
67 if (java
.useTextBlocks()) {
68 return CodeBlock
.builder()
70 .add("$>$>\n$L", statement
)
74 return CodeBlock
.builder()
79 private FieldSpec
.Builder
builder(final TypeName type
, final String name
) {
80 return FieldSpec
.builder(type
, name
)
81 .addAnnotations(annotations
.generatedField());
85 public String
constantSqlStatementFieldName(final SqlConfiguration configuration
) {
86 return configuration
.name()
87 .replaceAll(NAME_REGEX
, NAME_REPLACEMENT
)
89 + getVendor(configuration
);
93 public String
constantRawSqlStatementFieldName(final SqlConfiguration configuration
) {
94 return constantSqlStatementFieldName(configuration
) + names
.rawSuffix();
98 public String
constantSqlStatementParameterIndexFieldName(final SqlConfiguration configuration
) {
99 return constantSqlStatementFieldName(configuration
) + names
.indexSuffix();
102 private static String
getVendor(final SqlConfiguration configuration
) {
103 return Strings
.isBlank(configuration
.vendor())
105 : "_" + configuration
.vendor().replace(" ", "_").toUpperCase();