/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2006 - 2009 Pentaho Corporation. All rights reserved.
*
*
* Created Jun 26, 2009
* @author gmoran
*/
package org.pentaho.platform.plugin.action.chartbeans;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.dom4j.Element;
import org.pentaho.chart.ChartBeanFactory;
import org.pentaho.chart.plugin.IChartPlugin;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IPentahoSystemListener;
import org.pentaho.platform.api.engine.IPluginManager;
import org.pentaho.platform.api.engine.PluginBeanException;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.plugin.action.messages.Messages;
import org.pentaho.platform.util.logging.Logger;
public class ChartBeansSystemListener implements IPentahoSystemListener {
private String configFile = "chartbeans/chartbeans_config.xml"; //$NON-NLS-1$
public ChartBeansSystemListener() {
}
public boolean startup(final IPentahoSession session) {
try {
ChartBeanFactory.loadDefaultChartPlugins(initPlugins());
List<Element> nodes = PentahoSystem.getSystemSettings().getSystemSettings(configFile, "max-data-points-per-chart"); //$NON-NLS-1$
if (nodes.size() > 0) {
int maxDataPointsPerChart = Integer.parseInt(nodes.get(0).getText());
if (maxDataPointsPerChart > 0) {
ChartBeanFactory.setMaxDataPointsPerChart(maxDataPointsPerChart);
}
}
} catch (Exception ex) {
Logger
.warn(
ChartBeansSystemListener.class.getName(),
Messages.getInstance().getString("ChartBeansSystemListener.ERROR_0004_LOAD_FAILED"), //$NON-NLS-1$
ex);
return false;
}
return true;
}
/**
* This methods looks in the chartbeans configuration file, and retrieves the
* prescribed list of chart plugins (renderers). For each defined renderer,
* the method then looks to the PluginManager to see if that renderer has
* been overridden. If it has, then the class defined in the PluginManager
* will be loaded IN PLACE OF the configuration file's class.
*
* @return list of available chart "plugin" (renderer) instances.
* @throws Exception if no chart plugins (renderers) are found.
*/
@SuppressWarnings("unchecked")
private List <IChartPlugin> initPlugins() throws Exception {
ArrayList<IChartPlugin> plugins = new ArrayList<IChartPlugin>();
HashMap<String, Object> pluginMap = new HashMap<String, Object>();
List<Element> nodes = PentahoSystem.getSystemSettings().getSystemSettings(configFile, "bean"); //$NON-NLS-1$
if (nodes == null || nodes.size() == 0) {
String msg = Messages.getInstance().getString("ChartBeansSystemListener.ERROR_0001_CONFIG_MISSING"); //$NON-NLS-1$
Logger.warn(ChartBeansSystemListener.class.getName(), msg);
throw new ChartSystemInitializationException(msg);
}
Element node;
String id;
Object plugin;
IPluginManager pluginManager = PentahoSystem.get(IPluginManager.class);
for (int i = 0; i < nodes.size(); i++) {
node = nodes.get(i);
id = node.attribute("id").getText(); //$NON-NLS-1$
pluginMap.put(id, node.attribute("class").getText()); //$NON-NLS-1$
// Now let's see if there is a plugin overriding this engine...
if ((null != pluginManager) && (pluginManager.isBeanRegistered(id))) {
try {
plugin = pluginManager.getBean(id);
pluginMap.put(id, plugin);
} catch (PluginBeanException e) {
Logger.warn(ChartBeansSystemListener.class.getName(),
Messages.getInstance().getString("ChartBeansSystemListener.ERROR_0002_PLUGINMANAGER_BEAN_MISSING", id),//$NON-NLS-1$
e);
}
}
}
for (Object clazz : pluginMap.values()) {
try {
if (clazz instanceof String){
plugins.add((IChartPlugin) Class.forName(clazz.toString()).newInstance());
}else{
plugins.add((IChartPlugin)clazz);
}
} catch (Exception ex) {
Logger.warn(ChartBeansSystemListener.class.getName(),
Messages.getInstance().getString("ChartBeansSystemListener.ERROR_0003_CLASS_CREATION_PROBLEM") + clazz, ex); //$NON-NLS-1$
}
}
return plugins;
}
public void setConfigFile(String configFile) {
this.configFile = configFile;
}
public void shutdown() {
// Nothing required
}
}