package org.toobsframework.pres.chart.manager;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.net.URL;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.exolab.castor.xml.Unmarshaller;
import org.toobsframework.pres.chart.ChartDefinition;
import org.toobsframework.pres.chart.ChartInitializationException;
import org.toobsframework.pres.chart.ChartNotFoundException;
import org.toobsframework.pres.chart.config.Chart;
import org.toobsframework.pres.chart.config.ChartConfig;
import org.toobsframework.util.Configuration;
@SuppressWarnings("unchecked")
public final class ChartManager implements IChartManager {
private static Log log = LogFactory.getLog(ChartManager.class);
private static Map registry;
private static boolean doReload = true;
private static boolean initDone = false;
private static long[] lastModified;
private List configFiles = null;
private ChartManager() throws ChartInitializationException {
log.info("Constructing new ChartManager");
registry = new HashMap();
}
public ChartDefinition getChartDefinition(String Id)
throws ChartNotFoundException, ChartInitializationException {
if (doReload || !initDone) {
Date initStart = new Date();
this.init();
Date initEnd = new Date();
log.info("Init Time: " + (initEnd.getTime() - initStart.getTime()));
}
synchronized (registry) {
if (!registry.containsKey(Id)) {
throw new ChartNotFoundException(Id);
}
return (ChartDefinition) registry.get(Id);
}
}
public void init() throws ChartInitializationException {
synchronized (registry) {
InputStreamReader reader = null;
if(configFiles == null) {
return;
}
int l = configFiles.size();
if (lastModified == null) {
log.info("LastModified is null " + this.toString() + " Registry " + registry);
lastModified = new long[l];
}
for(int fileCounter = 0; fileCounter < l; fileCounter++) {
String fileName = (String)configFiles.get(fileCounter);
try {
if (log.isDebugEnabled()) {
log.debug("Checking Configuration file: " + fileName);
}
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL configFileURL = classLoader.getResource(fileName);
if (configFileURL == null) {
log.warn("Configuration file " + fileName + " not found");
continue;
}
File configFile = new File(configFileURL.getFile());
if (configFile.lastModified() <= lastModified[fileCounter]) {
continue;
}
log.info("Reloading ChartConfig file [" + fileName + "]");
//registry.clear();
reader = new InputStreamReader(configFileURL.openStream());
Unmarshaller unmarshaller = new Unmarshaller(Class.forName(ChartConfig.class.getName()));
unmarshaller.setValidation(false);
ChartConfig chartConfig = (ChartConfig) unmarshaller.unmarshal(reader);
registerCharts(chartConfig.getChart());
doReload = Configuration.getInstance().getReloadComponents();
lastModified[fileCounter] = configFile.lastModified();
} catch (Exception ex) {
log.error("ComponentLayout initialization failed " + ex.getMessage(), ex);
doReload = true;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
}
}
}
}
initDone = true;
}
}
private void registerCharts(Chart[] charts) {
if ((charts != null) && (charts.length > 0)) {
Chart chart = null;
ChartDefinition chartDefinition = null;
for (int i = 0; i < charts.length; i ++) {
chart = charts[i];
chartDefinition = new ChartDefinition();
chartDefinition.setId(chart.getId());
chartDefinition.setChartHeight(chart.getHeight());
chartDefinition.setChartWidth(chart.getWidth());
chartDefinition.setBackgroundColor(chart.getBackgroundColor());
chartDefinition.setShowLegend(chart.getShowLegend());
chartDefinition.setDoImageWithMap(chart.getDoImageWithMap());
chartDefinition.setUrlFragmentBean(chart.getUrlFragmentBean());
if (chart.getParameters() != null) {
chartDefinition.setParameters(chart.getParameters());
}
if (chart.getTitle() != null) {
chartDefinition.setTitle(chart.getTitle());
}
if (chart.getSubtitle() != null) {
chartDefinition.setSubtitle(chart.getSubtitle());
}
if (chart.getLegend() != null) {
chartDefinition.setLegend(chart.getLegend());
}
chartDefinition.setPlot(chart.getPlot());
if (registry.containsKey(chart.getId()) && !initDone) {
log.warn("Overriding chartDefinition with Id: " + chart.getId());
}
registry.put(chart.getId(), chartDefinition);
}
}
}
public List getConfigFiles() {
return configFiles;
}
public void setConfigFiles(List configFiles) {
this.configFiles = configFiles;
}
public void addConfigFiles(List configFiles) {
this.configFiles.addAll(configFiles);
}
}