Skip to content

Commit 4e66a1c

Browse files
committed
Add the "doma.criteria.prefix" option and the "doma.criteria.suffix" option
1 parent 226cd3d commit 4e66a1c

File tree

12 files changed

+443
-8
lines changed

12 files changed

+443
-8
lines changed

doma-core/src/main/java/org/seasar/doma/internal/ClassNames.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ public static ClassName newExternalDomainTypeClassName(CharSequence externalDoma
4343
return new ExternalDomainClassNameBuilder(externalDomainClassName).build();
4444
}
4545

46+
public static ClassName newEntityDefClassNameBuilder(
47+
CharSequence entityClassName, String criteriaPrefix, String criteriaSuffix) {
48+
assertNotNull(entityClassName, criteriaPrefix, criteriaSuffix);
49+
return new DefClassNameBuilder(entityClassName, criteriaPrefix, criteriaSuffix).build();
50+
}
51+
52+
public static ClassName newEmbeddableDefClassNameBuilder(
53+
CharSequence entityClassName, String criteriaPrefix, String criteriaSuffix) {
54+
assertNotNull(entityClassName, criteriaPrefix, criteriaSuffix);
55+
return new DefClassNameBuilder(entityClassName, criteriaPrefix, criteriaSuffix).build();
56+
}
57+
4658
private static class ClassNameBuilder {
4759

4860
final String binaryName;
@@ -88,4 +100,26 @@ protected String prefix() {
88100
+ ".";
89101
}
90102
}
103+
104+
private static class DefClassNameBuilder extends ClassNameBuilder {
105+
private final String criteriaPrefix;
106+
private final String criteriaSuffix;
107+
108+
public DefClassNameBuilder(
109+
CharSequence binaryName, String criteriaPrefix, String criteriaSuffix) {
110+
super(binaryName);
111+
this.criteriaPrefix = criteriaPrefix;
112+
this.criteriaSuffix = criteriaSuffix;
113+
}
114+
115+
@Override
116+
protected String infix() {
117+
return criteriaPrefix;
118+
}
119+
120+
@Override
121+
protected String suffix() {
122+
return super.suffix() + criteriaSuffix;
123+
}
124+
}
91125
}

doma-core/src/test/java/org/seasar/doma/internal/ClassNamesTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,30 @@ void newExternalDomainTypClassName() {
4444
ClassName className = ClassNames.newExternalDomainTypeClassName(getClass().getName());
4545
assertEquals("__.org.seasar.doma.internal._ClassNamesTest", className.toString());
4646
}
47+
48+
@Test
49+
void newEntityDefClassNameBuilder() {
50+
ClassName className = ClassNames.newEntityDefClassNameBuilder(getClass().getName(), "P", "S");
51+
assertEquals("org.seasar.doma.internal.PClassNamesTestS", className.toString());
52+
}
53+
54+
@Test
55+
void newEntityDefClassNameBuilder_withDefaultValues() {
56+
ClassName className = ClassNames.newEntityDefClassNameBuilder(getClass().getName(), "", "_");
57+
assertEquals("org.seasar.doma.internal.ClassNamesTest_", className.toString());
58+
}
59+
60+
@Test
61+
void newEmbeddableDefClassNameBuilder() {
62+
ClassName className =
63+
ClassNames.newEmbeddableDefClassNameBuilder(getClass().getName(), "P", "S");
64+
assertEquals("org.seasar.doma.internal.PClassNamesTestS", className.toString());
65+
}
66+
67+
@Test
68+
void newEmbeddableDefClassNameBuilder_withDefaultValues() {
69+
ClassName className =
70+
ClassNames.newEmbeddableDefClassNameBuilder(getClass().getName(), "", "_");
71+
assertEquals("org.seasar.doma.internal.ClassNamesTest_", className.toString());
72+
}
4773
}

