Skip to content

Commit 350ac91

Browse files
authored
Merge pull request #2727 from epochcoder/feature/2724-pass-subclassed-configuration-xmlconfigbuilder
Enable ability to provide custom configuration to XMLConfigBuilder
2 parents 043aaaa + d7826d7 commit 350ac91

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java

+20-4
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ public XMLConfigBuilder(Reader reader, String environment) {
6767
}
6868

6969
public XMLConfigBuilder(Reader reader, String environment, Properties props) {
70-
this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
70+
this(Configuration.class, reader, environment, props);
71+
}
72+
73+
public XMLConfigBuilder(Class<? extends Configuration> configClass, Reader reader, String environment, Properties props) {
74+
this(configClass, new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
7175
}
7276

7377
public XMLConfigBuilder(InputStream inputStream) {
@@ -79,11 +83,15 @@ public XMLConfigBuilder(InputStream inputStream, String environment) {
7983
}
8084

8185
public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
82-
this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
86+
this(Configuration.class, inputStream, environment, props);
87+
}
88+
89+
public XMLConfigBuilder(Class<? extends Configuration> configClass, InputStream inputStream, String environment, Properties props) {
90+
this(configClass, new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
8391
}
8492

85-
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
86-
super(new Configuration());
93+
private XMLConfigBuilder(Class<? extends Configuration> configClass, XPathParser parser, String environment, Properties props) {
94+
super(newConfig(configClass));
8795
ErrorContext.instance().resource("SQL Mapper Configuration");
8896
this.configuration.setVariables(props);
8997
this.parsed = false;
@@ -406,4 +414,12 @@ private boolean isSpecifiedEnvironment(String id) {
406414
return environment.equals(id);
407415
}
408416

417+
private static Configuration newConfig(Class<? extends Configuration> configClass) {
418+
try {
419+
return configClass.getDeclaredConstructor().newInstance();
420+
} catch (Exception ex) {
421+
throw new BuilderException("Failed to create a new Configuration instance.", ex);
422+
}
423+
}
424+
409425
}

src/test/java/org/apache/ibatis/builder/XmlConfigBuilderTest.java

+37-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
import static org.assertj.core.api.Assertions.assertThat;
2020
import static org.assertj.core.api.BDDAssertions.then;
2121
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
22+
import static org.junit.jupiter.api.Assertions.assertEquals;
2223
import static org.junit.jupiter.api.Assertions.assertNotNull;
2324
import static org.junit.jupiter.api.Assertions.assertNull;
2425
import static org.junit.jupiter.api.Assertions.assertTrue;
2526

27+
import java.io.IOException;
2628
import java.io.InputStream;
2729
import java.io.StringReader;
2830
import java.math.RoundingMode;
@@ -64,6 +66,7 @@
6466
import org.apache.ibatis.type.JdbcType;
6567
import org.apache.ibatis.type.TypeHandler;
6668
import org.apache.ibatis.type.TypeHandlerRegistry;
69+
import org.junit.jupiter.api.Assertions;
6770
import org.junit.jupiter.api.Tag;
6871
import org.junit.jupiter.api.Test;
6972

@@ -114,7 +117,7 @@ enum MyEnum {
114117

115118
public static class EnumOrderTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
116119

117-
private E[] constants;
120+
private final E[] constants;
118121

119122
public EnumOrderTypeHandler(Class<E> javaType) {
120123
constants = javaType.getEnumConstants();
@@ -319,4 +322,37 @@ public static String provideSql() {
319322
}
320323
}
321324

325+
@Test
326+
void shouldAllowSubclassedConfiguration() throws IOException {
327+
String resource = "org/apache/ibatis/builder/MinimalMapperConfig.xml";
328+
try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
329+
XMLConfigBuilder builder = new XMLConfigBuilder(
330+
MyConfiguration.class, inputStream, null, null);
331+
Configuration config = builder.parse();
332+
333+
assertThat(config).isInstanceOf(MyConfiguration.class);
334+
}
335+
}
336+
337+
@Test
338+
void noDefaultConstructorForSubclassedConfiguration() throws IOException {
339+
String resource = "org/apache/ibatis/builder/MinimalMapperConfig.xml";
340+
try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
341+
Exception exception = Assertions.assertThrows(Exception.class, () -> new XMLConfigBuilder(
342+
BadConfiguration.class, inputStream, null, null));
343+
assertEquals("Failed to create a new Configuration instance.", exception.getMessage());
344+
}
345+
}
346+
347+
public static class MyConfiguration extends Configuration {
348+
// only using to check configuration was used
349+
}
350+
351+
public static class BadConfiguration extends Configuration {
352+
353+
public BadConfiguration(String parameter) {
354+
// should have a default constructor
355+
}
356+
}
357+
322358
}

0 commit comments

Comments
 (0)