@Override public <T> Builder addIfNotDefault(ItemSpec<T> item, @Nullable T defaultValue) { checkNotNull(item, "Input display item cannot be null"); ItemSpec<T> defaultItem = item.withValue(defaultValue); return addItemIf(!Objects.equals(item, defaultItem), item); }
@Override public Builder include(String path, HasDisplayData subComponent) { checkNotNull(subComponent, "subComponent argument cannot be null"); checkNotNull(path, "path argument cannot be null"); Path absolutePath = latestPath.extend(path); HasDisplayData existingComponent = visitedPathMap.get(absolutePath); if (existingComponent != null) { throw new IllegalArgumentException( String.format( "Specified path '%s' already used for " + "subcomponent %s. Subcomponents must be included using unique paths.", path, existingComponent)); } return include(absolutePath, subComponent); }
@Override public Builder add(ItemSpec<?> item) { checkNotNull(item, "Input display item cannot be null"); return addItemIf(true, item); }
@Override public Builder delegate(HasDisplayData component) { checkNotNull(component); return include(latestPath, component); }
@Override public Builder addIfNotNull(ItemSpec<?> item) { checkNotNull(item, "Input display item cannot be null"); return addItemIf(item.getValue() != null, item); }
/** * Collect the {@link DisplayData} from a component. This will traverse all subcomponents * specified via {@link Builder#include} in the given component. Data in this component will be in * a namespace derived from the component. */ public static DisplayData from(HasDisplayData component) { checkNotNull(component, "component argument cannot be null"); InternalBuilder builder = new InternalBuilder(); builder.include(Path.root(), component); return builder.build(); }