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