package com.constellio.app.entities.navigation; import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.constellio.data.utils.KeyListMap; public class NavigationConfig implements Serializable { private final KeyListMap<String, NavigationItem> navigation; private final KeyListMap<String, PageItem> fragments; private final Set<String> codes; public NavigationConfig() { navigation = new KeyListMap<>(); fragments = new KeyListMap<>(); codes = new HashSet<>(); } public void add(String group, NavigationItem item) { add(group, item, navigation); } public void add(String group, NavigationItem item, int index) { add(group, item, index, navigation); } public void replace(String group, NavigationItem item) { replace(group, item, navigation); } public void replace(String group, PageItem item) { replace(group, item, fragments); } public void add(String group, PageItem item) { add(group, item, fragments); } public List<NavigationItem> getNavigation(String group) { return navigation.get(group); } public NavigationItem getNavigationItem(String group, String code) { for (NavigationItem item : getNavigation(group)) { if (code.equals(item.getCode())) { return item; } } return null; } public boolean hasNavigationItem(String group, String code) { return codes.contains(group + "." + code); } public List<PageItem> getFragments(String group) { return fragments.get(group); } private <V extends CodedItem> void add(String group, V value, KeyListMap<String, V> map) { String code = group + "." + value.getCode(); if (codes.contains(code)) { throw new Error("Item already in configuration: " + code); } codes.add(code); map.add(group, value); } private <V extends CodedItem> void add(String group, V value, int index, KeyListMap<String, V> map) { String code = group + "." + value.getCode(); if (codes.contains(code)) { throw new Error("Item already in configuration: " + code); } codes.add(code); map.get(group).add(index, value); } private <V extends CodedItem> void replace(String group, V value, KeyListMap<String, V> map) { String code = group + "." + value.getCode(); if (!codes.contains(code)) { throw new Error("Item not in configuration: " + code); } List<V> oldItems = map.get(group); List<V> items = new ArrayList<>(oldItems.size()); for (V item : oldItems) { items.add(value.getCode().equals(item.getCode()) ? value : item); } map.set(group, items); } }