KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openi > web > controller > admin > NewAnalysisFormControler


1 /*********************************************************************************
2  * The contents of this file are subject to the OpenI Public License Version 1.0
3  * ("License"); You may not use this file except in compliance with the
4  * License. You may obtain a copy of the License at
5  * http://www.openi.org/docs/LICENSE.txt
6  *
7  * Software distributed under the License is distributed on an "AS IS" basis,
8  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
9  * the specific language governing rights and limitations under the License.
10  *
11  * The Original Code is: OpenI Open Source
12  *
13  * The Initial Developer of the Original Code is Loyalty Matrix, Inc.
14  * Portions created by Loyalty Matrix, Inc. are
15  * Copyright (C) 2005 Loyalty Matrix, Inc.; All Rights Reserved.
16  *
17  * Contributor(s): ______________________________________.
18  *
19  ********************************************************************************/

20 package org.openi.web.controller.admin;
21
22 import com.tonbeller.jpivot.olap.model.*;
23 import com.tonbeller.jpivot.xmla.*;
24 import com.tonbeller.wcf.component.Renderable;
25 import com.tonbeller.wcf.controller.RequestContext;
26 import org.apache.log4j.Logger;
27 import org.openi.analysis.Analysis;
28 import org.openi.analysis.Datasource;
29 import org.openi.application.Application;
30 import org.openi.project.ProjectContext;
31 import org.openi.xmla.XmlaConnector;
32 import org.springframework.validation.BindException;
33 import org.springframework.web.servlet.ModelAndView;
34 import org.springframework.web.servlet.mvc.*;
35 import java.net.URLEncoder JavaDoc;
36 import java.util.*;
37 import javax.servlet.http.HttpServletRequest JavaDoc;
38 import javax.servlet.http.HttpServletResponse JavaDoc;
39
40
41 /**
42  * @author Dipendra Pokhrel<br>
43  * @version $Revision: 1.25.2.2 $ $Date: 2006/05/05 10:32:31 $ <br>
44  *
45  * Controller for handling <strong> new analysis </strong> request.
46  *
47  */

