/*
* Copyright 2004 Sun Microsystems, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.sun.syndication.io.impl;
import com.sun.syndication.io.DelegatingModuleGenerator;
import com.sun.syndication.io.DelegatingModuleParser;
import com.sun.syndication.io.WireFeedGenerator;
import com.sun.syndication.io.WireFeedParser;
import java.util.*;
/**
* <p>
* @author Alejandro Abdelnur
*
*/
public abstract class PluginManager {
private String[] _propertyValues;
private Map _pluginsMap;
private List _pluginsList;
private List _keys;
private WireFeedParser _parentParser;
private WireFeedGenerator _parentGenerator;
/**
* Creates a PluginManager
* <p>
* @param propertyKey property key defining the plugins classes
*
*/
protected PluginManager(String propertyKey) {
this(propertyKey, null, null);
}
protected PluginManager(String propertyKey, WireFeedParser parentParser,
WireFeedGenerator parentGenerator)
{
_parentParser = parentParser;
_parentGenerator = parentGenerator;
_propertyValues = PropertiesLoader.getPropertiesLoader().getTokenizedProperty(propertyKey,", ");
loadPlugins();
_pluginsMap = Collections.unmodifiableMap(_pluginsMap);
_pluginsList = Collections.unmodifiableList(_pluginsList);
_keys = Collections.unmodifiableList(new ArrayList(_pluginsMap.keySet()));
}
protected abstract String getKey(Object obj);
protected List getKeys() {
return _keys;
}
protected List getPlugins() {
return _pluginsList;
}
protected Map getPluginMap() {
return _pluginsMap;
}
protected Object getPlugin(String key) {
return _pluginsMap.get(key);
}
// PRIVATE - LOADER PART
private void loadPlugins() {
List finalPluginsList = new ArrayList();
_pluginsList = new ArrayList();
_pluginsMap = new HashMap();
String className = null;
try {
Class[] classes = getClasses();
for (int i=0;i<classes.length;i++) {
className = classes[i].getName();
Object plugin = classes[i].newInstance();
if (plugin instanceof DelegatingModuleParser) {
((DelegatingModuleParser) plugin).setFeedParser(_parentParser);
}
if (plugin instanceof DelegatingModuleGenerator) {
((DelegatingModuleGenerator) plugin).setFeedGenerator(_parentGenerator);
}
_pluginsMap.put(getKey(plugin), plugin);
_pluginsList.add(plugin); // to preserve the order of definition in the rome.properties files
}
Iterator i = _pluginsMap.values().iterator();
while (i.hasNext()) {
finalPluginsList.add(i.next()); // to remove overriden plugin impls
}
i = _pluginsList.iterator();
while (i.hasNext()) {
Object plugin = i.next();
if (!finalPluginsList.contains(plugin)) {
i.remove();
}
}
}
catch (Exception ex) {
throw new RuntimeException("could not instantiate plugin "+className,ex);
}catch (ExceptionInInitializerError er) {
throw new RuntimeException("could not instantiate plugin "+className,er);
}
}
/**
* Loads and returns the classes defined in the properties files.
* <p>
* @return array containing the classes defined in the properties files.
* @throws java.lang.ClassNotFoundException thrown if one of the classes defined in the properties file cannot be loaded
* and hard failure is ON.
*
*/
private Class[] getClasses() throws ClassNotFoundException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
List classes = new ArrayList();
for (int i = 0; i <_propertyValues.length; i++) {
Class mClass = Class.forName(_propertyValues[i], true, classLoader);
classes.add(mClass);
}
Class[] array = new Class[classes.size()];
classes.toArray(array);
return array;
}
}