KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > mondrian > web > servlet > MDXQueryServlet


1 /*
2 // $Id: //open/mondrian/src/main/mondrian/web/servlet/MDXQueryServlet.java#24 $
3 // This software is subject to the terms of the Common Public License
4 // Agreement, available at the following URL:
5 // http://www.opensource.org/licenses/cpl.html.
6 // Copyright (C) 2002-2002 Kana Software, Inc.
7 // Copyright (C) 2002-2007 Julian Hyde and others
8 // All Rights Reserved.
9 // You must accept the terms of that agreement to use this software.
10 //
11 // Sean McCullough, 13 February, 2002, 10:25 PM
12 */

13
14 package mondrian.web.servlet;
15
16 import java.io.IOException JavaDoc;
17 import java.util.List JavaDoc;
18 import java.util.Enumeration JavaDoc;
19
20 import javax.servlet.ServletConfig JavaDoc;
21 import javax.servlet.ServletException JavaDoc;
22 import javax.servlet.http.HttpServlet JavaDoc;
23 import javax.servlet.http.HttpServletRequest JavaDoc;
24 import javax.servlet.http.HttpServletResponse JavaDoc;
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 /**
34  * <code>MDXQueryServlet</code> is a servlet which receives MDX queries,
35  * executes them, and formats the results in an HTML table.
36  *
37  * @author Sean McCullough
38  * @since 13 February, 2002
39  * @version $Id: //open/mondrian/src/main/mondrian/web/servlet/MDXQueryServlet.java#24 $
40  */

41 public class MDXQueryServlet extends HttpServlet JavaDoc {
42     private String JavaDoc connectString;
43     private CatalogLocator locator;
44
45     /** Initializes the servlet.
46      */

47     public void init(ServletConfig JavaDoc config) throws ServletException JavaDoc {
48         super.init(config);
49         connectString = config.getInitParameter("connectString");
50         Enumeration JavaDoc initParameterNames = config.getInitParameterNames();
51         while (initParameterNames.hasMoreElements()) {
52             String JavaDoc name = (String JavaDoc) initParameterNames.nextElement();
53             String JavaDoc value = config.getInitParameter(name);
54             MondrianProperties.instance().setProperty(name, value);
55         }
56         locator = new ServletContextCatalogLocator(config.getServletContext());
57     }
58
59     /** Destroys the servlet.
60      */

61     public void destroy() {
62
63     }
64
65     /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
66      * @param request servlet request
67      * @param response servlet response
68      */

69     protected void processRequest(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
70             throws ServletException JavaDoc, java.io.IOException JavaDoc {
71         String JavaDoc queryName = request.getParameter("query");
72         request.setAttribute("query", queryName);
73         if (queryName != null) {
74             processTransform(request,response);
75             return;
76         }
77         String JavaDoc queryString = request.getParameter("queryString");
78         request.setAttribute("queryString", queryString);
79         mondrian.olap.Connection mdxConnection = null;
80         StringBuffer JavaDoc html = new StringBuffer JavaDoc();
81
82         //execute the query
83
try {
84             mdxConnection = DriverManager.getConnection(connectString, locator, false);
85             Query q = mdxConnection.parseQuery(queryString);
86             Result result = mdxConnection.execute(q);
87             List JavaDoc<Position> slicers = result.getSlicerAxis().getPositions();
88             html.append("<table class='resulttable' cellspacing=1 border=0>");
89             html.append(Util.nl);
90
91             List JavaDoc<Position> columns = result.getAxes()[0].getPositions();
92             List JavaDoc<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 it has more than 1 dimension
105
if (j == 0 && result.getAxes().length > 1) {
106                     // Print the top-left cell, and fill it with slicer members.
107
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 /*
120                         for (int k = 0; k < position.size(); k++) {
121                             if (k > 0) {
122                                 html.append("<br/>");
123                             }
124                             Member member = position.getMember(k);
125                             html.append(member.getUniqueName());
126                         }
127 */

128                     }
129                     html.append("&nbsp;</td>").append(Util.nl);
130                 }
131
132                 // Print the column headings.
133
for (int i=0; i<columns.size(); i++) {
134                     Position position = columns.get(i);
135                     //Member member = columns[i].getMember(j);
136
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 is two axes, show
150
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 JavaDoc e) {
172             final String JavaDoc[] strings = Util.convertStackToString(e);
173             html.append("Error:<pre><blockquote>");
174             for (String JavaDoc 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 JavaDoc out, Cell cell) {
190         out.append("<td class='cell'>").append(cell.getFormattedValue()).append(
191             "</td>");
192     }
193     private void processTransform(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
194             throws ServletException JavaDoc, IOException JavaDoc {
195         String JavaDoc 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 JavaDoc operation = request.getParameter("operation");
201         if (operation.equals("expand")) {
202             String JavaDoc 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 JavaDoc(
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 JavaDoc 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     /** Handles the HTTP <code>GET</code> method.
223      * @param request servlet request
224      * @param response servlet response
225      */

226     protected void doGet(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
227             throws ServletException JavaDoc, java.io.IOException JavaDoc {
228         processRequest(request, response);
229     }
230
231     /** Handles the HTTP <code>POST</code> method.
232      * @param request servlet request
233      * @param response servlet response
234      */

235     protected void doPost(HttpServletRequest JavaDoc request, HttpServletResponse JavaDoc response)
236             throws ServletException JavaDoc, java.io.IOException JavaDoc {
237         processRequest(request, response);
238     }
239
240     /** Returns a short description of the servlet.
241      */

242     public String JavaDoc getServletInfo() {
243         return "Process an MDX query and return the result formatted as an HTML table";
244     }
245
246 }
247
Popular Tags