package liquibase.integration.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.logging.Level; import java.util.logging.LogRecord; /** * Servlet that can be registered via web.xml to view the log of the Liquibase run from the LiquibaseServletListener. */ public class LiquibaseStatusServlet extends HttpServlet { private static List<LogRecord> liquibaseRunLog = new ArrayList<LogRecord>(); public static synchronized void logMessage(LogRecord message) { liquibaseRunLog.add(message); } @Override protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException { httpServletResponse.setContentType("text/html"); String logLevelToDisplay = httpServletRequest.getParameter("logLevel"); Level currentLevel = Level.INFO; if (logLevelToDisplay != null) { currentLevel = Level.parse(logLevelToDisplay); } PrintWriter writer = httpServletResponse.getWriter(); writer.println("<html>"); writer.println("<head><title>Liquibase Status</title></head>"); writer.println("<body>"); if (liquibaseRunLog.size() == 0) { writer.println("<b>Liquibase did not run</b>"); } else { writer.println("<b>View level: " + getLevelLink(Level.SEVERE, currentLevel, httpServletRequest) + " " + getLevelLink(Level.WARNING, currentLevel, httpServletRequest) + " " + getLevelLink(Level.INFO, currentLevel, httpServletRequest) + " " + getLevelLink(Level.CONFIG, currentLevel, httpServletRequest) + " " + getLevelLink(Level.FINE, currentLevel, httpServletRequest) + " " + getLevelLink(Level.FINER, currentLevel, httpServletRequest) + " " + getLevelLink(Level.FINEST, currentLevel, httpServletRequest) + "</b>"); writer.println("<hr>"); writer.println("<b>Liquibase started at " + DateFormat.getDateTimeInstance().format(new Date(liquibaseRunLog.get(0).getMillis()))); writer.println("<hr>"); writer.println("<pre>"); for (LogRecord record : liquibaseRunLog) { if (record.getLevel().intValue() >= currentLevel.intValue()) { writer.println(record.getLevel() + ": " + record.getMessage()); if (record.getThrown() != null) { record.getThrown().printStackTrace(writer); } } } writer.println(""); writer.println(""); writer.println("</pre>"); writer.println("<hr>"); writer.println("<b>Liquibase finished at " + DateFormat.getDateTimeInstance().format(new Date(liquibaseRunLog.get(liquibaseRunLog.size() - 1).getMillis()))); } writer.println("</body>"); writer.println("</html>"); } private String getLevelLink(Level level, Level currentLevel, HttpServletRequest request) { if (currentLevel.equals(level)) { return level.getName(); } else { return "<a href=" + request.getRequestURI() + "?logLevel=" + level.getName() + ">" + level.getName() + "</a>"; } } }