/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition 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 General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.plugins.core;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.settings.IResourceSettings;
import org.projectforge.continuousdb.SystemUpdater;
import org.projectforge.continuousdb.UpdateEntry;
import org.projectforge.core.ConfigXml;
import org.projectforge.core.CronSetup;
import org.projectforge.plugins.memo.MemoPlugin;
import org.projectforge.plugins.teamcal.TeamCalPlugin;
import org.projectforge.plugins.todo.ToDoPlugin;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
/**
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public class PluginsRegistry
{
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(PluginsRegistry.class);
/**
* Defines some built-in plugins. Don't forget to add the pluginContext.xml files to TestConfiguration.
*/
private final AbstractPlugin[] builtinPlugins = new AbstractPlugin[] { new ToDoPlugin(), new MemoPlugin(), new TeamCalPlugin()};
private static PluginsRegistry instance;
private IResourceSettings resourceSettings;
private ConfigurableListableBeanFactory beanFactory;
private final List<AbstractPlugin> plugins = new ArrayList<AbstractPlugin>();
public synchronized static PluginsRegistry instance()
{
if (instance == null) {
instance = new PluginsRegistry();
}
return instance;
}
public void register(final AbstractPlugin plugin)
{
for (final AbstractPlugin pl : plugins) {
if (pl.getClass().equals(plugin.getClass()) == true) {
log.warn("Can't add plugin twice. Plugin '" + plugin.getClass() + "' already added.");
return;
}
}
plugins.add(plugin);
}
public List<AbstractPlugin> getPlugins()
{
return plugins;
}
public PluginsRegistry()
{
}
public void set(final SystemUpdater systemUpdater)
{
for (final AbstractPlugin plugin : plugins) {
final UpdateEntry updateEntry = plugin.getInitializationUpdateEntry();
if (updateEntry != null) {
if (updateEntry.isInitial() == false) {
log.error("The given UpdateEntry returned by plugin.getInitializationUpdateEntry() is not initial! Please use constructor without parameter version: "
+ plugin.getClass());
}
systemUpdater.register(updateEntry);
}
final List<UpdateEntry> updateEntries = plugin.getUpdateEntries();
if (updateEntries != null) {
for (final UpdateEntry entry : updateEntries) {
if (entry.isInitial() == true) {
log.error("The given UpdateEntry returned by plugin.getUpdateEntries() is initial! Please use constructor with parameter version: "
+ plugin.getClass()
+ ": "
+ entry.getDescription());
}
}
systemUpdater.register(updateEntries);
}
}
}
public void set(final ConfigurableListableBeanFactory beanFactory)
{
this.beanFactory = beanFactory;
}
public void set(final IResourceSettings resourceSettings)
{
this.resourceSettings = resourceSettings;
}
/**
* Load built-in plugins and plugins which are configured in config.xml.
*/
public void loadPlugins()
{
for (final AbstractPlugin plugin : builtinPlugins) {
register(plugin);
}
final ConfigXml xmlConfiguration = ConfigXml.getInstance();
final String[] pluginMainClasses = xmlConfiguration.getPluginMainClasses();
if (pluginMainClasses != null) {
for (final String pluginMainClassName : pluginMainClasses) {
try {
final Class< ? > pluginMainClass = Class.forName(pluginMainClassName);
try {
final AbstractPlugin plugin = (AbstractPlugin) pluginMainClass.newInstance();
register(plugin);
} catch (final ClassCastException ex) {
log.error("Couldn't load plugin, class '" + pluginMainClassName + "' isn't of type AbstractPlugin.");
} catch (final InstantiationException ex) {
log.error("Couldn't load plugin, class '" + pluginMainClassName + "' can't be instantiated: " + ex);
} catch (final IllegalAccessException ex) {
log.error("Couldn't load plugin, class '" + pluginMainClassName + "' can't be instantiated: " + ex);
}
} catch (final ClassNotFoundException ex) {
log.error("Couldn't load plugin, class '" + pluginMainClassName + "' not found");
}
}
}
}
public void initialize()
{
for (final AbstractPlugin plugin : plugins) {
plugin.setResourceSettings(resourceSettings);
beanFactory.autowireBeanProperties(plugin, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);
plugin.init();
}
}
public void registerCronJobs(final CronSetup cronSetup)
{
for (final AbstractPlugin plugin : plugins) {
plugin.registerCronJob(cronSetup);
}
}
}