private void loadRichFacesComponents() {
    richfacesAttributes = new HashMap<Class<?>, List<Attribute>>();

    try {
      ClassLoader cl = Attributes.class.getClassLoader();
      Enumeration<URL> fileUrls = cl.getResources("META-INF/faces-config.xml");
      URL configFile = null;

      while (fileUrls.hasMoreElements()) {
        URL url = fileUrls.nextElement();
        if (url.getPath().matches(".*richfaces[^/]+jar.*")) {
          configFile = url;
        }
      }

      JAXBContext context = JAXBContext.newInstance(FacesConfigHolder.class);
      FacesConfigHolder facesConfigHolder =
          (FacesConfigHolder) context.createUnmarshaller().unmarshal(configFile);
      List<Component> components = facesConfigHolder.getComponents();
      List<Behavior> behaviors = facesConfigHolder.getBehaviors();

      for (Component c : components) {
        if (c.getAttributes() == null) {
          continue;
        }

        // remove hidden attributes
        Iterator<Attribute> i = c.getAttributes().iterator();
        while (i.hasNext()) {
          Attribute a = i.next();
          if (a.isHidden() || "id".equals(a.getName()) || "binding".equals(a.getName())) {
            i.remove();
          }
        }

        richfacesAttributes.put(c.getComponentClass(), c.getAttributes());
        logger.debug("attributes for component " + c.getComponentClass().getName() + " loaded");
      }

      for (Behavior b : behaviors) {
        if (b.getAttributes() == null) {
          continue;
        }

        // remove hidden attributes
        Iterator<Attribute> i = b.getAttributes().iterator();
        while (i.hasNext()) {
          Attribute a = i.next();
          if (a.isHidden() || "id".equals(a.getName()) || "binding".equals(a.getName())) {
            i.remove();
          }
        }

        richfacesAttributes.put(b.getBehaviorClass(), b.getAttributes());
        logger.debug("attributes for behavior " + b.getBehaviorClass().getName() + " loaded");
      }

    } catch (IOException ex) {
      logger.error("Input/output error.", ex);
    } catch (JAXBException ex) {
      logger.error("XML reading error.", ex);
    }
  }