private JsonObject removeValueForKey(final CharSequence key) { JsonObject result = this; if (containsKey(key)) { final Map<String, JsonField> fieldsCopy = copyFields(); fieldsCopy.remove(key.toString()); result = new ImmutableJsonObject(fieldsCopy); } return result; }
@Override public JsonObject get(final JsonFieldDefinition fieldDefinition) { checkFieldDefinition(fieldDefinition); return get(fieldDefinition.getPointer()); }
/** * Returns an empty JSON object. * * @return an empty JSON object. */ public static JsonObject newObject() { return ImmutableJsonObject.empty(); }
@Override public JsonObject setAll(final Iterable<JsonField> fields) { requireNonNull(fields, "The JSON fields to add must not be null!"); final JsonObject result; if (isEmpty(fields)) { result = this; } else { final Map<String, JsonField> fieldsCopy = copyFields(); fields.forEach(jsonField -> fieldsCopy.put(jsonField.getKeyName(), jsonField)); result = new ImmutableJsonObject(fieldsCopy); } return result; }
private JsonObject removeForPointer(final JsonPointer pointer) { final JsonObject result; final JsonKey rootKey = pointer.getRoot().orElse(ROOT_KEY); final Optional<JsonFieldDefinition> rootKeyDefinition = getDefinitionForKey(rootKey); if (pointer.isEmpty()) { result = this; } else if (1 == pointer.getLevelCount()) { result = removeValueForKey(rootKey); } else { final JsonPointer nextPointerLevel = pointer.nextLevel(); final Predicate<JsonObject> containsNextLevelRootKey = jsonObject -> nextPointerLevel.getRoot() .map(jsonObject::contains) .orElse(false); result = getValueForKey(rootKey) .filter(JsonValue::isObject) .map(JsonValue::asObject) .filter(containsNextLevelRootKey) .map(jsonObject -> jsonObject.remove(nextPointerLevel)) // Recursion .map(withoutValue -> JsonField.newInstance(rootKey, withoutValue, rootKeyDefinition.orElse(null))) .map(this::set) .orElse(this); } return result; }
@Override public JsonObject get(final JsonPointer pointer) { checkPointer(pointer); final Optional<JsonValue> rootKeyValue = getValueForKey(rootKey); final Optional<JsonFieldDefinition> rootKeyDefinition = getDefinitionForKey(rootKey); if (1 >= pointer.getLevelCount()) { result = rootKeyValue.map(
@Override public JsonObject get(final JsonFieldSelector fieldSelector) { requireNonNull(fieldSelector, "The JSON field selector must not be null!"); if (isEmpty()) { return this; } final List<JsonPointer> pointersContainedInThis = fieldSelector.getPointers() .stream() .filter(this::contains) .collect(Collectors.toList()); if (pointersContainedInThis.isEmpty()) { return empty(); } else { return filterByTrie(this, JsonFieldSelectorTrie.of(pointersContainedInThis)); } }
@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 <T> Optional<T> getValue(final JsonFieldDefinition<T> fieldDefinition) { checkFieldDefinition(fieldDefinition); return getValueForPointer(fieldDefinition.getPointer()).map(fieldDefinition::mapValue); }
@Override public JsonObject setAll(final Iterable<JsonField> fields) { requireNonNull(fields, "The JSON fields to add must not be null!"); final JsonObject result; if (isEmpty(fields)) { result = this; } else { result = new ImmutableJsonObject(fieldMap.putAll(fields)); } return result; }
private JsonObject removeValueForKey(final CharSequence key) { JsonObject result = this; if (containsKey(key)) { result = new ImmutableJsonObject(fieldMap.remove(key.toString())); } return result; }
@Override public ImmutableJsonObject set(final JsonField field) { requireNonNull(field, "The JSON field to be set must not be null!"); ImmutableJsonObject result = this; final JsonField existingField = fields.get(field.getKeyName()); if (!field.equals(existingField)) { final Map<String, JsonField> fieldsCopy = copyFields(); fieldsCopy.put(field.getKeyName(), field); result = new ImmutableJsonObject(fieldsCopy); } return result; }
@Override public JsonObject get(final JsonFieldSelector fieldSelector) { requireNonNull(fieldSelector, "The JSON field selector must not be null!"); if (isEmpty()) { return this; } final List<JsonPointer> pointersContainedInThis = fieldSelector.getPointers() .stream() .filter(this::contains) .collect(Collectors.toList()); if (pointersContainedInThis.isEmpty()) { return JsonFactory.newObject(); } else { return filterByTrie(this, JsonFieldSelectorTrie.of(pointersContainedInThis)); } }
/** * Returns a new {@code ImmutableJsonObject} instance which contains the given fields. * * @param fields the fields of the new JSON object. * @return a new JSON object containing the {@code fields}. * @throws NullPointerException if {@code fields} is {@code null}. */ public static ImmutableJsonObject of(final Map<String, JsonField> fields) { return new ImmutableJsonObject(fields); }
private Optional<JsonFieldDefinition> getDefinitionForKey(final CharSequence key) { return getField(key).flatMap(JsonField::getDefinition); }
@SuppressWarnings("unchecked") private static JsonObject filterByTrie(final JsonObject self, final JsonFieldSelectorTrie trie) { if (trie.isEmpty()) { return self; } final JsonObjectBuilder builder = JsonFactory.newObjectBuilder(); for (final JsonKey key : trie.getKeys()) { self.getField(key).ifPresent(child -> { final JsonValue childValue = child.getValue(); final JsonValue filteredChildValue = childValue.isObject() ? filterByTrie(childValue.asObject(), trie.descend(key)) : childValue; final Optional<JsonFieldDefinition> childFieldDefinition = child.getDefinition(); if (childFieldDefinition.isPresent()) { builder.set(childFieldDefinition.get(), filteredChildValue); } else { builder.set(key, filteredChildValue); } }); } return builder.build(); }
private JsonObject removeForPointer(final JsonPointer pointer) { final JsonObject result; final JsonKey rootKey = pointer.getRoot().orElse(ROOT_KEY); final Optional<JsonFieldDefinition> rootKeyDefinition = getDefinitionForKey(rootKey); if (pointer.isEmpty()) { result = this; } else if (1 == pointer.getLevelCount()) { result = removeValueForKey(rootKey); } else { final JsonPointer nextPointerLevel = pointer.nextLevel(); final Predicate<JsonObject> containsNextLevelRootKey = jsonObject -> nextPointerLevel.getRoot() .map(jsonObject::contains) .orElse(false); result = getValueForKey(rootKey) .filter(JsonValue::isObject) .map(JsonValue::asObject) .filter(containsNextLevelRootKey) .map(jsonObject -> jsonObject.remove(nextPointerLevel)) // Recursion .map(withoutValue -> JsonFactory.newField(rootKey, withoutValue, rootKeyDefinition.orElse(null))) .map(this::set) .orElse(this); } return result; }
@Override public JsonObject get(final JsonPointer pointer) { checkPointer(pointer); final Optional<JsonValue> rootKeyValue = getValueForKey(rootKey); final Optional<JsonFieldDefinition> rootKeyDefinition = getDefinitionForKey(rootKey); if (1 >= pointer.getLevelCount()) { result = rootKeyValue.map(
@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))); }
@Override public <T> Optional<T> getValue(final JsonFieldDefinition<T> fieldDefinition) { checkFieldDefinition(fieldDefinition); return getValueForPointer(fieldDefinition.getPointer()).map(fieldDefinition::mapValue); }