1+ package com .logicaldoc .web ;
2+
3+ import java .awt .Color ;
4+ import java .io .File ;
5+ import java .io .IOException ;
6+ import java .text .DateFormat ;
7+ import java .text .SimpleDateFormat ;
8+ import java .util .Calendar ;
9+ import java .util .Locale ;
10+
11+ import javax .servlet .ServletException ;
12+ import javax .servlet .http .HttpServlet ;
13+ import javax .servlet .http .HttpServletRequest ;
14+ import javax .servlet .http .HttpServletResponse ;
15+
16+ import org .jfree .chart .ChartFactory ;
17+ import org .jfree .chart .ChartUtilities ;
18+ import org .jfree .chart .JFreeChart ;
19+ import org .jfree .chart .axis .CategoryAxis ;
20+ import org .jfree .chart .axis .CategoryLabelPositions ;
21+ import org .jfree .chart .axis .NumberAxis ;
22+ import org .jfree .chart .plot .CategoryPlot ;
23+ import org .jfree .chart .plot .PlotOrientation ;
24+ import org .jfree .chart .renderer .category .BarRenderer ;
25+ import org .jfree .data .category .DefaultCategoryDataset ;
26+ import org .jfree .ui .HorizontalAlignment ;
27+ import org .slf4j .Logger ;
28+ import org .slf4j .LoggerFactory ;
29+
30+ import com .logicaldoc .core .PersistenceException ;
31+ import com .logicaldoc .core .security .Tenant ;
32+ import com .logicaldoc .core .sequence .SequenceDAO ;
33+ import com .logicaldoc .i18n .I18N ;
34+ import com .logicaldoc .util .Context ;
35+ import com .logicaldoc .util .LocaleUtil ;
36+ import com .logicaldoc .util .io .FileUtil ;
37+ import com .logicaldoc .web .util .ServletUtil ;
38+
39+ /**
40+ * Base for those servlets that produce a graph to display some kind of
41+ * statistics.
42+ *
43+ * @author Marco Meschieri - LogicalDOC
44+ * @since 9.2
45+ */
46+ public abstract class ChartServlet extends HttpServlet {
47+
48+ private static final long serialVersionUID = 1 ;
49+
50+ private static final Logger log = LoggerFactory .getLogger (ChartServlet .class );
51+
52+ protected String prefix = "prefix" ;
53+
54+ protected String rowKey = "key" ;
55+
56+ /**
57+ * Constructor of the object.
58+ */
59+ public ChartServlet () {
60+ super ();
61+ }
62+
63+ /**
64+ * The doGet method of the servlet.
65+ *
66+ * This method is called when a form has its tag value method equals to get.
67+ *
68+ * @param request the request send by the client to the server
69+ * @param response the response send by the server to the client
70+ *
71+ * @throws ServletException if an error occurred
72+ * @throws IOException if an error occurred
73+ */
74+ @ Override
75+ public void doGet (HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException {
76+ File chartFile = null ;
77+ try {
78+ ServletUtil .validateSession (request );
79+
80+ int width = 1200 ;
81+ if (request .getParameter ("width" ) != null )
82+ width = Integer .parseInt (request .getParameter ("width" ));
83+
84+ int height = 450 ;
85+ if (request .getParameter ("height" ) != null )
86+ height = Integer .parseInt (request .getParameter ("height" ));
87+
88+ Locale locale = Locale .ENGLISH ;
89+ if (request .getParameter ("locale" ) != null )
90+ locale = LocaleUtil .toLocale (request .getParameter ("locale" ));
91+
92+ chartFile = FileUtil .createTempFile ("chart" , ".png" );
93+
94+ drawChart (chartFile , width , height , locale , getObjectId (request ), getTenantId (request ));
95+
96+ ServletUtil .downloadFile (request , response , chartFile , "chart.png" );
97+ } catch (Exception e ) {
98+ log .error (e .getMessage (), e );
99+ } finally {
100+ FileUtil .delete (chartFile );
101+ }
102+ }
103+
104+ protected long getObjectId (HttpServletRequest request ) throws IOException , PersistenceException {
105+ return 0L ;
106+ }
107+
108+ protected long getTenantId (HttpServletRequest request ) throws IOException , PersistenceException {
109+ long tenantId = Tenant .SYSTEM_ID ;
110+ if (request .getParameter ("tenantId" ) != null )
111+ tenantId = Long .parseLong (request .getParameter ("tenantId" ));
112+ return tenantId ;
113+ }
114+
115+ protected void drawChart (File chartFile , int width , int height , Locale locale , long objectId , long tenantId )
116+ throws IOException {
117+ /**
118+ * Retrieve the sequences and order them by date
119+ */
120+ DefaultCategoryDataset dataset = new DefaultCategoryDataset ();
121+ SequenceDAO dao = Context .get (SequenceDAO .class );
122+
123+ DateFormat dfName = new SimpleDateFormat ("MMM yyyy" , locale );
124+ DateFormat dfNumber = new SimpleDateFormat ("yyyyMM" );
125+ for (int i = 0 ; i < 36 ; i ++) {
126+ Calendar cal = Calendar .getInstance ();
127+ cal .add (Calendar .MONTH , -i );
128+ String month = dfNumber .format (cal .getTime ());
129+ String monthName = dfName .format (cal .getTime ());
130+ dataset .addValue (dao .getCurrentValue (prefix + "-" + month , objectId , tenantId ),
131+ I18N .message (rowKey , locale ), monthName );
132+ }
133+
134+ JFreeChart chart = ChartFactory .createBarChart ("" , null , null , dataset , PlotOrientation .VERTICAL , false , false ,
135+ false );
136+
137+ CategoryPlot catPlot = chart .getCategoryPlot ();
138+ catPlot .getRangeAxis ().setStandardTickUnits (NumberAxis .createIntegerTickUnits ());
139+ BarRenderer r = (BarRenderer ) catPlot .getRenderer ();
140+ r .setSeriesPaint (0 , Color .BLUE );
141+
142+ chart .getTitle ().setHorizontalAlignment (HorizontalAlignment .LEFT );
143+ chart .getTitle ().setPaint (Color .BLUE );
144+
145+ CategoryAxis domainAxis = catPlot .getDomainAxis ();
146+ domainAxis .setCategoryLabelPositions (CategoryLabelPositions .UP_45 );
147+
148+ ChartUtilities .saveChartAsPNG (chartFile , chart , width , height );
149+ }
150+ }
0 commit comments