PluginRegistry.java :  » Content-Management-System » contineo » org » contineo » util » Java Open Source

Java Open Source » Content Management System » contineo 
contineo » org » contineo » util » PluginRegistry.java
package org.contineo.util;

import java.io.File;
import java.io.FilenameFilter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.java.plugin.JpfException;
import org.java.plugin.ObjectFactory;
import org.java.plugin.PluginManager;
import org.java.plugin.registry.Extension;
import org.java.plugin.registry.ExtensionPoint;
import org.java.plugin.registry.Identity;
import org.java.plugin.registry.PluginDescriptor;
import org.java.plugin.util.ExtendedProperties;

/**
 * Central point where plugins are loaded and handled. The class is abstract and
 * must be personalized as needed. The used implementation can be specified with
 * the 'contineo.app.pluginregistry' system property.
 * 
 * @author Marco Meschieri
 * @version $Id$
 * @since 3.0
 */
public abstract class PluginRegistry {

  // System property containing the plugin registry implementation to be used
  public static final String CONTINEO_APP_PLUGINREGISTRY = "contineo.app.pluginregistry";

  protected PluginManager manager = null;

  private static PluginRegistry instance;

  public static PluginRegistry getInstance() {
    if (instance == null) {
      String pluginregistry = System.getProperty(CONTINEO_APP_PLUGINREGISTRY);
      if (StringUtils.isEmpty(pluginregistry)) {
        pluginregistry = "org.contineo.DefaultPluginRegistry";
      }
      try {
        System.out.println("Instantiate concrete PluginRegistry: "+pluginregistry);
        instance = (PluginRegistry) Class.forName(pluginregistry).newInstance();
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
    return instance;
  }

  /**
   * Initializes all found plugins
   */
  public void init() {
    ExtendedProperties properties = new ExtendedProperties();
    properties.put("org.java.plugin.PathResolver", "org.java.plugin.standard.ShadingPathResolver");
    properties.put("org.java.plugin.standard.ShadingPathResolver.shadowFolder", System
        .getProperty("contineo.app.pluginsdir")
        + "/../.plugins");
    properties.put("org.java.plugin.standard.ShadingPathResolver.unpackMode", "always");

    ObjectFactory pluginObjectFactory = ObjectFactory.newInstance(properties);
    manager = pluginObjectFactory.createManager();

    List<PluginManager.PluginLocation> pluginLocations = locatePlugins(System
        .getProperty("contineo.app.pluginsdir"));

    if (pluginLocations.size() > 0) {
      Map<String, Identity> plugins = null;
      try {
        PluginManager.PluginLocation[] pLocations = (PluginManager.PluginLocation[]) pluginLocations
            .toArray(new PluginManager.PluginLocation[0]);
        plugins = manager.publishPlugins(pLocations);
      } catch (JpfException e) {
        throw new RuntimeException("Error publishing plugins", e);
      }

      System.out.println("Succesfully registered " + plugins.size() + " plugins");
      initPlugins(plugins);
    }
  }

  /**
   * Initializes found plugins
   * 
   * @param plugins Map of found plugins
   */
  protected abstract void initPlugins(Map<String, Identity> plugins);

  protected List<PluginManager.PluginLocation> locatePlugins(String pluginsDirectoryPath) {

    List<PluginManager.PluginLocation> pluginLocations = new LinkedList<PluginManager.PluginLocation>();

    // look for all zip files in plugin directory
    File pluginDirectory = new File(pluginsDirectoryPath);

    System.out.println("Searching for plugins in " + pluginDirectory.getAbsolutePath());

    FilenameFilter filter = new FilenameFilter() {
      public boolean accept(File dir, String name) {
        return (name.endsWith(".zip"));
      }
    };

    if (pluginDirectory.isDirectory()) {

      // find the plugins
      List<String> pluginsList = Arrays.asList(pluginDirectory.list(filter));

      if (pluginsList.size() > 0) {

        Iterator<String> i = pluginsList.iterator();

        while (i.hasNext()) {

          String pluginFilename = (String) i.next();

          File pluginZIPFile = new File(pluginDirectory.getPath() + "/" + pluginFilename);

          if (!pluginZIPFile.exists())
            throw new RuntimeException("file not Found:" + pluginZIPFile.getAbsolutePath());

          try {

            final URL manifestURL = new URL("jar:file:" + pluginZIPFile.getAbsolutePath() + "!/plugin.xml");

            final URL contextURL = pluginZIPFile.toURL();

            System.out.println("Found plugin file: " + pluginZIPFile.getName());

            pluginLocations.add(new PluginManager.PluginLocation() {
              public URL getManifestLocation() {
                return manifestURL;
              }

              public URL getContextLocation() {
                return contextURL;
              }
            });
          } catch (MalformedURLException e) {
            e.printStackTrace();
          }
        }
      } else {
        System.out.println("No Plugins Found");
      }

    } else {
      throw new RuntimeException("Unable to access Plugins directory: " + pluginDirectory.getAbsolutePath());
    }
    return pluginLocations;
  }

  public PluginManager getManager() {
    return manager;
  }

  /**
   * Returns the extensions connected to the specified extension point
   * 
   * @param pluginId The plugin identifier
   * @param extensionPoint The extension point id
   * @return List of connected extensions
   */
  public Collection<Extension> getExtensions(String pluginId, String extensionPoint) {
    PluginRegistry registry = PluginRegistry.getInstance();
    PluginDescriptor descriptor = registry.getManager().getRegistry().getPluginDescriptor(pluginId);
    ExtensionPoint dbinitExtPoint = registry.getManager().getRegistry().getExtensionPoint(descriptor.getId(),
        extensionPoint);
    Collection<Extension> exts = dbinitExtPoint.getConnectedExtensions();
    return exts;
  }

  /**
   * Retrieves the list of registered plugins
   * 
   * @return The list of registered plugins descriptors
   */
  public Collection<PluginDescriptor> getPlugins() {
    PluginRegistry registry = PluginRegistry.getInstance();
    return registry.getManager().getRegistry().getPluginDescriptors();
  }

  /**
   * Retrieve the plugin descriptor
   * 
   * @return The plugin descriptor
   */
  public PluginDescriptor getPlugin(String pluginId) {
    PluginRegistry registry = PluginRegistry.getInstance();
    return registry.getManager().getRegistry().getPluginDescriptor(pluginId);
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.