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.JRDesignCategoryDataset;
37  import net.sf.jasperreports.charts.design.JRDesignLinePlot;
38  import net.sf.jasperreports.engine.JRFont;
39  import net.sf.jasperreports.engine.design.JRDesignChart;
40  import net.sf.jasperreports.engine.design.JRDesignGroup;
41  import net.sf.jasperreports.engine.design.JRDesignVariable;
42  import net.sf.jasperreports.engine.type.LineSpacingEnum;
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.DJLineChartBuilder;
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 LineChartBuilderTest extends BaseDjReportTest {
71  	private DynamicReportBuilder drb; 
72  	private JRDesignChart chart;
73  	
74  	protected void setUp() throws Exception {
75  		drb = new DynamicReportBuilder();
76  		Style headerStyle = new Style();
77  		headerStyle.setFont(Font.VERDANA_MEDIUM_BOLD);
78  		headerStyle.setBorderBottom(Border.PEN_2_POINT());
79  		headerStyle.setHorizontalAlign(HorizontalAlign.CENTER);
80  		headerStyle.setVerticalAlign(VerticalAlign.MIDDLE);
81  		headerStyle.setBackgroundColor(Color.DARK_GRAY);
82  		headerStyle.setTextColor(Color.WHITE);
83  		headerStyle.setTransparency(Transparency.OPAQUE);
84  		drb.setDefaultStyles(null, null, headerStyle, null);	
85  		
86  		AbstractColumn columnState = ColumnBuilder.getNew()
87  		.setColumnProperty("state", String.class.getName()).setTitle(
88  				"State").setWidth(new Integer(85)).build();
89  		AbstractColumn columnBranch = ColumnBuilder.getNew()
90  		.setColumnProperty("branch", String.class.getName()).setTitle(
91  				"Branch").setWidth(new Integer(85)).build();
92  		AbstractColumn columnaQuantity = ColumnBuilder.getNew()
93  		.setColumnProperty("quantity", Long.class.getName()).setTitle(
94  				"Quantity").setWidth(new Integer(80)).build();
95  		AbstractColumn columnAmount = ColumnBuilder.getNew()
96  		.setColumnProperty("amount", Float.class.getName()).setTitle(
97  				"Amount").setWidth(new Integer(90)).build();
98  
99  		drb.addColumn(columnState);
100 		drb.addColumn(columnBranch);
101 		drb.addColumn(columnaQuantity);
102 		drb.addColumn(columnAmount);
103 		
104 		GroupBuilder gb1 = new GroupBuilder();
105 		DJGroup g1 = gb1.setCriteriaColumn((PropertyColumn) columnState)
106 				.addFooterVariable(columnAmount,DJCalculation.SUM)
107 			.addFooterVariable(columnaQuantity,DJCalculation.SUM) 
108 			.addVariable("group_state_name", columnState, DJCalculation.FIRST)
109 			.setGroupLayout(GroupLayout.DEFAULT) 
110 			.build();		
111 /*		GroupBuilder gb2 = new GroupBuilder(); 
112   		DJGroup g2 = gb2.setCriteriaColumn((PropertyColumn) columnBranch)
113 				.setGroupLayout(GroupLayout.VALUE_FOR_EACH) 
114 				.build();*/
115 		
116 		drb.addGroup(g1);
117 		//drb.addGroup(g2);
118 		
119 		drb.setUseFullPageWidth(true);
120 		
121 		DJAxisFormat categoryAxisFormat = new DJAxisFormat("category");
122 		categoryAxisFormat.setLabelFont(Font.ARIAL_SMALL);
123 		categoryAxisFormat.setLabelColor(Color.DARK_GRAY);
124 		categoryAxisFormat.setTickLabelFont(Font.ARIAL_SMALL);
125 		categoryAxisFormat.setTickLabelColor(Color.DARK_GRAY);
126 		categoryAxisFormat.setTickLabelMask("");
127 		categoryAxisFormat.setLineColor(Color.DARK_GRAY);
128 		
129 		DJAxisFormat valueAxisFormat = new DJAxisFormat("value");
130 		valueAxisFormat.setLabelFont(Font.ARIAL_SMALL);
131 		valueAxisFormat.setLabelColor(Color.DARK_GRAY);
132 		valueAxisFormat.setTickLabelFont(Font.ARIAL_SMALL);
133 		valueAxisFormat.setTickLabelColor(Color.DARK_GRAY);
134 		valueAxisFormat.setTickLabelMask("#,##0.0");
135 		valueAxisFormat.setLineColor(Color.DARK_GRAY);
136 		
137 		DJChart djChart = new DJLineChartBuilder()
138 		//chart		
139 		.setX(20)
140 		.setY(10)
141 		.setWidth(500)
142 		.setHeight(250)
143 		.setCentered(false)
144 		.setBackColor(Color.LIGHT_GRAY)
145 		.setShowLegend(true)
146 		.setPosition(DJChartOptions.POSITION_FOOTER)
147 		.setTitle(new StringExpression() {			
148 			public Object evaluate(Map fields, Map variables, Map parameters) {
149 				return variables.get("group_state_name");
150 			}
151 		})
152 		.setTitleColor(Color.DARK_GRAY)
153 		.setTitleFont(Font.ARIAL_BIG_BOLD)
154 		.setSubtitle("subtitle")
155 		.setSubtitleColor(Color.DARK_GRAY)
156 		.setSubtitleFont(Font.COURIER_NEW_BIG_BOLD)
157 		.setLegendColor(Color.DARK_GRAY)
158 		.setLegendFont(Font.COURIER_NEW_MEDIUM_BOLD)
159 		.setLegendBackgroundColor(Color.WHITE)
160 		.setLegendPosition(DJChartOptions.EDGE_BOTTOM)
161 		.setTitlePosition(DJChartOptions.EDGE_TOP)
162 		.setLineStyle(DJChartOptions.LINE_STYLE_DOTTED)
163 		.setLineWidth(1)
164 		.setLineColor(Color.DARK_GRAY)
165 		.setPadding(5)
166 		//dataset
167 		.setCategory((PropertyColumn) columnBranch)
168 		.addSerie(columnaQuantity, "quant.")
169 		.addSerie(columnAmount)
170 		//plot
171 		.setShowShapes(true)
172 		.setShowLines(true)
173 		.setCategoryAxisFormat(categoryAxisFormat)
174 		.setValueAxisFormat(valueAxisFormat)
175 		.build();
176 		drb.addChart(djChart);
177 		
178 		DJHyperLink djlink = new DJHyperLink();
179 		djlink.setExpression(new StringExpression() {
180 			public Object evaluate(Map fields, Map variables, Map parameters) {				
181 				return "http://thisIsAURL?count=" + variables.get("REPORT_COUNT");
182 			}
183 		});
184 		djlink.setTooltip(new LiteralExpression("I'm a literal tootltip"));		
185 		djChart.setLink(djlink);
186 		
187 		HashMap vars = new HashMap();
188 		vars.put(columnaQuantity, new JRDesignVariable());
189 		vars.put(columnAmount, new JRDesignVariable());
190 		JRDesignGroup group = new JRDesignGroup();
191 		chart = djChart.transform(new DynamicJasperDesign(), "", group, group, vars, 0);
192 	}
193 	
194 	public void testChart() {
195 		assertEquals(20, chart.getX());
196 		assertEquals(10, chart.getY());
197 		assertEquals(500, chart.getWidth());
198 		assertEquals(250, chart.getHeight());
199 		assertEquals(Color.LIGHT_GRAY, chart.getBackcolor());
200 		assertEquals(Boolean.TRUE, chart.getShowLegend());
201 		assertNotNull(chart.getTitleExpression().getText());
202 		assertEquals(Color.DARK_GRAY, chart.getTitleColor());
203 		testFont(Font.ARIAL_BIG_BOLD, chart.getTitleFont());		
204 		assertNotNull(chart.getSubtitleExpression().getText());
205 		assertEquals(Color.DARK_GRAY, chart.getSubtitleColor());
206 		testFont(Font.COURIER_NEW_BIG_BOLD, chart.getSubtitleFont());
207 		assertEquals(Color.DARK_GRAY, chart.getLegendColor());
208 		testFont(Font.COURIER_NEW_MEDIUM_BOLD, chart.getLegendFont());
209 		assertEquals(Color.WHITE, chart.getLegendBackgroundColor());
210 		assertEquals(new Byte(DJChartOptions.EDGE_BOTTOM), chart.getLegendPositionValue().getValueByte() );
211 		assertEquals(new Byte(DJChartOptions.EDGE_TOP), chart.getTitlePositionValue().getValueByte());
212         assertEquals(LineStyleEnum.getByValue(new Byte(DJChartOptions.LINE_STYLE_DOTTED)), chart.getLineBox().getPen().getLineStyleValue());
213 		assertEquals(new Float(1), chart.getLineBox().getPen().getLineWidth());
214 		assertEquals(Color.DARK_GRAY, chart.getLineBox().getPen().getLineColor());
215 		assertEquals(new Integer(5), chart.getLineBox().getPadding());
216 	}
217 	
218 	public void testDataset() {
219 		JRDesignCategoryDataset dataset = (JRDesignCategoryDataset) chart.getDataset();
220 		assertEquals(2, dataset.getSeriesList().size());
221 		assertNotNull(dataset.getSeries()[0].getLabelExpression().getText());
222 		assertNotNull(dataset.getSeries()[0].getSeriesExpression().getText());
223 	}
224 	
225 	public void testPlot() {
226 		JRDesignLinePlot plot = (JRDesignLinePlot) chart.getPlot();
227 		assertEquals(Boolean.TRUE, plot.getShowLines());
228 		assertEquals(Boolean.TRUE, plot.getShowShapes());
229 		
230 		assertNotNull(plot.getCategoryAxisLabelExpression().getText());
231 		testFont(Font.ARIAL_SMALL, plot.getCategoryAxisLabelFont());
232 		assertEquals(Color.DARK_GRAY, plot.getCategoryAxisLabelColor());		
233 		testFont(Font.ARIAL_SMALL, plot.getCategoryAxisTickLabelFont());
234 		assertEquals(Color.DARK_GRAY, plot.getCategoryAxisTickLabelColor());
235 		assertEquals("", plot.getCategoryAxisTickLabelMask());
236 		assertEquals(Color.DARK_GRAY, plot.getCategoryAxisLineColor());
237 		
238 		assertNotNull(plot.getValueAxisLabelExpression().getText());
239 		testFont(Font.ARIAL_SMALL, plot.getValueAxisLabelFont());
240 		assertEquals(Color.DARK_GRAY, plot.getValueAxisLabelColor());		
241 		testFont(Font.ARIAL_SMALL, plot.getValueAxisTickLabelFont());
242 		assertEquals(Color.DARK_GRAY, plot.getValueAxisTickLabelColor());
243 		assertEquals("#,##0.0", plot.getValueAxisTickLabelMask());
244 		assertEquals(Color.DARK_GRAY, plot.getValueAxisLineColor());
245 	}
246 	
247 	public DynamicReport buildReport() throws Exception {		
248 		return drb.build();
249 	}
250 
251 	private void testFont(Font djFont, JRFont jrFont) {
252 		assertEquals(djFont.getFontName(), jrFont.getFontName());
253 		assertEquals(djFont.getFontSize(), jrFont.getFontSize());
254 		assertEquals(djFont.isBold(), jrFont.isBold());
255 		assertEquals(djFont.isItalic(), jrFont.isItalic());
256 	}
257 	
258 	public static void main(String[] args) throws Exception {
259 		LineChartBuilderTest test = new LineChartBuilderTest();
260 		test.setUp();
261 		test.testReport();
262 		JasperViewer.viewReport(test.jp);
263 	}
264 }