View Javadoc

1   /*
2    * DynamicJasper: A library for creating reports dynamically by specifying
3    * columns, groups, styles, etc. at runtime. It also saves a lot of development
4    * time in many cases! (http://sourceforge.net/projects/dynamicjasper)
5    *
6    * Copyright (C) 2008  FDV Solutions (http://www.fdvsolutions.com)
7    *
8    * This library is free software; you can redistribute it and/or
9    * modify it under the terms of the GNU Lesser General Public
10   *
11   * License as published by the Free Software Foundation; either
12   *
13   * version 2.1 of the License, or (at your option) any later version.
14   *
15   * This library is distributed in the hope that it will be useful,
16   * but WITHOUT ANY WARRANTY; without even the implied warranty of
17   *
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19   *
20   * Lesser General Public License for more details.
21   *
22   * You should have received a copy of the GNU Lesser General Public
23   * License along with this library; if not, write to the Free Software
24   *
25   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
26   *
27   *
28   */
29  
30  package ar.com.fdvs.dj.test.domain.chart.builder;
31  
32  import java.awt.Color;
33  import java.util.HashMap;
34  import java.util.Map;
35  
36  import net.sf.jasperreports.charts.design.JRDesignBar3DPlot;
37  import net.sf.jasperreports.charts.design.JRDesignCategoryDataset;
38  import net.sf.jasperreports.charts.type.EdgeEnum;
39  import net.sf.jasperreports.engine.JRFont;
40  import net.sf.jasperreports.engine.design.JRDesignChart;
41  import net.sf.jasperreports.engine.design.JRDesignGroup;
42  import net.sf.jasperreports.engine.design.JRDesignVariable;
43  import net.sf.jasperreports.engine.type.LineStyleEnum;
44  import net.sf.jasperreports.view.JasperViewer;
45  import ar.com.fdvs.dj.domain.DJCalculation;
46  import ar.com.fdvs.dj.domain.DJHyperLink;
47  import ar.com.fdvs.dj.domain.DynamicJasperDesign;
48  import ar.com.fdvs.dj.domain.DynamicReport;
49  import ar.com.fdvs.dj.domain.StringExpression;
50  import ar.com.fdvs.dj.domain.Style;
51  import ar.com.fdvs.dj.domain.builders.ColumnBuilder;
52  import ar.com.fdvs.dj.domain.builders.DynamicReportBuilder;
53  import ar.com.fdvs.dj.domain.builders.GroupBuilder;
54  import ar.com.fdvs.dj.domain.chart.DJChart;
55  import ar.com.fdvs.dj.domain.chart.DJChartOptions;
56  import ar.com.fdvs.dj.domain.chart.builder.DJBar3DChartBuilder;
57  import ar.com.fdvs.dj.domain.chart.plot.DJAxisFormat;
58  import ar.com.fdvs.dj.domain.constants.Border;
59  import ar.com.fdvs.dj.domain.constants.Font;
60  import ar.com.fdvs.dj.domain.constants.GroupLayout;
61  import ar.com.fdvs.dj.domain.constants.HorizontalAlign;
62  import ar.com.fdvs.dj.domain.constants.Transparency;
63  import ar.com.fdvs.dj.domain.constants.VerticalAlign;
64  import ar.com.fdvs.dj.domain.entities.DJGroup;
65  import ar.com.fdvs.dj.domain.entities.columns.AbstractColumn;
66  import ar.com.fdvs.dj.domain.entities.columns.PropertyColumn;
67  import ar.com.fdvs.dj.domain.hyperlink.LiteralExpression;
68  import ar.com.fdvs.dj.test.BaseDjReportTest;
69  
70  public class Bar3DChartBuilderTest extends BaseDjReportTest {
71  	private DynamicReportBuilder drb; 
72  	private JRDesignChart chart;
73  	
74  	protected void setUp() throws Exception {
75  		drb = new DynamicReportBuilder();
76  		
77  		Style headerStyle = new Style();
78  		headerStyle.setFont(Font.VERDANA_MEDIUM_BOLD);
79  		headerStyle.setBorderBottom(Border.PEN_2_POINT());
80  		headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
81  		headerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
82  		headerStyle.setBackgroundColor(Color.DARK_GRAY);
83  		headerStyle.setTextColor(Color.WHITE);
84  		headerStyle.setTransparency(Transparency.OPAQUE);
85  		drb.setDefaultStyles(null, null, headerStyle, null);		
86  		
87  		AbstractColumn columnState = ColumnBuilder.getNew()
88  		.setColumnProperty("state", String.class.getName()).setTitle(
89  				"State").setWidth(new Integer(85)).build();
90  		AbstractColumn columnBranch = ColumnBuilder.getNew()
91  		.setColumnProperty("branch", String.class.getName()).setTitle(
92  				"Branch").setWidth(new Integer(85)).build();
93  		AbstractColumn columnaQuantity = ColumnBuilder.getNew()
94  		.setColumnProperty("quantity", Long.class.getName()).setTitle(
95  				"Quantity").setWidth(new Integer(80)).build();
96  		AbstractColumn columnAmount = ColumnBuilder.getNew()
97  		.setColumnProperty("amount", Float.class.getName()).setTitle(
98  				"Amount").setWidth(new Integer(90)).build();
99  
100 		drb.addColumn(columnState);
101 		drb.addColumn(columnBranch);
102 		drb.addColumn(columnaQuantity);
103 		drb.addColumn(columnAmount);
104 		
105 		GroupBuilder gb1 = new GroupBuilder();
106 		DJGroup g1 = gb1.setCriteriaColumn((PropertyColumn) columnState)
107 				.addFooterVariable(columnAmount,DJCalculation.SUM)
108 			.addFooterVariable(columnaQuantity,DJCalculation.SUM) 
109 			.addVariable("group_state_name", columnState, DJCalculation.FIRST)
110 			.setGroupLayout(GroupLayout.DEFAULT) 
111 			.build();		
112 /*		GroupBuilder gb2 = new GroupBuilder(); 
113   		DJGroup g2 = gb2.setCriteriaColumn((PropertyColumn) columnBranch)
114 				.setGroupLayout(GroupLayout.VALUE_FOR_EACH) 
115 				.build();*/
116 		
117 		drb.addGroup(g1);
118 		//drb.addGroup(g2);
119 		
120 		drb.setUseFullPageWidth(true);
121 		
122 		DJAxisFormat categoryAxisFormat = new DJAxisFormat("category");
123 		categoryAxisFormat.setLabelFont(Font.ARIAL_SMALL);
124 		categoryAxisFormat.setLabelColor(Color.DARK_GRAY);
125 		categoryAxisFormat.setTickLabelFont(Font.ARIAL_SMALL);
126 		categoryAxisFormat.setTickLabelColor(Color.DARK_GRAY);
127 		categoryAxisFormat.setTickLabelMask("");
128 		categoryAxisFormat.setLineColor(Color.DARK_GRAY);
129 		
130 		DJAxisFormat valueAxisFormat = new DJAxisFormat("value");
131 		valueAxisFormat.setLabelFont(Font.ARIAL_SMALL);
132 		valueAxisFormat.setLabelColor(Color.DARK_GRAY);
133 		valueAxisFormat.setTickLabelFont(Font.ARIAL_SMALL);
134 		valueAxisFormat.setTickLabelColor(Color.DARK_GRAY);
135 		valueAxisFormat.setTickLabelMask("#,##0.0");
136 		valueAxisFormat.setLineColor(Color.DARK_GRAY);
137 		
138 		DJChart djChart = new DJBar3DChartBuilder()
139 		//chart		
140 		.setX(20)
141 		.setY(10)
142 		.setWidth(500)
143 		.setHeight(250)
144 		.setCentered(false)
145 		.setBackColor(Color.LIGHT_GRAY)
146 		.setShowLegend(true)
147 		.setPosition(DJChartOptions.POSITION_FOOTER)
148 		.setTitle(new StringExpression() {			
149 			public Object evaluate(Map fields, Map variables, Map parameters) {
150 				return variables.get("group_state_name");
151 			}
152 		})
153 		.setTitleColor(Color.DARK_GRAY)
154 		.setTitleFont(Font.ARIAL_BIG_BOLD)
155 		.setSubtitle("subtitle")
156 		.setSubtitleColor(Color.DARK_GRAY)
157 		.setSubtitleFont(Font.COURIER_NEW_BIG_BOLD)
158 		.setLegendColor(Color.DARK_GRAY)
159 		.setLegendFont(Font.COURIER_NEW_MEDIUM_BOLD)
160 		.setLegendBackgroundColor(Color.WHITE)
161 		.setLegendPosition(DJChartOptions.EDGE_BOTTOM)
162 		.setTitlePosition(DJChartOptions.EDGE_TOP)
163 		.setLineStyle(DJChartOptions.LINE_STYLE_DOTTED)
164 		.setLineWidth(1)
165 		.setLineColor(Color.DARK_GRAY)
166 		.setPadding(5)
167 		//dataset
168 		.setCategory((PropertyColumn) columnBranch)
169 		.addSerie(columnaQuantity, "quant.")
170 		.addSerie(columnAmount)
171 		//plot
172 		.setXOffset(10)
173 		.setyOffset(10)
174 		.setShowLabels(false)
175 		.setCategoryAxisFormat(categoryAxisFormat)
176 		.setValueAxisFormat(valueAxisFormat)
177 		.build();
178 		drb.addChart(djChart);
179 		
180 		DJHyperLink djlink = new DJHyperLink();
181 		djlink.setExpression(new StringExpression() {
182 			public Object evaluate(Map fields, Map variables, Map parameters) {				
183 				return "http://thisIsAURL?count=" + variables.get("REPORT_COUNT");
184 			}
185 		});
186 		djlink.setTooltip(new LiteralExpression("I'm a literal tootltip"));		
187 		djChart.setLink(djlink);
188 		
189 		HashMap vars = new HashMap();
190 		vars.put(columnaQuantity, new JRDesignVariable());
191 		vars.put(columnAmount, new JRDesignVariable());
192 		JRDesignGroup group = new JRDesignGroup();
193 		chart = djChart.transform(new DynamicJasperDesign(), "", group, group, vars, 0);
194 	}
195 	
196 	public void testChart() {
197 		assertEquals(20, chart.getX());
198 		assertEquals(10, chart.getY());
199 		assertEquals(500, chart.getWidth());
200 		assertEquals(250, chart.getHeight());
201 		assertEquals(Color.LIGHT_GRAY, chart.getBackcolor());
202 		assertEquals(Boolean.TRUE, chart.getShowLegend());
203 		assertNotNull(chart.getTitleExpression().getText());
204 		assertEquals(Color.DARK_GRAY, chart.getTitleColor());
205 		testFont(Font.ARIAL_BIG_BOLD, chart.getTitleFont());		
206 		assertNotNull(chart.getSubtitleExpression().getText());
207 		assertEquals(Color.DARK_GRAY, chart.getSubtitleColor());
208 		testFont(Font.COURIER_NEW_BIG_BOLD, chart.getSubtitleFont());
209 		assertEquals(Color.DARK_GRAY, chart.getLegendColor());
210 		testFont(Font.COURIER_NEW_MEDIUM_BOLD, chart.getLegendFont());
211 		assertEquals(Color.WHITE, chart.getLegendBackgroundColor());
212 		assertEquals(EdgeEnum.getByValue(new Byte(DJChartOptions.EDGE_BOTTOM)), chart.getLegendPositionValue() );
213 		assertEquals(EdgeEnum.getByValue(new Byte(DJChartOptions.EDGE_TOP)), chart.getTitlePositionValue());
214 		assertEquals(LineStyleEnum.getByValue(new Byte(DJChartOptions.LINE_STYLE_DOTTED)), chart.getLineBox().getPen().getLineStyleValue());
215 		assertEquals(new Float(1), chart.getLineBox().getPen().getLineWidth());
216 		assertEquals(Color.DARK_GRAY, chart.getLineBox().getPen().getLineColor());
217 		assertEquals(new Integer(5), chart.getLineBox().getPadding());
218 	}
219 	
220 	public void testDataset() {
221 		JRDesignCategoryDataset dataset = (JRDesignCategoryDataset) chart.getDataset();
222 		assertEquals(2, dataset.getSeriesList().size());
223 		assertNotNull(dataset.getSeries()[0].getLabelExpression().getText());
224 		assertNotNull(dataset.getSeries()[0].getSeriesExpression().getText());
225 	}
226 	
227 	public void testPlot() {
228 		JRDesignBar3DPlot plot = (JRDesignBar3DPlot) chart.getPlot();
229 		assertEquals(new Double(10), plot.getXOffsetDouble());
230 		assertEquals(new Double(10), plot.getYOffsetDouble());
231 		assertEquals(Boolean.FALSE, plot.getShowLabels());
232 		
233 		assertNotNull(plot.getCategoryAxisLabelExpression().getText());
234 		testFont(Font.ARIAL_SMALL, plot.getCategoryAxisLabelFont());
235 		assertEquals(Color.DARK_GRAY, plot.getCategoryAxisLabelColor());		
236 		testFont(Font.ARIAL_SMALL, plot.getCategoryAxisTickLabelFont());
237 		assertEquals(Color.DARK_GRAY, plot.getCategoryAxisTickLabelColor());
238 		assertEquals("", plot.getCategoryAxisTickLabelMask());
239 		assertEquals(Color.DARK_GRAY, plot.getCategoryAxisLineColor());
240 		
241 		assertNotNull(plot.getValueAxisLabelExpression().getText());
242 		testFont(Font.ARIAL_SMALL, plot.getValueAxisLabelFont());
243 		assertEquals(Color.DARK_GRAY, plot.getValueAxisLabelColor());		
244 		testFont(Font.ARIAL_SMALL, plot.getValueAxisTickLabelFont());
245 		assertEquals(Color.DARK_GRAY, plot.getValueAxisTickLabelColor());
246 		assertEquals("#,##0.0", plot.getValueAxisTickLabelMask());
247 		assertEquals(Color.DARK_GRAY, plot.getValueAxisLineColor());
248 	}
249 	
250 	public DynamicReport buildReport() throws Exception {		
251 		return drb.build();
252 	}
253 
254 	private void testFont(Font djFont, JRFont jrFont) {
255 		assertEquals(djFont.getFontName(), jrFont.getFontName());
256 		assertEquals(djFont.getFontSize(), jrFont.getFontSize());
257 		assertEquals(djFont.isBold(), jrFont.isBold());
258 		assertEquals(djFont.isItalic(), jrFont.isItalic());
259 	}
260 	
261 	public static void main(String[] args) throws Exception {
262 		Bar3DChartBuilderTest test = new Bar3DChartBuilderTest();
263 		test.setUp();
264 		test.testReport();
265 		JasperViewer.viewReport(test.jp);
266 	}
267 }