@Override public <T> JsonObject set(final JsonFieldDefinition<T> fieldDefinition, @Nullable final T value) { requireNonNull(fieldDefinition, "The JSON field definition to set the value for must not be null!"); final JsonPointer pointer = fieldDefinition.getPointer(); final JsonKey leafKey = pointer.getLeaf().orElseThrow(() -> { final String msgTemplate = "The pointer of the field definition <{0}> must not be empty!"; return new IllegalArgumentException(MessageFormat.format(msgTemplate, fieldDefinition)); }); final JsonField field = JsonFactory.newField(leafKey, JsonFactory.getAppropriateValue(value), fieldDefinition); return setFieldInHierarchy(this, pointer, field); }
@Override public <T> JsonObject set(final JsonFieldDefinition<T> fieldDefinition, @Nullable final T value) { requireNonNull(fieldDefinition, "The JSON field definition to set the value for must not be null!"); final JsonPointer pointer = fieldDefinition.getPointer(); final JsonKey leafKey = pointer.getLeaf().orElseThrow(() -> { final String msgTemplate = "The pointer of the field definition <{0}> must not be empty!"; return new IllegalArgumentException(MessageFormat.format(msgTemplate, fieldDefinition)); }); final JsonField field = JsonField.newInstance(leafKey, JsonValue.of(value), fieldDefinition); return setFieldInHierarchy(this, pointer, field); }
@Override public JsonObject setValue(final CharSequence key, final JsonValue value) { final JsonPointer pointer = JsonFactory.getNonEmptyPointer(key); final JsonKey leafKey = pointer.getLeaf().orElse(ROOT_KEY); final Optional<JsonFieldDefinition> keyDefinition = getDefinitionForKey(leafKey); return setFieldInHierarchy(this, pointer, JsonFactory.newField(leafKey, value, keyDefinition.orElse(null))); }
@Override public JsonObject setValue(final CharSequence key, final JsonValue value) { final JsonPointer pointer = JsonFactory.getNonEmptyPointer(key); final JsonKey leafKey = pointer.getLeaf().orElse(ROOT_KEY); final Optional<JsonFieldDefinition> keyDefinition = getDefinitionForKey(leafKey); return setFieldInHierarchy(this, pointer, JsonField.newInstance(leafKey, value, keyDefinition.orElse(null))); }
private static JsonObject setFieldInHierarchy(final JsonObject target, final JsonPointer pointer, final JsonField jsonField) { if (1 >= pointer.getLevelCount()) { return target.set(jsonField); } final JsonKey rootKey = pointer.getRoot().orElse(ROOT_KEY); final JsonObject newTarget = target.getValue(rootKey) .filter(JsonValue::isObject) .filter(jsonValue -> !jsonValue.isNull()) .map(JsonValue::asObject) .orElseGet(ImmutableJsonObject::empty); // let the recursion begin ]:-) return target.setValue(rootKey, setFieldInHierarchy(newTarget, pointer.nextLevel(), jsonField)); }
private static JsonObject setFieldInHierarchy(final JsonObject target, final JsonPointer pointer, final JsonField jsonField) { if (1 >= pointer.getLevelCount()) { return target.set(jsonField); } final JsonKey rootKey = pointer.getRoot().orElse(ROOT_KEY); final JsonObject newTarget = target.getValue(rootKey) .filter(JsonValue::isObject) .filter(jsonValue -> !jsonValue.isNull()) .map(JsonValue::asObject) .orElseGet(ImmutableJsonObject::empty); // let the recursion begin ]:-) return target.setValue(rootKey, setFieldInHierarchy(newTarget, pointer.nextLevel(), jsonField)); }