/[projects]/WebConfig/src/dk/thoerup/webconfig/ConfigServlet.java
ViewVC logotype

Contents of /WebConfig/src/dk/thoerup/webconfig/ConfigServlet.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2345 - (show annotations) (download)
Mon Feb 23 14:01:03 2015 UTC (9 years, 3 months ago) by torben
File size: 6773 byte(s)
Add support for hidden values
1 package dk.thoerup.webconfig;
2
3 import java.io.IOException;
4 import java.lang.reflect.Field;
5 import java.lang.reflect.InvocationTargetException;
6 import java.lang.reflect.Method;
7
8 import javax.servlet.ServletException;
9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 public class ConfigServlet extends HttpServlet {
14 private static final long serialVersionUID = 1L;
15
16 private Object configObject;
17
18 public void setConfigObject(Object obj) {
19 configObject = obj;
20 }
21
22
23 @Override
24 public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
25
26
27 resp.setDateHeader("Expires", 0);
28 resp.setHeader("Pragma", "no-cache");
29 resp.setHeader("Cache-Control", "no-cache");
30 resp.setContentType("text/html");
31
32 StringBuilder sb = new StringBuilder();
33
34 sb.append("<html><body><h3>WebConfig:</h3><table border='1' cellspacing='0'>");
35 sb.append("<tr><th>Field name</th><th>Type</th><th>Description</th><th>Value</th><th>&nbsp;</th></tr>\n");
36
37
38 Field fields[] = configObject.getClass().getDeclaredFields();
39
40 try {
41 for(Field field : fields) {
42 field.setAccessible(true);
43
44 ConfigVariable anno = field.getAnnotation(ConfigVariable.class);
45 if (anno == null)
46 continue;
47
48 sb.append("<tr>");
49 sb.append("<td>").append( field.getName() ).append("</td>");
50 sb.append("<td>").append( getCleanTypename(field.getType()) ).append("</td>");
51 sb.append("<td>").append( anno.description() ).append("&nbsp;</td>");
52
53 sb.append("<form action='").append( req.getRequestURI() ).append("' method='post'>");
54 sb.append("<input type='hidden' name='varname' value='").append( field.getName() ).append("' />");
55
56
57
58 if (anno.hideValue() == false ) {
59 if (anno.readonly() == false) {
60 if (field.getType().getName().equals("boolean") ) {
61
62 String options = getBooleanSelectOptions(field,configObject);
63 sb.append("<td><select name='varvalue'>").append(options).append("</select></td>");
64
65 } else if (field.getType().isEnum()) {
66
67 String options = getEnumSelectOptions(field,configObject);
68 sb.append("<td><select name='varvalue'>").append(options).append("</select></td>");
69
70 } else {
71 sb.append("<td><input type='text' name='varvalue' value='").append( "" + field.get(configObject) ).append("' /></td>");
72
73 }
74 sb.append("<td><input type='submit' name='Set' value='Set'></td>\n");
75 } else {
76 sb.append("<td>").append( ""+ field.get(configObject) ).append("&nbsp;</td>");
77 sb.append("<td>&nbsp;</td>");
78 }
79 } else {
80 sb.append("<td><i>Value Hidden</i>&nbsp;</td>");
81 sb.append("<td>&nbsp;</td>");
82 }
83
84 sb.append("</form></tr>\n");
85 }
86
87 sb.append("</table>\n\n");
88
89 Method[] methods = configObject.getClass().getDeclaredMethods();
90 for(Method method : methods) {
91 method.setAccessible(true);
92
93 ReloadConfigMethod anno = method.getAnnotation(ReloadConfigMethod.class);
94 if (anno == null)
95 continue;
96
97 sb.append("<form method='post' action='").append( req.getRequestURI() ).append("'>");
98 sb.append("<input type='hidden' name='reloadmethod' value='").append(method.getName()).append("'>");
99 sb.append("<input type='submit' name='Reload Config' value='Reload Config'>");
100 sb.append("</form>\n");
101
102 }
103
104
105 } catch (IllegalAccessException e) {
106 throw new ServletException(e);
107 }
108
109 sb.append("</body></html>");
110
111 resp.getWriter().print( sb.toString() );
112 }
113
114 String getBooleanSelectOptions(Field field, Object configObject) throws IllegalAccessException {
115 String trueSelected = field.get(configObject).toString().equals("true") ? " selected " : "";
116 String falseSelected = field.get(configObject).toString().equals("false") ? " selected " : "";
117 return String.format("<option %s>true</option><option %s>false</option>", trueSelected, falseSelected);
118 }
119
120 String getEnumSelectOptions(Field field, Object configObject) throws IllegalAccessException {
121 Class<?> cls = field.getType();
122 StringBuilder sb = new StringBuilder();
123 Object constants[] = cls.getEnumConstants();
124
125 String value = field.get(configObject).toString();
126
127 for (int i = 0; i < constants.length; i++) {
128 String current = constants[i].toString();
129 String selected = current.equals(value) ? " selected " : "";
130 sb.append( String.format("<option %s>%s</option>", selected, current) );
131 }
132
133
134 return sb.toString();
135 }
136
137 String getCleanTypename(Class<?> cls) {
138
139 if (cls.isEnum()) {
140 String parts[] = cls.getName().split("\\.");
141 if (parts.length > 0)
142 return "Enum: " + parts[parts.length-1];
143 else
144 return "Enum: " + cls.getName();
145 } else {
146 return cls.getName();
147 }
148
149 }
150
151 @Override
152 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
153 String name = req.getParameter("varname");
154 String value = req.getParameter("varvalue");
155
156 String reloadmethod = req.getParameter("reloadmethod");
157
158 try {
159 if (reloadmethod != null) { //reload
160
161 Method method = configObject.getClass().getDeclaredMethod(reloadmethod, (Class<?>[]) null);
162 ReloadConfigMethod anno = method.getAnnotation(ReloadConfigMethod.class);
163 if (anno == null) {
164 resp.sendError(500, "Method is not annotated");
165 return;
166 }
167
168
169 method.setAccessible(true);
170 method.invoke(configObject, (Object[])null);
171
172 } else { //set var
173 value = value.trim();
174 Field field = configObject.getClass().getDeclaredField(name);
175 field.setAccessible(true);
176 ConfigVariable anno = field.getAnnotation(ConfigVariable.class);
177
178 if (anno == null) {
179 resp.sendError(500, "Field is not annotated");
180 return;
181 }
182
183 if (anno.readonly() == true) {
184 resp.sendError(500, "Can't write a read-only field");
185 return;
186 }
187
188 ConfigLoader.setFieldValue(field,configObject,value);
189
190
191 } //end of set var
192
193
194 } catch (NoSuchFieldException e) {
195 resp.sendError(500, "No such field: " + name);
196 } catch (IllegalAccessException e) { //this can't happen
197 throw new ServletException(e);
198 } catch (NoSuchMethodException e) {
199 resp.sendError(500, "No such method: " + reloadmethod);
200 } catch (InvocationTargetException e) {
201 resp.sendError(500, "Could not invoke method: " + reloadmethod);
202 }
203
204 resp.sendRedirect( req.getRequestURI() );
205 }
206
207 }

  ViewVC Help
Powered by ViewVC 1.1.20