1 package eu.svjatoslav.commons.network.navigation;
3 import java.util.ArrayList;
4 import java.util.HashMap;
8 import eu.svjatoslav.commons.network.Locale;
9 import eu.svjatoslav.commons.string.WildCardMatcher;
11 public class NavigationItem {
13 private String matchingPattern;
14 private final Map<Locale, String> localeToTitle = new HashMap<Locale, String>();
15 ArrayList<NavigationItem> subElements = new ArrayList<NavigationItem>();
16 private Locale[] localeOrder;
17 private NavigationItem parent;
18 private final String linkUrl;
20 public NavigationItem() {
24 public NavigationItem(final Locale... localeOrder) {
25 this.localeOrder = localeOrder;
26 matchingPattern = null;
30 public NavigationItem(final NavigationItem parent, final String linkUrl,
31 final String... titles) {
33 this.linkUrl = linkUrl;
34 matchingPattern = linkUrl;
36 initializeLocalizedTitles(titles);
39 public NavigationItem addChild(final String linkUrl, final String... titles) {
41 final NavigationItem item = new NavigationItem(this, linkUrl, titles);
42 subElements.add(item);
47 public String getLinkUrl() {
51 public Locale[] getLocaleOrder() {
52 if (localeOrder != null)
55 return parent.getLocaleOrder();
58 NavigationItem getMatchingNavigationItem(final String requestPath) {
59 if (matchesUrl(requestPath))
62 for (final NavigationItem childNavigationItem : subElements) {
63 final NavigationItem match = childNavigationItem
64 .getMatchingNavigationItem(requestPath);
72 public List<NavigationItem> getSubElements() {
76 public String getTitle() {
77 if (localeToTitle.size() != 1)
78 throw new RuntimeException("there shall be exactly one title");
80 return localeToTitle.values().iterator().next();
83 public String getTitle(final Locale locale) {
84 return localeToTitle.get(locale);
87 private void initializeLocalizedTitles(final String... titles) {
88 final Locale[] locales = getLocaleOrder();
89 if (locales.length != titles.length)
90 throw new RuntimeException("There should be exactly "
91 + locales.length + " title(s).");
93 for (int i = 0; i < titles.length; i++)
94 localeToTitle.put(locales[i], titles[i]);
97 public boolean matchesUrl(final String url) {
98 return WildCardMatcher.match(url, matchingPattern);
101 public NavigationItem setPattern(final String pattern) {
102 matchingPattern = pattern;