2 * Svjatoslav Commons - shared library of common functionality.
3 * Copyright ©2012-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 3 of the GNU Lesser General Public License
7 * or later as published by the Free Software Foundation.
10 package eu.svjatoslav.commons.network.navigation;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
17 import eu.svjatoslav.commons.network.Locale;
18 import eu.svjatoslav.commons.string.WildCardMatcher;
20 public class NavigationItem<NI extends NavigationItem> {
22 private String matchingPattern;
24 private final Map<Locale, String> localeToTitle = new HashMap<Locale, String>();
25 private final ArrayList<NI> subElements = new ArrayList<NI>();
26 private final NI parent;
27 private final Navigation<NI> navigation;
28 private final String linkUrl;
30 * CSS prefix is inherited to child menu items.
32 private String cssPrefix;
34 public NavigationItem(final Navigation<NI> navigation) {
35 this.navigation = navigation;
37 matchingPattern = null;
41 public NavigationItem(final NI parent, final String linkUrl,
42 final String... titles) {
43 this.navigation = parent.getNavigation();
45 this.linkUrl = linkUrl;
46 matchingPattern = linkUrl;
48 initializeLocalizedTitles(titles);
50 parent.addNavigationItem(this);
53 public void addNavigationItem(final NI navigationItem) {
54 subElements.add(navigationItem);
57 protected String getCssPrefix() {
58 if (cssPrefix != null)
64 return parent.getCssPrefix();
67 public String getLinkUrl() {
71 NI getMatchingNavigationItem(final String requestPath) {
72 if (matchesUrl(requestPath))
75 for (final NI childNavigationItem : subElements) {
76 final NI match = (NI) childNavigationItem
77 .getMatchingNavigationItem(requestPath);
85 public Navigation<NI> getNavigation() {
89 public List<NI> getSubElements() {
93 public String getTitle(final Locale locale) {
94 return localeToTitle.get(locale);
97 private void initializeLocalizedTitles(final String... titles) {
98 final List<Locale> locales = getNavigation().getLocaleConfiguration()
100 if (locales.size() != titles.length)
101 throw new RuntimeException("There should be exactly "
102 + locales.size() + " title(s).");
104 for (int i = 0; i < titles.length; i++)
105 localeToTitle.put(locales.get(i), titles[i]);
108 public boolean matchesUrl(final String url) {
109 return WildCardMatcher.match(url, matchingPattern);
112 public void setCssPrefix(final String cssPrefix) {
113 this.cssPrefix = cssPrefix;
116 public NavigationItem setPattern(final String pattern) {
117 matchingPattern = pattern;
122 public String toString() {
123 return "NavigationItem [matchingPattern=" + matchingPattern
124 + ", localeToTitle=" + localeToTitle + ", subElements count="
125 + subElements.size() + ", linkUrl=" + linkUrl + ", cssPrefix="