doma-processor/src/main/java/org/seasar/doma/internal/apt/Options.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ public final class Options {
2222

2323
public static final String CRITERIA_ENABLED = "doma.criteria.enabled";
2424

25+
public static final String CRITERIA_PREFIX = "doma.criteria.prefix";
26+
27+
public static final String CRITERIA_SUFFIX = "doma.criteria.suffix";
28+
2529
public static final String DEBUG = "doma.debug";
2630

2731
public static final String DAO_PACKAGE = "doma.dao.package";
@@ -79,6 +83,16 @@ public boolean isCriteriaEnabled() {
7983
return enabled != null ? Boolean.valueOf(enabled) : true;
8084
}
8185

86+
public String getCriteriaPrefix() {
87+
String prefix = getOption(CRITERIA_PREFIX);
88+
return prefix != null ? prefix : Constants.DEFAULT_CRITERIA_PREFIX;
89+
}
90+
91+
public String getCriteriaSuffix() {
92+
String suffix = getOption(CRITERIA_SUFFIX);
93+
return suffix != null ? suffix : Constants.DEFAULT_CRITERIA_SUFFIX;
94+
}
95+
8296
public Date getDate() {
8397
if (isTestEnabled()) {
8498
return new Date(0L);
@@ -197,6 +211,10 @@ private Map<String, String> loadProperties(FileObject config) throws IOException
197211

198212
public static class Constants {
199213

214+
public static final String DEFAULT_CRITERIA_PREFIX = "";
215+
216+
public static final String DEFAULT_CRITERIA_SUFFIX = "_";
217+
200218
public static final String DEFAULT_DAO_SUFFIX = "Impl";
201219

202220
public static final String DEFAULT_ENTITY_FIELD_PREFIX = "$";

doma-processor/src/main/java/org/seasar/doma/internal/apt/generator/EntityDefGenerator.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import javax.lang.model.type.TypeMirror;
88
import org.seasar.doma.internal.ClassName;
99
import org.seasar.doma.internal.ClassNames;
10+
import org.seasar.doma.internal.apt.AptIllegalStateException;
1011
import org.seasar.doma.internal.apt.Context;
1112
import org.seasar.doma.internal.apt.cttype.CtType;
1213
import org.seasar.doma.internal.apt.meta.entity.EntityDescMeta;
@@ -101,9 +102,10 @@ private void printPropertyDefFields() {
101102
UnwrapOptionalVisitor visitor = new UnwrapOptionalVisitor();
102103
for (EntityPropertyMeta p : entityMeta.getAllPropertyMetas()) {
103104
if (p.isEmbedded()) {
105+
ClassName className = createEmbeddableDefClassName(p);
104106
iprint(
105-
"public final %1$s_ %2$s = new %1$s_(__entityType, \"%2$s\");%n",
106-
/* 1 */ p.getCtType().getQualifiedName(), /* 2 */ p.getName());
107+
"public final %1$s %2$s = new %1$s(__entityType, \"%2$s\");%n",
108+
/* 1 */ className, /* 2 */ p.getName());
107109
} else {
108110
Pair<CtType, TypeMirror> pair = p.getCtType().accept(visitor, null);
109111
iprint(
@@ -118,6 +120,17 @@ private void printPropertyDefFields() {
118120
}
119121
}
120122

123+
private ClassName createEmbeddableDefClassName(EntityPropertyMeta p) {
124+
TypeElement embeddableTypeElement = ctx.getMoreTypes().toTypeElement(p.getType());
125+
if (embeddableTypeElement == null) {
126+
throw new AptIllegalStateException("embeddableTypeElement");
127+
}
128+
Name binaryName = ctx.getMoreElements().getBinaryName(embeddableTypeElement);
129+
String prefix = ctx.getOptions().getCriteriaPrefix();
130+
String suffix = ctx.getOptions().getCriteriaSuffix();
131+
return ClassNames.newEntityDefClassNameBuilder(binaryName, prefix, suffix);
132+
}
133+
121134
private void printMethods() {
122135
printAsTypeMethod();
123136
printAllPropertyDefsMethod();

doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EmbeddableDescProcessor.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import javax.annotation.processing.RoundEnvironment;
77
import javax.annotation.processing.SupportedAnnotationTypes;
88
import javax.annotation.processing.SupportedOptions;
9+
import javax.lang.model.element.Name;
910
import javax.lang.model.element.TypeElement;
1011
import org.seasar.doma.internal.ClassName;
12+
import org.seasar.doma.internal.ClassNames;
1113
import org.seasar.doma.internal.EmbeddableDesc;
1214
import org.seasar.doma.internal.apt.Options;
1315
import org.seasar.doma.internal.apt.generator.EmbeddableDefGenerator;
@@ -23,7 +25,9 @@
2325
Options.TEST,
2426
Options.DEBUG,
2527
Options.CONFIG_PATH,
26-
Options.CRITERIA_ENABLED
28+
Options.CRITERIA_ENABLED,
29+
Options.CRITERIA_PREFIX,
30+
Options.CRITERIA_SUFFIX
2731
})
2832
public class EmbeddableDescProcessor extends AbstractGeneratingProcessor<EmbeddableDescMeta> {
2933

@@ -49,7 +53,10 @@ protected ClassName createClassName(TypeElement typeElement, EmbeddableDescMeta
4953
assertNotNull(typeElement, meta);
5054
EmbeddableMeta embeddableMeta = meta.getEmbeddableMeta();
5155
TypeElement embeddableTypeElement = embeddableMeta.getTypeElement();
52-
return new ClassName(embeddableTypeElement.getQualifiedName().toString() + "_");
56+
Name binaryName = ctx.getMoreElements().getBinaryName(embeddableTypeElement);
57+
String prefix = ctx.getOptions().getCriteriaPrefix();
58+
String suffix = ctx.getOptions().getCriteriaSuffix();
59+
return ClassNames.newEmbeddableDefClassNameBuilder(binaryName, prefix, suffix);
5360
}
5461

5562
@Override

doma-processor/src/main/java/org/seasar/doma/internal/apt/processor/EntityDescProcessor.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import javax.annotation.processing.RoundEnvironment;
77
import javax.annotation.processing.SupportedAnnotationTypes;
88
import javax.annotation.processing.SupportedOptions;
9+
import javax.lang.model.element.Name;
910
import javax.lang.model.element.TypeElement;
1011
import org.seasar.doma.internal.ClassName;
12+
import org.seasar.doma.internal.ClassNames;
1113
import org.seasar.doma.internal.EntityDesc;
1214
import org.seasar.doma.internal.apt.Options;
1315
import org.seasar.doma.internal.apt.generator.EntityDefGenerator;
@@ -23,7 +25,9 @@
2325
Options.TEST,
2426
Options.DEBUG,
2527
Options.CONFIG_PATH,
26-
Options.CRITERIA_ENABLED
28+
Options.CRITERIA_ENABLED,
29+
Options.CRITERIA_PREFIX,
30+
Options.CRITERIA_SUFFIX
2731
})
2832
public class EntityDescProcessor extends AbstractGeneratingProcessor<EntityDescMeta> {
2933

@@ -49,7 +53,10 @@ protected ClassName createClassName(TypeElement typeElement, EntityDescMeta meta
4953
assertNotNull(typeElement, meta);
5054
EntityMeta entityMeta = meta.getEntityMeta();
5155
TypeElement entityTypeElement = entityMeta.getTypeElement();
52-
return new ClassName(entityTypeElement.getQualifiedName().toString() + "_");
56+
Name binaryName = ctx.getMoreElements().getBinaryName(entityTypeElement);
57+
String prefix = ctx.getOptions().getCriteriaPrefix();
58+
String suffix = ctx.getOptions().getCriteriaSuffix();
59+
return ClassNames.newEntityDefClassNameBuilder(binaryName, prefix, suffix);
5360
}
5461

5562
@Override

doma-processor/src/test/java/org/seasar/doma/internal/apt/GeneratedClassNameParameterResolver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818

1919
public class GeneratedClassNameParameterResolver implements ParameterResolver {
2020

21-
private final Class<?> clazz;
21+
protected final Class<?> clazz;
2222

23-
private final boolean isExternalDomain;
23+
protected final boolean isExternalDomain;
2424

2525
public GeneratedClassNameParameterResolver(Class<?> clazz) {
2626
assertNotNull(clazz);
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package org.seasar.doma.internal.apt.processor.embeddabledesc;
2+
3+
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
5+
import java.net.URL;
6+
import java.util.Arrays;
7+
import java.util.List;
8+
import java.util.stream.Stream;
9+
import org.junit.jupiter.api.BeforeEach;
10+
import org.junit.jupiter.api.TestTemplate;
11+
import org.junit.jupiter.api.extension.ExtendWith;
12+
import org.junit.jupiter.api.extension.Extension;
13+
import org.junit.jupiter.api.extension.ExtensionContext;
14+
import org.junit.jupiter.api.extension.ParameterContext;
15+
import org.junit.jupiter.api.extension.ParameterResolutionException;
16+
import org.junit.jupiter.api.extension.TestTemplateInvocationContext;
17+
import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider;
18+
import org.opentest4j.AssertionFailedError;
19+
import org.seasar.doma.internal.ClassName;
20+
import org.seasar.doma.internal.ClassNames;
21+
import org.seasar.doma.internal.EmbeddableDesc;
22+
import org.seasar.doma.internal.apt.CompilerSupport;
23+
import org.seasar.doma.internal.apt.GeneratedClassNameParameterResolver;
24+
import org.seasar.doma.internal.apt.ResourceParameterResolver;
25+
import org.seasar.doma.internal.apt.SimpleParameterResolver;
26+
import org.seasar.doma.internal.apt.processor.EmbeddableDescProcessor;
27+
28+
class EmbeddableDescProcessorOptionTest extends CompilerSupport {
29+
30+
private static final String prefix = "Q";
31+
private static final String suffix = "Def";
32+
33+
@BeforeEach
34+
void beforeEach() {
35+
addOption("-Adoma.test=true");
36+
addOption("-Adoma.criteria.prefix=" + prefix);
37+
addOption("-Adoma.criteria.suffix=" + suffix);
38+
}
39+
40+
@TestTemplate
41+
@ExtendWith(SuccessInvocationContextProvider.class)
42+
void success(Class clazz, URL expectedResourceUrl, String generatedClassName, String[] options)
43+
throws Exception {
44+
addOption(options);
45+
addProcessor(new EmbeddableDescProcessor());
46+
addCompilationUnit(clazz);
47+
compile();
48+
assertEqualsGeneratedSourceWithResource(expectedResourceUrl, generatedClassName);
49+
assertTrue(getCompiledResult());
50+
}
51+
52+
static class SuccessInvocationContextProvider implements TestTemplateInvocationContextProvider {
53+
@Override
54+
public boolean supportsTestTemplate(ExtensionContext context) {
55+
return true;
56+
}
57+
58+
@Override
59+
public Stream<TestTemplateInvocationContext> provideTestTemplateInvocationContexts(
60+
ExtensionContext context) {
61+
return Stream.of(invocationContext(_Address.class));
62+
}
63+
64+
private TestTemplateInvocationContext invocationContext(
65+
Class<?> compilationUnit, String... options) {
66+
return new TestTemplateInvocationContext() {
67+
@Override
68+
public String getDisplayName(int invocationIndex) {
69+
return compilationUnit.getSimpleName();
70+
}
71+
72+
@Override
73+
public List<Extension> getAdditionalExtensions() {
74+
return Arrays.asList(
75+
new SimpleParameterResolver(compilationUnit),
76+
new ResourceParameterResolver(compilationUnit),
77+
new CustomGeneratedClassNameParameterResolver(compilationUnit),
78+
new SimpleParameterResolver(options));
79+
}
80+
};
81+
}
82+
}
83+
84+
private static class CustomGeneratedClassNameParameterResolver
85+
extends GeneratedClassNameParameterResolver {
86+
87+
public CustomGeneratedClassNameParameterResolver(Class<?> clazz) {
88+
super(clazz);
89+
}
90+
91+
@Override
92+
public Object resolveParameter(
93+
ParameterContext parameterContext, ExtensionContext extensionContext)
94+
throws ParameterResolutionException {
95+
if (clazz.isAnnotationPresent(EmbeddableDesc.class)) {
96+
EmbeddableDesc embeddableDesc = clazz.getAnnotation(EmbeddableDesc.class);
97+
ClassName className =
98+
ClassNames.newEmbeddableDefClassNameBuilder(
99+
embeddableDesc.value().getName(), prefix, suffix);
100+
return className.toString();
101+
}
102+
throw new AssertionFailedError("annotation not found.");
103+
}
104+
}
105+
}

0 commit comments

Comments
 (0)