private ManagedList<Object> extractBeanSubElements(
     Element parentElement, ParserContext parserContext) {
   ManagedList<Object> list = new ManagedList<Object>();
   list.setSource(parserContext.extractSource(parentElement));
   for (Element beanElement : DomUtils.getChildElementsByTagName(parentElement, "bean", "ref")) {
     Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
     list.add(object);
   }
   return list;
 }
 private ManagedList<?> getDeferredResultInterceptors(
     Element element, Object source, ParserContext parserContext) {
   ManagedList<? super Object> interceptors = new ManagedList<Object>();
   Element asyncElement = DomUtils.getChildElementByTagName(element, "async-support");
   if (asyncElement != null) {
     Element interceptorsElement =
         DomUtils.getChildElementByTagName(asyncElement, "deferred-result-interceptors");
     if (interceptorsElement != null) {
       interceptors.setSource(source);
       for (Element converter : DomUtils.getChildElementsByTagName(interceptorsElement, "bean")) {
         BeanDefinitionHolder beanDef =
             parserContext.getDelegate().parseBeanDefinitionElement(converter);
         beanDef =
             parserContext.getDelegate().decorateBeanDefinitionIfRequired(converter, beanDef);
         interceptors.add(beanDef);
       }
     }
   }
   return interceptors;
 }
 private ManagedList<BeanReference> extractBeanRefSubElements(
     Element parentElement, ParserContext parserContext) {
   ManagedList<BeanReference> list = new ManagedList<BeanReference>();
   list.setSource(parserContext.extractSource(parentElement));
   for (Element refElement : DomUtils.getChildElementsByTagName(parentElement, "ref")) {
     BeanReference reference;
     if (StringUtils.hasText("bean")) {
       reference = new RuntimeBeanReference(refElement.getAttribute("bean"), false);
       list.add(reference);
     } else if (StringUtils.hasText("parent")) {
       reference = new RuntimeBeanReference(refElement.getAttribute("parent"), true);
       list.add(reference);
     } else {
       parserContext
           .getReaderContext()
           .error(
               "'bean' or 'parent' attribute is required for <ref> element",
               parserContext.extractSource(parentElement));
     }
   }
   return list;
 }
  private ManagedList<?> getMessageConverters(
      Element element, Object source, ParserContext parserContext) {
    Element convertersElement = DomUtils.getChildElementByTagName(element, "message-converters");
    ManagedList<? super Object> messageConverters = new ManagedList<Object>();
    if (convertersElement != null) {
      messageConverters.setSource(source);
      for (Element beanElement :
          DomUtils.getChildElementsByTagName(convertersElement, "bean", "ref")) {
        Object object = parserContext.getDelegate().parsePropertySubElement(beanElement, null);
        messageConverters.add(object);
      }
    }

    if (convertersElement == null
        || Boolean.valueOf(convertersElement.getAttribute("register-defaults"))) {
      messageConverters.setSource(source);
      messageConverters.add(createConverterDefinition(ByteArrayHttpMessageConverter.class, source));

      RootBeanDefinition stringConverterDef =
          createConverterDefinition(StringHttpMessageConverter.class, source);
      stringConverterDef.getPropertyValues().add("writeAcceptCharset", false);
      messageConverters.add(stringConverterDef);

      messageConverters.add(createConverterDefinition(ResourceHttpMessageConverter.class, source));
      messageConverters.add(createConverterDefinition(SourceHttpMessageConverter.class, source));
      messageConverters.add(
          createConverterDefinition(AllEncompassingFormHttpMessageConverter.class, source));

      if (romePresent) {
        messageConverters.add(
            createConverterDefinition(AtomFeedHttpMessageConverter.class, source));
        messageConverters.add(
            createConverterDefinition(RssChannelHttpMessageConverter.class, source));
      }

      if (jackson2XmlPresent) {
        RootBeanDefinition jacksonConverterDef =
            createConverterDefinition(MappingJackson2XmlHttpMessageConverter.class, source);
        GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source);
        jacksonFactoryDef.getPropertyValues().add("createXmlMapper", true);
        jacksonConverterDef
            .getConstructorArgumentValues()
            .addIndexedArgumentValue(0, jacksonFactoryDef);
        messageConverters.add(jacksonConverterDef);
      } else if (jaxb2Present) {
        messageConverters.add(
            createConverterDefinition(Jaxb2RootElementHttpMessageConverter.class, source));
      }

      if (jackson2Present) {
        RootBeanDefinition jacksonConverterDef =
            createConverterDefinition(MappingJackson2HttpMessageConverter.class, source);
        GenericBeanDefinition jacksonFactoryDef = createObjectMapperFactoryDefinition(source);
        jacksonConverterDef
            .getConstructorArgumentValues()
            .addIndexedArgumentValue(0, jacksonFactoryDef);
        messageConverters.add(jacksonConverterDef);
      } else if (gsonPresent) {
        messageConverters.add(createConverterDefinition(GsonHttpMessageConverter.class, source));
      }
    }
    return messageConverters;
  }