package org.fluentlenium.core.label;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
/**
* Apply label and label hints to element.
*
* @param <T> {@code this} class to chain method calls
*/
public class FluentLabelImpl<T> implements FluentLabel<T>, FluentLabelProvider {
private final T reference;
private final Supplier<String> defaultLabelSupplier;
private String label;
private final List<String> labelHints = new ArrayList<>();
/**
* Creates a new fluent label.
*
* @param reference object reference to chain methods calls.
* @param defaultLabelSupplier supplier for default label to display when no label is defined.
*/
public FluentLabelImpl(T reference, Supplier<String> defaultLabelSupplier) {
this.reference = reference;
this.defaultLabelSupplier = defaultLabelSupplier;
}
@Override
public T withLabel(String label) {
this.label = label;
return reference;
}
/**
* Get the defined label.
*
* @return defined value
*/
public String getLabel() {
return label;
}
@Override
public T withLabelHint(String... labelHint) {
if (labelHint != null) {
labelHints.addAll(Arrays.asList(labelHint));
}
return reference;
}
/**
* Get the defined label hints.
*
* @return array of label hints
*/
public String[] getLabelHints() {
return labelHints.toArray(new String[labelHints.size()]);
}
@Override
public String toString() {
StringBuilder toStringBuilder = new StringBuilder();
if (label == null) {
toStringBuilder.append(defaultLabelSupplier.get());
} else {
toStringBuilder.append(label);
}
if (!labelHints.isEmpty()) {
toStringBuilder.append(" [");
boolean notFirst = false;
for (String labelHint : labelHints) {
if (notFirst) {
toStringBuilder.append(", ");
}
toStringBuilder.append(labelHint);
notFirst = true;
}
toStringBuilder.append(']');
}
return toStringBuilder.toString();
}
}