com.jaspersoft.ireport.designer.data.fieldsproviders.ejbql.EJBQLFieldsReader.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.ireport.designer.data.fieldsproviders.ejbql.EJBQLFieldsReader.java

Source

/*
 * iReport - Visual Designer for JasperReports.
 * Copyright (C) 2002 - 2009 Jaspersoft Corporation. All rights reserved.
 * http://www.jaspersoft.com
 *
 * Unless you have purchased a commercial license agreement from Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of iReport.
 *
 * iReport is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * iReport 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with iReport. If not, see <http://www.gnu.org/licenses/>.
 */
package com.jaspersoft.ireport.designer.data.fieldsproviders.ejbql;

import bsh.Interpreter;
import com.jaspersoft.ireport.designer.IReportConnection;
import com.jaspersoft.ireport.designer.IReportManager;
import com.jaspersoft.ireport.designer.connection.EJBQLConnection;
import com.jaspersoft.ireport.designer.data.ReportQueryDialog;
import com.jaspersoft.ireport.designer.utils.Misc;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignParameter;

/**
 *
 * @author gtoffoli
 */
public class EJBQLFieldsReader {

    private Interpreter interpreter = null;
    private List reportParameters = null;
    private String queryString = "";
    private HashMap queryParameters = new HashMap();
    private String singleClassName = null;

    /** Creates a new instance of HQLFieldsReader */
    public EJBQLFieldsReader(String queryStr, List reportParameters) {

        this.setQueryString(queryStr);
        this.setReportParameters(reportParameters);
    }

    @SuppressWarnings("unchecked")
    public String prepareQuery() throws Exception {
        Iterator iterParams = getReportParameters().iterator();

        while (iterParams.hasNext()) {

            JRDesignParameter param = (JRDesignParameter) iterParams.next();
            String parameterName = param.getName();

            if (queryString.indexOf("$P!{" + parameterName + "}") > 0) {

                String expText = "";
                if (param.getDefaultValueExpression() == null) {
                    expText = param.getDefaultValueExpression().getText();
                }

                Object paramVal = ReportQueryDialog.recursiveInterpreter(getInterpreter(), expText,
                        getReportParameters());

                if (paramVal == null) {
                    paramVal = "";
                }

                queryString = Misc.string_replace("" + paramVal, "$P!{" + parameterName + "}", queryString);
            } else if (getQueryString().indexOf("$P{" + parameterName + "}") > 0) {
                String expText = "";
                if (param.getDefaultValueExpression() == null) {
                    expText = param.getDefaultValueExpression().getText();
                }

                Object paramVal = ReportQueryDialog.recursiveInterpreter(getInterpreter(), expText,
                        getReportParameters());
                String parameterReplacement = "_" + getLiteral(parameterName);

                queryParameters.put(parameterReplacement, paramVal);

            }
        }
        return queryString;
    }

    /**
     * Binds a paramter value to a query paramter.
     * 
     * @param parameter the report parameter
     */
    protected void setParameter(Query query, String hqlParamName, Object parameterValue) throws Exception {
        //ClassLoader cl = MainFrame.getMainInstance().getReportClassLoader();

        if (parameterValue == null) {
            query.setParameter(getLiteral(hqlParamName), parameterValue);
            return;
        }

        query.setParameter(hqlParamName, parameterValue);
    }

    private Interpreter prepareExpressionEvaluator() throws bsh.EvalError {

        Interpreter interpreter1 = new Interpreter();
        interpreter1.setClassLoader(interpreter1.getClass().getClassLoader());
        return interpreter1;
    }

    /**
    * Takes a name and returns the same if it is a Java identifier;
    * else it substitutes the illegal characters so that it can be an identifier
    *
    * @param name
    */
    public static String getLiteral(String name) {
        if (isValidLiteral(name)) {
            return name;
        }

        StringBuffer buffer = new StringBuffer(name.length() + 5);

        char[] literalChars = new char[name.length()];
        name.getChars(0, literalChars.length, literalChars, 0);

        for (int i = 0; i < literalChars.length; i++) {
            if (i == 0 && !Character.isJavaIdentifierStart(literalChars[i])) {
                buffer.append((int) literalChars[i]);
            } else if (i != 0 && !Character.isJavaIdentifierPart(literalChars[i])) {
                buffer.append((int) literalChars[i]);
            } else {
                buffer.append(literalChars[i]);
            }
        }

        return buffer.toString();
    }

