From 2758a1d66155b1ab85f554986c80581aa994cce6 Mon Sep 17 00:00:00 2001 From: Juan Alvarez Date: Sat, 21 May 2016 23:57:16 -0300 Subject: [PATCH] - version bumb 5.0.8-SNAPSHOT - Fix: Footer group label CoustomExpression had wrong field values --- pom.xml | 8 +- .../com/fdvs/dj/core/DJDefaultScriptlet.java | 78 +-- .../ar/com/fdvs/dj/core/FieldMapWrapper.java | 170 ++--- .../dj/core/layout/AbstractLayoutManager.java | 2 +- .../dj/core/layout/ClassicLayoutManager.java | 10 +- .../dj/core/layout/Dj2JrCrosstabBuilder.java | 2 +- .../DJGroupRegistrationManager.java | 3 +- .../entities/columns/ExpressionColumn.java | 4 +- .../domain/entities/columns/ImageColumn.java | 2 +- .../ar/com/fdvs/dj/util/ExpressionUtils.java | 643 +++++++++--------- .../ar/com/fdvs/dj/util/HyperLinkUtil.java | 5 +- .../ar/com/fdvs/dj/test/ReportExporter.java | 11 + .../ar/com/fdvs/dj/test/domain/Product.java | 5 + .../fdvs/dj/test/encoding/UTF8ReportTest.java | 151 ++++ .../groups/labels/LabelFooterValuesTest.java | 99 +++ 15 files changed, 752 insertions(+), 441 deletions(-) create mode 100644 src/test/java/ar/com/fdvs/dj/test/encoding/UTF8ReportTest.java create mode 100644 src/test/java/ar/com/fdvs/dj/test/groups/labels/LabelFooterValuesTest.java diff --git a/pom.xml b/pom.xml index a6f2bbc1..acabe41f 100644 --- a/pom.xml +++ b/pom.xml @@ -31,7 +31,7 @@ 4.0.0 ar.com.fdvs DynamicJasper - 5.0.7 + 5.0.8-SNAPSHOT DynamicJasper jar @@ -444,6 +444,12 @@ 3.2.2.RELEASE test + + com.github.albfernandez + juniversalchardet + 2.0.0 + test + diff --git a/src/main/java/ar/com/fdvs/dj/core/DJDefaultScriptlet.java b/src/main/java/ar/com/fdvs/dj/core/DJDefaultScriptlet.java index 85d30d2f..9544dc9a 100644 --- a/src/main/java/ar/com/fdvs/dj/core/DJDefaultScriptlet.java +++ b/src/main/java/ar/com/fdvs/dj/core/DJDefaultScriptlet.java @@ -12,52 +12,48 @@ /** * This class handles parameter passing to custom expressions in runtime (during report fill) - * @author mamana * + * @author mamana */ -public class DJDefaultScriptlet extends JRDefaultScriptlet { - - int veces = 0; - public DJDefaultScriptlet(){ - super(); -// logger.debug("Im a new Scrptlet " + this); - } - - /** - * Logger for this class - */ - private static final Log logger = LogFactory.getLog(DJDefaultScriptlet.class); - - protected static final String VARS_KEY = "vars"; - protected static final String PARAMS_KEY = "params"; - protected static final String FIELDS_KEY = "fields"; - - protected FieldMapWrapper fieldMapWrapper = new FieldMapWrapper(); - protected ParameterMapWrapper parameterMapWrapper = new ParameterMapWrapper(); - protected VariableMapWrapper variableMapWrapper = new VariableMapWrapper(); +public class DJDefaultScriptlet extends JRDefaultScriptlet { - public void setData(Map parsm, Map fldsm, Map varsm, JRFillGroup[] grps) { - super.setData(parsm, fldsm, varsm, grps); - putValuesInMap(); - } - - protected void putValuesInMap() { - fieldMapWrapper.setMap(this.fieldsMap); - parameterMapWrapper.setMap(this.parametersMap); - variableMapWrapper.setMap(this.variablesMap); - } + public DJDefaultScriptlet() { + super(); + } - public Map getCurrentFiels() { - return fieldMapWrapper; - } + private static final Log logger = LogFactory.getLog(DJDefaultScriptlet.class); - public Map getCurrentParams() { - return parameterMapWrapper; - } - public Map getCurrentVariables() { - return variableMapWrapper; - } + protected FieldMapWrapper fieldMapWrapper = new FieldMapWrapper(); + protected ParameterMapWrapper parameterMapWrapper = new ParameterMapWrapper(); + protected VariableMapWrapper variableMapWrapper = new VariableMapWrapper(); + + public void setData(Map parsm, Map fldsm, Map varsm, JRFillGroup[] grps) { + super.setData(parsm, fldsm, varsm, grps); + putValuesInMap(); + } + + protected void putValuesInMap() { + fieldMapWrapper.setMap(this.fieldsMap); + parameterMapWrapper.setMap(this.parametersMap); + variableMapWrapper.setMap(this.variablesMap); + } + + public Map getCurrentFields() { + return fieldMapWrapper; + } + + public Map getPreviousFields() { + return fieldMapWrapper.getPreviousValues(); + } + + public Map getCurrentParams() { + return parameterMapWrapper; + } + + public Map getCurrentVariables() { + return variableMapWrapper; + } @Override public void beforeReportInit() throws JRScriptletException { @@ -65,7 +61,5 @@ public void beforeReportInit() throws JRScriptletException { JasperReport jr = (JasperReport) getParameterValue(JRParameter.JASPER_REPORT); variableMapWrapper.setReportName(jr.getName()); parameterMapWrapper.setReportName(jr.getName()); - - } } diff --git a/src/main/java/ar/com/fdvs/dj/core/FieldMapWrapper.java b/src/main/java/ar/com/fdvs/dj/core/FieldMapWrapper.java index f6ec0411..2a324126 100644 --- a/src/main/java/ar/com/fdvs/dj/core/FieldMapWrapper.java +++ b/src/main/java/ar/com/fdvs/dj/core/FieldMapWrapper.java @@ -8,81 +8,99 @@ import net.sf.jasperreports.engine.fill.JRFillField; public class FieldMapWrapper implements Map { - - private Map map; - - public FieldMapWrapper(Map map){ - this.map = map; - } - - public FieldMapWrapper() { - this.map = Collections.EMPTY_MAP; - } - - public void clear() { - map.clear(); - } - - public boolean containsKey(Object key) { - return map.containsKey(key); - } - - public boolean containsValue(Object value) { - throw new DJException("Method not implemented"); - } - - public Set entrySet() { - return map.entrySet(); - } - - public boolean equals(Object o) { - return map.equals(o); - } - - public Object get(Object key) { - Object value = map.get(key); - if (value == null) - return null; - - return ((JRFillField)value).getValue(); - } - - public int hashCode() { - return map.hashCode(); - } - - public boolean isEmpty() { - return map.isEmpty(); - } - - public Set keySet() { - return map.keySet(); - } - - public Object put(Object arg0, Object arg1) { - return map.put(arg0, arg1); - } - - public void putAll(Map arg0) { - map.putAll(arg0); - } - - public Object remove(Object key) { - return map.remove(key); - } - - public int size() { - return map.size(); - } - - public Collection values() { - throw new DJException("Method not implemented"); - } - - public void setMap(Map fldsm) { - this.map = fldsm; - } - - + protected Map map; + + public FieldMapWrapper(Map map) { + this.map = map; + } + + public FieldMapWrapper() { + this.map = Collections.EMPTY_MAP; + } + + public void clear() { + map.clear(); + } + + public boolean containsKey(Object key) { + return map.containsKey(key); + } + + public boolean containsValue(Object value) { + throw new DJException("Method not implemented"); + } + + public Set entrySet() { + return map.entrySet(); + } + + public boolean equals(Object o) { + return map.equals(o); + } + + public Object get(Object key) { + Object value = map.get(key); + if (value == null) + return null; + + return ((JRFillField) value).getValue(); + } + + public int hashCode() { + return map.hashCode(); + } + + public boolean isEmpty() { + return map.isEmpty(); + } + + public Set keySet() { + return map.keySet(); + } + + public Object put(Object arg0, Object arg1) { + return map.put(arg0, arg1); + } + + public void putAll(Map arg0) { + map.putAll(arg0); + } + + public Object remove(Object key) { + return map.remove(key); + } + + public int size() { + return map.size(); + } + + public Collection values() { + throw new DJException("Method not implemented"); + } + + public void setMap(Map fldsm) { + this.map = fldsm; + } + + + public Map getPreviousValues() { + return new PreviousValuesMap(this); + } + + class PreviousValuesMap extends FieldMapWrapper { + + public PreviousValuesMap(FieldMapWrapper fieldMapWrapper) { + this.map = fieldMapWrapper.map; + } + + @Override + public Object get(Object key) { + Object value = map.get(key); + if (value == null) + return null; + + return ((JRFillField) value).getOldValue(); + } + } } diff --git a/src/main/java/ar/com/fdvs/dj/core/layout/AbstractLayoutManager.java b/src/main/java/ar/com/fdvs/dj/core/layout/AbstractLayoutManager.java index bbf9b5c0..e82847aa 100644 --- a/src/main/java/ar/com/fdvs/dj/core/layout/AbstractLayoutManager.java +++ b/src/main/java/ar/com/fdvs/dj/core/layout/AbstractLayoutManager.java @@ -418,7 +418,7 @@ protected JRDesignExpression getExpressionForConditionalStyle(ConditionalStyle c // PeS17 patch, 2008-11-29: put all fields to fields map, including "invisible" i.e. only registered ones - String fieldsMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFiels()"; + String fieldsMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFields()"; String parametersMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentParams()"; String variablesMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentVariables()"; diff --git a/src/main/java/ar/com/fdvs/dj/core/layout/ClassicLayoutManager.java b/src/main/java/ar/com/fdvs/dj/core/layout/ClassicLayoutManager.java index d711fb81..05e64e94 100644 --- a/src/main/java/ar/com/fdvs/dj/core/layout/ClassicLayoutManager.java +++ b/src/main/java/ar/com/fdvs/dj/core/layout/ClassicLayoutManager.java @@ -547,7 +547,7 @@ protected void layoutGroupFooterLabels(DJGroup djgroup, JRDesignGroup jgroup, in if (label.isJasperExpression()) //a text with things like "$F{myField}" labelExp = ExpressionUtils.createStringExpression(label.getText()); else if (label.getLabelExpression() != null){ - labelExp = ExpressionUtils.createExpression(jgroup.getName() + "_labelExpression", label.getLabelExpression()); + labelExp = ExpressionUtils.createExpression(jgroup.getName() + "_labelExpression", label.getLabelExpression(), true); } else //a simple text //labelExp = ExpressionUtils.createStringExpression("\""+ Utils.escapeTextForExpression(label.getText())+ "\""); labelExp = ExpressionUtils.createStringExpression("\""+ label.getText() + "\""); @@ -610,7 +610,7 @@ protected void layoutGroupCrosstabs(DJGroup columnsGroup, JRDesignGroup jgroup) else if (caption.getLabelExpression() != null) { String name = "expression_for_label_at_header_of_group[" + getReport().getColumnsGroups().indexOf(columnsGroup) + "]_crosstab[" + columnsGroup.getHeaderCrosstabs().indexOf(djcross) + "]"; LayoutUtils.registerCustomExpressionParameter((DynamicJasperDesign) getDesign(), name, caption.getLabelExpression()); - String invocationText = ExpressionUtils.createCustomExpressionInvocationText(caption.getLabelExpression(), name); + String invocationText = ExpressionUtils.createCustomExpressionInvocationText(caption.getLabelExpression(), name, false); captExp = ExpressionUtils.createExpression(invocationText, caption.getLabelExpression().getClassName()); log.debug(invocationText); } else //a simple text @@ -1028,7 +1028,7 @@ protected void placeVariableInBand(List variables, DJGroup djGroup, JRDesignGrou if (label.isJasperExpression()) //a text with things like "$F{myField}" labelExp = ExpressionUtils.createStringExpression(label.getText()); else if (label.getLabelExpression() != null){ - labelExp = ExpressionUtils.createExpression(variableName + "_labelExpression", label.getLabelExpression()); + labelExp = ExpressionUtils.createExpression(variableName + "_labelExpression", label.getLabelExpression(), false); } else //a simple text //labelExp = ExpressionUtils.createStringExpression("\""+ Utils.escapeTextForExpression(label.getText())+ "\""); labelExp = ExpressionUtils.createStringExpression("\""+ label.getText() + "\""); @@ -1056,7 +1056,7 @@ else if (label.getLabelExpression() != null){ textField.setEvaluationTime( EvaluationTimeEnum.GROUP ); if (var.getValueExpression() != null) { - expression = ExpressionUtils.createExpression(variableName + "_valueExpression", var.getValueExpression()); + expression = ExpressionUtils.createExpression(variableName + "_valueExpression", var.getValueExpression(), false); } else setTextAndClassToExpression(expression,var,col,variableName); @@ -1118,7 +1118,7 @@ else if (defStyle != null) applyStyleToElement(defStyle, textField); if (var.getPrintWhenExpression() != null) { - JRDesignExpression exp = ExpressionUtils.createExpression(variableName + "_printWhenExpression", var.getPrintWhenExpression()); + JRDesignExpression exp = ExpressionUtils.createExpression(variableName + "_printWhenExpression", var.getPrintWhenExpression(), false); textField.setPrintWhenExpression(exp); if (labelTf != null) labelTf.setPrintWhenExpression(exp); diff --git a/src/main/java/ar/com/fdvs/dj/core/layout/Dj2JrCrosstabBuilder.java b/src/main/java/ar/com/fdvs/dj/core/layout/Dj2JrCrosstabBuilder.java index 391a0173..c756c1ca 100644 --- a/src/main/java/ar/com/fdvs/dj/core/layout/Dj2JrCrosstabBuilder.java +++ b/src/main/java/ar/com/fdvs/dj/core/layout/Dj2JrCrosstabBuilder.java @@ -657,7 +657,7 @@ private void setUpConditionStyles(JRDesignStyle jrstyle, DJCrosstabMeasure djmea * MOVED INSIDE ExpressionUtils * protected JRDesignExpression getExpressionForConditionalStyle(ConditionalStyle condition, String columExpression) { - String fieldsMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFiels()"; + String fieldsMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFields()"; String parametersMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentParams()"; String variablesMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentVariables()"; diff --git a/src/main/java/ar/com/fdvs/dj/core/registration/DJGroupRegistrationManager.java b/src/main/java/ar/com/fdvs/dj/core/registration/DJGroupRegistrationManager.java index ceec1df6..6c811593 100644 --- a/src/main/java/ar/com/fdvs/dj/core/registration/DJGroupRegistrationManager.java +++ b/src/main/java/ar/com/fdvs/dj/core/registration/DJGroupRegistrationManager.java @@ -30,7 +30,6 @@ package ar.com.fdvs.dj.core.registration; import net.sf.jasperreports.engine.JRException; -import net.sf.jasperreports.engine.JRSection; import net.sf.jasperreports.engine.design.*; import net.sf.jasperreports.engine.type.CalculationEnum; @@ -186,7 +185,7 @@ protected void useVariableForCustomExpression(JRDesignGroup group, gvar.setCalculation( CalculationEnum.NOTHING ); gvar.setValueClassName(customExpression.getClassName()); - String expText = ExpressionUtils.createCustomExpressionInvocationText(customExpression, expToGroupByName); + String expText = ExpressionUtils.createCustomExpressionInvocationText(customExpression, expToGroupByName, false); JRDesignExpression gvarExp = new JRDesignExpression(); gvarExp.setValueClassName(customExpression.getClassName()); gvarExp.setText(expText); diff --git a/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ExpressionColumn.java b/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ExpressionColumn.java index 543a96ea..09b08f96 100644 --- a/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ExpressionColumn.java +++ b/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ExpressionColumn.java @@ -101,7 +101,7 @@ public String getTextForExpression() { if (this.calculatedExpressionText != null) return this.calculatedExpressionText; - String stringExpression = ExpressionUtils.createCustomExpressionInvocationText(expression, getColumnProperty().getProperty()); + String stringExpression = ExpressionUtils.createCustomExpressionInvocationText(expression, getColumnProperty().getProperty(), false); log.debug("Expression for CustomExpression = " + stringExpression); @@ -111,7 +111,7 @@ public String getTextForExpression() { public String getTextForExpressionForCalculartion() { - String stringExpression = ExpressionUtils.createCustomExpressionInvocationText(expressionForCalculation, getColumnProperty().getProperty()+"_calc"); + String stringExpression = ExpressionUtils.createCustomExpressionInvocationText(expressionForCalculation, getColumnProperty().getProperty()+"_calc", false); log.debug("Calculation Expression for CustomExpression = " + stringExpression); diff --git a/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ImageColumn.java b/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ImageColumn.java index f3855c7e..ed3a7d63 100644 --- a/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ImageColumn.java +++ b/src/main/java/ar/com/fdvs/dj/domain/entities/columns/ImageColumn.java @@ -75,7 +75,7 @@ public String getTextForExpression() { if (getCalculatedExpressionText() != null) return getCalculatedExpressionText(); - String stringExpression = ExpressionUtils.createCustomExpressionInvocationText(getExpression(),getColumnProperty().getProperty()); + String stringExpression = ExpressionUtils.createCustomExpressionInvocationText(getExpression(),getColumnProperty().getProperty(), false); log.debug("Image Column Expression for CustomExpression = " + stringExpression); diff --git a/src/main/java/ar/com/fdvs/dj/util/ExpressionUtils.java b/src/main/java/ar/com/fdvs/dj/util/ExpressionUtils.java index 5fff0131..5d432d50 100644 --- a/src/main/java/ar/com/fdvs/dj/util/ExpressionUtils.java +++ b/src/main/java/ar/com/fdvs/dj/util/ExpressionUtils.java @@ -60,314 +60,343 @@ public class ExpressionUtils { - private static final String REPORT_PARAMETERS_MAP = "$P{REPORT_PARAMETERS_MAP}"; - - /** - * Returns an expression that points to a java.util.Map object with the parameters to - * be used during the subreport fill time. - * Posibilities are:
- * - Use Partent report Map
- * - Use a Map that is a parameter of the partents map
- * - Use a property of the current row. - * @param sr - * @return - */ - public static JRDesignExpression getParameterExpression(Subreport sr) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClassName(java.util.Map.class.getName()); - if (sr.isUseParentReportParameters()){ - exp.setText(REPORT_PARAMETERS_MAP); - return exp; - } - - if (sr.getParametersExpression() == null) - return null; - - if (sr.getParametersMapOrigin() == DJConstants.SUBREPORT_PARAMETER_MAP_ORIGIN_PARAMETER){ - exp.setText(REPORT_PARAMETERS_MAP + ".get( \""+ sr.getParametersExpression() +"\" )"); - return exp; - } - - if (sr.getParametersMapOrigin() == DJConstants.SUBREPORT_PARAMETER_MAP_ORIGIN_FIELD){ - exp.setText("$F{"+ sr.getParametersExpression() +"}"); - return exp; - } - - return null; - } - - /** - * Returns the expression string required - * @param ds - * @return - */ - public static JRDesignExpression getDataSourceExpression(DJDataSource ds) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClass(JRDataSource.class); - - String dsType = getDataSourceTypeStr(ds.getDataSourceType()); - String expText = null; - if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_ORIGIN_FIELD){ - expText = dsType + "$F{" + ds.getDataSourceExpression() + "})"; - } else if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_ORIGIN_PARAMETER){ - expText = dsType + REPORT_PARAMETERS_MAP + ".get( \""+ ds.getDataSourceExpression() +"\" ) )"; - } else if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_TYPE_SQL_CONNECTION) { - expText = dsType + REPORT_PARAMETERS_MAP + ".get( \""+ ds.getDataSourceExpression() +"\" ) )"; - } else if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_ORIGIN_REPORT_DATASOURCE) { - - expText = "((" + JRDataSource.class.getName()+ ")" + REPORT_PARAMETERS_MAP + ".get( \"REPORT_DATA_SOURCE\" ) )"; - } - - exp.setText(expText); - - return exp; - } - public static JRDesignExpression getConnectionExpression(DJDataSource ds) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClass(Connection.class); - - String dsType = getDataSourceTypeStr(ds.getDataSourceType()); - String expText = dsType + REPORT_PARAMETERS_MAP + ".get( \""+ ds.getDataSourceExpression() +"\" ) )"; - - exp.setText(expText); - - return exp; - } - - /** - * Returns a JRDesignExpression that points to the main report connection - * @return - */ - public static JRDesignExpression getReportConnectionExpression() { - JRDesignExpression connectionExpression = new JRDesignExpression(); - connectionExpression.setText("$P{"+JRDesignParameter.REPORT_CONNECTION+"}"); - connectionExpression.setValueClass(Connection.class); - return connectionExpression; - } - - protected static String getDataSourceTypeStr(int datasourceType) { - //TODO Complete all other possible types - String dsType = "("; - if (DJConstants.DATA_SOURCE_TYPE_COLLECTION == datasourceType){ - dsType = "new "+JRBeanCollectionDataSource.class.getName()+"((java.util.Collection)"; - } - else if (DJConstants.DATA_SOURCE_TYPE_ARRAY == datasourceType){ - dsType = "new "+JRBeanArrayDataSource.class.getName()+"((Object[])"; - } - else if (DJConstants.DATA_SOURCE_TYPE_RESULTSET == datasourceType){ - dsType = "new "+JRResultSetDataSource.class.getName()+"(("+ResultSet.class.getName() +")"; - } - else if (DJConstants.DATA_SOURCE_TYPE_JRDATASOURCE == datasourceType){ - dsType = "(("+JRDataSource.class.getName() +")"; - } - else if (DJConstants.DATA_SOURCE_TYPE_SQL_CONNECTION == datasourceType){ - dsType = "(("+Connection.class.getName() +")"; - } - return dsType; - } - - public static JRDesignExpression createStringExpression(String text) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClass(String.class); - exp.setText(text); - return exp; - } - public static JRDesignExpression createExpression(String text, Class clazz) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClass(clazz); - exp.setText(text); - return exp; - } - public static JRDesignExpression createExpression(String text, String className) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClassName(className); - exp.setText(text); - return exp; - } - - public static JRDesignExpression createExpression(JasperDesign jasperDesign,SubreportParameter sp) { - JRDesignExpression exp = new JRDesignExpression(); - exp.setValueClassName(sp.getClassName()); - String text = null; - if (sp.getParameterOrigin()== DJConstants.SUBREPORT_PARAM_ORIGIN_FIELD){ - text = "$F{" + sp.getExpression() + "}"; - //We need to set proper class type to expression according to field class - if (sp.getClassName() == null){ - JRDesignField jrField = (JRDesignField) jasperDesign.getFieldsMap().get(sp.getExpression()); - if (jrField != null) - exp.setValueClass(jrField.getValueClass()); - else - exp.setValueClass(Object.class); - } - } else if (sp.getParameterOrigin()== DJConstants.SUBREPORT_PARAM_ORIGIN_PARAMETER){ - text = REPORT_PARAMETERS_MAP + ".get( \""+ sp.getExpression() +"\")"; - } else if (sp.getParameterOrigin()== DJConstants.SUBREPORT_PARAM_ORIGIN_VARIABLE){ - text = "$V{" + sp.getExpression() + "}"; - } else { //CUSTOM - text = sp.getExpression(); - } - exp.setText(text); - return exp; - } - - public static JRDesignExpression createAndRegisterExpression(DynamicJasperDesign design, String name, CustomExpression expression) { - LayoutUtils.registerCustomExpressionParameter(design, name, expression); - return createExpression(name, expression); - } - - public static JRDesignExpression createExpression(String name, CustomExpression expression) { - String text = ExpressionUtils.createCustomExpressionInvocationText(expression, name); - return createExpression(text, expression.getClassName()); - } - - /** - * - * @param Collection of ColumnProperty - * @return - */ - public static String getFieldsMapExpression(Collection columnsAndFields) { - StringBuffer fieldsMap = new StringBuffer("new " + PropertiesMap.class.getName() + "()" ); - for (Iterator iter = columnsAndFields.iterator(); iter.hasNext();) { - ColumnProperty columnProperty = (ColumnProperty) iter.next(); - - if (columnProperty != null) { - String propname = columnProperty.getProperty(); - fieldsMap.append(".with(\"" + propname + "\",$F{" + propname + "})"); - } - } - - return fieldsMap.toString(); - } - - /** - * Collection of JRVariable - * @param variables - * @return - */ - public static String getVariablesMapExpression(Collection variables) { - StringBuffer variablesMap = new StringBuffer("new " + PropertiesMap.class.getName() + "()"); - for (Iterator iter = variables.iterator(); iter.hasNext();) { - JRVariable jrvar = (JRVariable) iter.next(); - String varname = jrvar.getName(); - variablesMap.append(".with(\"" + varname + "\",$V{" + varname + "})"); - } - return variablesMap.toString(); - } - - - public static String getParametersMapExpression() { - return "new " + PropertiesMap.class.getName() + "($P{" + DJConstants.CUSTOM_EXPRESSION__PARAMETERS_MAP +"} )"; - } - - - public static String createParameterName(String preffix, Object obj) { - String name = obj.toString().substring(obj.toString().lastIndexOf(".")+1).replaceAll("[\\$@]", "_"); - return preffix + name; - } - - - /** - * If you register a CustomExpression with the name "customExpName", then this will create the text needed - * to invoke it in a JRDesignExpression - * @param customExpName - * @return - */ - public static String createCustomExpressionInvocationText(CustomExpression customExpression, String customExpName) { - String stringExpression = null; - if (customExpression instanceof DJSimpleExpression) { - DJSimpleExpression varexp = (DJSimpleExpression)customExpression; - String symbol = null; - switch(varexp.getType()){ - case DJSimpleExpression.TYPE_FIELD: - symbol = "F"; - break; - case DJSimpleExpression.TYPE_VARIABLE: - symbol = "V"; - break; - case DJSimpleExpression.TYPE_PARAMATER: - symbol = "P"; - break; - default: - throw new DJException("Invalid DJSimpleExpression, type must be FIELD, VARIABLE or PARAMETER"); - } - stringExpression = "$" +symbol + "{" + varexp.getVariableName() + "}"; - - } else { - String fieldsMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFiels()"; - String parametersMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentParams()"; - String variablesMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentVariables()"; - - stringExpression = "(("+CustomExpression.class.getName()+")$P{REPORT_PARAMETERS_MAP}.get(\""+customExpName+"\"))." - +CustomExpression.EVAL_METHOD_NAME+"( "+ fieldsMap +", " + variablesMap + ", " + parametersMap +" )"; - } - - return stringExpression; - } - - /** - * Same as regular, but instead of invoking directly $P{REPORT_SCRIPTLET}, it does through the $P{REPORT_PARAMETERS_MAP} - * @param customExpName - * @return - */ - public static String createCustomExpressionInvocationText2(String customExpName) { - - String fieldsMap = getTextForFieldsFromScriptlet(); - String parametersMap = getTextForParametersFromScriptlet(); - String variablesMap = getTextForVariablesFromScriptlet(); - + private static final String REPORT_PARAMETERS_MAP = "$P{REPORT_PARAMETERS_MAP}"; + + /** + * Returns an expression that points to a java.util.Map object with the parameters to + * be used during the subreport fill time. + * Posibilities are:
+ * - Use Partent report Map
+ * - Use a Map that is a parameter of the partents map
+ * - Use a property of the current row. + * + * @param sr + * @return + */ + public static JRDesignExpression getParameterExpression(Subreport sr) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClassName(java.util.Map.class.getName()); + if (sr.isUseParentReportParameters()) { + exp.setText(REPORT_PARAMETERS_MAP); + return exp; + } + + if (sr.getParametersExpression() == null) + return null; + + if (sr.getParametersMapOrigin() == DJConstants.SUBREPORT_PARAMETER_MAP_ORIGIN_PARAMETER) { + exp.setText(REPORT_PARAMETERS_MAP + ".get( \"" + sr.getParametersExpression() + "\" )"); + return exp; + } + + if (sr.getParametersMapOrigin() == DJConstants.SUBREPORT_PARAMETER_MAP_ORIGIN_FIELD) { + exp.setText("$F{" + sr.getParametersExpression() + "}"); + return exp; + } + + return null; + } + + /** + * Returns the expression string required + * + * @param ds + * @return + */ + public static JRDesignExpression getDataSourceExpression(DJDataSource ds) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClass(JRDataSource.class); + + String dsType = getDataSourceTypeStr(ds.getDataSourceType()); + String expText = null; + if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_ORIGIN_FIELD) { + expText = dsType + "$F{" + ds.getDataSourceExpression() + "})"; + } else if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_ORIGIN_PARAMETER) { + expText = dsType + REPORT_PARAMETERS_MAP + ".get( \"" + ds.getDataSourceExpression() + "\" ) )"; + } else if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_TYPE_SQL_CONNECTION) { + expText = dsType + REPORT_PARAMETERS_MAP + ".get( \"" + ds.getDataSourceExpression() + "\" ) )"; + } else if (ds.getDataSourceOrigin() == DJConstants.DATA_SOURCE_ORIGIN_REPORT_DATASOURCE) { + + expText = "((" + JRDataSource.class.getName() + ")" + REPORT_PARAMETERS_MAP + ".get( \"REPORT_DATA_SOURCE\" ) )"; + } + + exp.setText(expText); + + return exp; + } + + public static JRDesignExpression getConnectionExpression(DJDataSource ds) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClass(Connection.class); + + String dsType = getDataSourceTypeStr(ds.getDataSourceType()); + String expText = dsType + REPORT_PARAMETERS_MAP + ".get( \"" + ds.getDataSourceExpression() + "\" ) )"; + + exp.setText(expText); + + return exp; + } + + /** + * Returns a JRDesignExpression that points to the main report connection + * + * @return + */ + public static JRDesignExpression getReportConnectionExpression() { + JRDesignExpression connectionExpression = new JRDesignExpression(); + connectionExpression.setText("$P{" + JRDesignParameter.REPORT_CONNECTION + "}"); + connectionExpression.setValueClass(Connection.class); + return connectionExpression; + } + + protected static String getDataSourceTypeStr(int datasourceType) { + //TODO Complete all other possible types + String dsType = "("; + if (DJConstants.DATA_SOURCE_TYPE_COLLECTION == datasourceType) { + dsType = "new " + JRBeanCollectionDataSource.class.getName() + "((java.util.Collection)"; + } else if (DJConstants.DATA_SOURCE_TYPE_ARRAY == datasourceType) { + dsType = "new " + JRBeanArrayDataSource.class.getName() + "((Object[])"; + } else if (DJConstants.DATA_SOURCE_TYPE_RESULTSET == datasourceType) { + dsType = "new " + JRResultSetDataSource.class.getName() + "((" + ResultSet.class.getName() + ")"; + } else if (DJConstants.DATA_SOURCE_TYPE_JRDATASOURCE == datasourceType) { + dsType = "((" + JRDataSource.class.getName() + ")"; + } else if (DJConstants.DATA_SOURCE_TYPE_SQL_CONNECTION == datasourceType) { + dsType = "((" + Connection.class.getName() + ")"; + } + return dsType; + } + + public static JRDesignExpression createStringExpression(String text) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClass(String.class); + exp.setText(text); + return exp; + } + + public static JRDesignExpression createExpression(String text, Class clazz) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClass(clazz); + exp.setText(text); + return exp; + } + + public static JRDesignExpression createExpression(String text, String className) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClassName(className); + exp.setText(text); + return exp; + } + + public static JRDesignExpression createExpression(JasperDesign jasperDesign, SubreportParameter sp) { + JRDesignExpression exp = new JRDesignExpression(); + exp.setValueClassName(sp.getClassName()); + String text = null; + if (sp.getParameterOrigin() == DJConstants.SUBREPORT_PARAM_ORIGIN_FIELD) { + text = "$F{" + sp.getExpression() + "}"; + //We need to set proper class type to expression according to field class + if (sp.getClassName() == null) { + JRDesignField jrField = (JRDesignField) jasperDesign.getFieldsMap().get(sp.getExpression()); + if (jrField != null) + exp.setValueClass(jrField.getValueClass()); + else + exp.setValueClass(Object.class); + } + } else if (sp.getParameterOrigin() == DJConstants.SUBREPORT_PARAM_ORIGIN_PARAMETER) { + text = REPORT_PARAMETERS_MAP + ".get( \"" + sp.getExpression() + "\")"; + } else if (sp.getParameterOrigin() == DJConstants.SUBREPORT_PARAM_ORIGIN_VARIABLE) { + text = "$V{" + sp.getExpression() + "}"; + } else { //CUSTOM + text = sp.getExpression(); + } + exp.setText(text); + return exp; + } + + public static JRDesignExpression createAndRegisterExpression(DynamicJasperDesign design, String name, CustomExpression expression) { + LayoutUtils.registerCustomExpressionParameter(design, name, expression); + return createExpression(name, expression, false); + } + + /** + * Use {@link #createAndRegisterExpression(DynamicJasperDesign, String, CustomExpression)} + * This deprecated version may cause wrong field values when expression is executed in a group footer + * @param name + * @param expression + * @return + */ + @Deprecated + public static JRDesignExpression createExpression(String name, CustomExpression expression) { + return createExpression(name, expression, false); + } + + /** + * + * @param name + * @param expression + * @param usePreviousFieldValues if true, the Map with field values passed to the CustomExpresion contains the previous + * field value. This is needed when in group footer bands were at the time executing the + * CustomExpression the fields values already corresponds to the next group value. + * @return + */ + public static JRDesignExpression createExpression(String name, CustomExpression expression, boolean usePreviousFieldValues) { + String text = ExpressionUtils.createCustomExpressionInvocationText(expression, name, usePreviousFieldValues); + return createExpression(text, expression.getClassName()); + } + + /** + * @param Collection of ColumnProperty + * @return + */ + public static String getFieldsMapExpression(Collection columnsAndFields) { + StringBuffer fieldsMap = new StringBuffer("new " + PropertiesMap.class.getName() + "()"); + for (Iterator iter = columnsAndFields.iterator(); iter.hasNext(); ) { + ColumnProperty columnProperty = (ColumnProperty) iter.next(); + + if (columnProperty != null) { + String propname = columnProperty.getProperty(); + fieldsMap.append(".with(\"" + propname + "\",$F{" + propname + "})"); + } + } + + return fieldsMap.toString(); + } + + /** + * Collection of JRVariable + * + * @param variables + * @return + */ + public static String getVariablesMapExpression(Collection variables) { + StringBuffer variablesMap = new StringBuffer("new " + PropertiesMap.class.getName() + "()"); + for (Iterator iter = variables.iterator(); iter.hasNext(); ) { + JRVariable jrvar = (JRVariable) iter.next(); + String varname = jrvar.getName(); + variablesMap.append(".with(\"" + varname + "\",$V{" + varname + "})"); + } + return variablesMap.toString(); + } + + + public static String getParametersMapExpression() { + return "new " + PropertiesMap.class.getName() + "($P{" + DJConstants.CUSTOM_EXPRESSION__PARAMETERS_MAP + "} )"; + } + + + public static String createParameterName(String preffix, Object obj) { + String name = obj.toString().substring(obj.toString().lastIndexOf(".") + 1).replaceAll("[\\$@]", "_"); + return preffix + name; + } + + + /** + * If you register a CustomExpression with the name "customExpName", then this will create the text needed + * to invoke it in a JRDesignExpression + * + * @param customExpName + * @param usePreviousFieldValues + * @return + */ + public static String createCustomExpressionInvocationText(CustomExpression customExpression, String customExpName, boolean usePreviousFieldValues) { + String stringExpression = null; + if (customExpression instanceof DJSimpleExpression) { + DJSimpleExpression varexp = (DJSimpleExpression) customExpression; + String symbol = null; + switch (varexp.getType()) { + case DJSimpleExpression.TYPE_FIELD: + symbol = "F"; + break; + case DJSimpleExpression.TYPE_VARIABLE: + symbol = "V"; + break; + case DJSimpleExpression.TYPE_PARAMATER: + symbol = "P"; + break; + default: + throw new DJException("Invalid DJSimpleExpression, type must be FIELD, VARIABLE or PARAMETER"); + } + stringExpression = "$" + symbol + "{" + varexp.getVariableName() + "}"; + + } else { + String fieldsMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFields()"; + if (usePreviousFieldValues) { + fieldsMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getPreviousFields()"; + } + + String parametersMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentParams()"; + String variablesMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentVariables()"; + + stringExpression = "((" + CustomExpression.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"" + customExpName + "\"))." + + CustomExpression.EVAL_METHOD_NAME + "( " + fieldsMap + ", " + variablesMap + ", " + parametersMap + " )"; + } + + return stringExpression; + } + + /** + * Same as regular, but instead of invoking directly $P{REPORT_SCRIPTLET}, it does through the $P{REPORT_PARAMETERS_MAP} + * + * @param customExpName + * @return + */ + public static String createCustomExpressionInvocationText2(String customExpName) { + + String fieldsMap = getTextForFieldsFromScriptlet(); + String parametersMap = getTextForParametersFromScriptlet(); + String variablesMap = getTextForVariablesFromScriptlet(); + // String stringExpression = "((("+CustomExpression.class.getName()+")$P{"+customExpName+"})." // +CustomExpression.EVAL_METHOD_NAME+"( "+ fieldsMap +", " + variablesMap + ", " + parametersMap +" ))"; - - String stringExpression = "(("+CustomExpression.class.getName()+")$P{REPORT_PARAMETERS_MAP}.get(\""+customExpName+"\"))." - +CustomExpression.EVAL_METHOD_NAME+"( "+ fieldsMap +", " + variablesMap + ", " + parametersMap +" )"; - - return stringExpression; - } - - public static String getTextForVariablesFromScriptlet() { - return "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"REPORT_SCRIPTLET\")).getCurrentVariables()"; - } - - public static String getTextForParametersFromScriptlet() { - return "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"REPORT_SCRIPTLET\")).getCurrentParams()"; - } - - public static String getTextForFieldsFromScriptlet() { - return "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"REPORT_SCRIPTLET\")).getCurrentFiels()"; - } - - public static String getValueClassNameForOperation(DJCalculation calc, ColumnProperty prop) { - if (calc == DJCalculation.COUNT || calc == DJCalculation.DISTINCT_COUNT) - return Number.class.getName(); - else - return prop.getValueClassName(); - - } - - public static String getInitialValueExpressionForOperation(DJCalculation calc, ColumnProperty prop) { - if (calc == DJCalculation.COUNT || calc == DJCalculation.DISTINCT_COUNT) - return "new java.lang.Long(\"0\")"; - else if (calc == DJCalculation.SUM) - return "new " + prop.getValueClassName()+"(\"0\")"; - else return null; - - } - - - public static JRDesignExpression getExpressionForConditionalStyle(ConditionalStyle condition, String columExpression) { - String fieldsMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFiels()"; - String parametersMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentParams()"; - String variablesMap = "(("+DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentVariables()"; - - String evalMethodParams = fieldsMap +", " + variablesMap + ", " + parametersMap + ", " + columExpression; - - String text = "(("+ConditionStyleExpression.class.getName()+")$P{" + JRParameter.REPORT_PARAMETERS_MAP + "}.get(\""+condition.getName()+"\"))."+CustomExpression.EVAL_METHOD_NAME+"("+evalMethodParams+")"; - JRDesignExpression expression = new JRDesignExpression(); - expression.setValueClass(Boolean.class); - expression.setText(text); - return expression; - } - - + + String stringExpression = "((" + CustomExpression.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"" + customExpName + "\"))." + + CustomExpression.EVAL_METHOD_NAME + "( " + fieldsMap + ", " + variablesMap + ", " + parametersMap + " )"; + + return stringExpression; + } + + public static String getTextForVariablesFromScriptlet() { + return "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"REPORT_SCRIPTLET\")).getCurrentVariables()"; + } + + public static String getTextForParametersFromScriptlet() { + return "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"REPORT_SCRIPTLET\")).getCurrentParams()"; + } + + public static String getTextForFieldsFromScriptlet() { + return "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_PARAMETERS_MAP}.get(\"REPORT_SCRIPTLET\")).getCurrentFields()"; + } + + public static String getValueClassNameForOperation(DJCalculation calc, ColumnProperty prop) { + if (calc == DJCalculation.COUNT || calc == DJCalculation.DISTINCT_COUNT) + return Number.class.getName(); + else + return prop.getValueClassName(); + + } + + public static String getInitialValueExpressionForOperation(DJCalculation calc, ColumnProperty prop) { + if (calc == DJCalculation.COUNT || calc == DJCalculation.DISTINCT_COUNT) + return "new java.lang.Long(\"0\")"; + else if (calc == DJCalculation.SUM) + return "new " + prop.getValueClassName() + "(\"0\")"; + else return null; + + } + + + public static JRDesignExpression getExpressionForConditionalStyle(ConditionalStyle condition, String columExpression) { + String fieldsMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentFields()"; + String parametersMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentParams()"; + String variablesMap = "((" + DJDefaultScriptlet.class.getName() + ")$P{REPORT_SCRIPTLET}).getCurrentVariables()"; + + String evalMethodParams = fieldsMap + ", " + variablesMap + ", " + parametersMap + ", " + columExpression; + + String text = "((" + ConditionStyleExpression.class.getName() + ")$P{" + JRParameter.REPORT_PARAMETERS_MAP + "}.get(\"" + condition.getName() + "\"))." + CustomExpression.EVAL_METHOD_NAME + "(" + evalMethodParams + ")"; + JRDesignExpression expression = new JRDesignExpression(); + expression.setValueClass(Boolean.class); + expression.setText(text); + return expression; + } + } diff --git a/src/main/java/ar/com/fdvs/dj/util/HyperLinkUtil.java b/src/main/java/ar/com/fdvs/dj/util/HyperLinkUtil.java index a02e710d..8bf730e3 100644 --- a/src/main/java/ar/com/fdvs/dj/util/HyperLinkUtil.java +++ b/src/main/java/ar/com/fdvs/dj/util/HyperLinkUtil.java @@ -1,6 +1,5 @@ package ar.com.fdvs.dj.util; -import net.sf.jasperreports.engine.JRHyperlink; import net.sf.jasperreports.engine.design.JRDesignChart; import net.sf.jasperreports.engine.design.JRDesignExpression; import net.sf.jasperreports.engine.design.JRDesignImage; @@ -28,7 +27,7 @@ public class HyperLinkUtil { public static void applyHyperLinkToElement(DynamicJasperDesign design, DJHyperLink djlink, JRDesignImage image, String name) { StringExpression hce = djlink.getExpression(); - String text = ExpressionUtils.createCustomExpressionInvocationText(djlink.getExpression(), name); + String text = ExpressionUtils.createCustomExpressionInvocationText(djlink.getExpression(), name, false); LayoutUtils.registerCustomExpressionParameter(design, name,hce); JRDesignExpression hlpe = new JRDesignExpression(); hlpe.setValueClassName(hce.getClassName()); @@ -40,7 +39,7 @@ public static void applyHyperLinkToElement(DynamicJasperDesign design, DJHyperLi if (djlink.getTooltip() != null){ StringExpression sExp = djlink.getTooltip(); String tooltipParameterName = "hyperlink_tooltip_" +name; - String tooltipText = ExpressionUtils.createCustomExpressionInvocationText(djlink.getExpression(), tooltipParameterName); + String tooltipText = ExpressionUtils.createCustomExpressionInvocationText(djlink.getExpression(), tooltipParameterName, false); LayoutUtils.registerCustomExpressionParameter(design, tooltipParameterName,sExp); JRDesignExpression tooltipExp = new JRDesignExpression(); tooltipExp.setValueClassName(sExp.getClassName()); diff --git a/src/test/java/ar/com/fdvs/dj/test/ReportExporter.java b/src/test/java/ar/com/fdvs/dj/test/ReportExporter.java index db938a00..01ee5c6f 100644 --- a/src/test/java/ar/com/fdvs/dj/test/ReportExporter.java +++ b/src/test/java/ar/com/fdvs/dj/test/ReportExporter.java @@ -39,6 +39,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; +import java.util.Map; public class ReportExporter { /** @@ -54,6 +55,10 @@ public class ReportExporter { * @throws FileNotFoundException */ public static void exportReport(JasperPrint jp, String path) throws JRException, FileNotFoundException{ + exportReport(jp,path,null); + } + + public static void exportReport(JasperPrint jp, String path, MapexporterParams) throws JRException, FileNotFoundException { logger.debug("Exporing report to: " + path); JRPdfExporter exporter = new JRPdfExporter(); @@ -66,6 +71,12 @@ public static void exportReport(JasperPrint jp, String path) throws JRException, exporter.setParameter(JRExporterParameter.JASPER_PRINT, jp); exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, fos); + if (exporterParams != null) { + for (Map.Entry entry : exporterParams.entrySet()) { + exporter.setParameter(entry.getKey(), entry.getValue()); + } + } + exporter.exportReport(); logger.debug("Report exported: " + path); diff --git a/src/test/java/ar/com/fdvs/dj/test/domain/Product.java b/src/test/java/ar/com/fdvs/dj/test/domain/Product.java index e95d8df7..ca064a51 100644 --- a/src/test/java/ar/com/fdvs/dj/test/domain/Product.java +++ b/src/test/java/ar/com/fdvs/dj/test/domain/Product.java @@ -186,4 +186,9 @@ public String getCode() { return "001-123ABC-HRC"; } } + + @Override + public String toString() { + return "" + id + "|" + productLine + "|" + item + "|" + state; + } } diff --git a/src/test/java/ar/com/fdvs/dj/test/encoding/UTF8ReportTest.java b/src/test/java/ar/com/fdvs/dj/test/encoding/UTF8ReportTest.java new file mode 100644 index 00000000..e46d9178 --- /dev/null +++ b/src/test/java/ar/com/fdvs/dj/test/encoding/UTF8ReportTest.java @@ -0,0 +1,151 @@ +/* + * DynamicJasper: A library for creating reports dynamically by specifying + * columns, groups, styles, etc. at runtime. It also saves a lot of development + * time in many cases! (http://sourceforge.net/projects/dynamicjasper) + * + * Copyright (C) 2008 FDV Solutions (http://www.fdvsolutions.com) + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * + */ + +package ar.com.fdvs.dj.test.encoding; + + +import ar.com.fdvs.dj.domain.DJCalculation; +import ar.com.fdvs.dj.domain.DJValueFormatter; +import ar.com.fdvs.dj.domain.DynamicReport; +import ar.com.fdvs.dj.domain.Style; +import ar.com.fdvs.dj.domain.builders.FastReportBuilder; +import ar.com.fdvs.dj.domain.constants.Font; +import ar.com.fdvs.dj.test.BaseDjReportTest; +import ar.com.fdvs.dj.test.ReportExporter; +import ar.com.fdvs.dj.test.domain.Product; +import net.sf.jasperreports.engine.JRDataSource; +import net.sf.jasperreports.engine.JRExporterParameter; +import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; +import net.sf.jasperreports.engine.export.JRPdfExporterParameter; +import net.sf.jasperreports.view.JasperDesignViewer; +import net.sf.jasperreports.view.JasperViewer; +import org.mozilla.universalchardet.UniversalDetector; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.*; + +public class UTF8ReportTest extends BaseDjReportTest { + + public static final String PDF_FONT_ENCODING = "ISO-8859-2"; + + /** + * For a list of supported encodings: http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html + */ + + + public DynamicReport buildReport() throws Exception { + + + Style titleStyle = Style.createBlankStyle("title"); + Style subtitleStyle = Style.createBlankStyle("subtitleStyle"); + Style headerStyle = Style.createBlankStyle("headerStyle"); + Style detailStyle = Style.createBlankStyle("detailStyle"); + + String encoding = PDF_FONT_ENCODING; + + log.debug("ENCODING IS: " + encoding); + + titleStyle.setFont(new Font(18, "Arial", "Arial", encoding, false)); + subtitleStyle.setFont(new Font(14, "Arial", "Arial", encoding, false)); + detailStyle.setFont(new Font(10, "Arial", "Arial", encoding, false)); + + /** + * Creates the DynamicReportBuilder and sets the basic options for + * the report + */ + FastReportBuilder drb = new FastReportBuilder(); + drb.addColumn("State", "state", String.class.getName(), 30) + .addColumn("Branch", "branch", String.class.getName(), 30) + .addColumn("Product Line", "productLine", String.class.getName(), 50) + .addColumn("Item", "item", String.class.getName(), 50) + .addColumn("Item Code", "id", Long.class.getName(), 30, true) + .addColumn("Quantity", "quantity", Long.class.getName(), 60, true) + .addColumn("Amount", "amount", Float.class.getName(), 70, true) + .addGroups(2) + .setTitle("Report with Polish letters") + .setSubtitle("ĄĆ\tĘ\tŁ\tŃ\tÓ\tŚ\tŹ\tŻ\tą\tć\tę\tł\tń\tó\tś\tź\tż") + .setPrintBackgroundOnOddRows(true) + .setDefaultStyles(titleStyle, subtitleStyle, headerStyle, detailStyle) + .setUseFullPageWidth(true); + + drb.addGlobalFooterVariable(drb.getColumn(4), DJCalculation.COUNT, null, new DJValueFormatter() { + + public String getClassName() { + return String.class.getName(); + } + + + public Object evaluate(Object value, Map fields, Map variables, Map parameters) { + return (value == null ? "0" : value.toString()) + " Clients"; + } + }); + + + DynamicReport dr = drb.build(); + + return dr; + } + + public static Collection getDummyCollection() { + + SimpleDateFormat dateFormat = new SimpleDateFormat(); + dateFormat.applyPattern("dd/MM/yyyy"); + + List col = new ArrayList(); + + //The collection is ordered by State, Branch and Product Line + col.add(new Product(1l, "book", "ąćęłńóśźż", "abcdefghaijkslmnopqĄĆĘŁŃÓŚŹŻĄĆĘŁŃÓŚŹŻĄĆĘŁŃÓŚŹŻĄĆĘŁŃÓŚŹŻĄĆĘŁŃÓŚŹŻĄĆĘŁ", "Main Street", new Long("2500"), new Float("5"))); + col.add(new Product(1l, "book", "áñö", "ĄĆĘŁŃÓŚŹŻ", "Main Street", new Long("2500"), new Float("5"))); + return col; + } + + @Override + protected void exportReport() throws Exception { + Map exportParams = new HashMap(); + ReportExporter.exportReport(jp, System.getProperty("user.dir") + "/target/reports/" + this.getClass().getName() + ".pdf", exportParams); + exportToJRXML(); + } + + @Override + protected JRDataSource getDataSource() { + return new JRBeanCollectionDataSource(getDummyCollection()); + } + + public static void main(String[] args) throws Exception { + UTF8ReportTest test = new UTF8ReportTest(); + test.testReport(); + test.exportToJRXML(); + JasperViewer.viewReport(test.jp); //finally display the report report + JasperDesignViewer.viewReportDesign(test.jr); + } + +} diff --git a/src/test/java/ar/com/fdvs/dj/test/groups/labels/LabelFooterValuesTest.java b/src/test/java/ar/com/fdvs/dj/test/groups/labels/LabelFooterValuesTest.java new file mode 100644 index 00000000..54340031 --- /dev/null +++ b/src/test/java/ar/com/fdvs/dj/test/groups/labels/LabelFooterValuesTest.java @@ -0,0 +1,99 @@ +/* + * DynamicJasper: A library for creating reports dynamically by specifying + * columns, groups, styles, etc. at runtime. It also saves a lot of development + * time in many cases! (http://sourceforge.net/projects/dynamicjasper) + * + * Copyright (C) 2008 FDV Solutions (http://www.fdvsolutions.com) + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * + */ + +package ar.com.fdvs.dj.test.groups.labels; + + +import ar.com.fdvs.dj.domain.*; +import ar.com.fdvs.dj.domain.builders.FastReportBuilder; +import ar.com.fdvs.dj.domain.constants.LabelPosition; +import ar.com.fdvs.dj.domain.entities.DJGroupVariable; +import ar.com.fdvs.dj.test.BaseDjReportTest; +import net.sf.jasperreports.view.JasperDesignViewer; +import net.sf.jasperreports.view.JasperViewer; + +import java.util.Date; +import java.util.Map; + +public class LabelFooterValuesTest extends BaseDjReportTest { + + public DynamicReport buildReport() throws Exception { + + Style labelStyle = new Style("labelStyle"); + + FastReportBuilder drb = new FastReportBuilder(); + drb.addColumn("State", "state", String.class.getName(), 30) + .addColumn("Branch", "branch", String.class.getName(), 30) + .addColumn("Product Line", "productLine", String.class.getName(), 50) + .addColumn("Item", "item", String.class.getName(), 50) + .addColumn("Item Code", "id", Long.class.getName(), 30, true) + .addColumn("Quantity", "quantity", Long.class.getName(), 60, true) + .addColumn("Amount", "amount", Float.class.getName(), 70, true) + .addGroups(2) + .setTitle("November " + getYear() + " sales report") + .setSubtitle("This report was generated at " + new Date()) + .setPrintBackgroundOnOddRows(true) + .setUseFullPageWidth(true); + + drb.addGlobalFooterVariable(drb.getColumn(4), DJCalculation.COUNT, null, new DJValueFormatter() { + + public String getClassName() { + return String.class.getName(); + } + + + public Object evaluate(Object value, Map fields, Map variables, Map parameters) { + return (value == null ? "0" : value.toString()) + " Clients"; + } + }); + + DJGroupLabel label = new DJGroupLabel(new StringExpression() { + @Override + public Object evaluate(Map fields, Map variables, Map parameters) { + return "SUM for state " + fields.get("state"); + } + },labelStyle, LabelPosition.BOTTOM); + DJGroupVariable groupVariable = new DJGroupVariable(drb.getColumn(5), DJCalculation.SUM, null, null, label); + drb.getGroup(0).addFooterVariable(groupVariable); + + + DynamicReport dr = drb.build(); + + return dr; + } + + public static void main(String[] args) throws Exception { + LabelFooterValuesTest test = new LabelFooterValuesTest(); + test.testReport(); + test.exportToJRXML(); + JasperViewer.viewReport(test.jp); //finally display the report report + JasperDesignViewer.viewReportDesign(test.jr); + } + +}