Members Class — spring-boot Architecture
Architecture documentation for the Members class in JsonWriter.java from the spring-boot codebase.
Entity Profile
Relationship Graph
Source Code
core/spring-boot/src/main/java/org/springframework/boot/json/JsonWriter.java lines 175–356
final class Members<T> {
private final List<Member<?>> members = new ArrayList<>();
private final boolean contributesPair;
private final @Nullable Series series;
private final JsonWriterFiltersAndProcessors jsonProcessors = new JsonWriterFiltersAndProcessors();
Members(Consumer<Members<T>> members, boolean contributesToExistingSeries) {
Assert.notNull(members, "'members' must not be null");
members.accept(this);
Assert.state(!this.members.isEmpty(), "No members have been added");
this.contributesPair = this.members.stream().anyMatch(Member::contributesPair);
this.series = (this.contributesPair && !contributesToExistingSeries) ? Series.OBJECT : null;
if (this.contributesPair || this.members.size() > 1) {
this.members.forEach((member) -> Assert.state(member.contributesPair(),
() -> String.format("%s does not contribute a named pair, ensure that all members have "
+ "a name or call an appropriate 'using' method", member)));
}
}
/**
* Add a new member with access to the instance being written.
* @param name the member name
* @return the added {@link Member} which may be configured further
*/
public Member<T> add(String name) {
return add(name, (instance) -> instance);
}
/**
* Add a new member with a static value.
* @param <V> the value type
* @param name the member name
* @param value the member value
* @return the added {@link Member} which may be configured further
*/
public <V> Member<V> add(String name, @Nullable V value) {
return add(name, (instance) -> value);
}
/**
* Add a new member with a supplied value.
* @param <V> the value type
* @param name the member name
* @param supplier a supplier of the value
* @return the added {@link Member} which may be configured further
*/
public <V> Member<V> add(String name, Supplier<@Nullable V> supplier) {
Assert.notNull(supplier, "'supplier' must not be null");
return add(name, (instance) -> supplier.get());
}
/**
* Add a new member with an extracted value.
* @param <V> the value type
* @param name the member name
* @param extractor {@link Extractor} to extract the value
* @return the added {@link Member} which may be configured further
*/
public <V> Member<V> add(String name, Extractor<T, V> extractor) {
Assert.notNull(name, "'name' must not be null");
Assert.notNull(extractor, "'extractor' must not be null");
return addMember(name, extractor);
}
/**
* Add a new member with access to the instance being written. The member is added
* without a name, so one of the {@code Member.using(...)} methods must be used to
* complete the configuration.
* @return the added {@link Member} which may be configured further
*/
public Member<T> add() {
return from((value) -> value);
}
/**
* Add all entries from the given {@link Map} to the JSON.
* @param <M> the map type
* @param <K> the key type
* @param <V> the value type
* @param extractor {@link Extractor} to extract the map
* @return the added {@link Member} which may be configured further
*/
public <M extends Map<K, V>, K, V> Member<M> addMapEntries(Extractor<T, M> extractor) {
return from(extractor).usingPairs(Map::forEach);
}
/**
* Add members from a static value. One of the {@code Member.using(...)} methods
* must be used to complete the configuration.
* @param <V> the value type
* @param value the member value
* @return the added {@link Member} which may be configured further
*/
public <V> Member<V> from(@Nullable V value) {
return from((instance) -> value);
}
/**
* Add members from a supplied value. One of the {@code Member.using(...)} methods
* must be used to complete the configuration.
* @param <V> the value type
* @param supplier a supplier of the value
* @return the added {@link Member} which may be configured further
*/
public <V> Member<V> from(Supplier<@Nullable V> supplier) {
Assert.notNull(supplier, "'supplier' must not be null");
return from((instance) -> supplier.get());
}
/**
* Add members from an extracted value. One of the {@code Member.using(...)}
* methods must be used to complete the configuration.
* @param <V> the value type
* @param extractor {@link Extractor} to extract the value
* @return the added {@link Member} which may be configured further
*/
public <V> Member<V> from(Extractor<T, V> extractor) {
Assert.notNull(extractor, "'extractor' must not be null");
return addMember(null, extractor);
}
/**
* Add a filter that will be used to restrict the members written to the JSON.
* @param predicate the predicate used to filter members
*/
public void applyingPathFilter(Predicate<MemberPath> predicate) {
Assert.notNull(predicate, "'predicate' must not be null");
this.jsonProcessors.pathFilters().add(predicate);
}
/**
* Add a {@link NameProcessor} to be applied when the JSON is written.
* @param nameProcessor the name processor to add
*/
public void applyingNameProcessor(NameProcessor nameProcessor) {
Assert.notNull(nameProcessor, "'nameProcessor' must not be null");
this.jsonProcessors.nameProcessors().add(nameProcessor);
}
/**
* Add a {@link ValueProcessor} to be applied when the JSON is written.
* @param valueProcessor the value processor to add
*/
public void applyingValueProcessor(ValueProcessor<?> valueProcessor) {
Assert.notNull(valueProcessor, "'valueProcessor' must not be null");
this.jsonProcessors.valueProcessors().add(valueProcessor);
}
private <V> Member<V> addMember(@Nullable String name, Extractor<T, V> extractor) {
Member<V> member = new Member<>(this.members.size(), name, ValueExtractor.of(extractor));
this.members.add(member);
return member;
}
/**
* Writes the given instance using the configured {@link Member members}.
* @param instance the instance to write
* @param valueWriter the JSON value writer to use
*/
void write(@Nullable T instance, JsonValueWriter valueWriter) {
valueWriter.pushProcessors(this.jsonProcessors);
valueWriter.start(this.series);
for (Member<?> member : this.members) {
member.write(instance, valueWriter);
}
valueWriter.end(this.series);
valueWriter.popProcessors();
}
/**
* Return if any of the members contributes a name/value pair to the JSON.
* @return if a name/value pair is contributed
*/
boolean contributesPair() {
return this.contributesPair;
}
}
Domain
Source
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free