Coverage Report - org.homeunix.thecave.buddi.plugin.BuddiPluginFactory
 
Classes in this File Line Coverage Branch Coverage Complexity
BuddiPluginFactory
63%
35/55
42%
24/56
9.25
BuddiPluginFactory$1
25%
1/4
0%
0/4
9.25
 
 1  
 /*
 2  
  * Created on Aug 12, 2007 by wyatt
 3  
  */
 4  
 package org.homeunix.thecave.buddi.plugin;
 5  
 
 6  
 import java.io.File;
 7  
 import java.io.FileFilter;
 8  
 import java.io.IOException;
 9  
 import java.io.InputStream;
 10  
 import java.util.HashMap;
 11  
 import java.util.LinkedList;
 12  
 import java.util.List;
 13  
 import java.util.Map;
 14  
 import java.util.Properties;
 15  
 import java.util.logging.Logger;
 16  
 
 17  
 import org.homeunix.thecave.buddi.Buddi;
 18  
 import org.homeunix.thecave.buddi.Const;
 19  
 import org.homeunix.thecave.buddi.plugin.api.BuddiExportPlugin;
 20  
 import org.homeunix.thecave.buddi.plugin.api.BuddiImportPlugin;
 21  
 import org.homeunix.thecave.buddi.plugin.api.BuddiPanelPlugin;
 22  
 import org.homeunix.thecave.buddi.plugin.api.BuddiPreferencePlugin;
 23  
 import org.homeunix.thecave.buddi.plugin.api.BuddiReportPlugin;
 24  
 import org.homeunix.thecave.buddi.plugin.api.BuddiRunnablePlugin;
 25  
 import org.homeunix.thecave.buddi.plugin.api.BuddiSynchronizePlugin;
 26  
 import org.homeunix.thecave.buddi.plugin.api.BuddiTransactionCellRendererPlugin;
 27  
 
 28  
 import ca.digitalcave.moss.application.plugin.MossPlugin;
 29  
 import ca.digitalcave.moss.application.plugin.factory.PluginFactory;
 30  
 import ca.digitalcave.moss.common.ClassLoaderFunctions;
 31  
 
 32  0
 public class BuddiPluginFactory extends PluginFactory {
 33  
         
 34  2986
         private static final Map<Class<? extends MossPlugin>, List<MossPlugin>> pluginMap = new HashMap<Class<? extends MossPlugin>, List<MossPlugin>>();
 35  
 
 36  
         /**
 37  
          * Removes all the plugins from the cache.  Next time the plugins are
 38  
          * accessed, we will reload from disk.
 39  
          */
 40  
         public static void forcePluginRefresh(){
 41  43
                 pluginMap.clear();
 42  43
         }
 43  
         
 44  
         /**
 45  
          * Returns all plugins, both in the classpath and in plugin dirs, of the given type.
 46  
          * @param pluginType
 47  
          * @return
 48  
          */
 49  
         public static List<? extends MossPlugin> getPlugins(Class<? extends MossPlugin> pluginType){
 50  308850
                 if (pluginMap.get(pluginType) == null){
 51  19432
                         pluginMap.put(pluginType, new LinkedList<MossPlugin>());
 52  
                         
 53  
                         //Load built in plugins
 54  
                         String[] builtIn;
 55  19432
                         if (pluginType.getName().equals(BuddiReportPlugin.class.getName()))
 56  2977
                                 builtIn = Const.BUILT_IN_REPORTS;
 57  16455
                         else if (pluginType.getName().equals(BuddiImportPlugin.class.getName()))
 58  3020
                                 builtIn = Const.BUILT_IN_IMPORTS;
 59  13435
                         else if (pluginType.getName().equals(BuddiExportPlugin.class.getName()))
 60  3020
                                 builtIn = Const.BUILT_IN_EXPORTS;
 61  10415
                         else if (pluginType.getName().equals(BuddiPreferencePlugin.class.getName()))
 62  695
                                 builtIn = Const.BUILT_IN_PREFERENCE_PANELS;
 63  9720
                         else if (pluginType.getName().equals(BuddiRunnablePlugin.class.getName()))
 64  2986
                                 builtIn = Const.BUILT_IN_RUNNABLES;
 65  6734
                         else if (pluginType.getName().equals(BuddiSynchronizePlugin.class.getName()))
 66  3020
                                 builtIn = Const.BUILT_IN_SYNCHRONIZES;
 67  3714
                         else if (pluginType.getName().equals(BuddiTransactionCellRendererPlugin.class.getName()))
 68  695
                                 builtIn = Const.BUILT_IN_TRANSACTION_CELL_RENDERERS;
 69  3019
                         else if (pluginType.getName().equals(BuddiPanelPlugin.class.getName()))
 70  3019
                                 builtIn = Const.BUILT_IN_PANELS;
 71  
                         else {
 72  0
                                 builtIn = new String[0];
 73  0
                                 Logger.getLogger(BuddiPluginFactory.class.getName()).warning("Unknown plugin type: " + pluginType.getName());
 74  
                         }
 75  
                         
 76  40572
                         for (String className : builtIn){
 77  21140
                                 MossPlugin plugin = BuddiPluginFactory.getValidPluginFromClasspath(className);
 78  21140
                                 if (pluginType.isInstance(plugin)){
 79  21140
                                         pluginMap.get(pluginType).add(plugin);
 80  
                                 }
 81  
                         }
 82  
 
 83  
                         //Load user defined plugins
 84  19432
                         File[] plugins = Buddi.getPluginsFolder().listFiles(pluginFilter); 
 85  19432
                         if (plugins != null){
 86  19432
                                 for (File pluginFile : plugins){
 87  0
                                         Properties props = new Properties();
 88  
                                         try {
 89  0
                                                 InputStream is = ClassLoaderFunctions.getResourceAsStreamFromJar(pluginFile, "/" + Const.PLUGIN_PROPERTIES);
 90  0
                                                 if (is != null)
 91  0
                                                         props.load(is);
 92  
                                         }
 93  0
                                         catch (IOException ioe){}
 94  0
                                         for (MossPlugin plugin : getMossPluginsFromJar(pluginFile, Buddi.getVersion(), props.getProperty(Const.PLUGIN_PROPERTIES_ROOT))) {
 95  0
                                                 if (pluginType.isInstance(plugin)){
 96  0
                                                         pluginMap.get(pluginType).add((MossPlugin) plugin);
 97  
                                                 }
 98  
                                         }
 99  
                                 }
 100  
                         }
 101  
                 }
 102  
                 
 103  308850
                 return pluginMap.get(pluginType);
 104  
         }
 105  
         
 106  2986
         public static final FileFilter pluginFilter = new FileFilter(){
 107  
                 public boolean accept(File pathname) {
 108  0
                         if (pathname.getName().endsWith(Const.PLUGIN_EXTENSION)
 109  
                                         && pathname.isFile())
 110  0
                                 return true;
 111  0
                         return false;
 112  
                 }
 113  
         };
 114  
         
 115  
         public static List<File> getPluginFiles(){
 116  3724
                 List<File> pluginFiles = new LinkedList<File>();
 117  
                 
 118  
                 //Loop through all files fuond in the plugins folder, and see if they contain a valid
 119  
                 // plugin.  If so, add it to the list.  This time (Buddi 3), we focus on the plugin file
 120  
                 // itself, rather than each plugin class within it.
 121  3724
                 File[] plugins = Buddi.getPluginsFolder().listFiles(pluginFilter); 
 122  3724
                 if (plugins != null){
 123  3724
                         for (File pluginFile : plugins){
 124  0
                                 Properties props = new Properties();
 125  
                                 try {
 126  0
                                         InputStream is = ClassLoaderFunctions.getResourceAsStreamFromJar(pluginFile, "/" + Const.PLUGIN_PROPERTIES);
 127  0
                                         if (is != null)
 128  0
                                                 props.load(is);
 129  
                                 }
 130  0
                                 catch (IOException ioe){}
 131  0
                                 for (MossPlugin plugin : getMossPluginsFromJar(pluginFile, Buddi.getVersion(), props.getProperty(Const.PLUGIN_PROPERTIES_ROOT))) {
 132  0
                                         if (plugin instanceof BuddiExportPlugin
 133  
                                                         || plugin instanceof BuddiImportPlugin
 134  
                                                         || plugin instanceof BuddiSynchronizePlugin
 135  
                                                         || plugin instanceof BuddiPreferencePlugin
 136  
                                                         || plugin instanceof BuddiReportPlugin
 137  
                                                         || plugin instanceof BuddiRunnablePlugin
 138  
                                                         || plugin instanceof BuddiTransactionCellRendererPlugin
 139  
                                                         || plugin instanceof BuddiPanelPlugin){
 140  0
                                                 pluginFiles.add(pluginFile);
 141  0
                                                 break;
 142  
                                         }
 143  
                                 }
 144  
                         }
 145  
                 }
 146  
                 
 147  3724
                 return pluginFiles;
 148  
         }
 149  
 }