} else if (categoryName.equals("slowfirstpass")) { return new ByInterfaceDetectorFactorySelector(spanPlugins ? null : plugin, SlowFirstPassDetector.class);
} else if (categoryName.equals("interprocedural")) { return new ByInterfaceDetectorFactorySelector(spanPlugins ? null : plugin, InterproceduralFirstPassDetector.class);
	private static DetectorFactorySelector getConstraintSelector(			Element constraintElement,			Plugin plugin,			String singleDetectorElementName,			String detectorCategoryElementName) throws PluginException {		Node node = constraintElement.selectSingleNode("./" + singleDetectorElementName);		if (node != null) {			String detectorClass = node.valueOf("@class");			return new SingleDetectorFactorySelector(plugin, detectorClass);		}				node = constraintElement.selectSingleNode("./" + detectorCategoryElementName);		if (node != null) {			String categoryName = node.valueOf("@name");			boolean spanPlugins = Boolean.valueOf(node.valueOf("@spanplugins")).booleanValue();			if (categoryName.equals("reporting")) {				return new ReportingDetectorFactorySelector(spanPlugins ? null : plugin);			} else if (categoryName.equals("training")) {				return new ByInterfaceDetectorFactorySelector(spanPlugins ? null : plugin, TrainingDetector.class);			} else if (categoryName.equals("slowfirstpass")) {				return new ByInterfaceDetectorFactorySelector(spanPlugins ? null : plugin, SlowFirstPassDetector.class);			} else {				throw new PluginException("Invalid constraint selector node");			}		}				throw new PluginException("Invalid constraint selector node");	}