com.jaspersoft.jasperserver.remote.utils.RepositoryHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.jasperserver.remote.utils.RepositoryHelper.java

Source

/*
 * Copyright (C) 2005 - 2014 TIBCO Software Inc. 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 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.
 *
 * 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 Affero  General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public  License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.jaspersoft.jasperserver.remote.utils;

import com.jaspersoft.jasperserver.api.common.util.LocaleHelper;
import com.jaspersoft.jasperserver.api.engine.common.service.EngineService;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRReport;
import org.apache.commons.collections.set.ListOrderedSet;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.lang.reflect.Array;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

import com.jaspersoft.jasperserver.api.common.util.rd.DateRangeFactory;

import net.sf.jasperreports.types.date.DateRange;
import net.sf.jasperreports.types.date.InvalidDateRangeExpressionException;
import net.sf.jasperreports.types.date.TimestampRange;

/**
 *
 * @author gtoffoli
 * @version $Id: RepositoryHelper.java 47331 2014-07-18 09:13:06Z kklein $
 */
public class RepositoryHelper {
    protected static final Log log = LogFactory.getLog(RepositoryHelper.class);

    /**
     * Converts BigDecimal numbers to the the type they should be based on
     * what the JRParameters say.
     *
     * @todo add float and dobule
     *
     * @param reportUri the name of the report
     * @param currentParameters parameters to fic
     */
    public static Map convertParameterValues(String reportUri, Map currentParameters, EngineService engine) {
        Map parametersMap = new HashMap();

        JRReport report = engine.getMainJasperReport(null, reportUri);
        JRParameter[] parameters = report.getParameters();
        if (parameters != null) {
            for (int i = 0; i < parameters.length; i++) {
                JRParameter parameter = parameters[i];
                parametersMap.put(parameter.getName(), parameter);
            }
        }

        for (Iterator i = currentParameters.keySet().iterator(); i.hasNext();) {
            String parameterName = "" + i.next();

            JRParameter parameter = (JRParameter) parametersMap.get(parameterName);
            if (parameter != null) {
                Object value = currentParameters.get(parameterName);
                Object parameterValue;
                if (value == null) {
                    parameterValue = null;
                } else if (value instanceof String) {
                    parameterValue = stringToValue((String) value, parameter.getValueClass());
                } else if (value instanceof Collection) {
                    parameterValue = getMultiParameterValues(parameter, (Collection) value);
                } else {
                    parameterValue = value;
                }
                currentParameters.put(parameterName, parameterValue);
            }
        }

        return currentParameters;
    }

    protected static Object getMultiParameterValues(JRParameter parameter, Collection values) {
        Object parameterValue;
        Class parameterType = parameter.getValueClass();
        if (parameterType.equals(Object.class) || parameterType.equals(Collection.class)
                || parameterType.equals(Set.class) || parameterType.equals(List.class)) {
            Collection paramValues;
            if (parameterType.equals(List.class)) {
                //if the parameter type is list, use a list
                paramValues = new ArrayList(values.size());
            } else {
                //else use an ordered set
                paramValues = new ListOrderedSet();
            }

            Class componentType = parameter.getNestedType();
            for (Iterator it = values.iterator(); it.hasNext();) {
                Object val = (Object) it.next();
                Object paramValue;
                if (componentType == null || !(val instanceof String)) {
                    //no conversion if no nested type set for the parameter
                    paramValue = val;
                } else {
                    paramValue = stringToValue((String) val, componentType);
                }
                paramValues.add(paramValue);
            }
            parameterValue = paramValues;
        } else if (parameterType.isArray()) {
            Class componentType = parameterType.getComponentType();
            parameterValue = Array.newInstance(componentType, values.size());
            int idx = 0;
            for (Iterator iter = values.iterator(); iter.hasNext(); ++idx) {
                Object val = iter.next();
                Object paramValue;
                if (val instanceof String) {
                    paramValue = stringToValue((String) val, componentType);
                } else {
                    paramValue = val;
                }
                Array.set(parameterValue, idx, paramValue);
            }
        } else {
            parameterValue = values;
        }
        return parameterValue;
    }

