001: package org.openi.chart;
002:
003: import org.apache.log4j.Logger;
004:
005: import org.jfree.data.category.DefaultCategoryDataset;
006: import org.openi.analysis.Analysis;
007: import org.openi.analysis.Datasource;
008: import org.openi.project.ProjectContext;
009: import org.openi.xmla.DatasetAdapter;
010: import org.openi.xmla.XmlaConnector;
011: import org.xml.sax.SAXException;
012:
013: import com.tonbeller.jpivot.olap.model.OlapException;
014: import com.tonbeller.jpivot.olap.model.OlapModel;
015:
016: import java.io.FileNotFoundException;
017: import java.io.IOException;
018:
019: import javax.servlet.ServletException;
020: import javax.servlet.http.HttpServlet;
021: import javax.servlet.http.HttpServletRequest;
022: import javax.servlet.http.HttpServletResponse;
023:
024: /**
025: * should this be a spring controller?
026: *
027: */
028: public class StreamChartServlet extends HttpServlet {
029: private static Logger logger = Logger
030: .getLogger(StreamChartServlet.class);
031:
032: public StreamChartServlet() {
033: super ();
034: }
035:
036: private int parseInt(String value, int defaultValue) {
037: int retVal = defaultValue;
038:
039: try {
040: retVal = Integer.parseInt(value);
041: if (retVal == 0)
042: retVal = defaultValue;//if zero, also use default
043: } catch (Exception e) {
044: logger.debug(e);
045: }
046:
047: return retVal;
048: }
049:
050: /**
051: * requires:
052: * config parameter in request
053: * valid projectContext in session
054: */
055: public void service(HttpServletRequest request,
056: HttpServletResponse response) throws ServletException {
057: long start = System.currentTimeMillis();
058: ProjectContext projectContext = (ProjectContext) request
059: .getSession().getAttribute("projectContext");
060:
061: // logger.debug("streaming chart for analysis: " + analysisName);
062: logger.debug("projectContext: "
063: + projectContext.getProject().getProjectName());
064:
065: String config = request.getParameter("config");
066: String mdx = request.getParameter("mdx");
067:
068: Analysis analysis = null;
069: if (config != null && config.length() > 0) {
070: logger
071: .debug("found a config param, restoring analysis from file: "
072: + config);
073: analysis = restoreAnalysis(projectContext, config);
074: } else if (mdx != null && mdx.length() > 0) {
075: logger
076: .debug("found a mdx param, generating analysis on the fly using mdx: "
077: + mdx);
078: String targetDatasource = request
079: .getParameter("targetDatasource");
080: String analysisName = request.getParameter("analysisName");
081: analysis = new Analysis();
082: analysis.setAnalysisTitle(analysisName);
083: analysis.setDataSourceName(targetDatasource);
084: analysis.setMdxQuery(mdx);
085: }
086:
087: if (analysis == null) {
088: try {
089: response.sendRedirect("images/spacer.gif");
090: } catch (IOException e) {
091: logger.error(e);
092: } finally {
093: return;
094: }
095: }
096: String datasourceName = analysis.getDataSourceName();
097: logger.debug("using datasource name: " + datasourceName);
098:
099: Datasource datasource = projectContext
100: .getDatasource(datasourceName);
101: // logger.debug("using datasource: " + datasource.getServer());
102:
103: // DefaultCategoryDataset dataset = getDataset(datasource.getServer(), datasource.getCatalog(), analysis);
104:
105: OlapModel olapModel = getDataset(datasource.getServer(),
106: datasource.getCatalog(), analysis);
107:
108: try {
109: int x = this .parseInt(request.getParameter("width"), 320);
110: int y = this .parseInt(request.getParameter("height"), 240);
111: EnhancedChartFactory.createChart(
112: response.getOutputStream(), analysis, olapModel, x,
113: y, request.getLocale());
114: } catch (FileNotFoundException e) {
115: throw new ServletException(e);
116: } catch (IOException e) {
117: throw new ServletException(e);
118: } catch (OlapException e) {
119: throw new ServletException(e);
120: } finally {
121: long elapsed = System.currentTimeMillis() - start;
122: logger.info("request completed in " + elapsed + "ms");
123: }
124: }
125:
126: /**
127: * trap all exception?
128: * @param projectContext
129: * @param analysisName
130: * @return
131: * @throws ServletException
132: */
133: private Analysis restoreAnalysis(ProjectContext projectContext,
134: String analysisName) throws ServletException {
135:
136: Analysis analysis = null;
137:
138: try {
139: analysis = projectContext.restoreAnalysis(analysisName);
140: } catch (IOException e) {
141: // throw new ServletException(e);
142: }
143: return analysis;
144: }
145:
146: /**
147: * might want to trap all exceptions?
148: * @param xmlaUri
149: * @param catalog
150: * @param analysis
151: * @return
152: * @throws ServletException
153: */
154: private OlapModel getDataset(String xmlaUri, String catalog,
155: Analysis analysis) throws ServletException {
156:
157: XmlaConnector connector = new XmlaConnector();
158: String mdxQuery = analysis.getMdxQuery();
159:
160: OlapModel model = null;
161: ;
162: try {
163: Datasource datasource = new Datasource(xmlaUri, catalog);
164: model = connector.query(datasource, mdxQuery);
165: } catch (IOException e) {
166: throw new ServletException(e);
167: } catch (OlapException e) {
168: throw new ServletException(e);
169: } catch (SAXException e) {
170: throw new ServletException(e);
171: }
172: return model;
173:
174: }
175:
176: }
|