/** * Returns a new instance of {@code ImmutableJsonObjectBuilder}. * * @return a new builder for an immutable {@link JsonObject}. */ public static ImmutableJsonObjectBuilder newInstance() { return new ImmutableJsonObjectBuilder(); }
/** * Returns a new mutable builder for a {@code JsonObject}. * * @return a new JSON object builder. */ public static JsonObjectBuilder newObjectBuilder() { return ImmutableJsonObjectBuilder.newInstance(); }
private static JsonObjectBuilder setFieldInHierarchy(final ImmutableJsonObjectBuilder target, final JsonPointer pointer, final JsonField field) { if (1 >= pointer.getLevelCount()) { return target.set(field); } final JsonKey rootKey = pointer.getRoot().orElse(ROOT_KEY); final ImmutableJsonObjectBuilder newTarget = newInstance(); final JsonField rootJsonField = target.fields.get(rootKey.toString()); if (null != rootJsonField) { final JsonValue rootValue = rootJsonField.getValue(); if (rootValue.isObject() && !rootValue.isNull()) { newTarget.setAll(rootValue.asObject()); } } // let the recursion begin >:-( final JsonObject jsonObject = setFieldInHierarchy(newTarget, pointer.nextLevel(), field).build(); return target.set(rootKey, jsonObject); }
@Override public ImmutableJsonObjectBuilder set(final CharSequence key, final JsonValue value, final Predicate<JsonField> predicate) { final JsonPointer pointer = JsonFactory.getNonEmptyPointer(key); checkValue(value); checkPredicate(predicate); pointer.getLeaf() .map(leafKey -> JsonFactory.newField(leafKey, value)) .filter(predicate) .ifPresent(jsonField -> setFieldInHierarchy(this, pointer, jsonField)); return this; }
@Override public ImmutableJsonObjectBuilder set(final CharSequence key, final int value, final Predicate<JsonField> predicate) { return set(key, JsonFactory.newValue(value), predicate); }
@Override public <T> JsonObjectBuilder set(final JsonFieldDefinition<T> fieldDefinition, @Nullable final T value, final Predicate<JsonField> predicate) { requireNonNull(fieldDefinition, "The definition of the JSON field to set the value for must not be null!"); checkPredicate(predicate); final JsonPointer pointer = fieldDefinition.getPointer(); pointer.getLeaf() .map(leafKey -> JsonFactory.newField(leafKey, JsonFactory.getAppropriateValue(value), fieldDefinition)) .filter(predicate) .ifPresent(jsonField -> setFieldInHierarchy(this, pointer, jsonField)); return this; }
@Override public ImmutableJsonObjectBuilder remove(final JsonFieldDefinition fieldDefinition) { requireNonNull(fieldDefinition, "The field definition must not be null!"); return remove(fieldDefinition.getPointer()); }
@Override public ImmutableJsonObjectBuilder setAll(final Iterable<JsonField> fields, final Predicate<JsonField> predicate) { requireNonNull(fields, "The JSON fields to be set must not be null!"); checkPredicate(predicate); StreamSupport.stream(fields.spliterator(), false) .filter(field -> !field.getDefinition().isPresent() || predicate.test(field)) .forEach(fieldToBeSet -> this.fields.put(fieldToBeSet.getKeyName(), fieldToBeSet)); return this; }
private static JsonObjectBuilder setFieldInHierarchy(final ImmutableJsonObjectBuilder target, final JsonPointer pointer, final JsonField field) { if (1 >= pointer.getLevelCount()) { return target.set(field); } final JsonKey rootKey = pointer.getRoot().orElse(ROOT_KEY); final ImmutableJsonObjectBuilder newTarget = newInstance(); final JsonField rootJsonField = target.fields.get(rootKey.toString()); if (null != rootJsonField) { final JsonValue rootValue = rootJsonField.getValue(); if (rootValue.isObject() && !rootValue.isNull()) { newTarget.setAll(rootValue.asObject()); } } // let the recursion begin >:-( final JsonObject jsonObject = setFieldInHierarchy(newTarget, pointer.nextLevel(), field).build(); return target.set(rootKey, jsonObject); }
@Override public ImmutableJsonObjectBuilder set(final CharSequence key, final JsonValue value, final Predicate<JsonField> predicate) { final JsonPointer pointer = JsonFactory.getNonEmptyPointer(key); checkValue(value); checkPredicate(predicate); pointer.getLeaf() .map(leafKey -> JsonFactory.newField(leafKey, value)) .filter(predicate) .ifPresent(jsonField -> setFieldInHierarchy(this, pointer, jsonField)); return this; }
@Override public ImmutableJsonObjectBuilder set(final CharSequence key, final String value, final Predicate<JsonField> predicate) { return set(key, JsonFactory.newValue(value), predicate); }
@Override public <T> JsonObjectBuilder set(final JsonFieldDefinition<T> fieldDefinition, @Nullable final T value, final Predicate<JsonField> predicate) { requireNonNull(fieldDefinition, "The definition of the JSON field to set the value for must not be null!"); checkPredicate(predicate); final JsonPointer pointer = fieldDefinition.getPointer(); pointer.getLeaf() .map(leafKey -> JsonFactory.newField(leafKey, JsonFactory.getAppropriateValue(value), fieldDefinition)) .filter(predicate) .ifPresent(jsonField -> setFieldInHierarchy(this, pointer, jsonField)); return this; }
@Override public ImmutableJsonObjectBuilder remove(final CharSequence key) { return remove(JsonFactory.newPointer(key)); }
@Override public ImmutableJsonObjectBuilder setAll(final Iterable<JsonField> fields, final Predicate<JsonField> predicate) { requireNonNull(fields, "The JSON fields to be set must not be null!"); checkPredicate(predicate); StreamSupport.stream(fields.spliterator(), false) .filter(field -> !field.getDefinition().isPresent() || predicate.test(field)) .forEach(fieldToBeSet -> this.fields.put(fieldToBeSet.getKeyName(), fieldToBeSet)); return this; }
@Override public ImmutableJsonObjectBuilder set(final CharSequence key, final boolean value, final Predicate<JsonField> predicate) { return set(key, JsonFactory.newValue(value), predicate); }
@Override public ImmutableJsonObjectBuilder remove(final JsonFieldDefinition fieldDefinition) { requireNonNull(fieldDefinition, "The field definition must not be null!"); return remove(fieldDefinition.getPointer()); }
/** * Returns a new mutable builder for a {@code JsonObject}. * * @return a new JSON object builder. */ public static JsonObjectBuilder newObjectBuilder() { return ImmutableJsonObjectBuilder.newInstance(); }
/** * Returns a new instance of {@code ImmutableJsonObjectBuilder}. * * @return a new builder for an immutable {@link JsonObject}. */ public static ImmutableJsonObjectBuilder newInstance() { return new ImmutableJsonObjectBuilder(); }
@Override public ImmutableJsonObjectBuilder set(final CharSequence key, final long value, final Predicate<JsonField> predicate) { return set(key, JsonFactory.newValue(value), predicate); }
@Override public ImmutableJsonObjectBuilder remove(final CharSequence key) { return remove(JsonFactory.newPointer(key)); }