Support relaxed binding to 'mixedCASE' names

Update relaxed binding so that names of the form `initSQL` can now
be bound against properties of the form `init-s-q-l`.

Fixes gh-6803
pull/6857/head
Phillip Webb 8 years ago
parent 3570f7730a
commit 07b2fe1d67

@ -232,7 +232,13 @@ public final class RelaxedNames implements Iterable<String> {
* @return the relaxed names * @return the relaxed names
*/ */
public static RelaxedNames forCamelCase(String name) { public static RelaxedNames forCamelCase(String name) {
return new RelaxedNames(Manipulation.CAMELCASE_TO_HYPHEN.apply(name)); StringBuffer result = new StringBuffer();
for (char c : name.toCharArray()) {
result.append(Character.isUpperCase(c) && result.length() > 0
&& result.charAt(result.length() - 1) != '-'
? "-" + Character.toLowerCase(c) : c);
}
return new RelaxedNames(result.toString());
} }
} }

@ -653,6 +653,17 @@ public class RelaxedDataBinderTests {
assertThat(target.getObjects()).containsExactly("teststring"); assertThat(target.getObjects()).containsExactly("teststring");
} }
@Test
public void testMixedWithUpperCaseWord() throws Exception {
// gh-6803
VanillaTarget target = new VanillaTarget();
RelaxedDataBinder binder = getBinder(target, "test");
MutablePropertyValues values = new MutablePropertyValues();
values.add("test.mixed-u-p-p-e-r", "foo");
binder.bind(values);
assertThat(target.getMixedUPPER()).isEqualTo("foo");
}
private void doTestBindCaseInsensitiveEnums(VanillaTarget target) throws Exception { private void doTestBindCaseInsensitiveEnums(VanillaTarget target) throws Exception {
BindingResult result = bind(target, "bingo: THIS"); BindingResult result = bind(target, "bingo: THIS");
assertThat(result.getErrorCount()).isEqualTo(0); assertThat(result.getErrorCount()).isEqualTo(0);
@ -1013,6 +1024,8 @@ public class RelaxedDataBinderTests {
private List<Object> objects; private List<Object> objects;
private String mixedUPPER;
public char[] getBar() { public char[] getBar() {
return this.bar; return this.bar;
} }
@ -1077,6 +1090,14 @@ public class RelaxedDataBinderTests {
this.objects = objects; this.objects = objects;
} }
public String getMixedUPPER() {
return this.mixedUPPER;
}
public void setMixedUPPER(String mixedUPPER) {
this.mixedUPPER = mixedUPPER;
}
} }
enum Bingo { enum Bingo {

@ -123,4 +123,28 @@ public class RelaxedNamesTests {
assertThat(iterator.hasNext()).isFalse(); assertThat(iterator.hasNext()).isFalse();
} }
@Test
public void forCamelCase() throws Exception {
Iterator<String> iterator = RelaxedNames.forCamelCase("camelCase").iterator();
assertThat(iterator.next()).isEqualTo("camel-case");
assertThat(iterator.next()).isEqualTo("camel_case");
assertThat(iterator.next()).isEqualTo("camelCase");
assertThat(iterator.next()).isEqualTo("camelcase");
assertThat(iterator.next()).isEqualTo("CAMEL-CASE");
assertThat(iterator.next()).isEqualTo("CAMEL_CASE");
assertThat(iterator.next()).isEqualTo("CAMELCASE");
}
@Test
public void forCamelCaseWithCaps() throws Exception {
Iterator<String> iterator = RelaxedNames.forCamelCase("camelCASE").iterator();
assertThat(iterator.next()).isEqualTo("camel-c-a-s-e");
assertThat(iterator.next()).isEqualTo("camel_c_a_s_e");
assertThat(iterator.next()).isEqualTo("camelCASE");
assertThat(iterator.next()).isEqualTo("camelcase");
assertThat(iterator.next()).isEqualTo("CAMEL-C-A-S-E");
assertThat(iterator.next()).isEqualTo("CAMEL_C_A_S_E");
assertThat(iterator.next()).isEqualTo("CAMELCASE");
}
} }

@ -298,12 +298,14 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
@Test @Test
public void relaxedPropertyNamesSame() throws Exception { public void relaxedPropertyNamesSame() throws Exception {
testRelaxedPropertyNames("test.FOO_BAR=test1", "test.FOO_BAR=test2"); testRelaxedPropertyNames("test.FOO_BAR=test1", "test.FOO_BAR=test2",
"test.BAR-B-A-Z=testa", "test.BAR-B-A-Z=testb");
} }
@Test @Test
public void relaxedPropertyNamesMixed() throws Exception { public void relaxedPropertyNamesMixed() throws Exception {
testRelaxedPropertyNames("test.FOO_BAR=test2", "test.foo-bar=test1"); testRelaxedPropertyNames("test.FOO_BAR=test2", "test.foo-bar=test1",
"test.BAR-B-A-Z=testb", "test.bar_b_a_z=testa");
} }
private void testRelaxedPropertyNames(String... environment) { private void testRelaxedPropertyNames(String... environment) {
@ -312,8 +314,9 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
environment); environment);
this.context.register(RelaxedPropertyNames.class); this.context.register(RelaxedPropertyNames.class);
this.context.refresh(); this.context.refresh();
assertThat(this.context.getBean(RelaxedPropertyNames.class).getFooBar()) RelaxedPropertyNames bean = this.context.getBean(RelaxedPropertyNames.class);
.isEqualTo("test2"); assertThat(bean.getFooBar()).isEqualTo("test2");
assertThat(bean.getBarBAZ()).isEqualTo("testb");
} }
@Test @Test
@ -670,6 +673,8 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
private String fooBar; private String fooBar;
private String barBAZ;
public String getFooBar() { public String getFooBar() {
return this.fooBar; return this.fooBar;
} }
@ -678,6 +683,14 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
this.fooBar = fooBar; this.fooBar = fooBar;
} }
public String getBarBAZ() {
return this.barBAZ;
}
public void setBarBAZ(String barBAZ) {
this.barBAZ = barBAZ;
}
} }
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")

Loading…
Cancel
Save