public static boolean setProperty()

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;
    }