1
24 package net.sf.jasperreports.compilers;
25
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.Iterator;
29 import java.util.List;
30 import java.util.Map;
31
32 import net.sf.jasperreports.engine.JRExpression;
33 import net.sf.jasperreports.engine.JRExpressionChunk;
34 import net.sf.jasperreports.engine.JRExpressionCollector;
35 import net.sf.jasperreports.engine.type.ExpressionTypeEnum;
36
37
40 public class ReportExpressionsCompiler
41 {
42
43 private static final ReportExpressionsCompiler INSTANCE = new ReportExpressionsCompiler();
44
45 public static ReportExpressionsCompiler instance()
46 {
47 return INSTANCE;
48 }
49
50 private Map<String, DirectExpressionEvaluation> constantExpressionEvaluations;
51
52 public ReportExpressionsCompiler()
53 {
54 constantExpressionEvaluations = constantEvaluations();
55 }
56
57 protected Map<String, DirectExpressionEvaluation> constantEvaluations()
58 {
59 Map<String, DirectExpressionEvaluation> constantEvaluations = new HashMap<>();
60
61 constantEvaluations.put("new java.lang.Integer(0)", new ConstantExpressionEvaluation(Integer.valueOf(0)));
62 constantEvaluations.put("new java.lang.Integer(1)", new ConstantExpressionEvaluation(Integer.valueOf(1)));
63
64 constantEvaluations.put("false", new ConstantExpressionEvaluation(Boolean.FALSE));
65 constantEvaluations.put("true", new ConstantExpressionEvaluation(Boolean.TRUE));
66 constantEvaluations.put("Boolean.FALSE", new ConstantExpressionEvaluation(Boolean.FALSE));
67 constantEvaluations.put("Boolean.TRUE", new ConstantExpressionEvaluation(Boolean.TRUE));
68 constantEvaluations.put("\"\"", new ConstantExpressionEvaluation(""));
69 return constantEvaluations;
70 }
71
72 public ReportExpressionsCompilation getExpressionsCompilation(JRExpressionCollector expressionCollector)
73 {
74 List<JRExpression> sourceExpressions = new ArrayList<>();
75
76 Map<Integer, DirectExpressionEvaluation> directEvaluations = new HashMap<>();
77 List<JRExpression> expressions = expressionCollector.getExpressions();
78 for (Iterator<JRExpression> it = expressions.iterator(); it.hasNext();)
79 {
80 JRExpression expression = it.next();
81 DirectExpressionEvaluation directEvaluation = directEvaluation(expression);
82 if (directEvaluation == null)
83 {
84 sourceExpressions.add(expression);
85 }
86 else
87 {
88 Integer expressionId = expressionCollector.getExpressionId(expression);
89 directEvaluations.put(expressionId, directEvaluation);
90 }
91 }
92 return new ReportExpressionsCompilation(sourceExpressions,
93 directEvaluations);
94 }
95
96 protected DirectExpressionEvaluation directEvaluation(JRExpression expression)
97 {
98 DirectExpressionEvaluation directEvaluation = null;
99 if (expression.getType() == ExpressionTypeEnum.SIMPLE_TEXT)
100 {
101 directEvaluation = new SimpleTextEvaluation(expression.getChunks());
102 }
103 else
104 {
105 JRExpressionChunk[] chunks = expression.getChunks();
106 if (chunks == null || chunks.length == 0)
107 {
108 directEvaluation = ConstantExpressionEvaluation.nullEvaluation();
109 }
110 else if (chunks.length == 1)
111 {
112 JRExpressionChunk chunk = chunks[0];
113 switch (chunk.getType())
114 {
115 case JRExpressionChunk.TYPE_PARAMETER:
116 directEvaluation = new ParameterEvaluation(chunk.getText());
117 break;
118 case JRExpressionChunk.TYPE_FIELD:
119 directEvaluation = new FieldEvaluation(chunk.getText());
120 break;
121 case JRExpressionChunk.TYPE_VARIABLE:
122 directEvaluation = new VariableEvaluation(chunk.getText());
123 break;
124 case JRExpressionChunk.TYPE_RESOURCE:
125 directEvaluation = new ResourceEvaluation(chunk.getText());
126 break;
127 case JRExpressionChunk.TYPE_TEXT:
128 directEvaluation = constantExpressionEvaluations.get(chunk.getText());
129 default:
130 break;
131 }
132 }
133 }
134 return directEvaluation;
135 }
136
137 }
138