Uploaded image for project: 'Weld'
  1. Weld
  2. WELD-2609

ObserverMethodConfigurator#read methods do not set async and notify callback

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 3.1.4.Final
    • 3.1.3.Final
    • None
    • None

      As described in WELD-2608, I'm adding some beans manually using AfterBeanDiscovery.
      As the observer methods of those beans are not registered automatically (currently if that issue is valid and not expected), I thought it should be easy to also register the observer methods like I registered the beans.

      So as I registered the beans using this:

      afterBeanDiscovery
              .addBean()
              .read(annotatedBeanType)
              .alternative(false)
      

      I assumed adding the observer methods should be similar simple.
      My naive first approach was this, assuming all necessary information is determined by read as was the case for the bean:

      annotatedBeanType
              .methods
              .findAll {
                  it.parameters.any {
                      it.isAnnotationPresent(Observes) ||
                              it.isAnnotationPresent(ObservesAsync)
                  }
              }
              .each { method ->
                  afterBeanDiscovery
                          .addObserverMethod()
                          .read(method)
              }
      

      But I found two problems with this, namely the async property and the the notify callback are not set.

      So what I currently have is:

      annotatedBeanType
              .methods
              .findAll {
                  it.parameters.any {
                      it.isAnnotationPresent(Observes) ||
                              it.isAnnotationPresent(ObservesAsync)
                  }
              }
              .groupBy {
                  it.parameters.any {
                      it.isAnnotationPresent(ObservesAsync)
                  }
              }
              .each { async, methods ->
                  methods.each { method ->
                      afterBeanDiscovery
                              .addObserverMethod()
                              .read(method)
                              .async(async)
                              .notifyWith { eventContext ->
                                  def cdi = CDI.current()
                                  def beanType = annotatedBeanType.javaClass
                                  def bean = cdi.select(beanType).get()
                                  def arguments = method
                                          .parameters
                                          .collect {
                                              if (it.isAnnotationPresent(Observes) || it.isAnnotationPresent(ObservesAsync)) {
                                                  eventContext.event
                                              } else {
                                                  def qualifiers = it.annotations.findAll {
                                                      it.annotationType().isAnnotationPresent(Qualifier)
                                                  } as List
                                                  cdi.select(it.baseType, *qualifiers).get()
                                              }
                                          }
                                  method.javaMember.invoke(bean, *arguments)
                              }
                  }
              }
      

      But I hope that this is a bug and the `read` call should both, determine and set the async property and also configure a proper notify callback, especially as my current variant depends on `CDI.current()` which if I understood properly only works if there is exactly one container running, which might not be the case if tests are executed in parallel.

            manovotn Matěj Novotný
            Vampire0 Björn Kautler
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: