package com.tddinaction.ejb3.util; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import javax.naming.InitialContext; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.sql.DataSource; public class SqlEditor extends HttpServlet { private DataSource datasource; @Override public void init(ServletConfig config) throws ServletException { lookupDataSource(); } private void lookupDataSource() { try { if (datasource == null) { InitialContext ctx = new InitialContext(); datasource = (DataSource) ctx .lookup("java:/DefaultDS"); } } catch (Exception e) { throw new RuntimeException(e); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("results", new ArrayList()); render(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sql = request.getParameter("sql"); request.getSession(true).setAttribute("previousSQL", sql); request.setAttribute("results", executeQuery(sql)); render(request, response); } private List executeQuery(String sql) { List results = new ArrayList(); Connection c = null; try { c = datasource.getConnection(); Statement s = c.createStatement(); boolean success = s.execute(sql); if (success) { ResultSet rs = s.getResultSet(); results = toListOfLists(rs); } } catch (Exception e) { throw new RuntimeException(e); } finally { close(c); } return results; } private void close(Connection c) { try { if (c != null) { c.close(); } } catch (Exception ignored) { } } private List toListOfLists(ResultSet rs) throws Exception { ResultSetMetaData metaData = rs.getMetaData(); List<List<String>> results = new ArrayList<List<String>>(); List<String> headers = new ArrayList<String>(); for (int i = 1; i <= metaData.getColumnCount(); i++) { headers.add(metaData.getColumnLabel(i)); } results.add(headers); while (rs.next()) { List<String> row = new ArrayList<String>(); for (int i = 1; i <= metaData.getColumnCount(); i++) { row.add(rs.getString(i)); } results.add(row); } return results; } private void render(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (request.getSession(true).getAttribute("previousSQL") == null) { request.getSession(true).setAttribute("previousSQL", ""); } request.getRequestDispatcher("/sql.jsp").forward(request, response); } }