001: /*
002: * Copyright 2004 Sun Microsystems, Inc.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: *
016: */
017: package com.sun.syndication.io.impl;
018:
019: import com.sun.syndication.io.DelegatingModuleGenerator;
020: import com.sun.syndication.io.DelegatingModuleParser;
021: import com.sun.syndication.io.WireFeedGenerator;
022: import com.sun.syndication.io.WireFeedParser;
023:
024: import java.util.*;
025:
026: /**
027: * <p>
028: * @author Alejandro Abdelnur
029: *
030: */
031: public abstract class PluginManager {
032: private String[] _propertyValues;
033: private Map _pluginsMap;
034: private List _pluginsList;
035: private List _keys;
036: private WireFeedParser _parentParser;
037: private WireFeedGenerator _parentGenerator;
038:
039: /**
040: * Creates a PluginManager
041: * <p>
042: * @param propertyKey property key defining the plugins classes
043: *
044: */
045: protected PluginManager(String propertyKey) {
046: this (propertyKey, null, null);
047: }
048:
049: protected PluginManager(String propertyKey,
050: WireFeedParser parentParser,
051: WireFeedGenerator parentGenerator) {
052: _parentParser = parentParser;
053: _parentGenerator = parentGenerator;
054: _propertyValues = PropertiesLoader.getPropertiesLoader()
055: .getTokenizedProperty(propertyKey, ", ");
056: loadPlugins();
057: _pluginsMap = Collections.unmodifiableMap(_pluginsMap);
058: _pluginsList = Collections.unmodifiableList(_pluginsList);
059: _keys = Collections.unmodifiableList(new ArrayList(_pluginsMap
060: .keySet()));
061: }
062:
063: protected abstract String getKey(Object obj);
064:
065: protected List getKeys() {
066: return _keys;
067: }
068:
069: protected List getPlugins() {
070: return _pluginsList;
071: }
072:
073: protected Map getPluginMap() {
074: return _pluginsMap;
075: }
076:
077: protected Object getPlugin(String key) {
078: return _pluginsMap.get(key);
079: }
080:
081: // PRIVATE - LOADER PART
082:
083: private void loadPlugins() {
084: List finalPluginsList = new ArrayList();
085: _pluginsList = new ArrayList();
086: _pluginsMap = new HashMap();
087: String className = null;
088: try {
089: Class[] classes = getClasses();
090: for (int i = 0; i < classes.length; i++) {
091: className = classes[i].getName();
092: Object plugin = classes[i].newInstance();
093: if (plugin instanceof DelegatingModuleParser) {
094: ((DelegatingModuleParser) plugin)
095: .setFeedParser(_parentParser);
096: }
097: if (plugin instanceof DelegatingModuleGenerator) {
098: ((DelegatingModuleGenerator) plugin)
099: .setFeedGenerator(_parentGenerator);
100: }
101:
102: _pluginsMap.put(getKey(plugin), plugin);
103: _pluginsList.add(plugin); // to preserve the order of definition in the rome.properties files
104: }
105: Iterator i = _pluginsMap.values().iterator();
106: while (i.hasNext()) {
107: finalPluginsList.add(i.next()); // to remove overriden plugin impls
108: }
109:
110: i = _pluginsList.iterator();
111: while (i.hasNext()) {
112: Object plugin = i.next();
113: if (!finalPluginsList.contains(plugin)) {
114: i.remove();
115: }
116: }
117: } catch (Exception ex) {
118: throw new RuntimeException("could not instantiate plugin "
119: + className, ex);
120: } catch (ExceptionInInitializerError er) {
121: throw new RuntimeException("could not instantiate plugin "
122: + className, er);
123: }
124: }
125:
126: /**
127: * Loads and returns the classes defined in the properties files.
128: * <p>
129: * @return array containing the classes defined in the properties files.
130: * @throws java.lang.ClassNotFoundException thrown if one of the classes defined in the properties file cannot be loaded
131: * and hard failure is ON.
132: *
133: */
134: private Class[] getClasses() throws ClassNotFoundException {
135: ClassLoader classLoader = PluginManager.class.getClassLoader();
136: List classes = new ArrayList();
137: for (int i = 0; i < _propertyValues.length; i++) {
138: Class mClass = Class.forName(_propertyValues[i], true,
139: classLoader);
140: classes.add(mClass);
141: }
142: Class[] array = new Class[classes.size()];
143: classes.toArray(array);
144: return array;
145: }
146:
147: }
|