48 class NewAnalysisFormControler extends SimpleFormController {
49     private static Logger logger = Logger.getLogger(NewAnalysisFormControler.class);
50
51     /**
52      * Retrieve a backing object for the current form from the given request
53      * @param request HttpServletRequest
54      * @return Object as application config object
55      * @throws Exception
56      */

57     protected Object JavaDoc formBackingObject(HttpServletRequest JavaDoc request)
58         throws Exception JavaDoc {
59         String JavaDoc dsparam = null;
60         String JavaDoc cubeparam = null;
61         String JavaDoc mdxQuery = null;
62         dsparam = request.getParameter("dataSource");
63         cubeparam = request.getParameter("cube");
64
65         Map map = new HashMap();
66
67         //datasource change reuqest
68
if ("1".equalsIgnoreCase(request.getParameter("changeds"))) {
69             Analysis analysis = getAnalysisFromSession(request, "analysis01");
70
71             if (analysis != null) {
72                 dsparam = analysis.getDataSourceName();
73                 mdxQuery = getMdxQueryFromSession(request, "query01");
74                 cubeparam = getCubeNameFromMdx(mdxQuery);
75                 map.put("changeDatasource", "true");
76             }
77         }
78
79         if ("true".equalsIgnoreCase(request.getParameter("changeDatasource"))) {
80             map.put("changeDatasource", "true");
81         }
82
83         map.put("dataSource", dsparam);
84
85         String JavaDoc lastds = request.getParameter("lastDatasource");
86
87         if ((lastds != null) && (!lastds.equalsIgnoreCase(dsparam))) {
88             cubeparam = null;
89         }
90
91         map.put("cube", cubeparam);
92
93         ProjectContext context = (ProjectContext) request.getSession()
94                                                          .getAttribute("projectContext");
95
96         List datasource = new ArrayList();
97
98         Iterator iterator = context.getProject().getDataSourceMap().keySet()
99                                    .iterator();
100
101         while (iterator.hasNext()) {
102             String JavaDoc key = (String JavaDoc) iterator.next();
103
104             if (context.getProject().getDataSourceMap().get(key) instanceof Datasource) {
105                 datasource.add(key);
106             }
107         }
108
109         map.put("datasourceList", datasource);
110
111         if (dsparam != null) {
112             Datasource ds = context.getDatasource(dsparam);
113
114             if (ds != null) {
115                 map.put("catalog", ds.getCatalog());
116                 map.put("cubeList",
117                     new XmlaConnector().getCubeList(ds.getServer(), ds.getCatalog(),
118                         getUser(request), getPassword(request)));
119             }
120
121             if ((cubeparam != null) && (cubeparam != "")) {
122                 String JavaDoc cube = cubeparam;
123
124                 if (!cube.equalsIgnoreCase(request.getParameter("lastCube"))) {
125                     org.openi.xmla.XMLAQueryTag qtag = new org.openi.xmla.XMLAQueryTag();
126
127                     qtag.setCatalog(ds.getCatalog());
128
129                     qtag.setUri(ds.getServer());
130                     qtag.setId("query_new");
131
132                     XMLA_SOAP xmla;
133
134                     if (Application.getInstance().isBasicAuthentication()) {
135                         qtag.setUser(getUser(request));
136                         qtag.setPassword(getPassword(request));
137                         xmla = new XMLA_SOAP(ds.getServer(), getUser(request),
138                                 getPassword(request));
139                     } else {
140                         qtag.setUser("");
141                         qtag.setPassword("");
142                         xmla = new XMLA_SOAP(ds.getServer(), "", "");
143                     }
144
145                     if (mdxQuery == null) {
146                         // interate through the dimensions and create mdx
147
List dims = xmla.discoverDim(ds.getCatalog(), cube);
148                         Iterator dimensions = dims.iterator();
149
150                         while (dimensions.hasNext()) {
151                             OlapItem item = (OlapItem) dimensions.next();
152
153                             if (!"Measures".equalsIgnoreCase(item.getName())) {
154                                 
155                                 List hiers= xmla.discoverHier(ds.getCatalog(), cube, "[" + item.getName() + "]");
156                                 
157                                 String JavaDoc hierName = "";
158                                 
159                                 if (hiers != null && hiers.size() >1 ) {
160                                     hierName = ((OlapItem)hiers.get(0)).getName();
161                                     
162                                     if( hierName.startsWith("[") && hierName.endsWith("]")) {
163                                         hierName = "." + hierName;
164                                     }else{
165                                         hierName = ".[" + hierName + "]";
166                                     }
167                                     
168                                                                                 
169                                 }
170                                 
171                                 mdxQuery = "SELECT {[Measures].DefaultMember} on columns, {["
172                                     + item.getName() + "]" + hierName + ".DefaultMember} on rows FROM ["
173                                     + cube + "]";
174                                 logger.debug("Default query generated as :"
175                                     + mdxQuery);
176
177                                 break;
178                             }
179                         }
180                     }
181
182                     qtag.setMdxQuery(mdxQuery);
183                     qtag.init(com.tonbeller.wcf.controller.RequestContext
184                             .instance());
185
186                         //this is required since navigator does ot use form post for its member
187
request.getSession()
188                                .setAttribute("newanalysismodel", map);
189                     }
190
191                     map.put("selectedCube", cube);
192                 }
193
194                 map.put("selectedDatasource", dsparam);
195             }
196
197             //this is the case when user clicks on navigator member
198
if (request.getMethod().equalsIgnoreCase("get")
199                     && (request.getParameter("null") != null)) {
200                 map = (Map) request.getSession().getAttribute("newanalysismodel");
201
202                 map.put("navClicked", "true");
203             }
204
205             return map;
206         }
207
208         
209
210         /**
211          * called when user submits the form
212          * @param request HttpServletRequest
213          * @param response HttpServletResponse
214          * @param command Object
215          * @param error BindException
216          * @return ModelAndView
217          * @throws Exception
218          */

219         protected ModelAndView onSubmit(HttpServletRequest JavaDoc request,
220             HttpServletResponse JavaDoc response, Object JavaDoc command, BindException error)
221             throws Exception JavaDoc {
222             ModelAndView mv = null;
223
224             String JavaDoc action = request.getParameter("action");
225
226             if (action == null) {
227                 action = request.getParameter("navi_new.hiernav.ok");
228             }
229
230             if (action == null) {
231                 action = request.getParameter("navi_new.hiernav.cancel");
232             }
233
234             if (action == null) {
235             } else if (action.equalsIgnoreCase("OK")) {
236                 // Creating new analysis from this stage creates analysis with default mdx query
237
// since XMLA_Model's mdx query has not been changed yet, if you have manipulated the members.
238
// Needs navigator's render call for this page to make changes.
239
// This requires us to call render method of component otherwise the changes in mdx
240
// will not be reflected
241
Renderable comp = (Renderable) request.getSession()
242                                                       .getAttribute("navi_new");
243
244                 try {
245                     // looks very ugly. But it requires since after ok, the navigator is not being
246
// rendered( because we are redirecting to main analysis page).
247
// So render is necessary otherwise the default modified mdx will not be set in new analysis
248
comp.render(RequestContext.instance());
249                 } catch (Exception JavaDoc e) {
250                 }
251
252                 // create an analysis and redirect to analysis page
253
createAnalysis(request, response, command);
254             } else if (action.equalsIgnoreCase("Cancel")) {
255                 String JavaDoc message;
256
257                 if ("true".equalsIgnoreCase(request.getParameter(
258                                 "changeDatasource"))) {
259                     message = "Change datasource cancelled";
260                     response.sendRedirect("analysis.htm?message=" + message);
261                 } else {
262                     message = "New analysis cancelled";
263                     response.sendRedirect("splash.htm?message=" + message);
264                 }
265             }
266
267             return super.onSubmit(request, response, command, error);
268         }
269
270         private void createAnalysis(HttpServletRequest JavaDoc request,
271             HttpServletResponse JavaDoc response, Object JavaDoc command)
272             throws Exception JavaDoc {
273             Analysis analysis = null;
274             request.getSession().removeAttribute("lastParams");
275
276             if (request.getParameter("changeDatasource") == null) {
277                 analysis = new Analysis();
278                 analysis.setAnalysisTitle(request.getParameter("cube"));
279             } else {
280                 analysis = getAnalysisFromSession(request, "analysis01");
281             }
282
283             analysis.setDataSourceName(request.getParameter("dataSource"));
284
285             String JavaDoc mdxQuery = getMdxQueryFromSession(request, "query_new");
286
287             analysis.setMdxQuery(mdxQuery);
288
289             request.getSession().setAttribute("analysis01", analysis);
290
291             String JavaDoc message;
292
293             if ("true".equalsIgnoreCase(request.getParameter("changeDatasource"))) {
294                 message = "Datasource changed";
295             } else {
296                 message = "New analysis created";
297             }
298
299             response.sendRedirect("analysis.htm?config=newanalysis&message="
300                 + message);
301         }
302
303         private String JavaDoc getUser(HttpServletRequest JavaDoc request)
304             throws Exception JavaDoc {
305             return URLEncoder.encode(request.getUserPrincipal().getName(),
306                 "UTF-8");
307         }
308
309         private String JavaDoc getPassword(HttpServletRequest JavaDoc request)
310             throws Exception JavaDoc {
311             String JavaDoc pwd = (String JavaDoc) request.getSession()
312                                          .getAttribute("user.credentials");
313
314             if (pwd != null) {
315                 pwd = URLEncoder.encode(pwd, "UTF-8");
316             } else {
317                 pwd = "";
318             }
319
320             return pwd;
321         }
322
323         private String JavaDoc getCubeNameFromMdx(String JavaDoc mdxQuery) {
324             /* As 'cube=((XMLA_Model) olapModel).getCube()' method didn't work, parsing
325                cube name from mdx query */

326             String JavaDoc cube = "";
327
328             int index1 = mdxQuery.toUpperCase().indexOf(" FROM ");
329             int index2 = mdxQuery.toUpperCase().indexOf(" WHERE ");
330             index1 = index1 + 7;
331
332             if (index2 == -1) {
333                 index2 = mdxQuery.length();
334             }
335
336             cube = mdxQuery.substring(index1, index2 - 1);
337             cube = cube.trim();
338             cube.replaceAll("\\[", "");
339             cube.replaceAll("\\]", "");
340
341             return cube;
342         }
343
344         private String JavaDoc getMdxQueryFromSession(HttpServletRequest JavaDoc request,
345             String JavaDoc queryID) {
346             String JavaDoc mdxQuery = "";
347             OlapModel olapModel = (OlapModel) request.getSession()
348                                                      .getAttribute(queryID);
349
350             //get mdx query
351
if (olapModel.getBookmarkState(0) instanceof XMLA_Memento) {
352                 XMLA_Memento olapMem = (XMLA_Memento) olapModel.getBookmarkState(0);
353                 mdxQuery = olapMem.getMdxQuery();
354             }
355
356             return mdxQuery;
357         }
358
359         private Analysis getAnalysisFromSession(HttpServletRequest JavaDoc request,
360             String JavaDoc sessionID) {
361             Analysis analysis = null;
362
363             if (request.getSession().getAttribute(sessionID) != null) {
364                 analysis = (Analysis) request.getSession()
365                                              .getAttribute(sessionID);
366             }
367
368             return analysis;
369         }
370     }
371
Popular Tags