    /**
     *  This method get a object and tries to convert it in a string
     *  Valid objects are:
     *    java.util.Date (converted in a string representing milliseconds)
     *    Number
     *    BigDecimal
     *    Byte
     *    Short
     *    Integer
     *    Long
     *    Float
     *    Double
     *    Boolean (will be the string true or false)
     *    String
     * 
     *  The default returned object is of type String
     * @param value The object to convert in a string
     * @return Return a string represeting the object
     */
    public static String valueToString(Object value) {
        String str = (value == null) ? "" : "" + value;
        if (value != null && value instanceof java.util.Date) {
            str = "" + ((java.util.Date) value).getTime();
        }

        return str;
    }

    /**
     *  This method get a string and tries to convert the string into the requested object.
     *  Valid classes are:
     *    java.util.Date (the string is supposed to represent a number of milliseconds)
     *    Number
     *    BigDecimal
     *    Byte
     *    Short
     *    Integer
     *    Long
     *    Float
     *    Double
     *    Boolean
     *    String
     *    java.util.Locale
     * 
     *  The default returned object is of type String
     * @param str the string representing the value
     * @param clazz The class of the result (not garanteed)
     * @return return an Object hopefully of the requested class (or a String)
     * 
     */
    public static Object stringToValue(String str, Class clazz) {
        Object value = str;
        if (value == null) {
            return value;
        }

        if (java.util.Date.class.getName().equals(clazz.getName())) {
            value = new java.util.Date(Long.valueOf(value.toString()).longValue());
        } else if (java.sql.Date.class.getName().equals(clazz.getName())) {
            value = new java.sql.Date(Long.valueOf(value.toString()).longValue());
        } else if (java.sql.Timestamp.class.getName().equals(clazz.getName())) {
            value = new java.sql.Timestamp(Long.valueOf(value.toString()).longValue());
        } else if (Number.class.isAssignableFrom(clazz)) {
            value = new java.math.BigDecimal(value.toString());
            if (Byte.class.getName().equals(clazz.getName())) {
                value = new Byte(((Number) value).byteValue());
            } else if (Short.class.getName().equals(clazz.getName())) {
                value = new Short(((Number) value).shortValue());
            } else if (Integer.class.getName().equals(clazz.getName())) {
                value = new Integer(((Number) value).intValue());
            } else if (Long.class.getName().equals(clazz.getName())) {
                value = new Long(((Number) value).longValue());
            } else if (Float.class.getName().equals(clazz.getName())) {
                value = new Float(((Number) value).floatValue());
            } else if (Double.class.getName().equals(clazz.getName())) {
                value = new Double(((Number) value).doubleValue());
            }
        } else if (Boolean.class.getName().equals(clazz.getName())) {
            value = Boolean.valueOf(value.toString());
        } else if (Locale.class.getName().equals(clazz.getName())) {
            value = LocaleHelper.getInstance().getLocale(str);
        } else if (DateRange.class.equals(clazz)) {
            try {
                value = DateRangeFactory.getInstance(str, Date.class);
            } catch (InvalidDateRangeExpressionException e) {
                //if DateRange passed as string with milliseconds we need to parse it
                Date dateValue = (Date) stringToValue(str, Date.class);
                value = DateRangeFactory.getInstance(dateValue);
            }
        } else if (TimestampRange.class.equals(clazz)) {
            try {
                value = DateRangeFactory.getInstance(str, Timestamp.class);
            } catch (InvalidDateRangeExpressionException e) {
                //if TimestampRange passed as string with milliseconds we need to parse it
                Timestamp timestamp = (Timestamp) stringToValue(str, Timestamp.class);
                value = DateRangeFactory.getInstance(timestamp);
            }
        }
        return value;
    }

}