fixed default locale selection for web navigation
[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 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;
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                 matchingPattern = 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                 matchingPattern = linkUrl;
35
36                 initializeLocalizedTitles(titles);
37         }
38
39         public NavigationItem addChild(final String linkUrl, final String... titles) {
40
41                 final NavigationItem item = new NavigationItem(this, linkUrl, titles);
42                 subElements.add(item);
43
44                 return item;
45         }
46
47         public String getLinkUrl() {
48                 return linkUrl;
49         }
50
51         public Locale[] getLocaleOrder() {
52                 if (localeOrder != null)
53                         return localeOrder;
54
55                 return parent.getLocaleOrder();
56         }
57
58         NavigationItem getMatchingNavigationItem(final String requestPath) {
59                 if (matchesUrl(requestPath))
60                         return this;
61
62                 for (final NavigationItem childNavigationItem : subElements) {
63                         final NavigationItem match = childNavigationItem
64                                         .getMatchingNavigationItem(requestPath);
65
66                         if (match != null)
67                                 return match;
68                 }
69                 return null;
70         }
71
72         public List<NavigationItem> getSubElements() {
73                 return subElements;
74         }
75
76         public String getTitle() {
77                 if (localeToTitle.size() != 1)
78                         throw new RuntimeException("there shall be exactly one title");
79
80                 return localeToTitle.values().iterator().next();
81         }
82
83         public String getTitle(final Locale locale) {
84                 return localeToTitle.get(locale);
85         }
86
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).");
92
93                 for (int i = 0; i < titles.length; i++)
94                         localeToTitle.put(locales[i], titles[i]);
95         }
96
97         public boolean matchesUrl(final String url) {
98                 return WildCardMatcher.match(url, matchingPattern);
99         }
100
101         public NavigationItem setPattern(final String pattern) {
102                 matchingPattern = pattern;
103                 return this;
104         }
105
106 }