1 13 14 package mondrian.web.servlet; 15 16 import java.io.IOException ; 17 import java.util.List ; 18 import java.util.Enumeration ; 19 20 import javax.servlet.ServletConfig ; 21 import javax.servlet.ServletException ; 22 import javax.servlet.http.HttpServlet ; 23 import javax.servlet.http.HttpServletRequest ; 24 import javax.servlet.http.HttpServletResponse ; 25 26 import mondrian.olap.*; 27 import mondrian.spi.CatalogLocator; 28 import mondrian.spi.impl.ServletContextCatalogLocator; 29 import mondrian.web.taglib.ResultCache; 30 31 import org.eigenbase.xom.StringEscaper; 32 33 41 public class MDXQueryServlet extends HttpServlet { 42 private String connectString; 43 private CatalogLocator locator; 44 45 47 public void init(ServletConfig config) throws ServletException { 48 super.init(config); 49 connectString = config.getInitParameter("connectString"); 50 Enumeration initParameterNames = config.getInitParameterNames(); 51 while (initParameterNames.hasMoreElements()) { 52 String name = (String ) initParameterNames.nextElement(); 53 String value = config.getInitParameter(name); 54 MondrianProperties.instance().setProperty(name, value); 55 } 56 locator = new ServletContextCatalogLocator(config.getServletContext()); 57 } 58 59 61 public void destroy() { 62 63 } 64 65 69 protected void processRequest(HttpServletRequest request, HttpServletResponse response) 70 throws ServletException , java.io.IOException { 71 String queryName = request.getParameter("query"); 72 request.setAttribute("query", queryName); 73 if (queryName != null) { 74 processTransform(request,response); 75 return; 76 } 77 String queryString = request.getParameter("queryString"); 78 request.setAttribute("queryString", queryString); 79 mondrian.olap.Connection mdxConnection = null; 80 StringBuffer html = new StringBuffer (); 81 82 try { 84 mdxConnection = DriverManager.getConnection(connectString, locator, false); 85 Query q = mdxConnection.parseQuery(queryString); 86 Result result = mdxConnection.execute(q); 87 List <Position> slicers = result.getSlicerAxis().getPositions(); 88 html.append("<table class='resulttable' cellspacing=1 border=0>"); 89 html.append(Util.nl); 90 91 List <Position> columns = result.getAxes()[0].getPositions(); 92 List <Position> rows = null; 93 if( result.getAxes().length == 2 ) 94 rows = result.getAxes()[1].getPositions(); 95 96 int columnWidth = columns.get(0).size(); 97 int rowWidth = 0; 98 if( result.getAxes().length == 2 ) 99 rowWidth = result.getAxes()[1].getPositions().get(0).size(); 100 101 for (int j=0; j<columnWidth; j++) { 102 html.append("<tr>"); 103 104 if (j == 0 && result.getAxes().length > 1) { 106 html.append("<td nowrap class='slicer' rowspan='").append( 108 columnWidth).append("' colspan='").append(rowWidth) 109 .append("'>"); 110 for (Position position : slicers) { 111 int k = 0; 112 for (Member member : position) { 113 if (k > 0) { 114 html.append("<br/>"); 115 } 116 html.append(member.getUniqueName()); 117 k++; 118 } 119 128 } 129 html.append(" </td>").append(Util.nl); 130 } 131 132 for (int i=0; i<columns.size(); i++) { 134 Position position = columns.get(i); 135 Member member = position.get(j); 137 int width = 1; 138 while ((i + 1) < columns.size() && 139 columns.get(i + 1).get(j) == member) { 140 i++; 141 width++; 142 } 143 html.append("<td nowrap class='columnheading' colspan='") 144 .append(width).append("'>") 145 .append(member.getUniqueName()).append("</td>"); 146 } 147 html.append("</tr>").append(Util.nl); 148 } 149 if (result.getAxes().length > 1) { 151 for (int i=0; i<rows.size(); i++) { 152 html.append("<tr>"); 153 final Position row = rows.get(i); 154 for (Member member : row) { 155 html.append("<td nowrap class='rowheading'>").append( 156 member.getUniqueName()).append("</td>"); 157 } 158 for (int j=0; j<columns.size(); j++) { 159 showCell(html,result.getCell(new int[]{j,i})); 160 } 161 html.append("</tr>"); 162 } 163 } else { 164 html.append("<tr>"); 165 for (int i=0; i<columns.size(); i++) { 166 showCell(html,result.getCell(new int[]{i})); 167 } 168 html.append("</tr>"); 169 } 170 html.append("</table>"); 171 } catch (Throwable e) { 172 final String [] strings = Util.convertStackToString(e); 173 html.append("Error:<pre><blockquote>"); 174 for (String string : strings) { 175 StringEscaper.htmlEscaper.appendEscapedString(string, html); 176 } 177 html.append("</blockquote></pre>"); 178 } finally { 179 if (mdxConnection != null) { 180 mdxConnection.close(); 181 } 182 } 183 184 request.setAttribute("result", html.toString()); 185 response.setHeader("Content-Type", "text/html"); 186 getServletContext().getRequestDispatcher("/adhoc.jsp").include(request, response); 187 } 188 189 private void showCell( StringBuffer out, Cell cell) { 190 out.append("<td class='cell'>").append(cell.getFormattedValue()).append( 191 "</td>"); 192 } 193 private void processTransform(HttpServletRequest request, HttpServletResponse response) 194 throws ServletException , IOException { 195 String queryName = request.getParameter("query"); 196 ResultCache rc = ResultCache.getInstance(request.getSession(), getServletContext(), queryName); 197 Query query = rc.getQuery(); 198 query = query.safeClone(); 199 rc.setDirty(); 200 String operation = request.getParameter("operation"); 201 if (operation.equals("expand")) { 202 String memberName = request.getParameter("member"); 203 boolean fail = true; 204 Member member = query.getSchemaReader(true).getMemberByUniqueName( 205 Util.explode(memberName), fail); 206 if (true) { 207 throw new UnsupportedOperationException ( 208 "query.toggleDrillState(member) has been de-supported"); 209 } 210 } else { 211 throw Util.newInternal("unkown operation '" + operation + "'"); 212 } 213 rc.setQuery(query); 214 String redirect = request.getParameter("redirect"); 215 if (redirect == null) { 216 redirect = "/adhoc.jsp"; 217 } 218 response.setHeader("Content-Type", "text/html"); 219 getServletContext().getRequestDispatcher(redirect).include(request, response); 220 } 221 222 226 protected void doGet(HttpServletRequest request, HttpServletResponse response) 227 throws ServletException , java.io.IOException { 228 processRequest(request, response); 229 } 230 231 235 protected void doPost(HttpServletRequest request, HttpServletResponse response) 236 throws ServletException , java.io.IOException { 237 processRequest(request, response); 238 } 239 240 242 public String getServletInfo() { 243 return "Process an MDX query and return the result formatted as an HTML table"; 244 } 245 246 } 247 | Popular Tags |