Files
HRMS/hrmsEjb/net/sf/jasperreports/engine/design/JRClassGenerator.java
2025-07-28 13:56:49 +05:30

483 lines
16 KiB
Java

package net.sf.jasperreports.engine.design;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
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.util.JRStringUtil;
public class JRClassGenerator {
private static final int EXPR_MAX_COUNT_PER_METHOD = 100;
protected static final String SOURCE_EXPRESSION_ID_START = "$JR_EXPR_ID=";
protected static final int sOURCE_EXPRESSION_ID_START_LENGTH = "$JR_EXPR_ID=".length();
protected static final String SOURCE_EXPRESSION_ID_END = "$";
private static Map fieldPrefixMap = null;
private static Map variablePrefixMap = null;
private static Map methodSuffixMap = null;
protected final JRSourceCompileTask sourceTask;
protected Map parametersMap;
protected Map fieldsMap;
protected Map variablesMap;
protected JRVariable[] variables;
static {
fieldPrefixMap = new HashMap();
fieldPrefixMap.put(new Byte((byte)1), "Old");
fieldPrefixMap.put(new Byte((byte)2), "");
fieldPrefixMap.put(new Byte((byte)3), "");
variablePrefixMap = new HashMap();
variablePrefixMap.put(new Byte((byte)1), "Old");
variablePrefixMap.put(new Byte((byte)2), "Estimated");
variablePrefixMap.put(new Byte((byte)3), "");
methodSuffixMap = new HashMap();
methodSuffixMap.put(new Byte((byte)1), "Old");
methodSuffixMap.put(new Byte((byte)2), "Estimated");
methodSuffixMap.put(new Byte((byte)3), "");
}
protected JRClassGenerator(JRSourceCompileTask sourceTask) {
this.sourceTask = sourceTask;
this.parametersMap = sourceTask.getParametersMap();
this.fieldsMap = sourceTask.getFieldsMap();
this.variablesMap = sourceTask.getVariablesMap();
this.variables = sourceTask.getVariables();
}
public static JRCompilationSourceCode generateClass(JRSourceCompileTask sourceTask) throws JRException {
JRClassGenerator generator = new JRClassGenerator(sourceTask);
return generator.generateClass();
}
protected JRCompilationSourceCode generateClass() throws JRException {
StringBuffer sb = new StringBuffer();
generateClassStart(sb);
generateDeclarations(sb);
generateInitMethod(sb);
generateInitParamsMethod(sb);
if (this.fieldsMap != null)
generateInitFieldsMethod(sb);
generateInitVarsMethod(sb);
List expressions = this.sourceTask.getExpressions();
sb.append(generateMethod((byte)3, expressions));
if (this.sourceTask.isOnlyDefaultEvaluation()) {
List empty = new ArrayList();
sb.append(generateMethod((byte)1, empty));
sb.append(generateMethod((byte)2, empty));
} else {
sb.append(generateMethod((byte)1, expressions));
sb.append(generateMethod((byte)2, expressions));
}
sb.append("}\n");
String code = sb.toString();
JRExpression[] lineExpressions = parseSourceLines(code);
return new JRDefaultCompilationSourceCode(code, lineExpressions);
}
private void generateInitMethod(StringBuffer sb) {
sb.append("\n");
sb.append("\n");
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append(" public void customizedInit(\n");
sb.append(" Map pm,\n");
sb.append(" Map fm,\n");
sb.append(" Map vm\n");
sb.append(" )\n");
sb.append(" {\n");
sb.append(" initParams(pm);\n");
if (this.fieldsMap != null)
sb.append(" initFields(fm);\n");
sb.append(" initVars(vm);\n");
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
}
protected final void generateClassStart(StringBuffer sb) {
sb.append("/*\n");
sb.append(" * Generated by JasperReports - ");
sb.append((new SimpleDateFormat()).format(new 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 = this.sourceTask.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("/**\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append("public class ");
sb.append(this.sourceTask.getUnitName());
sb.append(" extends JREvaluator\n");
sb.append("{\n");
sb.append("\n");
sb.append("\n");
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
}
protected final void generateDeclarations(StringBuffer sb) {
if (this.parametersMap != null && this.parametersMap.size() > 0) {
Collection parameterNames = this.parametersMap.keySet();
for (Iterator it = parameterNames.iterator(); it.hasNext(); ) {
sb.append(" private JRFillParameter parameter_");
sb.append(JRStringUtil.getLiteral(it.next()));
sb.append(" = null;\n");
}
}
if (this.fieldsMap != null && this.fieldsMap.size() > 0) {
Collection fieldNames = this.fieldsMap.keySet();
for (Iterator it = fieldNames.iterator(); it.hasNext(); ) {
sb.append(" private JRFillField field_");
sb.append(JRStringUtil.getLiteral(it.next()));
sb.append(" = null;\n");
}
}
if (this.variables != null && this.variables.length > 0)
for (int i = 0; i < this.variables.length; i++) {
sb.append(" private JRFillVariable variable_");
sb.append(JRStringUtil.getLiteral(this.variables[i].getName()));
sb.append(" = null;\n");
}
}
protected final void generateInitParamsMethod(StringBuffer sb) throws JRException {
Iterator parIt = null;
if (this.parametersMap != null && this.parametersMap.size() > 0) {
parIt = this.parametersMap.keySet().iterator();
} else {
parIt = Collections.EMPTY_SET.iterator();
}
generateInitParamsMethod(sb, parIt, 0);
}
protected final void generateInitFieldsMethod(StringBuffer sb) throws JRException {
Iterator fieldIt = null;
if (this.fieldsMap != null && this.fieldsMap.size() > 0) {
fieldIt = this.fieldsMap.keySet().iterator();
} else {
fieldIt = Collections.EMPTY_SET.iterator();
}
generateInitFieldsMethod(sb, fieldIt, 0);
}
protected final void generateInitVarsMethod(StringBuffer sb) throws JRException {
Iterator varIt = null;
if (this.variables != null && this.variables.length > 0) {
varIt = Arrays.<JRVariable>asList(this.variables).iterator();
} else {
varIt = Collections.EMPTY_LIST.iterator();
}
generateInitVarsMethod(sb, varIt, 0);
}
private void generateInitParamsMethod(StringBuffer sb, Iterator it, int index) throws JRException {
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append(" private void initParams");
if (index > 0)
sb.append(index);
sb.append("(Map pm)\n");
sb.append(" {\n");
for (int i = 0; i < 100 && it.hasNext(); i++) {
String parameterName = it.next();
sb.append(" parameter_");
sb.append(JRStringUtil.getLiteral(parameterName));
sb.append(" = (JRFillParameter)pm.get(\"");
sb.append(parameterName);
sb.append("\");\n");
}
if (it.hasNext()) {
sb.append(" initParams");
sb.append(index + 1);
sb.append("(pm);\n");
}
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
if (it.hasNext())
generateInitParamsMethod(sb, it, index + 1);
}
private void generateInitFieldsMethod(StringBuffer sb, Iterator it, int index) throws JRException {
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append(" private void initFields");
if (index > 0)
sb.append(index);
sb.append("(Map fm)\n");
sb.append(" {\n");
for (int i = 0; i < 100 && it.hasNext(); i++) {
String fieldName = it.next();
sb.append(" field_");
sb.append(JRStringUtil.getLiteral(fieldName));
sb.append(" = (JRFillField)fm.get(\"");
sb.append(fieldName);
sb.append("\");\n");
}
if (it.hasNext()) {
sb.append(" initFields");
sb.append(index + 1);
sb.append("(fm);\n");
}
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
if (it.hasNext())
generateInitFieldsMethod(sb, it, index + 1);
}
private void generateInitVarsMethod(StringBuffer sb, Iterator it, int index) throws JRException {
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append(" private void initVars");
if (index > 0)
sb.append(index);
sb.append("(Map vm)\n");
sb.append(" {\n");
for (int i = 0; i < 100 && it.hasNext(); i++) {
String variableName = ((JRVariable)it.next()).getName();
sb.append(" variable_");
sb.append(JRStringUtil.getLiteral(variableName));
sb.append(" = (JRFillVariable)vm.get(\"");
sb.append(variableName);
sb.append("\");\n");
}
if (it.hasNext()) {
sb.append(" initVars");
sb.append(index + 1);
sb.append("(vm);\n");
}
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
if (it.hasNext())
generateInitVarsMethod(sb, it, index + 1);
}
protected final String generateMethod(byte evaluationType, List expressionsList) throws JRException {
StringBuffer sb = new StringBuffer();
if (expressionsList.size() > 0) {
sb.append(generateMethod(expressionsList.listIterator(), 0, evaluationType));
} else {
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
sb.append(" public Object evaluate");
sb.append((String)methodSuffixMap.get(new Byte(evaluationType)));
sb.append("(int id) throws Throwable\n");
sb.append(" {\n");
sb.append(" return null;\n");
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
}
return sb.toString();
}
private String generateMethod(Iterator it, int index, byte evaluationType) throws JRException {
StringBuffer sb = new StringBuffer();
sb.append(" /**\n");
sb.append(" *\n");
sb.append(" */\n");
if (index > 0) {
sb.append(" private Object evaluate");
sb.append((String)methodSuffixMap.get(new Byte(evaluationType)));
sb.append(index);
} else {
sb.append(" public Object evaluate");
sb.append((String)methodSuffixMap.get(new Byte(evaluationType)));
}
sb.append("(int id) throws Throwable\n");
sb.append(" {\n");
sb.append(" Object value = null;\n");
sb.append("\n");
sb.append(" switch (id)\n");
sb.append(" {\n");
for (int i = 0; it.hasNext() && i < 100; i++) {
JRExpression expression = it.next();
sb.append(" case ");
sb.append(this.sourceTask.getExpressionId(expression));
sb.append(" : \n");
sb.append(" {\n");
sb.append(" value = (");
sb.append(expression.getValueClassName());
sb.append(")(");
sb.append(generateExpression(expression, evaluationType));
sb.append(");");
appendExpressionComment(sb, expression);
sb.append("\n");
sb.append(" break;\n");
sb.append(" }\n");
}
sb.append(" default :\n");
sb.append(" {\n");
if (it.hasNext()) {
sb.append(" value = evaluate");
sb.append((String)methodSuffixMap.get(new Byte(evaluationType)));
sb.append(index + 1);
sb.append("(id);\n");
}
sb.append(" }\n");
sb.append(" }\n");
sb.append(" \n");
sb.append(" return value;\n");
sb.append(" }\n");
sb.append("\n");
sb.append("\n");
if (it.hasNext())
sb.append(generateMethod(it, index + 1, evaluationType));
return sb.toString();
}
private String generateExpression(JRExpression expression, byte evaluationType) {
JRParameter jrParameter = null;
JRField jrField = null;
JRVariable jrVariable = null;
StringBuffer sb = 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 1:
appendExpressionText(expression, sb, chunkText);
break;
case 2:
jrParameter = (JRParameter)this.parametersMap.get(chunkText);
sb.append("((");
sb.append(jrParameter.getValueClassName());
sb.append(")parameter_");
sb.append(JRStringUtil.getLiteral(chunkText));
sb.append(".getValue())");
break;
case 3:
jrField = (JRField)this.fieldsMap.get(chunkText);
sb.append("((");
sb.append(jrField.getValueClassName());
sb.append(")field_");
sb.append(JRStringUtil.getLiteral(chunkText));
sb.append(".get");
sb.append((String)fieldPrefixMap.get(new Byte(evaluationType)));
sb.append("Value())");
break;
case 4:
jrVariable = (JRVariable)this.variablesMap.get(chunkText);
sb.append("((");
sb.append(jrVariable.getValueClassName());
sb.append(")variable_");
sb.append(JRStringUtil.getLiteral(chunkText));
sb.append(".get");
sb.append((String)variablePrefixMap.get(new Byte(evaluationType)));
sb.append("Value())");
break;
case 5:
sb.append("str(\"");
sb.append(chunkText);
sb.append("\")");
break;
}
}
if (sb.length() == 0)
sb.append("null");
return sb.toString();
}
protected void appendExpressionText(JRExpression expression, StringBuffer sb, String chunkText) {
StringTokenizer tokenizer = new StringTokenizer(chunkText, "\n", true);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (token.equals("\n"))
appendExpressionComment(sb, expression);
sb.append(token);
}
}
protected void appendExpressionComment(StringBuffer sb, JRExpression expression) {
sb.append("//");
sb.append("$JR_EXPR_ID=");
sb.append(this.sourceTask.getExpressionId(expression));
sb.append("$");
}
protected JRExpression[] parseSourceLines(String sourceCode) {
List expressions = new ArrayList();
int start = 0;
int end = sourceCode.indexOf('\n');
while (end >= 0) {
JRExpression expression = null;
if (start < end) {
String line = sourceCode.substring(start, end);
expression = getLineExpression(line);
}
expressions.add(expression);
start = end + 1;
end = sourceCode.indexOf('\n', start);
}
return expressions.<JRExpression>toArray(new JRExpression[expressions.size()]);
}
protected JRExpression getLineExpression(String line) {
JRExpression expression = null;
int exprIdStart = line.indexOf("$JR_EXPR_ID=");
if (exprIdStart >= 0) {
exprIdStart += sOURCE_EXPRESSION_ID_START_LENGTH;
int exprIdEnd = line.indexOf("$", exprIdStart);
if (exprIdEnd >= 0)
try {
int exprId = Integer.parseInt(line.substring(exprIdStart, exprIdEnd));
expression = this.sourceTask.getExpression(exprId);
} catch (NumberFormatException e) {}
}
return expression;
}
}