org.aksw.commons.util.slot.SlottedBuilderImpl Maven / Gradle / Ivy
package org.aksw.commons.util.slot;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
public class SlottedBuilderImpl
implements SlottedBuilder
{
/** The assembler that assembles the 'whole' from the 'parts' */
protected Function, ? extends W> assembler;
protected Set> slots = new LinkedHashSet<>();
public SlottedBuilderImpl(Function, ? extends W> assembler) {
super();
this.assembler = assembler;
}
public class SlotImpl
implements Slot
{
protected Supplier
supplier;
@Override
public Supplier
getSupplier() {
return supplier;
}
@Override
public Slot
setSupplier(Supplier
partSupplier) {
this.supplier = partSupplier;
return this;
}
@Override
public void close() {
synchronized (slots) {
slots.remove(this);
}
}
@Override
public String toString() {
return "SlotImpl [suppliedValue=" + supplier.get() + "]";
}
}
@Override
public synchronized Slot
newSlot() {
Slot
result = new SlotImpl();
synchronized (slots) {
slots.add(result);
}
return result;
}
@Override
public W build() {
synchronized (slots) {
Collection
parts = slots.stream()
.filter(slot -> slot != null)
.map(Slot::getSupplier)
.filter(supplier -> supplier != null)
.map(Supplier::get)
.filter(part -> part != null)
.collect(Collectors.toList());
W result = assembler.apply(parts);
return result;
}
}
public static SlottedBuilder create(Function, ? extends W> assembler) {
return new SlottedBuilderImpl(assembler);
}
}