Skip to content

Commit

Permalink
reflection: factor setProperty out of onDataChangedEvent
Browse files Browse the repository at this point in the history
  • Loading branch information
Alextopher committed Sep 12, 2024
1 parent f9b73c7 commit 5ff2f67
Showing 1 changed file with 43 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -202,33 +202,7 @@ public void onDataChangeEvent(DataChangeEvent<?> event) {
}

try {
var propField = currentSettings.getClass().getField(propName);
var propType = propField.getType();

if (propType.isEnum()) {
var actual = propType.getEnumConstants()[(int) newPropValue];
propField.set(currentSettings, actual);
} else if (propType.isAssignableFrom(DoubleCouple.class)) {
var orig = (ArrayList<Number>) newPropValue;
var actual = new DoubleCouple(orig.get(0), orig.get(1));
propField.set(currentSettings, actual);
} else if (propType.isAssignableFrom(IntegerCouple.class)) {
var orig = (ArrayList<Number>) newPropValue;
var actual = new IntegerCouple(orig.get(0).intValue(), orig.get(1).intValue());
propField.set(currentSettings, actual);
} else if (propType.equals(Double.TYPE)) {
propField.setDouble(currentSettings, ((Number) newPropValue).doubleValue());
} else if (propType.equals(Integer.TYPE)) {
propField.setInt(currentSettings, (Integer) newPropValue);
} else if (propType.equals(Boolean.TYPE)) {
if (newPropValue instanceof Integer) {
propField.setBoolean(currentSettings, (Integer) newPropValue != 0);
} else {
propField.setBoolean(currentSettings, (Boolean) newPropValue);
}
} else {
propField.set(currentSettings, newPropValue);
}
setProperty(currentSettings, propName, newPropValue);
logger.trace("Set prop " + propName + " to value " + newPropValue);
} catch (NoSuchFieldException | IllegalAccessException e) {
logger.error(
Expand All @@ -248,4 +222,46 @@ public void onDataChangeEvent(DataChangeEvent<?> event) {
}
}
}

/**
* Sets the value of a property in the given object using reflection. This method should not be
* used generally and is only known to be correct in the context of `onDataChangeEvent`.
*
* @param currentSettings The object whose property needs to be set.
* @param propName The name of the property to be set.
* @param newPropValue The new value to be assigned to the property.
* @throws IllegalAccessException If the field cannot be accessed.
* @throws NoSuchFieldException If the field does not exist.
* @throws Exception If an some other unknown exception occurs while setting the property.
*/
protected static void setProperty(Object currentSettings, String propName, Object newPropValue)
throws IllegalAccessException, NoSuchFieldException, Exception {
var propField = currentSettings.getClass().getField(propName);
var propType = propField.getType();

if (propType.isEnum()) {
var actual = propType.getEnumConstants()[(int) newPropValue];
propField.set(currentSettings, actual);
} else if (propType.isAssignableFrom(DoubleCouple.class)) {
var orig = (ArrayList<Number>) newPropValue;
var actual = new DoubleCouple(orig.get(0), orig.get(1));
propField.set(currentSettings, actual);
} else if (propType.isAssignableFrom(IntegerCouple.class)) {
var orig = (ArrayList<Number>) newPropValue;
var actual = new IntegerCouple(orig.get(0).intValue(), orig.get(1).intValue());
propField.set(currentSettings, actual);
} else if (propType.equals(Double.TYPE)) {
propField.setDouble(currentSettings, ((Number) newPropValue).doubleValue());
} else if (propType.equals(Integer.TYPE)) {
propField.setInt(currentSettings, (Integer) newPropValue);
} else if (propType.equals(Boolean.TYPE)) {
if (newPropValue instanceof Integer) {
propField.setBoolean(currentSettings, (Integer) newPropValue != 0);
} else {
propField.setBoolean(currentSettings, (Boolean) newPropValue);
}
} else {
propField.set(currentSettings, newPropValue);
}
}
}

0 comments on commit 5ff2f67

Please sign in to comment.