Example 2 : Cached Stock pricing graph
This is an example of how to cache sophisticated images
The free OOS library jCharts is used here to draw the graphs
- The user can enter an arbitrary company name and hit the 'show stock graph' button.
- The graph is cached application-wide with the key being the company name and the graph will expire 5 minutes after creation
- During the 5 minutes caching time, repeated calls from the same browser with the same company name will not arrive at the server, because the image is cached on the browser.
- See the jcharts with image maps example of how to add an image map to this same example >
Screenshot
Note
This is static documentation.
You can see this example live
Graph.html
<form jwcid="@Form"> Enter an arbitrary company name : <input type="text" jwcid="@TextField" listener="listener:onSubmit" value="ognl:companyName"/> <input type="submit" value="show stock graph"/> </form> <img jwcid="@sotacs:DynamicImage" parameters="ognl:companyName" height="300" width="500" painter="painter:paintGraph" cachingMode="literal:application" disabled="ognl:companyName == null || companyName.trim().length() == 0" />
Graph1.java
public abstract class Graph1 extends BasePage{
private static final int MINUTES_BACK = 8;
@Persist("client")
public abstract String getCompanyName();
/*
* this method paints the graph and sets expiration time
*/
public void paintGraph(Graphics2D g2d, IPainterContext context){
//retrieve data from DB
double[] data = getStockData(getCompanyName());
//render the chart with jCharts
try{
Chart chart = makeJChart(context, data);
chart.setGraphics2D(g2d);
chart.render();
} catch(Throwable e){
e.printStackTrace();
}
//set expiration time to 5 minutes
context.setExpiresAt(System.currentTimeMillis() + 1000 * 60 * 5);
}
/*
* Produce a chart using the jCharts-API
*/
private Chart makeJChart(IPainterContext context, double[] data)
throws Exception{
GregorianCalendar cal = new GregorianCalendar();
String[] xLabels = new String[MINUTES_BACK];
for (int i = MINUTES_BACK - 1; i >= 0 ;i--) {
if(i != MINUTES_BACK - 1) cal.add(Calendar.MINUTE, -1);
xLabels[i] = cal.get(Calendar.HOUR_OF_DAY) + "h " +
cal.get(Calendar.MINUTE );
}
String xTitle = "Time";
String yTitle = "Price in $";
String title = getCompanyName() + " (last updated "+ new Date()+")";
DataSeries dataSeries =
new DataSeries( xLabels, xTitle, yTitle, title );
String[] legendLabels = {getCompanyName() + " stock price"};
Paint[] paints = new Paint[]{Color.BLUE};
Stroke[] strokes= { new BasicStroke( 1.0f )};
Shape[] shapes= { PointChartProperties.SHAPE_CIRCLE };
LineChartProperties lineChartProperties =
new LineChartProperties(strokes, shapes);
AxisChartDataSet axisChartDataSet =
new AxisChartDataSet(new double[][]{data}, legendLabels,
paints, ChartType.LINE, lineChartProperties );
dataSeries.addIAxisPlotDataSet( axisChartDataSet );
ChartProperties chartProperties= new ChartProperties();
AxisProperties axisProperties= new AxisProperties();
LegendProperties legendProperties= new LegendProperties();
return new AxisChart( dataSeries, chartProperties,
axisProperties, legendProperties,
context.getWidth(), context.getHeight());
}
/*
* retrieve stock prices out of a randomDB
*/
private double[] getStockData(String name) {
Random random = new Random(System.currentTimeMillis());
double[] data = new double[MINUTES_BACK];
double start = random.nextDouble() * 1000.0 + 1.0;
for (int i = 0; i < data.length; i++) {
start += start * 0.4 * random.nextGaussian();
if(start < 0) start = - start;
data[i] = start;
}
return data;
}
}
