0152c26048acb267367412d3f23f4305191415db
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / network / navigation / NavigationItem.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality.
3  * Copyright ©2012-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
4  *
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.
8  */
9
10 package eu.svjatoslav.commons.network.navigation;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 import eu.svjatoslav.commons.string.WildCardMatcher;
18
19 public class NavigationItem {
20
21         private String matchingPattern;
22
23         private final Map<String, String> localeToTitle = new HashMap<String, String>();
24         private final ArrayList<NavigationItem> subElements = new ArrayList<NavigationItem>();
25         private final NavigationItem parent;
26         private final Navigation<NavigationItem> navigation;
27         private final String linkUrl;
28         /**
29          * CSS prefix is inherited to child menu items.
30          */
31         private String cssPrefix;
32
33         public NavigationItem(final Navigation<NavigationItem> navigation) {
34                 this.navigation = navigation;
35                 parent = null;
36                 matchingPattern = null;
37                 linkUrl = null;
38         }
39
40         public NavigationItem(final NavigationItem parent, final String linkUrl,
41                         final String... titles) {
42                 navigation = parent.getNavigation();
43                 this.parent = parent;
44                 this.linkUrl = linkUrl;
45                 matchingPattern = linkUrl;
46
47                 initializeLocalizedTitles(titles);
48
49                 parent.addNavigationItem(this);
50         }
51
52         public void addNavigationItem(final NavigationItem navigationItem) {
53                 subElements.add(navigationItem);
54         }
55
56         protected String getCssPrefix() {
57                 if (cssPrefix != null)
58                         return cssPrefix;
59
60                 if (parent == null)
61                         return null;
62
63                 return parent.getCssPrefix();
64         }
65
66         public String getLinkUrl() {
67                 return linkUrl;
68         }
69
70         NavigationItem getMatchingNavigationItem(final String requestPath) {
71                 if (matchesUrl(requestPath))
72                         return this;
73
74                 for (final NavigationItem childNavigationItem : subElements) {
75                         final NavigationItem match = childNavigationItem
76                                         .getMatchingNavigationItem(requestPath);
77
78                         if (match != null)
79                                 return match;
80                 }
81                 return null;
82         }
83
84         public Navigation<NavigationItem> getNavigation() {
85                 return navigation;
86         }
87
88         public List<NavigationItem> getSubElements() {
89                 return subElements;
90         }
91
92         public String getTitle(final String locale) {
93                 return localeToTitle.get(locale);
94         }
95
96         private void initializeLocalizedTitles(final String... titles) {
97                 final List<String> locales = getNavigation().getLocaleConfiguration()
98                                 .getAllowedLocales();
99                 if (locales.size() != titles.length)
100                         throw new RuntimeException("There should be exactly "
101                                         + locales.size() + " title(s).");
102
103                 for (int i = 0; i < titles.length; i++)
104                         localeToTitle.put(locales.get(i), titles[i]);
105         }
106
107         public boolean matchesUrl(final String url) {
108                 return WildCardMatcher.match(url, matchingPattern);
109         }
110
111         public void setCssPrefix(final String cssPrefix) {
112                 this.cssPrefix = cssPrefix;
113         }
114
115         public NavigationItem setPattern(final String pattern) {
116                 matchingPattern = pattern;
117                 return this;
118         }
119
120         @Override
121         public String toString() {
122                 return "NavigationItem [matchingPattern=" + matchingPattern
123                                 + ", localeToTitle=" + localeToTitle + ", subElements count="
124                                 + subElements.size() + ", linkUrl=" + linkUrl + ", cssPrefix="
125                                 + cssPrefix + "]";
126         }
127
128 }