Skip to content

Commit c2ef680

Browse files
authored
Merge pull request #191 from kakusuke/config-file
設定ファイルから注釈処理のオプションを読み込めるように
2 parents 1fc16fd + dcca5e9 commit c2ef680

File tree

5 files changed

+184
-12
lines changed

5 files changed

+184
-12
lines changed

docs/sources/annotation-processing.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ doma.version.validation
7070
(Domaのバージョンに互換性がある限りにおいて)。
7171
デフォルトの値は、 ``true`` 。
7272

73+
doma.config.path
74+
オプションの設定ファイルを置く場所の指定。
75+
デフォルトの値は、 ``doma.compile.config``。
76+
7377
Eclipse
7478
=======
7579

@@ -90,3 +94,10 @@ Gradle
9094
9195
compileJava.options.compilerArgs = ['-Adoma.dao.subpackage=impl', '-Adoma.dao.suffix=Impl']
9296
97+
設定ファイル
98+
==========
99+
100+
デフォルトでは ``main/resources/doma.compile.config`` ファイルにオプションを記述しておくことで、
101+
ビルドツールごとのオプションの設定を利用する必要がなくなります。
102+
記述形式はプロパティファイルと同様です。
103+
なお、設定がバッティングした場合、ビルドツールごとのオプションの設定が優先されます。

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

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,20 @@
1515
*/
1616
package org.seasar.doma.internal.apt;
1717

18+
import java.io.IOException;
19+
import java.io.InputStream;
20+
import java.io.InputStreamReader;
21+
import java.util.Collections;
1822
import java.util.Date;
23+
import java.util.HashMap;
24+
import java.util.Map;
25+
import java.util.Properties;
26+
import java.util.concurrent.ConcurrentHashMap;
1927

28+
import javax.annotation.processing.Filer;
2029
import javax.annotation.processing.ProcessingEnvironment;
30+
import javax.tools.FileObject;
31+
import javax.tools.StandardLocation;
2132

2233
import org.seasar.doma.internal.Artifact;
2334

