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 (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: