e6ed8ef2cea330b6a85e9f62b18c373eca022641
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / network / navigation / Navigation.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality.
3  * Copyright ©2012-2017, 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 eu.svjatoslav.commons.network.LocaleConfiguration;
13
14 import javax.servlet.http.HttpServletRequest;
15 import java.net.MalformedURLException;
16 import java.net.URL;
17 import java.util.List;
18
19 public class Navigation<NI extends NavigationItem> {
20
21     protected final LocaleConfiguration localeConfiguration;
22     private NI rootNavigationItem;
23     private NI defaultNavigationItem;
24
25     public Navigation(final LocaleConfiguration localeConfiguration) {
26         this.localeConfiguration = localeConfiguration;
27     }
28
29     public NI getDefaultNavigationItem() {
30         return defaultNavigationItem;
31     }
32
33     private String getGetNotNullString(final String string) {
34         if (string != null)
35             return string;
36
37         return "";
38     }
39
40     public LocaleConfiguration getLocaleConfiguration() {
41         return localeConfiguration;
42     }
43
44     public NI getRootNavigationItem() {
45         return rootNavigationItem;
46     }
47
48     public NI getSelectedItem(final HttpServletRequest request) {
49         final String requestUrl = request.getRequestURL().toString();
50
51         try {
52             final String requestPath = new URL(requestUrl).getPath();
53
54             @SuppressWarnings("unchecked") final NI match = (NI) rootNavigationItem.getMatchingNavigationItem(requestPath);
55
56             if (match != null)
57                 return match;
58         } catch (final MalformedURLException e) {
59             System.out.println("Cannot handle URL: " + requestUrl);
60             e.printStackTrace();
61         }
62
63         return getDefaultNavigationItem();
64     }
65
66     @SuppressWarnings("unchecked")
67     public String getTopMenu(final HttpServletRequest request) {
68
69         final String currentLocale = localeConfiguration.detectCurrentLocale(request);
70
71         final NI selectedItem = getSelectedItem(request);
72         final StringBuilder result = new StringBuilder();
73
74         result.append("<div class=\"" + getGetNotNullString(rootNavigationItem.getCssPrefix()) + "navigationMenu\">");
75
76         for (final NI item : (List<NI>) getRootNavigationItem().getSubElements()) {
77
78             if (item == selectedItem)
79                 result.append("<a class=\"" + getGetNotNullString(item.getCssPrefix()) + "menuItemSelected\" href=\""
80                         + item.getLinkUrl() + "\">");
81             else
82                 result.append("<a class=\"" + getGetNotNullString(item.getCssPrefix()) + "menuItem\" href=\""
83                         + item.getLinkUrl() + "\">");
84
85             result.append("<div>" + item.getTitle(currentLocale) + "</div>");
86             result.append("</a>");
87         }
88
89         result.append("</div>");
90
91         return result.toString();
92     }
93
94     public NI setDefaultNavigationItem(final NI defaultNavigationItem) {
95         this.defaultNavigationItem = defaultNavigationItem;
96         return defaultNavigationItem;
97     }
98
99     public NI setRootNavigationItem(final NI rootNavigationItem) {
100         this.rootNavigationItem = rootNavigationItem;
101         return rootNavigationItem;
102     }
103
104 }