    /**
     * Checks if the input is a valid Java literal
     * @param literal
     * @author Gaganis Giorgos (gaganis@users.sourceforge.net) 
     */
    private static boolean isValidLiteral(String literal) {
        boolean result = true;

        char[] literalChars = new char[literal.length()];
        literal.getChars(0, literalChars.length, literalChars, 0);

        for (int i = 0; i < literalChars.length; i++) {
            if (i == 0 && !Character.isJavaIdentifierStart(literalChars[i])) {
                result = false;
                break;
            }

            if (i != 0 && !Character.isJavaIdentifierPart(literalChars[i])) {
                result = false;
                break;
            }
        }

        return result;
    }

    public Interpreter getInterpreter() {

        if (interpreter == null) {
            try {
                interpreter = prepareExpressionEvaluator();
            } catch (Exception ex) {

            }
        }
        return interpreter;
    }

    public void setInterpreter(Interpreter interpreter) {
        this.interpreter = interpreter;
    }

    public List getReportParameters() {
        return reportParameters;
    }

    public void setReportParameters(List reportParameters) {
        this.reportParameters = reportParameters;
    }

    public String getQueryString() {
        return queryString;
    }

    public void setQueryString(String queryString) {
        this.queryString = queryString;
    }

    public HashMap getQueryParameters() {
        return queryParameters;
    }

    public void setQueryParameters(HashMap queryParameters) {
        this.queryParameters = queryParameters;
    }

    @SuppressWarnings("unchecked")
    public Vector readFields() throws Exception {
        prepareQuery();

        Vector fields = new Vector();
        EntityManager em = null;
        Query query = null;
        setSingleClassName(null);
        try {

            IReportConnection conn = IReportManager.getInstance().getDefaultConnection();
            if (!(conn instanceof EJBQLConnection)) {
                throw new Exception("No EJBQL connection selected.");
            }

            em = ((EJBQLConnection) conn).getEntityManager();

            query = em.createQuery(queryString);

            for (Iterator iter = queryParameters.keySet().iterator(); iter.hasNext();) {
                String parameterName = (String) iter.next();
                query.setParameter(parameterName, queryParameters.get(parameterName));
            }

            query.setMaxResults(1);
            List list = query.getResultList();

            if (list.size() > 0) {
                Object obj = list.get(0);

                if (obj != null && obj.getClass().isArray()) {
                    // Fields array...
                    Object[] fiels_obj = (Object[]) obj;
                    for (int i = 0; i < fiels_obj.length; ++i) {
                        fields.add(createField(fiels_obj[i], i));
                    }
                } else {
                    setSingleClassName(obj.getClass().getName());
                    fields = getFields(obj);
                }
            }

            return fields;

        } catch (Exception ex) {
            ex.printStackTrace();
            throw ex;
        } finally {

        }
    }

    @SuppressWarnings("unchecked")
    public Vector getFields(Object obj) {

        Vector fields = new Vector();
        java.beans.PropertyDescriptor[] pd = org.apache.commons.beanutils.PropertyUtils
                .getPropertyDescriptors(obj.getClass());
        for (int nd = 0; nd < pd.length; ++nd) {
            String fieldName = pd[nd].getName();
            if (pd[nd].getPropertyType() != null && pd[nd].getReadMethod() != null) {
                String returnType = pd[nd].getPropertyType().getName();
                JRDesignField field = new JRDesignField();
                field.setName(fieldName);
                field.setValueClassName(Misc.getJRFieldType(returnType));
                //field.setDescription(""); //Field returned by " +methods[i].getName() + " (real type: "+ returnType +")");
                fields.addElement(field);
            }
        }

        return fields;

    }

    public JRDesignField createField(Object obj, int pos) {
        String fieldName = "COLUMN_" + (pos + 1);
        if (pos < 0) {
            fieldName = obj.getClass().getName();
            if (fieldName.indexOf(".") > 0) {
                fieldName = fieldName.substring(fieldName.indexOf(".") + 1);
            }
            if (fieldName.length() == 0)
                fieldName = "COLUMN_1";
        }
        JRDesignField field = new JRDesignField();
        field.setName(fieldName);
        field.setValueClassName(obj.getClass().getName());
        //field.setDescription("");

        return field;
    }

    public String getSingleClassName() {
        return singleClassName;
    }

    public void setSingleClassName(String singleClassName) {
        this.singleClassName = singleClassName;
    }

}