/*
* Created on Oct 25, 2006
*
*/
package com.cvicse.report.ui.portal.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* Contains methods to add no cache string to a url,creating the charts.<br>
* This class can be used to create chart xml given the swf filename and other<br>
* parameters.<br>
* In order to use this class in your jsps,import this class and<br>
* call the appropriate method directly as follows:<br>
* FusionChartsCreator.createChart(...);<br>
*
* @author InfoSoft Global (P) Ltd.
*/
public class FusionChartsCreator {
/**
* Adds additional string to the url to and encodes the parameters,<br>
* so as to disable caching of data.<br>
* @param strDataURL -
* dataURL to be fed to chart
* @param addNoCacheStr -
* Whether to add aditional string to URL to disable
* caching of data
* @return cachedURL - URL with the additional string added
*/
public static String addCacheToDataURL(String strDataURL) {
String cachedURL = strDataURL;
// Add the no-cache string if required
// We add ?FCCurrTime=xxyyzz
// If the dataURL already contains a ?, we add &FCCurrTime=xxyyzz
// We replace : with _, as FusionCharts cannot handle : in URLs
Calendar nowCal = Calendar.getInstance();
Date now = nowCal.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH_mm_ss a");
String strNow = sdf.format(now);
try {
if (strDataURL.indexOf("?") > 0) {
cachedURL = strDataURL + "&FCCurrTime="
+ URLEncoder.encode(strNow, "UTF-8");
} else {
cachedURL = strDataURL + "?FCCurrTime="
+ URLEncoder.encode(strNow, "UTF-8");
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
cachedURL = strDataURL + "?FCCurrTime=" + strNow;
}
return cachedURL;
}
/**
* Creates the JavaScript + HTML code required to embed a chart.<br>
* Uses the javascript FusionCharts class to create the chart by supplying <br>
* the required parameters to it.<br>
* Note: Only one of the parameters strURL or strXML has to be not null for this<br>
* method to work. If both the parameters are provided then strURL is used for further processing.<br>
*
* @param chartSWF -
* SWF File Name (and Path) of the chart which you intend
* to plot
* @param strURL -
* If you intend to use dataURL method for this chart,
* pass the URL as this parameter. Else, set it to "" (in
* case of dataXML method)
* @param strXML -
* If you intend to use dataXML method for this chart,
* pass the XML data as this parameter. Else, set it to ""
* (in case of dataURL method)
* @param chartId -
* Id for the chart, using which it will be recognized in
* the HTML page. Each chart on the page needs to have a
* unique Id.
* @param chartWidth -
* Intended width for the chart (in pixels)
* @param chartHeight -
* Intended height for the chart (in pixels)
* @param debugMode -
* Whether to start the chart in debug mode
* @param registerWithJS -
* Whether to ask chart to register itself with
* JavaScript
*/
public static String createChart(String chartSWF, String strURL,
String strXML, String chartId, int chartWidth, int chartHeight,
boolean debugMode, boolean registerWithJS) {
StringBuffer strBuf = new StringBuffer();
// First we create a new DIV for each chart. We specify the name of DIV
// as "chartId"Div.
// DIV names are case-sensitive.
strBuf.append("\t\t<!-- START Script Block for Chart-->\n");
strBuf.append("\t\t<div id='" + chartId + "Div' align='center'>\n");
strBuf.append("\t\t\t\tChart.\n");
/*
* The above text "Chart" is shown to users before the chart has started
* loading (if there is a lag in relaying SWF from server). This text is
* also shown to users who do not have Flash Player installed. You can
* configure it as per your needs.
*/
strBuf.append("\t\t</div>\n");
/*
* Now, we create the chart using FusionCharts js class. Each chart's
* instance (JavaScript) Id is named as chart_"chartId".
*/
strBuf.append("\t\t<script type='text/javascript'>\n");
// Instantiate the Chart
Boolean registerWithJSBool = new Boolean(registerWithJS);
Boolean debugModeBool = new Boolean(debugMode);
int regWithJSInt = boolToNum(registerWithJSBool);
int debugModeInt = boolToNum(debugModeBool);
strBuf.append("\t\t\t\tvar chart_" + chartId + " = new FusionCharts('"
+ chartSWF + "', '" + chartId + "', '" + chartWidth + "', '"
+ chartHeight + "', '" + debugModeInt + "', '" + regWithJSInt
+ "');\n");
// Check whether we've to provide data using dataXML method or dataURL
// method
if (strXML.equals("")) {
strBuf.append("\t\t\t\t// Set the dataURL of the chart\n");
strBuf.append("\t\t\t\tchart_" + chartId + ".setDataURL(\"" + strURL
+ "\");\n");
} else {
strBuf.append("\t\t\t\t// Provide entire XML data using dataXML method\n");
strBuf.append("\t\t\t\tchart_" + chartId + ".setDataXML(\"" + strXML
+ "\");\n");
}
strBuf.append("\t\t\t\t// Finally, render the chart.\n");
strBuf.append("\t\t\t\tchart_" + chartId + ".render(\"" + chartId + "Div\");\n");
strBuf.append("\t\t</script>\n");
strBuf.append("\t\t<!--END Script Block for Chart-->\n");
return strBuf.substring(0);
}
/**
* Creates the object tag required to embed a chart.
* Generates the object tag to embed the swf directly into the html page.<br>
* Note: Only one of the parameters strURL or strXML has to be not null for this<br>
* method to work. If both the parameters are provided then strURL is used for further processing.<br>
*
* @param chartSWF -
* SWF File Name (and Path) of the chart which you intend
* to plot
* @param strURL -
* If you intend to use dataURL method for this chart,
* pass the URL as this parameter. Else, set it to "" (in
* case of dataXML method)
* @param strXML -
* If you intend to use dataXML method for this chart,
* pass the XML data as this parameter. Else, set it to ""
* (in case of dataURL method)
* @param chartId -
* Id for the chart, using which it will be recognized in
* the HTML page. Each chart on the page needs to have a
* unique Id.
* @param chartWidth -
* Intended width for the chart (in pixels)
* @param chartHeight -
* Intended height for the chart (in pixels)
* @param debugMode -
* Whether to start the chart in debug mode
*/
public static String createChartHTML(String chartSWF, String strURL,
String strXML, String chartId, int chartWidth, int chartHeight,
boolean debugMode) { /*
* Generate the FlashVars string based
* on whether dataURL has been provided
* or dataXML.
*/
String strFlashVars = "";
Boolean debugModeBool = new Boolean(debugMode);
if (strXML.equals("")) {
// DataURL Mode
strFlashVars = "chartWidth=" + chartWidth + "&chartHeight="
+ chartHeight + "&debugMode=" + boolToNum(debugModeBool)
+ "&dataURL=" + strURL + "";
} else {
// DataXML Mode
strFlashVars = "chartWidth=" + chartWidth + "&chartHeight="
+ chartHeight + "&debugMode=" + boolToNum(debugModeBool)
+ "&dataXML=" + strXML + "";
}
StringBuffer strBuf = new StringBuffer();
strBuf.append("\t\t<!--START Code Block for Chart-->\n");
strBuf
.append("\t\t<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0' width='"
+ chartWidth
+ "' height='"
+ chartHeight
+ "' id='"
+ chartId + "'>\n");
strBuf.append("\t\t\t\t<param name='allowScriptAccess' value='always' />\n");
strBuf.append("\t\t\t\t<param name='movie' value='" + chartSWF + "'/>\n");
strBuf.append("\t\t\t\t<param name='FlashVars' value=\"" + strFlashVars
+ "\" />\n");
strBuf.append("\t\t\t\t<param name='quality' value='high' />\n");
//防止flash遮盖Dhtml需要设置wmode为Opaque,若其他浏览器需要在embed标签中添加此属性
strBuf.append("\t\t\t\t<param name='wmode' value='Opaque' />\n");
strBuf
.append("\t\t\t\t<embed src='"
+ chartSWF
+ "' FlashVars=\""
+ strFlashVars
+ "\" quality='high' width='"
+ chartWidth
+ "' height='"
+ chartHeight
+ "' name='"
+ chartId
+ "' allowScriptAccess='always' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' />\n");
strBuf.append("\t\t</object>\n");
strBuf.append("\t\t<!--END Code Block for Chart-->\n");
return strBuf.substring(0);
}
/**
* Converts a Boolean value to int value<br>
*
* @param bool Boolean value which needs to be converted to int value
* @return int value correspoding to the boolean : 1 for true and 0 for false
*/
public static int boolToNum(Boolean bool) {
int num = 0;
if (bool.booleanValue()) {
num = 1;
}
return num;
}
}