slightly more type-safe and extending friendly navigation
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / network / navigation / Navigation.java
index 42720c9..6ef5e68 100755 (executable)
@@ -1,30 +1,65 @@
+/*
+ * Svjatoslav Commons - shared library of common functionality.
+ * Copyright ©2012-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 3 of the GNU Lesser General Public License
+ * or later as published by the Free Software Foundation.
+ */
+
 package eu.svjatoslav.commons.network.navigation;
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import eu.svjatoslav.commons.network.Locale;
+import eu.svjatoslav.commons.network.LocaleConfiguration;
 
-public class Navigation {
+public class Navigation<NI extends NavigationItem> {
 
-       private NavigationItem rootNavigationItem;
+       private NI rootNavigationItem;
 
-       private NavigationItem defaultNavigationItem;
+       private NI defaultNavigationItem;
 
-       public NavigationItem getDefaultNavigationItem() {
+       protected final LocaleConfiguration localeConfiguration;
+
+       public Navigation(final LocaleConfiguration localeConfiguration) {
+               this.localeConfiguration = localeConfiguration;
+       }
+
+       public NI getDefaultNavigationItem() {
                return defaultNavigationItem;
        }
 
-       public NavigationItem getRootNavigationItem() {
+       private String getGetNotNullString(final String string) {
+               if (string != null)
+                       return string;
+
+               return "";
+       }
+
+       public LocaleConfiguration getLocaleConfiguration() {
+               return localeConfiguration;
+       }
+
+       public NI getRootNavigationItem() {
                return rootNavigationItem;
        }
 
-       public NavigationItem getSelectedItem(final String requestUrl) {
+       public NI getSelectedItem(final HttpServletRequest request) {
+               final String requestUrl = request.getRequestURL().toString();
 
                try {
                        final String requestPath = new URL(requestUrl).getPath();
 
-                       for (final NavigationItem item : rootNavigationItem.subElements)
-                               if (item.matchesUrl(requestPath))
-                                       return item;
+                       final NI match = (NI) rootNavigationItem
+                                       .getMatchingNavigationItem(requestPath);
+
+                       if (match != null)
+                               return match;
                } catch (final MalformedURLException e) {
                        System.out.println("Cannot handle URL: " + requestUrl);
                        e.printStackTrace();
@@ -33,24 +68,32 @@ public class Navigation {
                return getDefaultNavigationItem();
        }
 
-       public String getTopMenu(final String requestUrl) {
+       public String getTopMenu(final HttpServletRequest request) {
+
+               final Locale currentLocale = localeConfiguration
+                               .detectCurrentLocale(request);
 
-               final NavigationItem selectedItem = getSelectedItem(requestUrl);
+               final NI selectedItem = getSelectedItem(request);
                final StringBuffer result = new StringBuffer();
 
-               result.append("<div class=\"navigationMenu\">");
+               result.append("<div class=\""
+                               + getGetNotNullString(rootNavigationItem.getCssPrefix())
+                               + "navigationMenu\">");
 
-               for (final NavigationItem item : getRootNavigationItem()
+               for (final NI item : (List<NI>) getRootNavigationItem()
                                .getSubElements()) {
 
                        if (item == selectedItem)
-                               result.append("<a class=\"menuItemSelected\" href=\""
-                                               + item.getLink() + "\">");
-                       else
-                               result.append("<a class=\"menuItem\" href=\"" + item.getLink()
+                               result.append("<a class=\""
+                                               + getGetNotNullString(item.getCssPrefix())
+                                               + "menuItemSelected\" href=\"" + item.getLinkUrl()
                                                + "\">");
+                       else
+                               result.append("<a class=\""
+                                               + getGetNotNullString(item.getCssPrefix())
+                                               + "menuItem\" href=\"" + item.getLinkUrl() + "\">");
 
-                       result.append("<div>" + item.getTitle() + "</div>");
+                       result.append("<div>" + item.getTitle(currentLocale) + "</div>");
                        result.append("</a>");
                }
 
@@ -59,13 +102,14 @@ public class Navigation {
                return result.toString();
        }
 
-       public void setDefaultNavigationItem(
-                       final NavigationItem defaultNavigationItem) {
+       public NI setDefaultNavigationItem(final NI defaultNavigationItem) {
                this.defaultNavigationItem = defaultNavigationItem;
+               return defaultNavigationItem;
        }
 
-       public void setRootNavigationItem(final NavigationItem rootNavigationItem) {
+       public NI setRootNavigationItem(final NI rootNavigationItem) {
                this.rootNavigationItem = rootNavigationItem;
+               return rootNavigationItem;
        }
 
 }