com.autentia.tnt.util.JPivotUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.autentia.tnt.util.JPivotUtils.java

Source

/**
 * TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L.
 * Copyright (C) 2007 Autentia Real Bussiness Solution S.L.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package com.autentia.tnt.util;

import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.olap4j.OlapConnection;
import org.olap4j.OlapStatement;
import org.olap4j.OlapWrapper;
import org.xml.sax.SAXException;

import com.tonbeller.jpivot.mondrian.MondrianModel;
import com.tonbeller.jpivot.olap.model.OlapException;
import com.tonbeller.jpivot.olap.model.OlapModel;
import com.tonbeller.jpivot.tags.MondrianModelFactory;
import com.tonbeller.wcf.controller.RequestContext;

/**
 * Clases de utilidades relacionadas con JPivot, Mondrian y OLAP4J
 * 
 * @author <a href="www.autentia.com">AUTENTIA</a>
 */
public class JPivotUtils {

    private static final Log log = LogFactory.getLog(JPivotUtils.class);

    // nombres de los componentes de JPivot que van a sesin y se referencian en
    // "jpivot.jsp". Se dejan los nombres de los ejemplos de jpivot ya que al
    // cambiarlos dej de funcionar la exportacin a PDF y Excel, debido a que el
    // servlet propio de JPivot compone el nombre de la tabla, grfica e impresin
    // como "table","chart","print" ms el sufijo pasado en el parmetro "cube".
    // Por eso no se pueden cambiar los nombres.
    public static final String QUERY_SESSION_NAME = "query01";

    private static final String TABLE_SESSION_NAME = "table01";

    private static final String NAVI_SESSION_NAME = "navi01";

    private static final String SORTFORM_SESSION_NAME = "sortform01";

    private static final String PRINT_SESSION_NAME = "print01";

    private static final String PRINTFORM_SESSION_NAME = "printform01";

    private static final String CHART_SESSION_NAME = "chart01";

    private static final String CHARTFORM_SESSION_NAME = "chartform01";

    private static final String TOOLBAR_SESSION_NAME = "toolbar01";

    /** Data source de la aplicacin */
    private static final String DATA_SOURCE = "jdbc/TNTConcept";

    /**
     * Ejecuta una query MDX sobre un cubo OLAP utilizando el datasource por defecto. <br>
     * El resultado lo almacena en el contexto de sesin para que pueda ser recogido y pintado por las etiquetas de JPivot.
     * 
     * @param mdxQuery query a ejecutar
     * @param cubeSchema URL del que representa el cubo OLAP
     * @return
     * @throws SAXException
     * @throws IOException
     * @throws OlapException
     */
    public static OlapModel executeOlapQuery(String mdxQuery, URL schema, HttpSession session)
            throws SAXException, IOException, OlapException {

        final RequestContext context = RequestContext.instance();

        // final URL schema = JpivotUtils.class.getResource(cubeSchema);//new URL("file:///"+cubeSchema);//

        final MondrianModelFactory.Config cfg = new MondrianModelFactory.Config();
        cfg.setMdxQuery(mdxQuery);
        cfg.setSchemaUrl(schema.toExternalForm());
        cfg.setDataSource(DATA_SOURCE);

        final MondrianModel mondrianModel = MondrianModelFactory.instance(cfg);
        final OlapModel olapModel = (OlapModel) mondrianModel.getTopDecorator();
        olapModel.setLocale(context.getLocale());
        // olapModel.setLocale(FacesContext.getCurrentInstance().getViewRoot().getLocale());
        olapModel.setServletContext(context.getSession().getServletContext());
        // olapModel.setServletContext((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext());

        // olapModel.
        olapModel.initialize();

        if (log.isDebugEnabled()) {
            java.util.Enumeration attributeNames = session.getAttributeNames();
            while (attributeNames.hasMoreElements()) {
                String name = (String) attributeNames.nextElement();
                log.debug("--- name: " + name + "; type:" + session.getAttribute(name).getClass() + " ---");
            }
        }

        // borramos de la sesion los datos que ha metido JPivot
        // y el model de la consulta que volveremos a meter
        // Esto es necesario porque los tags de JPivot no machacan los
        // valores si ya estn en sesin; por lo que al cambiar de informe
        // sigue mostrando el informe selecionado previamente
        session.removeAttribute(JPivotUtils.QUERY_SESSION_NAME);
        session.removeAttribute(JPivotUtils.TABLE_SESSION_NAME);
        session.removeAttribute(JPivotUtils.NAVI_SESSION_NAME);
        session.removeAttribute(JPivotUtils.SORTFORM_SESSION_NAME);
        session.removeAttribute(JPivotUtils.PRINT_SESSION_NAME);
        session.removeAttribute(JPivotUtils.PRINTFORM_SESSION_NAME);
        session.removeAttribute(JPivotUtils.CHART_SESSION_NAME);
        session.removeAttribute(JPivotUtils.CHARTFORM_SESSION_NAME);
        session.removeAttribute(JPivotUtils.TOOLBAR_SESSION_NAME);

        session.setAttribute(JPivotUtils.QUERY_SESSION_NAME, olapModel);
        return olapModel;
    }

    /**
     * Ejecuta una query MDX sobre un cubo OLAP utilizando el datasource por defecto. <br>
     * El resultado lo almacena en el contexto de sesin para que pueda ser recogido y pintado por las etiquetas de JPivot.
     * 
     * @param mdxQuery query a ejecutar
     * @param cubeSchema esquema situado en src/main/resources que representa el cubo OLAP
     * @return
     * @throws SAXException
     * @throws IOException
     * @throws OlapException
     */
    public static OlapModel executeOlapQuery(String mdxQuery, String cubeSchema, HttpSession session)
            throws SAXException, IOException, OlapException {
        final URL schema = JPivotUtils.class.getResource(cubeSchema);
        return executeOlapQuery(mdxQuery, schema, session);
    }

    /**
     * Crea una conexin con el datasource por defecto sobre el cubo OLAP y ejecuta la query devolviendo el resultado como
     * <b>ResultSet</b>
     * 
     * @param mdxQuery query a ejecutar
     * @param cubeSchema esquema situado en src/main/resources que representa el cubo OLAP
     * @return un objeto ResultSet con la consulta realizada
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public static ResultSet getResultSet(String mdxQuery, String cubeSchema)
            throws ClassNotFoundException, SQLException {
        Class.forName("mondrian.olap4j.MondrianOlap4jDriver");
        final URL url = JPivotUtils.class.getResource(cubeSchema);
        final String catalog = url.toExternalForm();

        final Connection conn = DriverManager.getConnection(
                "jdbc:mondrian:DataSource=java:comp/" + DATA_SOURCE + "/galileoDS;Catalog=" + catalog + ";");
        final OlapWrapper wrapper = (OlapWrapper) conn;
        final OlapConnection olConn = wrapper.unwrap(OlapConnection.class);
        final OlapStatement statement = olConn.createStatement();

        return statement.executeOlapQuery(mdxQuery);
    }
}