public static RequestContextBean parseConfigFile(ExternalContext externalContext) {
    RequestContextBean bean = new RequestContextBean();

    InputStream in = externalContext.getResourceAsStream(_CONFIG_FILE);
    if (in != null) {
      try {
        InputSource input = new InputSource();
        input.setByteStream(in);
        input.setPublicId(_CONFIG_FILE);

        XMLReader reader = _SAX_PARSER_FACTORY.newSAXParser().getXMLReader();

        reader.setContentHandler(new Handler(bean, externalContext));
        reader.parse(input);
      } catch (IOException ioe) {
        _LOG.warning(ioe);
      } catch (ParserConfigurationException pce) {
        _LOG.warning(pce);
      } catch (SAXException saxe) {
        _LOG.warning(saxe);
      } finally {
        try {
          in.close();
        } catch (IOException ioe) {
          // Ignore
          ;
        }
      }
    }

    String classNameString =
        (String) bean.getProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY);
    if (classNameString != null) {
      classNameString = classNameString.trim();

      // check if this contains multiple class names for chained processors usecase.
      // Usually the class named are separated by space char.
      String classNames[] = classNameString.split("[ ]+");
      if (classNames.length == 1) {
        // This could be a single processor full override usecase or a chained
        // processor usecase that has only one processor.
        try {
          Class<UploadedFileProcessor> clazz =
              (Class<UploadedFileProcessor>) ClassLoaderUtils.loadClass(classNames[0]);
          if (ChainedUploadedFileProcessor.class.isAssignableFrom(clazz)) {
            // this single chained processor case
            ChainedUploadedFileProcessor cufp[] = {
              (ChainedUploadedFileProcessor) clazz.newInstance()
            };
            bean.setProperty(
                RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
                new CompositeUploadedFileProcessorImpl(Arrays.asList(cufp)));
          } else {
            // this is full override usecase
            bean.setProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY, clazz.newInstance());
          }

        } catch (Exception e) {
          _LOG.severe("CANNOT_INSTANTIATE_UPLOADEDFILEPROCESSOR", e);
          bean.setProperty(
              RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
              new CompositeUploadedFileProcessorImpl());
        }
      } else {
        try {
          // chained processors usecase, Multiple processors
          List<ChainedUploadedFileProcessor> processors =
              new ArrayList<ChainedUploadedFileProcessor>(classNames.length);
          for (String className : classNames) {
            Class<ChainedUploadedFileProcessor> clazz =
                (Class<ChainedUploadedFileProcessor>) ClassLoaderUtils.loadClass(className);
            processors.add(clazz.newInstance());
          }
          bean.setProperty(
              RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
              new CompositeUploadedFileProcessorImpl(processors));
        } catch (Exception e) {
          _LOG.severe("CANNOT_INSTANTIATE_UPLOADEDFILEPROCESSOR", e);
          bean.setProperty(
              RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY,
              new CompositeUploadedFileProcessorImpl());
        }
      }
    } else {
      // nothing specified, hence use default.
      bean.setProperty(
          RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY, new CompositeUploadedFileProcessorImpl());
    }

    UploadedFileProcessor ufp =
        (UploadedFileProcessor) bean.getProperty(RequestContextBean.UPLOADED_FILE_PROCESSOR_KEY);

    ufp.init(externalContext.getContext());

    if (_LOG.isInfo()) {
      Object debug = bean.getProperty(RequestContextBean.DEBUG_OUTPUT_KEY);
      if (Boolean.TRUE.equals(debug)) _LOG.info("RUNNING_IN_DEBUG_MODE", _CONFIG_FILE);
    }
    return bean;
  }