001: /*
002: * ============================================================================
003: * GNU Lesser General Public License
004: * ============================================================================
005: *
006: * JasperReports - Free Java report-generating library.
007: * Copyright (C) 2001-2005 JasperSoft Corporation http://www.jaspersoft.com
008: *
009: * This library is free software; you can redistribute it and/or
010: * modify it under the terms of the GNU Lesser General Public
011: * License as published by the Free Software Foundation; either
012: * version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: * Lesser General Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
022: *
023: * JasperSoft Corporation
024: * 185, Berry Street, Suite 6200
025: * San Francisco CA 94107
026: * http://www.jaspersoft.com
027: */
028:
029: /*
030: * Contributors:
031: * Gaganis Giorgos - gaganis@users.sourceforge.net
032: */
033: package net.sf.jasperreports.compilers;
034:
035: import java.text.SimpleDateFormat;
036: import java.util.Collection;
037: import java.util.HashMap;
038: import java.util.Iterator;
039: import java.util.Map;
040:
041: import net.sf.jasperreports.engine.JRException;
042: import net.sf.jasperreports.engine.JRExpression;
043: import net.sf.jasperreports.engine.JRExpressionChunk;
044: import net.sf.jasperreports.engine.JRField;
045: import net.sf.jasperreports.engine.JRParameter;
046: import net.sf.jasperreports.engine.JRVariable;
047: import net.sf.jasperreports.engine.design.JasperDesign;
048: import net.sf.jasperreports.engine.util.JRStringUtil;
049:
050: /**
051: * @author Teodor Danciu (teodord@users.sourceforge.net)
052: * @version $Id: JRBshGenerator.java,v 1.1 2007/08/15 23:26:01 suricate Exp $
053: */
054: public class JRBshGenerator {
055:
056: /**
057: *
058: */
059: private JasperDesign jasperDesign = null;
060:
061: private static Map fieldPrefixMap = null;
062: private static Map variablePrefixMap = null;
063: private static Map methodSuffixMap = null;
064:
065: /**
066: *
067: */
068: protected JRBshGenerator(JasperDesign jrDesign) {
069: jasperDesign = jrDesign;
070:
071: fieldPrefixMap = new HashMap();
072: fieldPrefixMap
073: .put(new Byte(JRExpression.EVALUATION_OLD), "Old");
074: fieldPrefixMap.put(new Byte(JRExpression.EVALUATION_ESTIMATED),
075: "");
076: fieldPrefixMap.put(new Byte(JRExpression.EVALUATION_DEFAULT),
077: "");
078:
079: variablePrefixMap = new HashMap();
080: variablePrefixMap.put(new Byte(JRExpression.EVALUATION_OLD),
081: "Old");
082: variablePrefixMap.put(new Byte(
083: JRExpression.EVALUATION_ESTIMATED), "Estimated");
084: variablePrefixMap.put(
085: new Byte(JRExpression.EVALUATION_DEFAULT), "");
086:
087: methodSuffixMap = new HashMap();
088: methodSuffixMap.put(new Byte(JRExpression.EVALUATION_OLD),
089: "Old");
090: methodSuffixMap.put(
091: new Byte(JRExpression.EVALUATION_ESTIMATED),
092: "Estimated");
093: methodSuffixMap.put(new Byte(JRExpression.EVALUATION_DEFAULT),
094: "");
095: }
096:
097: /**
098: *
099: */
100: public static String generateScript(JasperDesign jrDesign)
101: throws JRException {
102: JRBshGenerator generator = new JRBshGenerator(jrDesign);
103: return generator.generateScript();
104: }
105:
106: /**
107: *
108: */
109: protected String generateScript() throws JRException {
110: StringBuffer sb = new StringBuffer();
111:
112: /* */
113: sb.append("//\n");
114: sb.append("// Generated by JasperReports - ");
115: sb
116: .append((new SimpleDateFormat())
117: .format(new java.util.Date()));
118: sb.append("\n");
119: sb.append("//\n");
120: sb.append("import net.sf.jasperreports.engine.*;\n");
121: sb.append("import net.sf.jasperreports.engine.fill.*;\n");
122: sb.append("\n");
123: sb.append("import java.util.*;\n");
124: sb.append("import java.math.*;\n");
125: sb.append("import java.text.*;\n");
126: sb.append("import java.io.*;\n");
127: sb.append("import java.net.*;\n");
128: sb.append("\n");
129:
130: /* */
131: String[] imports = jasperDesign.getImports();
132: if (imports != null && imports.length > 0) {
133: for (int i = 0; i < imports.length; i++) {
134: sb.append("import ");
135: sb.append(imports[i]);
136: sb.append(";\n");
137: }
138: }
139:
140: /* */
141: sb.append("\n");
142: sb.append("\n");
143: sb.append("createBshCalculator()\n");
144: sb.append("{\n");
145: sb.append("\n");
146: sb.append("\n");
147: sb.append(" JRCalculator calculator = null;\n");
148: sb.append("\n");
149:
150: /* */
151: Map parametersMap = jasperDesign.getParametersMap();
152: if (parametersMap != null && parametersMap.size() > 0) {
153: Collection parameterNames = parametersMap.keySet();
154: for (Iterator it = parameterNames.iterator(); it.hasNext();) {
155: sb.append(" JRFillParameter parameter_");
156: sb.append(JRStringUtil.getLiteral((String) it.next()));
157: sb.append(" = null;\n");
158: }
159: }
160:
161: /* */
162: sb.append("\n");
163:
164: /* */
165: Map fieldsMap = jasperDesign.getFieldsMap();
166: if (fieldsMap != null && fieldsMap.size() > 0) {
167: Collection fieldNames = fieldsMap.keySet();
168: for (Iterator it = fieldNames.iterator(); it.hasNext();) {
169: sb.append(" JRFillField field_");
170: sb.append(JRStringUtil.getLiteral((String) it.next()));
171: sb.append(" = null;\n");
172: }
173: }
174:
175: /* */
176: sb.append("\n");
177:
178: /* */
179: JRVariable[] variables = jasperDesign.getVariables();
180: if (variables != null && variables.length > 0) {
181: for (int i = 0; i < variables.length; i++) {
182: sb.append(" JRFillVariable variable_");
183: sb.append(JRStringUtil.getLiteral((String) variables[i]
184: .getName()));
185: sb.append(" = null;\n");
186: }
187: }
188:
189: /* */
190: sb.append("\n");
191: sb.append("\n");
192: sb.append(" init(\n");
193: sb.append(" JRCalculator calculator,\n");
194: sb.append(" Map parsm,\n");
195: sb.append(" Map fldsm,\n");
196: sb.append(" Map varsm\n");
197: sb.append(" )\n");
198: sb.append(" {\n");
199: sb.append(" super.calculator = calculator;\n");
200: sb.append("\n");
201:
202: /* */
203: parametersMap = jasperDesign.getParametersMap();
204: if (parametersMap != null && parametersMap.size() > 0) {
205: Collection parameterNames = parametersMap.keySet();
206: String parameterName = null;
207: for (Iterator it = parameterNames.iterator(); it.hasNext();) {
208: parameterName = (String) it.next();
209: sb.append(" super.parameter_");
210: sb.append(JRStringUtil.getLiteral(parameterName));
211: sb.append(" = (JRFillParameter)parsm.get(\"");
212: sb.append(parameterName);
213: sb.append("\");\n");
214: }
215: }
216:
217: /* */
218: sb.append("\n");
219:
220: /* */
221: fieldsMap = jasperDesign.getFieldsMap();
222: if (fieldsMap != null && fieldsMap.size() > 0) {
223: Collection fieldNames = fieldsMap.keySet();
224: String fieldName = null;
225: for (Iterator it = fieldNames.iterator(); it.hasNext();) {
226: fieldName = (String) it.next();
227: sb.append(" super.field_");
228: sb.append(JRStringUtil.getLiteral(fieldName));
229: sb.append(" = (JRFillField)fldsm.get(\"");
230: sb.append(fieldName);
231: sb.append("\");\n");
232: }
233: }
234:
235: /* */
236: sb.append("\n");
237:
238: /* */
239: variables = jasperDesign.getVariables();
240: if (variables != null && variables.length > 0) {
241: String variableName = null;
242: for (int i = 0; i < variables.length; i++) {
243: variableName = variables[i].getName();
244: sb.append(" super.variable_");
245: sb.append(JRStringUtil.getLiteral(variableName));
246: sb.append(" = (JRFillVariable)varsm.get(\"");
247: sb.append(variableName);
248: sb.append("\");\n");
249: }
250: }
251:
252: /* */
253: sb.append(" }\n");
254: sb.append("\n");
255: sb.append("\n");
256:
257: sb.append(this .generateMethod(JRExpression.EVALUATION_DEFAULT));
258: sb.append(this .generateMethod(JRExpression.EVALUATION_OLD));
259: sb.append(this
260: .generateMethod(JRExpression.EVALUATION_ESTIMATED));
261:
262: sb.append("\n");
263: sb.append(" str(String key)\n");
264: sb.append(" {\n");
265: sb.append(" return super.calculator.str(key);\n");
266: sb.append(" }\n");
267: sb.append("\n");
268: sb.append(" msg(String pattern, Object arg0)\n");
269: sb.append(" {\n");
270: sb
271: .append(" return super.calculator.msg(pattern, arg0);\n");
272: sb.append(" }\n");
273: sb.append("\n");
274: sb
275: .append(" msg(String pattern, Object arg0, Object arg1)\n");
276: sb.append(" {\n");
277: sb
278: .append(" return super.calculator.msg(pattern, arg0, arg1);\n");
279: sb.append(" }\n");
280: sb.append("\n");
281: sb
282: .append(" msg(String pattern, Object arg0, Object arg1, Object arg2)\n");
283: sb.append(" {\n");
284: sb
285: .append(" return super.calculator.msg(pattern, arg0, arg1, arg2);\n");
286: sb.append(" }\n");
287: sb.append("\n");
288: sb.append(" return this;\n");
289: sb.append("}\n");
290:
291: return sb.toString();
292: }
293:
294: /**
295: *
296: */
297: private String generateMethod(byte evaluationType)
298: throws JRException {
299: StringBuffer sb = new StringBuffer();
300:
301: /* */
302: sb.append(" Object evaluate");
303: sb.append((String) methodSuffixMap
304: .get(new Byte(evaluationType)));
305: sb.append("(int id)\n");
306: sb.append(" {\n");
307: sb.append(" Object value = null;\n");
308: sb.append("\n");
309: sb.append(" switch (id)\n");
310: sb.append(" {\n");
311:
312: Collection expressions = jasperDesign.getExpressions();
313: if (expressions != null && expressions.size() > 0) {
314: JRExpression expression = null;
315: for (Iterator it = expressions.iterator(); it.hasNext();) {
316: expression = (JRExpression) it.next();
317:
318: sb.append(" case ");
319: sb.append(expression.getId());
320: sb.append(" : // ");
321: sb.append(expression.getId());
322: sb.append("\n");
323: sb.append(" {\n");
324: sb.append(" value = (");
325: sb.append(expression.getValueClassName());
326: sb.append(")(");
327: sb.append(this .generateExpression(expression,
328: evaluationType));
329: sb.append(");\n");
330: sb.append(" break;\n");
331: sb.append(" }\n");
332: }
333: }
334:
335: /* */
336: sb.append(" default :\n");
337: sb.append(" {\n");
338: sb.append(" }\n");
339: sb.append(" }\n");
340: sb.append(" \n");
341: sb.append(" return value;\n");
342: sb.append(" }\n");
343: sb.append("\n");
344: sb.append("\n");
345:
346: return sb.toString();
347: }
348:
349: /**
350: *
351: */
352: private String generateExpression(JRExpression expression,
353: byte evaluationType) throws JRException {
354: Map parametersMap = jasperDesign.getParametersMap();
355: Map fieldsMap = jasperDesign.getFieldsMap();
356: Map variablesMap = jasperDesign.getVariablesMap();
357:
358: JRParameter jrParameter = null;
359: JRField jrField = null;
360: JRVariable jrVariable = null;
361:
362: StringBuffer sbuffer = new StringBuffer();
363:
364: JRExpressionChunk[] chunks = expression.getChunks();
365: JRExpressionChunk chunk = null;
366: String chunkText = null;
367: if (chunks != null && chunks.length > 0) {
368: for (int i = 0; i < chunks.length; i++) {
369: chunk = chunks[i];
370:
371: chunkText = chunk.getText();
372: if (chunkText == null) {
373: chunkText = "";
374: }
375:
376: switch (chunk.getType()) {
377: case JRExpressionChunk.TYPE_TEXT: {
378: sbuffer.append(chunkText);
379: break;
380: }
381: case JRExpressionChunk.TYPE_PARAMETER: {
382: jrParameter = (JRParameter) parametersMap
383: .get(chunkText);
384:
385: sbuffer.append("((");
386: sbuffer.append(jrParameter.getValueClassName());
387: sbuffer.append(")super.parameter_");
388: sbuffer.append(JRStringUtil.getLiteral(chunkText));
389: sbuffer.append(".getValue())");
390:
391: break;
392: }
393: case JRExpressionChunk.TYPE_FIELD: {
394: jrField = (JRField) fieldsMap.get(chunkText);
395:
396: sbuffer.append("((");
397: sbuffer.append(jrField.getValueClassName());
398: sbuffer.append(")super.field_");
399: sbuffer.append(JRStringUtil.getLiteral(chunkText));
400: sbuffer.append(".get");
401: sbuffer.append((String) fieldPrefixMap
402: .get(new Byte(evaluationType)));
403: sbuffer.append("Value())");
404:
405: break;
406: }
407: case JRExpressionChunk.TYPE_VARIABLE: {
408: jrVariable = (JRVariable) variablesMap
409: .get(chunkText);
410:
411: sbuffer.append("((");
412: sbuffer.append(jrVariable.getValueClassName());
413: sbuffer.append(")super.variable_");
414: sbuffer.append(JRStringUtil.getLiteral(chunkText));
415: sbuffer.append(".get");
416: sbuffer.append((String) variablePrefixMap
417: .get(new Byte(evaluationType)));
418: sbuffer.append("Value())");
419:
420: break;
421: }
422: case JRExpressionChunk.TYPE_RESOURCE: {
423: jrParameter = (JRParameter) parametersMap
424: .get(chunkText);
425:
426: sbuffer.append("super.calculator.str(\"");
427: sbuffer.append(chunkText);
428: sbuffer.append("\")");
429:
430: break;
431: }
432: }
433: }
434: }
435:
436: if (sbuffer.length() == 0) {
437: sbuffer.append("null");
438: }
439:
440: return sbuffer.toString();
441: }
442:
443: }
|