@@ -47,12 +58,14 @@ public final class Options {
4758

4859
public static final String VERSION_VALIDATION = "doma.version.validation";
4960

61+
public static final String CONFIG_PATH = "doma.config.path";
62+
5063
public static final String LOMBOK_ALL_ARGS_CONSTRUCTOR = "doma.lombok.AllArgsConstructor";
5164

5265
public static final String LOMBOK_VALUE = "doma.lombok.Value";
5366

5467
public static boolean isTestEnabled(ProcessingEnvironment env) {
55-
String test = env.getOptions().get(Options.TEST);
68+
String test = getOption(env, Options.TEST);
5669
return Boolean.valueOf(test).booleanValue();
5770
}
5871

@@ -71,69 +84,120 @@ public static Date getDate(ProcessingEnvironment env) {
7184
}
7285

7386
public static boolean isDebugEnabled(ProcessingEnvironment env) {
74-
String debug = env.getOptions().get(Options.DEBUG);
87+
String debug = getOption(env, Options.DEBUG);
7588
return Boolean.valueOf(debug).booleanValue();
7689
}
7790

7891
public static String getDaoPackage(ProcessingEnvironment env) {
79-
String pkg = env.getOptions().get(Options.DAO_PACKAGE);
92+
String pkg = getOption(env, Options.DAO_PACKAGE);
8093
return pkg != null ? pkg : null;
8194
}
8295

8396
public static String getDaoSubpackage(ProcessingEnvironment env) {
84-
String subpackage = env.getOptions().get(Options.DAO_SUBPACKAGE);
97+
String subpackage = getOption(env, Options.DAO_SUBPACKAGE);
8598
return subpackage != null ? subpackage : null;
8699
}
87100

88101
public static String getDaoSuffix(ProcessingEnvironment env) {
89-
String suffix = env.getOptions().get(Options.DAO_SUFFIX);
102+
String suffix = getOption(env, Options.DAO_SUFFIX);
90103
return suffix != null ? suffix : Constants.DEFAULT_DAO_SUFFIX;
91104
}
92105

93106
public static String getEntityFieldPrefix(ProcessingEnvironment env) {
94-
String prefix = env.getOptions().get(Options.ENTITY_FIELD_PREFIX);
107+
String prefix = getOption(env, Options.ENTITY_FIELD_PREFIX);
95108
if ("none".equalsIgnoreCase(prefix)) {
96109
return "";
97110
}
98111
return prefix != null ? prefix : Constants.DEFAULT_ENTITY_FIELD_PREFIX;
99112
}
100113

101114
public static String getExprFunctions(ProcessingEnvironment env) {
102-
String name = env.getOptions().get(Options.EXPR_FUNCTIONS);
115+
String name = getOption(env, Options.EXPR_FUNCTIONS);
103116
return name != null ? name : null;
104117
}
105118

106119
public static String getDomainConverters(ProcessingEnvironment env) {
107-
String converters = env.getOptions().get(Options.DOMAIN_CONVERTERS);
120+
String converters = getOption(env, Options.DOMAIN_CONVERTERS);
108121
return converters != null ? converters : null;
109122
}
110123

111124
public static boolean getSqlValidation(ProcessingEnvironment env) {
112-
String v = env.getOptions().get(Options.SQL_VALIDATION);
125+
String v = getOption(env, Options.SQL_VALIDATION);
113126
return v != null ? Boolean.valueOf(v).booleanValue() : true;
114127
}
115128

116129
public static boolean getVersionValidation(ProcessingEnvironment env) {
117-
String v = env.getOptions().get(Options.VERSION_VALIDATION);
130+
String v = getOption(env, Options.VERSION_VALIDATION);
118131
return v != null ? Boolean.valueOf(v).booleanValue() : true;
119132
}
120133

134+
public static String getConfigPath(ProcessingEnvironment env) {
135+
String configPath = env.getOptions().get(Options.CONFIG_PATH);
136+
return configPath != null ? configPath : Constants.DEFAULT_CONFIG_PATH;
137+
}
138+
121139
public static String getLombokAllArgsConstructor(ProcessingEnvironment env) {
122-
String name = env.getOptions().get(Options.LOMBOK_ALL_ARGS_CONSTRUCTOR);
140+
String name = getOption(env, Options.LOMBOK_ALL_ARGS_CONSTRUCTOR);
123141
return name != null ? name : Constants.DEFAULT_LOMBOK_ALL_ARGS_CONSTRUCTOR;
124142
}
125143

126144
public static String getLombokValue(ProcessingEnvironment env) {
127-
String name = env.getOptions().get(Options.LOMBOK_VALUE);
145+
String name = getOption(env, Options.LOMBOK_VALUE);
128146
return name != null ? name : Constants.DEFAULT_LOMBOK_VALUE;
129147
}
130148

149+
private static String getOption(ProcessingEnvironment env, String key) {
150+
String v = env.getOptions().get(key);
151+
if (v != null) {
152+
return v;
153+
}
154+
155+
return getConfig(env).get(key);
156+
}
157+
158+
private static Map<String, Map<String, String>> configCache = new ConcurrentHashMap<>();
159+
private static Map<String, String> getConfig(ProcessingEnvironment env) {
160+
FileObject config = getFileObject(env, "", getConfigPath(env));
161+
if (config == null) {
162+
return Collections.emptyMap();
163+
}
164+
return configCache.computeIfAbsent(config.toUri().getPath(), configPath -> {
165+
try {
166+
return loadProperties(config);
167+
} catch (IOException e) {
168+
return Collections.emptyMap();
169+
}
170+
});
171+
}
172+
173+
private static FileObject getFileObject(ProcessingEnvironment env, String pkg, String relativeName) {
174+
Filer filer = env.getFiler();
175+
176+
try {
177+
return filer.getResource(StandardLocation.CLASS_OUTPUT, pkg, relativeName);
178+
} catch (IOException e) {
179+
return null;
180+
}
181+
}
182+
183+
@SuppressWarnings("unchecked")
184+
private static Map<String, String> loadProperties(FileObject config) throws IOException {
185+
try (InputStream is = config.openInputStream();
186+
InputStreamReader isr = new InputStreamReader(is, "UTF-8")){
187+
Properties props = new Properties();
188+
props.load(isr);
189+
return (Map<String, String>) new HashMap(props);
190+
}
191+
}
192+
131193
protected static class Constants {
132194

133195
public static final String DEFAULT_DAO_SUFFIX = "Impl";
134196

135197
public static final String DEFAULT_ENTITY_FIELD_PREFIX = "$";
136198

199+
public static final String DEFAULT_CONFIG_PATH = "doma.compile.config";
200+
137201
public static final String DEFAULT_LOMBOK_ALL_ARGS_CONSTRUCTOR = "lombok.AllArgsConstructor";
138202

139203
public static final String DEFAULT_LOMBOK_VALUE = "lombok.Value";

src/test/java/org/seasar/doma/internal/apt/dao/DaoProcessorTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,17 @@ public void testSqlValidationSkip() throws Exception {
588588
assertTrue(getCompiledResult());
589589
}
590590

591+
public void testSqlValidationSkipWhenOptionSpecifiedByConfigFile() throws Exception {
592+
addOption("-Adoma.config.path=sql.validation.skip.config");
593+
Class<?> target = SqlValidationSkipDao.class;
594+
DaoProcessor processor = new DaoProcessor();
595+
addProcessor(processor);
596+
addCompilationUnit(target);
597+
compile();
598+
assertGeneratedSource(target);
599+
assertTrue(getCompiledResult());
600+
}
601+
591602
public void testParameterizedParam() throws Exception {
592603
Class<?> target = ParameterizedParamDao.class;
593604
DaoProcessor processor = new DaoProcessor();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package org.seasar.doma.internal.apt.dao;
2+
3+
/** */
4+
@javax.annotation.Generated(value = { "Doma", "@VERSION@" }, date = "1970-01-01T09:00:00.000+0900")
5+
public class SqlValidationSkipDaoImpl extends org.seasar.doma.internal.jdbc.dao.AbstractDao implements org.seasar.doma.internal.apt.dao.SqlValidationSkipDao {
6+
7+
static {
8+
org.seasar.doma.internal.Artifact.validateVersion("@VERSION@");
9+
}
10+
11+
private static final java.lang.reflect.Method __method0 = org.seasar.doma.internal.jdbc.dao.AbstractDao.getDeclaredMethod(org.seasar.doma.internal.apt.dao.SqlValidationSkipDao.class, "selectById", java.lang.String.class);
12+
13+
/** */
14+
public SqlValidationSkipDaoImpl() {
15+
super(new org.seasar.doma.internal.apt.dao.MyConfig());
16+
}
17+
18+
/**
19+
* @param connection the connection
20+
*/
21+
public SqlValidationSkipDaoImpl(java.sql.Connection connection) {
22+
super(new org.seasar.doma.internal.apt.dao.MyConfig(), connection);
23+
}
24+
25+
/**
26+
* @param dataSource the dataSource
27+
*/
28+
public SqlValidationSkipDaoImpl(javax.sql.DataSource dataSource) {
29+
super(new org.seasar.doma.internal.apt.dao.MyConfig(), dataSource);
30+
}
31+
32+
/**
33+
* @param config the configuration
34+
*/
35+
protected SqlValidationSkipDaoImpl(org.seasar.doma.jdbc.Config config) {
36+
super(config);
37+
}
38+
39+
/**
40+
* @param config the configuration
41+
* @param connection the connection
42+
*/
43+
protected SqlValidationSkipDaoImpl(org.seasar.doma.jdbc.Config config, java.sql.Connection connection) {
44+
super(config, connection);
45+
}
46+
47+
/**
48+
* @param config the configuration
49+
* @param dataSource the dataSource
50+
*/
51+
protected SqlValidationSkipDaoImpl(org.seasar.doma.jdbc.Config config, javax.sql.DataSource dataSource) {
52+
super(config, dataSource);
53+
}
54+
55+
@Override
56+
public java.lang.String selectById(java.lang.String name) {
57+
entering("org.seasar.doma.internal.apt.dao.SqlValidationSkipDaoImpl", "selectById", name);
58+
try {
59+
org.seasar.doma.jdbc.query.SqlFileSelectQuery __query = getQueryImplementors().createSqlFileSelectQuery(__method0);
60+
__query.setMethod(__method0);
61+
__query.setConfig(__config);
62+
__query.setSqlFilePath("META-INF/org/seasar/doma/internal/apt/dao/SqlValidationSkipDao/selectById.sql");
63+
__query.addParameter("name", java.lang.String.class, name);
64+
__query.setCallerClassName("org.seasar.doma.internal.apt.dao.SqlValidationSkipDaoImpl");
65+
__query.setCallerMethodName("selectById");
66+
__query.setResultEnsured(false);
67+
__query.setResultMappingEnsured(false);
68+
__query.setFetchType(org.seasar.doma.FetchType.LAZY);
69+
__query.setQueryTimeout(-1);
70+
__query.setMaxRows(-1);
71+
__query.setFetchSize(-1);
72+
__query.setSqlLogType(org.seasar.doma.jdbc.SqlLogType.FORMATTED);
73+
__query.prepare();
74+
org.seasar.doma.jdbc.command.SelectCommand<java.lang.String> __command = getCommandImplementors().createSelectCommand(__method0, __query, new org.seasar.doma.internal.jdbc.command.BasicSingleResultHandler<java.lang.String>(org.seasar.doma.wrapper.StringWrapper::new, false));
75+
java.lang.String __result = __command.execute();
76+
__query.complete();
77+
exiting("org.seasar.doma.internal.apt.dao.SqlValidationSkipDaoImpl", "selectById", __result);
78+
return __result;
79+
} catch (java.lang.RuntimeException __e) {
80+
throwing("org.seasar.doma.internal.apt.dao.SqlValidationSkipDaoImpl", "selectById", __e);
81+
throw __e;
82+
}
83+
}
84+
85+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
doma.sql.validation=false

0 commit comments

Comments
 (0)