refactored navigation logic to be more fool-proof
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / network / navigation / NavigationItem.java
index fdf6985..d40ff57 100755 (executable)
@@ -10,37 +10,48 @@ import eu.svjatoslav.commons.string.WildCardMatcher;
 
 public class NavigationItem {
 
-       private final String link;
-       private final String matchingWildcard;
-       private final Map<Locale, String> titles = new HashMap<Locale, String>();
+       private String matchingWildcard;
+       private final Map<Locale, String> localeToTitle = new HashMap<Locale, String>();
        ArrayList<NavigationItem> subElements = new ArrayList<NavigationItem>();
-
-       public NavigationItem(final String link) {
-               this.link = link;
-               matchingWildcard = link;
+       private Locale[] localeOrder;
+       private NavigationItem parent;
+       private final String linkUrl;
+
+       public NavigationItem(final Locale... localeOrder) {
+               if (localeOrder.length == 0)
+                       this.localeOrder = new Locale[] { Locale.ENG };
+               else
+                       this.localeOrder = localeOrder;
+
+               matchingWildcard = null;
+               linkUrl = null;
        }
 
-       public NavigationItem(final String link, final String wildcard) {
-               this.link = link;
-               matchingWildcard = wildcard;
+       public NavigationItem(final NavigationItem parent, final String linkUrl,
+                       final String... titles) {
+               this.parent = parent;
+               this.linkUrl = linkUrl;
+
+               initializeLocalizedTitles(titles);
        }
 
-       public void addSubNavigation(final NavigationItem item) {
+       public NavigationItem addChild(final String linkUrl, final String... titles) {
+
+               final NavigationItem item = new NavigationItem(this, linkUrl, titles);
                subElements.add(item);
-       }
 
-       public NavigationItem addTitle(final Locale locale, final String title) {
-               titles.put(locale, title);
-               return this;
+               return item;
        }
 
-       public NavigationItem addTitle(final String title) {
-               titles.put(Locale.ENG, title);
-               return this;
+       public String getLinkUrl() {
+               return linkUrl;
        }
 
-       public String getLink() {
-               return link;
+       public Locale[] getLocaleOrder() {
+               if (localeOrder != null)
+                       return localeOrder;
+
+               return parent.getLocaleOrder();
        }
 
        public List<NavigationItem> getSubElements() {
@@ -48,15 +59,27 @@ public class NavigationItem {
        }
 
        public String getTitle() {
-               return titles.get(Locale.ENG);
+               if (localeToTitle.size() != 1)
+                       throw new RuntimeException("there shall be exactly one title");
+
+               return localeToTitle.values().iterator().next();
        }
 
        public String getTitle(final Locale locale) {
-               return titles.get(locale);
+               return localeToTitle.get(locale);
        }
 
-       public boolean matchesUrl(final String url) {
+       private void initializeLocalizedTitles(final String... titles) {
+               final Locale[] locales = getLocaleOrder();
+               if (locales.length != titles.length)
+                       throw new RuntimeException("There should be exactly "
+                                       + locales.length + " title(s).");
 
+               for (int i = 0; i < titles.length; i++)
+                       localeToTitle.put(locales[i], titles[i]);
+       }
+
+       public boolean matchesUrl(final String url) {
                return WildCardMatcher.match(url, matchingWildcard);
 
        }