possibility to use CSS prefix for menu items
[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
15 import javax.servlet.http.HttpServletRequest;
16
17 public class Navigation {
18
19         private NavigationItem rootNavigationItem;
20
21         private NavigationItem defaultNavigationItem;
22
23         public NavigationItem getDefaultNavigationItem() {
24                 return defaultNavigationItem;
25         }
26
27         private String getGetNotNullString(final String string) {
28                 if (string != null)
29                         return string;
30
31                 return "";
32         }
33
34         public NavigationItem getRootNavigationItem() {
35                 return rootNavigationItem;
36         }
37
38         public NavigationItem getSelectedItem(final HttpServletRequest request) {
39                 final String requestUrl = request.getRequestURL().toString();
40
41                 try {
42                         final String requestPath = new URL(requestUrl).getPath();
43
44                         final NavigationItem match = rootNavigationItem
45                                         .getMatchingNavigationItem(requestPath);
46
47                         if (match != null)
48                                 return match;
49                 } catch (final MalformedURLException e) {
50                         System.out.println("Cannot handle URL: " + requestUrl);
51                         e.printStackTrace();
52                 }
53
54                 return getDefaultNavigationItem();
55         }
56
57         public String getTopMenu(final HttpServletRequest request) {
58
59                 final NavigationItem selectedItem = getSelectedItem(request);
60                 final StringBuffer result = new StringBuffer();
61
62                 result.append("<div class=\""
63                                 + getGetNotNullString(rootNavigationItem.getCssPrefix())
64                                 + "navigationMenu\">");
65
66                 for (final NavigationItem item : getRootNavigationItem()
67                                 .getSubElements()) {
68
69                         if (item == selectedItem)
70                                 result.append("<a class=\""
71                                                 + getGetNotNullString(item.getCssPrefix())
72                                                 + "menuItemSelected\" href=\"" + item.getLinkUrl()
73                                                 + "\">");
74                         else
75                                 result.append("<a class=\""
76                                                 + getGetNotNullString(item.getCssPrefix())
77                                                 + "menuItem\" href=\"" + item.getLinkUrl() + "\">");
78
79                         result.append("<div>" + item.getTitle() + "</div>");
80                         result.append("</a>");
81                 }
82
83                 result.append("</div>");
84
85                 return result.toString();
86         }
87
88         public NavigationItem setDefaultNavigationItem(
89                         final NavigationItem defaultNavigationItem) {
90                 this.defaultNavigationItem = defaultNavigationItem;
91                 return defaultNavigationItem;
92         }
93
94         public NavigationItem setRootNavigationItem(
95                         final NavigationItem rootNavigationItem) {
96                 this.rootNavigationItem = rootNavigationItem;
97                 return rootNavigationItem;
98         }
99
100 }