SOLR-9161: SolrPluginUtils.invokeSetters now accommodates setter variants

This commit is contained in:
Christine Poerschke 2016-05-27 19:07:06 +01:00
parent 3d22ea3492
commit 50658dd93d
3 changed files with 39 additions and 5 deletions

View File

@ -337,6 +337,8 @@ Other Changes
* SOLR-9110: Move JoinFromCollection- SubQueryTransformer- BlockJoinFacet- Distrib Tests to SolrCloudTestCase (Mikhail Khludnev)
* SOLR-9161: SolrPluginUtils.invokeSetters now accommodates setter variants (Christine Poerschke)
================== 6.0.1 ==================
(No Changes)

View File

@ -1066,8 +1066,8 @@ public class SolrPluginUtils {
String key = entry.getKey();
String setterName = "set" + String.valueOf(Character.toUpperCase(key.charAt(0))) + key.substring(1);
try {
final Method method = findSetter(clazz, setterName, key);
final Object val = entry.getValue();
final Method method = findSetter(clazz, setterName, key, val.getClass());
method.invoke(bean, val);
} catch (InvocationTargetException | IllegalAccessException e1) {
throw new RuntimeException("Error invoking setter " + setterName + " on class : " + clazz.getName(), e1);
@ -1075,10 +1075,14 @@ public class SolrPluginUtils {
}
}
private static Method findSetter(Class<?> clazz, String setterName, String key) {
for (Method m : clazz.getMethods()) {
if (m.getName().equals(setterName) && m.getParameterTypes().length == 1) {
return m;
private static Method findSetter(Class<?> clazz, String setterName, String key, Class<?> paramClazz) {
try {
return clazz.getMethod(setterName, new Class<?>[] { paramClazz });
} catch (NoSuchMethodException e) {
for (Method m : clazz.getMethods()) {
if (m.getName().equals(setterName) && m.getParameterTypes().length == 1) {
return m;
}
}
}
throw new RuntimeException("No setter corrresponding to '" + key + "' in " + clazz.getName());

View File

@ -455,6 +455,34 @@ public class SolrPluginUtilsTest extends SolrTestCaseJ4 {
assertEquals(3, q.build().getMinimumNumberShouldMatch());
}
private class InvokeSettersTestClass {
private float aFloat = random().nextFloat();
public float getAFloat() {
return aFloat;
}
public void setAFloat(float aFloat) {
this.aFloat = aFloat;
}
public void setAFloat(String aFloat) {
this.aFloat = Float.parseFloat(aFloat);
}
}
@Test
public void testInvokeSetters() {
final Float theFloat = new Float(random().nextFloat());
implTestInvokeSetters(theFloat, theFloat);
implTestInvokeSetters(theFloat, theFloat.toString());
}
public void implTestInvokeSetters(final Float theFloat, final Object theFloatObject) {
final InvokeSettersTestClass bean = new InvokeSettersTestClass();
final Map<String,Object> initArgs = new HashMap<>();
initArgs.put("aFloat", theFloatObject);
SolrPluginUtils.invokeSetters(bean, initArgs.entrySet());
assertEquals(bean.getAFloat(), theFloat.floatValue(), 0.0);
}
/** macro */
public String pe(CharSequence s) {
return SolrPluginUtils.partialEscape(s).toString();