mondiran,开源的bi展现工具,但是如果使用 jpivot 的标签来展现 mondrian 的数据,总是有些不顺手,不能和自己的程序融为一体。所以研究了相关标签的代码,写了这个小示例程序。
1、查询数据,主要参考标签源代码:
com.tonbeller.jpivot.tags.MondrianOlapModelTag
- public OlapModel getResultOlapModel(PageContext pageContext, RequestContext context, String mdxQuery, String id) throws JspException {
- try {
- OlapModel om = getOlapModel(pageContext, context, mdxQuery);
- om = (OlapModel) om.getTopDecorator();
- om.setLocale(context.getLocale());
- om.setID(id);
- HttpSession session = pageContext.getSession();
- om.setServletContext(session.getServletContext());
- OlapModelProxy omp = OlapModelProxy.instance(id, session);
- omp.initializeAndShow(om);
- return om;
- } catch (Exception e) {
- throw new JspException(e);
- }
- }
- public OlapModel getOlapModel(PageContext pageContext, RequestContext context, String mdxQuery) throws JspException, OlapException,
- SAXException, IOException {
- MondrianModelFactory.Config cfg = new MondrianModelFactory.Config();
- URL schemaUrl;
- if (catalogUri.startsWith("/"))
- schemaUrl = pageContext.getServletContext().getResource(catalogUri);
- else
- schemaUrl = new URL(catalogUri);
- if (schemaUrl == null)
- throw new JspException("could not find Catalog /"" + catalogUri + "/"");
- cfg.setMdxQuery(mdxQuery);
- // Add the schema URL. Enclose the value in quotes to permit
- // schema URLs that include things like ;jsessionid values.
- cfg.setSchemaUrl("/"" + schemaUrl.toExternalForm() + "/"");
- cfg.setJdbcUrl(jdbcUrl);
- cfg.setJdbcDriver(jdbcDriver);
- cfg.setJdbcUser(jdbcUser);
- cfg.setJdbcPassword(jdbcPassword);
- cfg.setDataSource(dataSource);
- cfg.setRole(role);
- cfg.setDynResolver(dynResolver);
- cfg.setDynLocale(dynLocale);
- cfg.setConnectionPooling(connectionPooling);
- cfg.setDataSourceChangeListener(dataSourceChangeListener);
- allowOverride(context, cfg);
- URL url;
- if (config == null)
- url = getDefaultConfig();
- else
- url = pageContext.getServletContext().getResource(config);
- MondrianModel mm = MondrianModelFactory.instance(url, cfg);
- OlapModel om = (OlapModel) mm.getTopDecorator();
- om.setLocale(context.getLocale());
- om.setServletContext(context.getSession().getServletContext());
- return om;
- }
2、展示数据,主要参考标签源代码:
com.tonbeller.wcf.component.RendererTag
- public String getResultTable() throws JspException {
- String ret = "";
- try {
- // 表格展示
- java.net.URL configUrl = null;
- configUrl = this.getClass().getResource("/com/tonbeller/jpivot/table/config.xml");
- String renderId = "table_" + id;
- Renderable comp = (Renderable) getComponentForTable(renderId, configUrl, olapModel);
- // add "context" and "renderId" to parameter map
- HashMap para = new HashMap();
- para.putAll(RendererParameters.getParameterMap((HttpServletRequest) pageContext.getRequest()));
- createPredefinedParameters(requestContext, para, renderId);
- Transformer transformer = XmlUtils.getTransformer(httpSession, "/WEB-INF/olap/mdxtable.xsl", true);
- setXslParameters(requestContext, transformer, para);
- Document document = comp.render(requestContext);
- DOMSource source = new DOMSource(document);
- StringWriter sw = new StringWriter();
- StreamResult result = new StreamResult(sw);
- transformer.transform(source, result);
- sw.flush();
- ret = sw.toString();
- } catch (Exception e) {
- throw new JspException(e);
- }
- return ret;
- }
3、可以自己从mondrian的查询结果中将数据整理成自己需要的格式,主要代码如下:
- public void getData(OlapModel om){
- try{
- com.tonbeller.jpivot.mondrian.MondrianResult result = (com.tonbeller.jpivot.mondrian.MondrianResult)om.getResult();
- com.tonbeller.jpivot.olap.model.Axis[] axes = result.getAxes();
- java.util.List cells = result.getCells();
- com.tonbeller.jpivot.olap.model.Axis measureAxis = axes[0];
- com.tonbeller.jpivot.olap.model.Axis rowAxis = null;
- if(axes.length>1) rowAxis = axes[1];
- int numMeasures = 0;
- //列
- System.out.println("");
- System.out.println("/");
- com.tonbeller.jpivot.olap.model.Hierarchy[] measureHierarchies = measureAxis.getHierarchies();
- for(int i=0;i<measureHierarchies.length;i++){
- com.tonbeller.jpivot.olap.model.Hierarchy hierarchy = measureHierarchies[i];
- System.out.print(hierarchy.getLabel() + "/t");
- }
- //列名
- System.out.println("");
- System.out.println("/");
- java.util.List measurePositions = measureAxis.getPositions();
- numMeasures = measurePositions.size();
- for(int i=0;i<measurePositions.size();i++){
- com.tonbeller.jpivot.olap.model.Position position = (com.tonbeller.jpivot.olap.model.Position)measurePositions.get(i);
- com.tonbeller.jpivot.olap.model.Member[] posMembers = position.getMembers();
- for(int j=0;j<posMembers.length;j++){
- System.out.print(posMembers[j].getLabel() + "/t");
- }
- System.out.println("");
- }
- if(rowAxis!=null){
- //行
- System.out.println("");
- System.out.println("/");
- com.tonbeller.jpivot.olap.model.Hierarchy[] rowHierarchies = rowAxis.getHierarchies();
- for(int i=0;i<rowHierarchies.length;i++){
- com.tonbeller.jpivot.olap.model.Hierarchy hierarchy = rowHierarchies[i];
- System.out.print(hierarchy.getLabel() + "/t");
- }
- //行名
- System.out.println("");
- System.out.println("/");
- java.util.List rowPositions = rowAxis.getPositions();
- for(int i=0;i<rowPositions.size();i++){
- com.tonbeller.jpivot.olap.model.Position position = (com.tonbeller.jpivot.olap.model.Position)rowPositions.get(i);
- com.tonbeller.jpivot.olap.model.Member[] posMembers = position.getMembers();
- for(int j=0;j<posMembers.length;j++){
- System.out.print(posMembers[j].getLabel() + "/t");
- }
- System.out.println("");
- }
- }
- //值
- System.out.println("");
- System.out.println("/");
- for(int i=0;i<cells.size();i++){
- if(i % numMeasures==0){
- System.out.println("");
- }
- com.tonbeller.jpivot.olap.model.Cell cell = (com.tonbeller.jpivot.olap.model.Cell)cells.get(i);
- System.out.print(cell.getFormattedValue() + "/t");
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
4、源代码例子可以在我的资源中下载,需要一个资源分,呵呵。