public static <C, V> void setValue(C target, String path, V value, boolean required, boolean autoConvert) { int sep = path.indexOf('.'); if (sep < 0) // it is a local property setLocal(target, path, value, required, autoConvert); else { // a recursive feature path needs to be resolved String localName = path.substring(0, sep); Object subTarget = FeatureAccessor.getValue(target, localName, true); if (subTarget == null) { // feature exists but is null, so create an object and assign it to the feature subTarget = setFeatureDefault(target, localName); } String remainingName = path.substring(sep + 1); setValue(subTarget, remainingName, value, required, autoConvert); } }
private Object haveTargetObject(Object bean, String featurePath) { if (featurePath == null) { return bean; } else if (featurePath.contains(".")) { String[] pathParts = StringUtil.splitOnFirstSeparator(featurePath, '.'); Object child = haveTargetObject(bean, pathParts[0]); return haveTargetObject(child, pathParts[1]); } Object value = FeatureAccessor.getValue(bean, featurePath, false); if (value != null) return value; else return AnyMutator.setFeatureDefault(bean, featurePath); }