/*
* ============================================================================
* GNU Lesser General Public License
* ============================================================================
*
* JasperReports - Free Java report-generating library.
* Copyright (C) 2001-2005 Teodor Danciu teodord@users.sourceforge.net
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* Teodor Danciu
* 173, Calea Calarasilor, Bl. 42, Sc. 1, Ap. 18
* Postal code 030615, Sector 3
* Bucharest, ROMANIA
* Email: teodord@users.sourceforge.net
*/
package net.sf.jasperreports.compilers;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRExpressionChunk;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JRVariable;
import net.sf.jasperreports.engine.design.JasperDesign;
/**
* @author Teodor Danciu (teodord@users.sourceforge.net)
* @version $Id: JRBshGenerator.java,v 1.1 2005/05/23 08:26:24 sherifo Exp $
*/
public class JRBshGenerator
{
/**
*
*/
private JasperDesign jasperDesign = null;
private static Map fieldPrefixMap = null;
private static Map variablePrefixMap = null;
private static Map methodSuffixMap = null;
/**
*
*/
protected JRBshGenerator(JasperDesign jrDesign)
{
jasperDesign = jrDesign;
fieldPrefixMap = new HashMap();
fieldPrefixMap.put(new Byte(JRExpression.EVALUATION_OLD), "Old");
fieldPrefixMap.put(new Byte(JRExpression.EVALUATION_ESTIMATED), "");
fieldPrefixMap.put(new Byte(JRExpression.EVALUATION_DEFAULT), "");
variablePrefixMap = new HashMap();
variablePrefixMap.put(new Byte(JRExpression.EVALUATION_OLD), "Old");
variablePrefixMap.put(new Byte(JRExpression.EVALUATION_ESTIMATED), "Estimated");
variablePrefixMap.put(new Byte(JRExpression.EVALUATION_DEFAULT), "");
methodSuffixMap = new HashMap();
methodSuffixMap.put(new Byte(JRExpression.EVALUATION_OLD), "Old");
methodSuffixMap.put(new Byte(JRExpression.EVALUATION_ESTIMATED), "Estimated");
methodSuffixMap.put(new Byte(JRExpression.EVALUATION_DEFAULT), "");
}
/**
*
*/
public static String generateScript(JasperDesign jrDesign) throws JRException
{
JRBshGenerator generator = new JRBshGenerator(jrDesign);
return generator.generateScript();
}
/**
*
*/
protected String generateScript() throws JRException
{
StringBuffer sb = new StringBuffer();
/* */
sb.append("//\n");
sb.append("// Generated by JasperReports - ");
sb.append((new SimpleDateFormat()).format(new java.util.Date()));
sb.append("\n");
sb.append("//\n");
sb.append("import net.sf.jasperreports.engine.*;\n");
sb.append("import net.sf.jasperreports.engine.fill.*;\n");
sb.append("\n");
sb.append("import java.util.*;\n");
sb.append("import java.math.*;\n");
sb.append("import java.text.*;\n");
sb.append("import java.io.*;\n");
sb.append("import java.net.*;\n");
sb.append("\n");
/* */
String[] imports = jasperDesign.getImports();
if (imports != null && imports.length > 0)
{
for (int i = 0; i < imports.length; i++)
{
sb.append("import ");
sb.append(imports[i]);
sb.append(";\n");
}
}
/* */
sb.append("\n");
sb.append("\n");
sb.append("createBshCalculator()\n");
sb.append("{\n");
sb.append("\n");
sb.append("\n");
sb.append(" JRCalculator calculator = null;\n");
sb.append("\n");
/* */
Map parametersMap = jasperDesign.getParametersMap();
if (parametersMap != null && parametersMap.size() > 0)
{
Collection parameterNames = parametersMap.keySet();
for (Iterator it = parameterNames.iterator(); it.hasNext();)
{
sb.append(" JRFillParameter parameter_");
sb.append(it.next());
sb.append(" = null;\n");
}
}
/* */
sb.append("\n");
/* */
Map fieldsMap = jasperDesign.getFieldsMap();
if (fieldsMap != null && fieldsMap.size() > 0)
{
Collection fieldNames = fieldsMap.keySet();
for (Iterator it = fieldNames.iterator(); it.hasNext();)
{
sb.append(" JRFillField field_");
sb.append(it.next());
sb.append(" = null;\n");
}
}
/* */
sb.append("\n");
/* */
JRVariable[] variables = jasperDesign.getVariables();
if (variables != null && variables.length > 0)
{
for (int i = 0; i < variables.length; i++)
{
sb.append(" JRFillVariable variable_");
sb.append(variables[i].getName());
sb.append(" = null;\n");
}
}
/* */
sb.append("\n");
sb.append("\n");
sb.append(" init(\n");
sb.append(" JRCalculator calculator,\n");
sb.append(" Map parsm,\n");
sb.append(" Map fldsm,\n");
sb.append(" Map varsm\n");
sb.append(" )\n");
sb.append(" {\n");
sb.append(" super.calculator = calculator;\n");
sb.append("\n");
/* */
parametersMap = jasperDesign.getParametersMap();
if (parametersMap != null && parametersMap.size() > 0)
{
Collection parameterNames = parametersMap.keySet();
String parameterName = null;
for (Iterator it = parameterNames.iterator(); it.hasNext();)
{
parameterName = (String)it.next();
sb.append(" super.parameter_");
sb.append(parameterName);
sb.append(" = (JRFillParameter)parsm.get(\"");
sb.append(parameterName);
sb.append("\");\n");
}
}
/* */
sb.append("\n");
/* */
fieldsMap = jasperDesign.getFieldsMap();
if (fieldsMap != null && fieldsMap.size() > 0)
{
Collection fieldNames = fieldsMap.keySet();
String fieldName = null;
for (Iterator it = fieldNames.iterator(); it.hasNext();)
{
fieldName = (String)it.next();
sb.append(" super.field_");
sb.append(fieldName);
sb.append(" = (JRFillField)fldsm.get(\"");
sb.append(fieldName);
sb.append("\");\n");
}
}
/* */
sb.append("\n");
/* */
variables = jasperDesign.getVariables();
if (variables != null && variables.length > 0)
{
String variableName = null;
for (int i = 0; i < variables.length; i++)
{
variableName = variables[i].getName();
sb.append(" super.variable_");
sb.append(variableName);
sb.append(" = (JRFillVariable)varsm.get(\"");
sb.append(variableName);
sb.append("\");\n");
}
}
/* */
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
sb.append(this.generateMethod(JRExpression.EVALUATION_DEFAULT));
sb.append(this.generateMethod(JRExpression.EVALUATION_OLD));
sb.append(this.generateMethod(JRExpression.EVALUATION_ESTIMATED));
sb.append("\n");
sb.append(" str(String key)\n");
sb.append(" {\n");
sb.append(" return super.calculator.str(key);\n");
sb.append(" }\n");
sb.append("\n");
sb.append(" msg(String pattern, Object arg0)\n");
sb.append(" {\n");
sb.append(" return super.calculator.msg(pattern, arg0);\n");
sb.append(" }\n");
sb.append("\n");
sb.append(" msg(String pattern, Object arg0, Object arg1)\n");
sb.append(" {\n");
sb.append(" return super.calculator.msg(pattern, arg0, arg1);\n");
sb.append(" }\n");
sb.append("\n");
sb.append(" msg(String pattern, Object arg0, Object arg1, Object arg2)\n");
sb.append(" {\n");
sb.append(" return super.calculator.msg(pattern, arg0, arg1, arg2);\n");
sb.append(" }\n");
sb.append("\n");
sb.append(" return this;\n");
sb.append("}\n");
return sb.toString();
}
/**
*
*/
private String generateMethod(byte evaluationType) throws JRException
{
StringBuffer sb = new StringBuffer();
/* */
sb.append(" Object evaluate");
sb.append((String)methodSuffixMap.get(new Byte(evaluationType)));
sb.append("(int id)\n");
sb.append(" {\n");
sb.append(" Object value = null;\n");
sb.append("\n");
sb.append(" switch (id)\n");
sb.append(" {\n");
Collection expressions = jasperDesign.getExpressions();
if (expressions != null && expressions.size() > 0)
{
JRExpression expression = null;
for (Iterator it = expressions.iterator(); it.hasNext();)
{
expression = (JRExpression)it.next();
sb.append(" case ");
sb.append(expression.getId());
sb.append(" : // ");
sb.append(expression.getName());
sb.append("\n");
sb.append(" {\n");
sb.append(" value = (");
sb.append(expression.getValueClassName());
sb.append(")(");
sb.append(this.generateExpression(expression, evaluationType));
sb.append(");\n");
sb.append(" break;\n");
sb.append(" }\n");
}
}
/* */
sb.append(" default :\n");
sb.append(" {\n");
sb.append(" }\n");
sb.append(" }\n");
sb.append(" \n");
sb.append(" return value;\n");
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
return sb.toString();
}
/**
*
*/
private String generateExpression(
JRExpression expression,
byte evaluationType
) throws JRException
{
Map parametersMap = jasperDesign.getParametersMap();
Map fieldsMap = jasperDesign.getFieldsMap();
Map variablesMap = jasperDesign.getVariablesMap();
JRParameter jrParameter = null;
JRField jrField = null;
JRVariable jrVariable = null;
StringBuffer sbuffer = new StringBuffer();
JRExpressionChunk[] chunks = expression.getChunks();
JRExpressionChunk chunk = null;
String chunkText = null;
if (chunks != null && chunks.length > 0)
{
for(int i = 0; i < chunks.length; i++)
{
chunk = chunks[i];
chunkText = chunk.getText();
if (chunkText == null)
{
chunkText = "";
}
switch (chunk.getType())
{
case JRExpressionChunk.TYPE_TEXT :
{
sbuffer.append(chunkText);
break;
}
case JRExpressionChunk.TYPE_PARAMETER :
{
jrParameter = (JRParameter)parametersMap.get(chunkText);
sbuffer.append("((");
sbuffer.append(jrParameter.getValueClassName());
sbuffer.append(")super.parameter_");
sbuffer.append(chunkText);
sbuffer.append(".getValue())");
break;
}
case JRExpressionChunk.TYPE_FIELD :
{
jrField = (JRField)fieldsMap.get(chunkText);
sbuffer.append("((");
sbuffer.append(jrField.getValueClassName());
sbuffer.append(")super.field_");
sbuffer.append(chunkText);
sbuffer.append(".get");
sbuffer.append((String)fieldPrefixMap.get(new Byte(evaluationType)));
sbuffer.append("Value())");
break;
}
case JRExpressionChunk.TYPE_VARIABLE :
{
jrVariable = (JRVariable)variablesMap.get(chunkText);
sbuffer.append("((");
sbuffer.append(jrVariable.getValueClassName());
sbuffer.append(")super.variable_");
sbuffer.append(chunkText);
sbuffer.append(".get");
sbuffer.append((String)variablePrefixMap.get(new Byte(evaluationType)));
sbuffer.append("Value())");
break;
}
case JRExpressionChunk.TYPE_RESOURCE :
{
jrParameter = (JRParameter)parametersMap.get(chunkText);
sbuffer.append("super.calculator.str(\"");
sbuffer.append(chunkText);
sbuffer.append("\")");
break;
}
}
}
}
if (sbuffer.length() == 0)
{
sbuffer.append("null");
}
return sbuffer.toString();
}
}