/** IMPORTANT: call this method after calling setIdGeneartor() */
  public boolean loadPlugins(String[] classNames) throws ParserPluginLoadException {
    String notLoadedNames = null;
    if (classNames != null) {
      for (String className : classNames) {
        boolean exception = false;
        try {
          Class pluginClass = Class.forName(className);
          ParserPlugin plugin = (ParserPlugin) pluginClass.newInstance();
          plugin.setIdGenerator(getIdGenerator());
          plugins.add(plugin);
        } catch (ClassNotFoundException e) {
          if (debugEnabled)
            LoggerUtils.error("Failed to find Parser Plugin \"" + className + "\".");
          exception = true;
        } catch (InstantiationException e) {
          if (debugEnabled)
            LoggerUtils.error("Failed to instantiate Parser Plugin \"" + className + "\".");
          exception = true;
        } catch (IllegalAccessException e) {
          if (debugEnabled)
            LoggerUtils.error("Failed to access Parser Plugin \"" + className + "\".");
          exception = true;
        } catch (ClassCastException e) {
          if (debugEnabled)
            LoggerUtils.error(
                "Failed to cast Parser Plugin \"" + className + "\" to ParserPlugin.");
          exception = true;
        }

        if (exception)
          if (notLoadedNames == null) notLoadedNames = className;
          else notLoadedNames += ", " + className;
      }
    }

    if (notLoadedNames != null) throw new ParserPluginLoadException(notLoadedNames);

    return (plugins.size() > 0);
  }
/** @author <a href="mailto:[email protected]">Huy A. Huynh</a> */
public class ParserPluginManager extends ParserPlugin {

  private static final boolean debugEnabled = LoggerUtils.isDebugEnabled(ParserPluginManager.class);

  private HashSet<ParserPlugin> plugins;

  public ParserPluginManager() {
    plugins = new HashSet<ParserPlugin>();
  }

  /** IMPORTANT: call this method after calling setIdGeneartor() */
  public boolean loadPlugins(String[] classNames) throws ParserPluginLoadException {
    String notLoadedNames = null;
    if (classNames != null) {
      for (String className : classNames) {
        boolean exception = false;
        try {
          Class pluginClass = Class.forName(className);
          ParserPlugin plugin = (ParserPlugin) pluginClass.newInstance();
          plugin.setIdGenerator(getIdGenerator());
          plugins.add(plugin);
        } catch (ClassNotFoundException e) {
          if (debugEnabled)
            LoggerUtils.error("Failed to find Parser Plugin \"" + className + "\".");
          exception = true;
        } catch (InstantiationException e) {
          if (debugEnabled)
            LoggerUtils.error("Failed to instantiate Parser Plugin \"" + className + "\".");
          exception = true;
        } catch (IllegalAccessException e) {
          if (debugEnabled)
            LoggerUtils.error("Failed to access Parser Plugin \"" + className + "\".");
          exception = true;
        } catch (ClassCastException e) {
          if (debugEnabled)
            LoggerUtils.error(
                "Failed to cast Parser Plugin \"" + className + "\" to ParserPlugin.");
          exception = true;
        }

        if (exception)
          if (notLoadedNames == null) notLoadedNames = className;
          else notLoadedNames += ", " + className;
      }
    }

    if (notLoadedNames != null) throw new ParserPluginLoadException(notLoadedNames);

    return (plugins.size() > 0);
  }

  public Set<ParserPlugin> getLoadedPlugins() {
    return plugins;
  }

  public Set<Hit> parseHits(Parser htmlParser, String referringUrl) {
    if (plugins.size() == 0) return null;

    HashSet<Hit> resultSet = null;
    for (ParserPlugin plugin : plugins) {
      htmlParser.reset();
      Set<Hit> parsed = plugin.parseHits(htmlParser, referringUrl);
      if (parsed != null) {
        if (resultSet == null) resultSet = new HashSet<Hit>();
        resultSet.addAll(parsed);
      }
    }

    return resultSet;
  }
}