d40ff570070fe92ef29a008a8ec775093cac7c9f
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / network / navigation / NavigationItem.java
1 package eu.svjatoslav.commons.network.navigation;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7
8 import eu.svjatoslav.commons.network.Locale;
9 import eu.svjatoslav.commons.string.WildCardMatcher;
10
11 public class NavigationItem {
12
13         private String matchingWildcard;
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;
19
20         public NavigationItem(final Locale... localeOrder) {
21                 if (localeOrder.length == 0)
22                         this.localeOrder = new Locale[] { Locale.ENG };
23                 else
24                         this.localeOrder = localeOrder;
25
26                 matchingWildcard = null;
27                 linkUrl = null;
28         }
29
30         public NavigationItem(final NavigationItem parent, final String linkUrl,
31                         final String... titles) {
32                 this.parent = parent;
33                 this.linkUrl = linkUrl;
34
35                 initializeLocalizedTitles(titles);
36         }
37
38         public NavigationItem addChild(final String linkUrl, final String... titles) {
39
40                 final NavigationItem item = new NavigationItem(this, linkUrl, titles);
41                 subElements.add(item);
42
43                 return item;
44         }
45
46         public String getLinkUrl() {
47                 return linkUrl;
48         }
49
50         public Locale[] getLocaleOrder() {
51                 if (localeOrder != null)
52                         return localeOrder;
53
54                 return parent.getLocaleOrder();
55         }
56
57         public List<NavigationItem> getSubElements() {
58                 return subElements;
59         }
60
61         public String getTitle() {
62                 if (localeToTitle.size() != 1)
63                         throw new RuntimeException("there shall be exactly one title");
64
65                 return localeToTitle.values().iterator().next();
66         }
67
68         public String getTitle(final Locale locale) {
69                 return localeToTitle.get(locale);
70         }
71
72         private void initializeLocalizedTitles(final String... titles) {
73                 final Locale[] locales = getLocaleOrder();
74                 if (locales.length != titles.length)
75                         throw new RuntimeException("There should be exactly "
76                                         + locales.length + " title(s).");
77
78                 for (int i = 0; i < titles.length; i++)
79                         localeToTitle.put(locales[i], titles[i]);
80         }
81
82         public boolean matchesUrl(final String url) {
83                 return WildCardMatcher.match(url, matchingWildcard);
84
85         }
86
87 }