in persistence-spi/src/main/java/org/apache/unomi/persistence/spi/PropertyHelper.java [39:114]
public static boolean setProperty(Object target, String propertyName, Object propertyValue, String setPropertyStrategy) {
try {
// Handle remove
String parentPropertyName;
if (setPropertyStrategy != null && setPropertyStrategy.equals("remove")) {
if (resolver.hasNested(propertyName)) {
parentPropertyName = propertyName.substring(0, propertyName.lastIndexOf('.'));
try {
Object parentPropertyValue = PropertyUtils.getNestedProperty(target, parentPropertyName);
if (parentPropertyValue instanceof HashMap) {
if (((HashMap) parentPropertyValue).keySet().contains(propertyName.substring(propertyName.lastIndexOf('.') + 1))) {
((HashMap) parentPropertyValue).remove(propertyName.substring(propertyName.lastIndexOf('.') + 1));
PropertyUtils.setNestedProperty(target, parentPropertyName, parentPropertyValue);
return true;
} else {
return false;
}
}
} catch (NestedNullException ex) {
return false;
}
}
return false;
}
// Leave now, next strategies require a propertyValue, if no propertyValue, nothing to update.
if (propertyValue == null) {
return false;
}
// Resolve propertyName
while (resolver.hasNested(propertyName)) {
Object v = PropertyUtils.getProperty(target, resolver.next(propertyName));
if (v == null) {
v = new LinkedHashMap<>();
PropertyUtils.setProperty(target, resolver.next(propertyName), v);
}
propertyName = resolver.remove(propertyName);
target = v;
}
// Get previous value
Object previousValue = PropertyUtils.getProperty(target, propertyName);
// Handle strategies
if (setPropertyStrategy == null ||
setPropertyStrategy.equals("alwaysSet") ||
(setPropertyStrategy.equals("setIfMissing") && previousValue == null)) {
if (!compareValues(propertyValue, previousValue)) {
BeanUtils.setProperty(target, propertyName, propertyValue);
return true;
}
} else if (setPropertyStrategy.equals("addValue") || setPropertyStrategy.equals("addValues")) {
List<Object> newValuesList = convertToList(propertyValue);
List<Object> previousValueList = convertToList(previousValue);
newValuesList.addAll(previousValueList);
Set<Object> newValuesSet = new HashSet<>(newValuesList);
if (newValuesSet.size() != previousValueList.size()) {
BeanUtils.setProperty(target, propertyName, Arrays.asList(newValuesSet.toArray()));
return true;
}
} else if (setPropertyStrategy.equals("removeValue") || setPropertyStrategy.equals("removeValues")) {
List<Object> previousValueList = convertToList(previousValue);
if (previousValueList.removeAll(convertToList(propertyValue))) {
BeanUtils.setProperty(target, propertyName, previousValueList);
return true;
}
}
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
LOGGER.error("Cannot set property", e);
}
return false;
}