+ private final Map<String, String> localeToTitle = new HashMap<>();
+ private final ArrayList<NavigationItem> subElements = new ArrayList<>();
+ private final NavigationItem parent;
+ private final Navigation<? extends NavigationItem> navigation;
+ private final String linkUrl;
+ private String matchingPattern;
+ /**
+ * CSS prefix is inherited to child menu items.
+ */
+ private String cssPrefix;
+
+ /**
+ * Used to build root navigation item.
+ */
+ public NavigationItem(final Navigation<? extends NavigationItem> navigation) {
+ this.navigation = navigation;
+ parent = null;
+ matchingPattern = null;
+ linkUrl = null;
+ }
+
+ public NavigationItem(final NavigationItem parent, final String linkUrl, final String... titles) {
+
+ navigation = parent.getNavigation();
+ this.parent = parent;
+ this.linkUrl = linkUrl;
+ matchingPattern = linkUrl;
+
+ initializeLocalizedTitles(titles);
+
+ parent.addNavigationItem(this);
+ }
+
+ public void addNavigationItem(final NavigationItem navigationItem) {
+ subElements.add(navigationItem);
+ }
+
+ protected String getCssPrefix() {
+ if (cssPrefix != null)
+ return cssPrefix;
+
+ if (parent == null)
+ return null;
+
+ return parent.getCssPrefix();
+ }
+
+ public void setCssPrefix(final String cssPrefix) {
+ this.cssPrefix = cssPrefix;
+ }
+
+ public String getLinkUrl() {
+ return linkUrl;
+ }
+
+ NavigationItem getMatchingNavigationItem(final String requestPath) {
+ if (matchesUrl(requestPath))
+ return this;