package dk.thoerup.webconfig; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ConfigServlet extends HttpServlet { private static final long serialVersionUID = 1L; private Object configObject; public void setConfigObject(Object obj) { configObject = obj; } @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setDateHeader("Expires", 0); resp.setHeader("Pragma", "no-cache"); resp.setHeader("Cache-Control", "no-cache"); resp.setContentType("text/html"); StringBuilder sb = new StringBuilder(); sb.append("

WebConfig:

"); sb.append("\n"); Field fields[] = configObject.getClass().getDeclaredFields(); try { for(Field field : fields) { field.setAccessible(true); ConfigVariable anno = field.getAnnotation(ConfigVariable.class); if (anno == null) continue; sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); if (anno.readonly() == false) { sb.append(""); sb.append("\n"); } else { sb.append(""); sb.append(""); } sb.append("\n"); } sb.append("
Field nameTypeDescriptionValue 
").append( field.getName() ).append("").append( field.getType().getName() ).append("").append( anno.description() ).append(" 
").append( ""+ field.get(configObject) ).append("  
\n\n"); Method[] methods = configObject.getClass().getDeclaredMethods(); for(Method method : methods) { method.setAccessible(true); ReloadConfig anno = method.getAnnotation(ReloadConfig.class); if (anno == null) continue; sb.append("
"); sb.append(""); sb.append(""); sb.append("
\n"); } } catch (IllegalAccessException e) { throw new ServletException(e); } sb.append(""); resp.getWriter().print( sb.toString() ); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("varname"); String value = req.getParameter("varvalue"); String reloadmethod = req.getParameter("reloadmethod"); try { if (reloadmethod != null) { //reload Method method = configObject.getClass().getDeclaredMethod(reloadmethod, (Class[]) null); ReloadConfig anno = method.getAnnotation(ReloadConfig.class); if (anno == null) { resp.sendError(500, "Method is not annotated"); return; } method.setAccessible(true); method.invoke(configObject, (Object[])null); } else { //set var value = value.trim(); Field field = configObject.getClass().getDeclaredField(name); field.setAccessible(true); ConfigVariable anno = field.getAnnotation(ConfigVariable.class); if (anno == null) { resp.sendError(500, "Field is not annotated"); return; } if (anno.readonly() == true) { resp.sendError(500, "Can't write a read-only field"); return; } if (field.getType().getName().equals("int") ) { field.setInt(configObject, Integer.parseInt(value) ); } else if (field.getType().getName().equals("boolean") ) { value = value.toLowerCase(); if (! (value.equals("true") || value.equals("false"))) { resp.sendError(500, "Only 'true' or 'false' as values for boolean field"); return; } field.setBoolean(configObject, Boolean.parseBoolean(value) ); } else if (field.getType().getName().equals("long") ) { field.setLong(configObject, Long.parseLong(value) ); } else if (field.getType().getName().equals("short") ) { field.setShort(configObject, Short.parseShort(value) ); } else if (field.getType().getName().equals("double") ) { field.setDouble(configObject, Double.parseDouble(value) ); } else if (field.getType().getName().equals("float") ) { field.setFloat(configObject, Float.parseFloat(value) ); } else if (field.getType().getName().equals("char") ) { field.setFloat(configObject, value.charAt(0) ); } else { field.set(configObject, value ); } } //end of set var } catch (NoSuchFieldException e) { resp.sendError(500, "No such field: " + name); } catch (IllegalAccessException e) { //this can't happen throw new ServletException(e); } catch (NoSuchMethodException e) { resp.sendError(500, "No such method: " + reloadmethod); } catch (InvocationTargetException e) { resp.sendError(500, "Could not invoke method: " + reloadmethod); } resp.sendRedirect( req.getRequestURI() ); } }