/**
   * Verify that the given URI is indeed a valid extension namespace URI, and if so enable it.
   *
   * <p>This method does all the error handling.
   */
  protected final void checkAndEnable(String uri) throws SAXException {
    if (!isRecognizableExtension(uri)) {
      String nearest = EditDistance.findNearest(uri, recognizableExtensions);
      // not the namespace URI we know of
      error(Messages.ERR_UNSUPPORTED_EXTENSION.format(uri, nearest));
    } else if (!isSupportedExtension(uri)) {
      // recognizable but not not supported, meaning
      // the plug-in isn't enabled

      // look for plug-in that handles this URI
      Plugin owner = null;
      for (Plugin p : options.getAllPlugins()) {
        if (p.getCustomizationURIs().contains(uri)) {
          owner = p;
          break;
        }
      }
      if (owner != null)
        // we know the plug-in that supports this namespace, but it's not enabled
        error(Messages.ERR_PLUGIN_NOT_ENABLED.format(owner.getOptionName(), uri));
      else {
        // this shouldn't happen, but be defensive...
        error(Messages.ERR_UNSUPPORTED_EXTENSION.format(uri));
      }
    }

    // as an error recovery enable this namespace URI anyway.
    enabledExtensions.add(uri);
  }
  /** @param handler This error handler will receive detected errors. */
  public AbstractExtensionBindingChecker(
      String schemaLanguage, Options options, ErrorHandler handler) {
    this.schemaLanguage = schemaLanguage;
    this.allowExtensions = options.compatibilityMode != Options.STRICT;
    this.options = options;
    setErrorHandler(handler);

    for (Plugin plugin : options.getAllPlugins())
      recognizableExtensions.addAll(plugin.getCustomizationURIs());
    recognizableExtensions.add(Const.XJC_EXTENSION_URI);
  }
 /**
  * If the tag name belongs to a plugin namespace-wise, check its local name to make sure it's
  * correct.
  */
 protected final void verifyTagName(String namespaceURI, String localName, String qName)
     throws SAXException {
   if (options.pluginURIs.contains(namespaceURI)) {
     // make sure that this is a valid tag name
     boolean correct = false;
     for (Plugin p : options.activePlugins) {
       if (p.isCustomizationTagName(namespaceURI, localName)) {
         correct = true;
         break;
       }
     }
     if (!correct) {
       error(Messages.ERR_ILLEGAL_CUSTOMIZATION_TAGNAME.format(qName));
       startCutting();
     }
   }
 }