package de.otto.edison.navigation; import net.jcip.annotations.ThreadSafe; import java.util.ArrayList; import java.util.List; import static java.util.Collections.emptyList; import static java.util.Collections.unmodifiableList; import static java.util.Comparator.comparing; /** * The navigation of Edison-Microservices on /internal pages. * <p> * The NavBar can be extended by more items. In order to do this, just {@link #register} * </p> * @since 1.0.0 */ @ThreadSafe public class NavBar { private volatile List<NavBarItem> items; private NavBar(final List<NavBarItem> items) { updateAndSortItems(new ArrayList<>(items)); } public static NavBar emptyNavBar() { return new NavBar(emptyList()); } public static NavBar navBar(final List<NavBarItem> items) { return new NavBar(items); } /** * Registers another item in this NavBar. * <p> * The item is positioned in the navigation by {@link NavBarItem#getPosition()}, * then by {@link NavBarItem#getTitle()}. * </p> * @param item New NavBarItem. */ public void register(final NavBarItem item) { updateAndSortItems(new ArrayList<NavBarItem>(items) {{ add(item); }}); } /** * Returns the list of all {@link NavBarItem items}. * <p> * The list is sorted by {@link NavBarItem#getPosition()}, then by {@link NavBarItem#getTitle()}. * </p> * @return Unmodifiable list of navbar items. */ public List<NavBarItem> getItems() { return unmodifiableList(items); } private void updateAndSortItems(final List<NavBarItem> items) { items.sort( comparing(NavBarItem::getPosition) .thenComparing(NavBarItem::getTitle)); this.items = unmodifiableList(items); } }