void addPlugins(Collection<String> classNames) throws PluginException {
		PluginException pe = null;
		List<Plugin> list = new ArrayList<>(classNames.size());
		List<String> badList = new ArrayList<>();
		for (String className : classNames) {
			try {
				Class<? extends Plugin> pluginClass = PluginUtils.forName(className);
				if (getLoadedPlugin(pluginClass) != null) {
					continue;
				}
				PluginUtils.assertUniquePluginName(pluginClass);
				Plugin p = PluginUtils.instantiatePlugin(pluginClass, tool);

				list.add(p);
			}
			catch (PluginException e) {
				pe = e.getPluginException(pe);
				badList.add(className);
			}
		}
		Plugin[] pluginArray = list.toArray(new Plugin[list.size()]);
		try {
			addPlugins(pluginArray);
		}
		catch (PluginException e) {
			pe = e.getPluginException(pe);
		}
		if (badList.size() > 0) {
			//EventManager eventMgr = tool.getEventManager
			for (String className : badList) {
				// remove from event manager
				tool.removeEventListener(className);
			}
		}
		if (pe != null) {
			throw pe;
		}
	}
Identify plugin which will accept specified URL.  If no plugin accepts URL it will be
rejected and false returned. If a plugin can accept the specified URL it will attempt to
process and return true if successful.
The user may be prompted if connecting to the URL requires user authentication.
@param url read-only resource URL
@return true if URL accepted and processed else false
Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginManager.java