package org.stagemonitor.web.configuration; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.stagemonitor.core.Stagemonitor; import org.stagemonitor.configuration.ConfigurationRegistry; public class ConfigurationServlet extends HttpServlet { public static final String CONFIGURATION_ENDPOINT = "/stagemonitor/configuration"; private static final Logger logger = LoggerFactory.getLogger(ConfigurationServlet.class); private final ConfigurationRegistry configuration; public ConfigurationServlet() { this(Stagemonitor.getConfiguration()); } public ConfigurationServlet(ConfigurationRegistry configuration) { this.configuration = configuration; logger.info("Registering configuration Endpoint {}. You can dynamically change the configuration by " + "issuing a POST request to {}?key=stagemonitor.config.key&value=configValue&stagemonitor.password=password. " + "If the password is not set, dynamically changing the configuration is not available. " + "The password can be omitted if set to an empty string.", ConfigurationServlet.CONFIGURATION_ENDPOINT, ConfigurationServlet.CONFIGURATION_ENDPOINT); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { reloadConfigIfRequested(req); resp.setStatus(HttpServletResponse.SC_NO_CONTENT); } private boolean reloadConfigIfRequested(HttpServletRequest req) { if (req.getParameter("reload") != null) { configuration.reloadDynamicConfigurationOptions(); return true; } return false; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { if (reloadConfigIfRequested(req)) { resp.setStatus(HttpServletResponse.SC_NO_CONTENT); return; } final String key = req.getParameter("key"); if (key == null) { sendError(resp, HttpServletResponse.SC_BAD_REQUEST, "Missing parameter 'key'"); return; } final String configurationSource = req.getParameter("configurationSource"); if (configurationSource == null) { sendError(resp, HttpServletResponse.SC_BAD_REQUEST, "Missing parameter 'configurationSource'"); return; } tryToSaveAndHandleErrors(configuration, req, resp, key, req.getParameter("value")); } public static void tryToSaveAndHandleErrors(ConfigurationRegistry configuration, HttpServletRequest req, HttpServletResponse resp, String key, String value) throws IOException { String password = req.getHeader("X-Stagemonitor-Show-Widget"); if (password == null) { password = req.getParameter(Stagemonitor.STAGEMONITOR_PASSWORD); } try { configuration.save(key, value, req.getParameter("configurationSource"), password); resp.setStatus(HttpServletResponse.SC_NO_CONTENT); } catch (IllegalArgumentException e) { sendError(resp, HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); } catch (IllegalStateException e) { sendError(resp, HttpServletResponse.SC_UNAUTHORIZED, e.getMessage()); } catch (UnsupportedOperationException e) { sendError(resp, HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); } catch (Exception e) { logger.error(e.getMessage(), e); sendError(resp, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Internal Error. Check your server logs."); } } private static void sendError(HttpServletResponse response, int status, String message) throws IOException { response.setStatus(status); response.getWriter().print(message); } }