@Override
  public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
    if (processingEnv.getOptions().containsKey(Const.CONFIG_FILE_OPTION.getValue())) {
      String value = processingEnv.getOptions().get(Const.CONFIG_FILE_OPTION.getValue());

      // For multiple config files we are following the format
      // -Aconfig=foo.config:bar.config where : is the pathSeparatorChar
      StringTokenizer st = new StringTokenizer(value, File.pathSeparator);
      if (!st.hasMoreTokens()) {
        errorListener.error(
            null, Messages.OPERAND_MISSING.format(Const.CONFIG_FILE_OPTION.getValue()));
        return true;
      }

      while (st.hasMoreTokens()) {
        File configFile = new File(st.nextToken());
        if (!configFile.exists()) {
          errorListener.error(null, Messages.NON_EXISTENT_FILE.format());
          continue;
        }

        try {
          Collection<TypeElement> rootElements = new ArrayList<TypeElement>();
          filterClass(rootElements, roundEnv.getRootElements());
          ConfigReader configReader =
              new ConfigReader(processingEnv, rootElements, configFile, errorListener);

          Collection<Reference> classesToBeIncluded = configReader.getClassesToBeIncluded();
          J2SJAXBModel model =
              XJC.createJavaCompiler()
                  .bind(
                      classesToBeIncluded,
                      Collections.<QName, Reference>emptyMap(),
                      null,
                      processingEnv);

          SchemaOutputResolver schemaOutputResolver = configReader.getSchemaOutputResolver();

          model.generateSchema(schemaOutputResolver, errorListener);
        } catch (IOException e) {
          errorListener.error(e.getMessage(), e);
        } catch (SAXException e) {
          // the error should have already been reported
        }
      }
    }
    return true;
  }
  /** Performs error check */
  public void errorCheck() {
    ErrorReceiver er = Ring.get(ErrorReceiver.class);
    for (QName n : enumBaseTypes) {
      XSSchemaSet xs = Ring.get(XSSchemaSet.class);
      XSSimpleType st = xs.getSimpleType(n.getNamespaceURI(), n.getLocalPart());
      if (st == null) {
        er.error(loc, Messages.ERR_UNDEFINED_SIMPLE_TYPE.format(n));
        continue;
      }

      if (!SimpleTypeBuilder.canBeMappedToTypeSafeEnum(st)) {
        er.error(loc, Messages.ERR_CANNOT_BE_BOUND_TO_SIMPLETYPE.format(n));
        continue;
      }
    }
  }
  /**
   * @param schemas Schema files to be checked.
   * @param errorHandler detected errors will be reported to this handler.
   * @return true if there was no error, false if there were errors.
   */
  public static boolean check(
      InputSource[] schemas,
      ErrorReceiver errorHandler,
      final EntityResolver entityResolver,
      boolean disableXmlSecurity) {

    ErrorReceiverFilter errorFilter = new ErrorReceiverFilter(errorHandler);
    boolean hadErrors = false;

    SchemaFactory sf = XmlFactory.createSchemaFactory(W3C_XML_SCHEMA_NS_URI, disableXmlSecurity);
    XmlFactory.allowExternalAccess(sf, "all", disableXmlSecurity);
    sf.setErrorHandler(errorFilter);
    if (entityResolver != null) {
      sf.setResourceResolver(
          new LSResourceResolver() {
            public LSInput resolveResource(
                String type,
                String namespaceURI,
                String publicId,
                String systemId,
                String baseURI) {
              try {
                // XSOM passes the namespace URI to the publicID parameter.
                // we do the same here .
                InputSource is = entityResolver.resolveEntity(namespaceURI, systemId);
                if (is == null) return null;
                return new LSInputSAXWrapper(is);
              } catch (SAXException e) {
                // TODO: is this sufficient?
                return null;
              } catch (IOException e) {
                // TODO: is this sufficient?
                return null;
              }
            }
          });
    }

    try {
      XmlFactory.allowExternalDTDAccess(sf, "all", disableXmlSecurity);
      sf.newSchema(getSchemaSource(schemas, entityResolver));
    } catch (SAXException e) {
      // TODO: we haven't thrown exceptions from here before. should we just trap them and return
      // false?
      hadErrors = true;
    } catch (OutOfMemoryError e) {
      errorHandler.warning(null, Messages.format(Messages.WARN_UNABLE_TO_CHECK_CORRECTNESS));
    }

    return !(hadErrors || errorFilter.hadError());
  }